Merge branch 'main' into main

This commit is contained in:
Hiddify
2024-02-16 12:17:51 +03:30
committed by GitHub
295 changed files with 3650 additions and 1936 deletions

View File

@@ -1,6 +1,6 @@
name: Bug Report name: Bug Report
description: Report a bug encountered while using Hiddify Next description: Report a bug encountered while using Hiddify
labels: ['bug'] labels: ["bug"]
body: body:
- type: markdown - type: markdown
attributes: attributes:
@@ -52,7 +52,7 @@ body:
id: version id: version
attributes: attributes:
label: Version label: Version
description: What version of Hiddify Next are you using? description: What version of Hiddify are you using?
placeholder: v1.3.8 etc placeholder: v1.3.8 etc
validations: validations:
required: true required: true

View File

@@ -2,4 +2,4 @@ blank_issues_enabled: false
contact_links: contact_links:
- name: Questions & Help - name: Questions & Help
url: https://t.me/hiddify_board url: https://t.me/hiddify_board
about: Ask a question about Hiddify Next about: Ask a question about Hiddify

View File

@@ -33,27 +33,27 @@
<tbody align=left> <tbody align=left>
<tr> <tr>
<td>Android</td><td> <td>Android</td><td>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=github"></a><br> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-universal.apk"><img src="https://img.shields.io/badge/APK-Universal-044d29.svg?logo=github"></a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=github"></a><br> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-arm64.apk"><img src="https://img.shields.io/badge/APK-ARMv8-168039.svg?logo=github"></a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=github"></a><br> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-arm7.apk"><img src="https://img.shields.io/badge/APK-ARMv7-45bf55.svg?logo=github"></a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=github"></a> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Android-x86_64.apk"><img src="https://img.shields.io/badge/APK-x64-96ed89.svg?logo=github"></a>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>Windows</td> <td>Windows</td>
<td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-windows-x64-setup.zip"><img src="https://img.shields.io/badge/Setup-x64-0078d7.svg?logo=github"></a><br> <td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Windows-Setup-x64.exe"><img src="https://img.shields.io/badge/Setup-x64-0078d7.svg?logo=github"></a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-windows-x64-portable.zip"><img src="https://img.shields.io/badge/Portable-x64-2d7d9a.svg?logo=github"></a> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Windows-Portable-x64.zip"><img src="https://img.shields.io/badge/Portable-x64-2d7d9a.svg?logo=github"></a>
</td> </td>
</tr> </tr>
<tr> <tr>
<td>macOS (v10.15+)</td> <td>macOS (v10.15+)</td>
<td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-macos-universal.zip"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=github"></a></td> <td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-MacOS.dmg"><img src="https://img.shields.io/badge/DMG-Universal-ea005e.svg?logo=github"></a></td>
</tr> </tr>
<tr> <tr>
<td>Linux</td> <td>Linux</td>
<td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-linux-x64.zip"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=github"> </a><br> <td><a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Linux-x64.AppImage"><img src="https://img.shields.io/badge/AppImage-x64-f84e29.svg?logo=github"> </a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-debian-x64.zip"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=github"> </a><br> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-Debian-x64.deb"><img src="https://img.shields.io/badge/DebPackage-x64-FF9966.svg?logo=github"> </a><br>
<a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/hiddify-rpm-x64.zip"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=github"> </a></td> <a href="https://github.com/hiddify/hiddify-next/releases/download/RELEASE_TAG/Hiddify-rpm-x64.rpm"><img src="https://img.shields.io/badge/RpmPackage-x64-F1B42F.svg?logo=github"> </a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -13,11 +13,20 @@ on:
default: "dev" default: "dev"
env: env:
IS_GITHUB_ACTIONS: 1
CHANNEL: "${{ inputs.channel }}" CHANNEL: "${{ inputs.channel }}"
NDK_VERSION: r26b NDK_VERSION: r26b
UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}" UPLOAD_ARTIFACT: "${{ inputs.upload-artifact }}"
TAG_NAME: "${{ inputs.tag-name }}" TAG_NAME: "${{ inputs.tag-name }}"
TARGET_NAME_AppImage: "Hiddify-Linux-x64"
TARGET_NAME_deb: "Hiddify-Debian-x64"
TARGET_NAME_rpm: "Hiddify-rpm-x64"
TARGET_NAME_apk: "Hiddify-Android"
TARGET_NAME_aab: "Hiddify-Android"
#TARGET_NAME_exe: "Hiddify-Windows-x64"
TARGET_NAME_dmg: "Hiddify-MacOS"
TARGET_NAME_pkg: "Hiddify-MacOS-Installer"
TARGET_NAME_ipa: "Hiddify-iOS"
jobs: jobs:
build: build:
permissions: write-all permissions: write-all
@@ -34,60 +43,36 @@ jobs:
targets: aab targets: aab
- platform: windows - platform: windows
os: windows-latest os: windows-2019
aarch: amd64 aarch: amd64
targets: exe targets: exe
filename: hiddify-windows-x64
# - platform: linux-appimage - platform: linux
# os: ubuntu-20.04 os: ubuntu-22.04
# aarch: amd64
# targets: AppImage
# filename: hiddify-linux-x64
- platform: linux-deb
os: ubuntu-20.04
aarch: amd64 aarch: amd64
targets: deb targets: AppImage,deb,rpm
filename: hiddify-debian-x64
- platform: linux-rpm
os: ubuntu-20.04
aarch: amd64
targets: rpm
filename: hiddify-rpm-x64
- platform: macos - platform: macos
os: macos-13 os: macos-13
aarch: universal aarch: universal
targets: dmg targets: dmg,pkg
filename: hiddify-macos-universal
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- name: checkout - name: checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup Apple dependencies
if: matrix.platform == 'macos' || matrix.platform == 'ios'
run: |
brew install create-dmg tree
echo "installed create-dmg tree "
npm install -g appdmg
- name: Setup Flutter - name: Setup Flutter
uses: subosito/flutter-action@v2 uses: subosito/flutter-action@v2
with: with:
flutter-version: '3.16.x' flutter-version: '3.16.x'
channel: 'stable' channel: 'stable'
cache: true cache: true
- name: Setup Java - name: Setup Java
if: startsWith(matrix.platform,'android') if: startsWith(matrix.platform,'android')
uses: actions/setup-java@v3 uses: actions/setup-java@v3
with: with:
distribution: 'zulu' distribution: 'zulu'
java-version: 17 java-version: 17
- name: Setup NDK - name: Setup NDK
if: startsWith(matrix.platform,'android') if: startsWith(matrix.platform,'android')
uses: nttld/setup-ndk@v1.4.1 uses: nttld/setup-ndk@v1.4.1
@@ -97,36 +82,15 @@ jobs:
add-to-path: true add-to-path: true
link-to-sdk: true link-to-sdk: true
- name: Setup Flutter Distributor
if: ${{ !startsWith(matrix.platform,'android') }}
run: |
dart pub global activate flutter_distributor
- name: Setup Linux dependencies - name: Setup dependencies
if: ${{ startsWith(matrix.platform,'linux') }}
run: | run: |
sudo apt install -y locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf make ${{ matrix.platform }}-install-dependencies
sudo modprobe fuse
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
chmod +x appimagetool
mv appimagetool /usr/local/bin/
- name: Get Geo Assets - name: Prepare for ${{ matrix.platform }}
run: | run: |
make get-geo-assets make ${{ matrix.platform }}-prepare
tree
- name: Get Dependencies
run: |
make get
- name: Generate
run: |
make translate
make gen
- name: Get Libs & Bindings ${{ matrix.platform }}
run: |
make ${{ matrix.platform }}-libs
- name: Setup Android Signing Properties - name: Setup Android Signing Properties
if: startsWith(matrix.platform,'android') if: startsWith(matrix.platform,'android')
@@ -198,10 +162,10 @@ jobs:
run: | run: |
mkdir out mkdir out
ls -R ./build/app/outputs ls -R ./build/app/outputs
cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/hiddify-android-arm64.apk || echo "no arm64 apk" cp ./build/app/outputs/flutter-apk/*arm64-v8a*.apk out/${TARGET_NAME_apk}-arm64.apk || echo "no arm64 apk"
cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/hiddify-android-arm7.apk || echo "no arm7 apk" cp ./build/app/outputs/flutter-apk/*armeabi-v7a*.apk out/${TARGET_NAME_apk}-arm7.apk || echo "no arm7 apk"
cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/hiddify-android-x86_64.apk || echo "no x64 apk" cp ./build/app/outputs/flutter-apk/*x86_64*.apk out/${TARGET_NAME_apk}-x86_64.apk || echo "no x64 apk"
cp ./build/app/outputs/flutter-apk/app-release.apk out/hiddify-android-universal.apk || echo "no universal apk" cp ./build/app/outputs/flutter-apk/app-release.apk out/${TARGET_NAME_apk}-universal.apk || echo "no universal apk"
- name: Copy to out Android AAB - name: Copy to out Android AAB
if: matrix.platform == 'android-aab' if: matrix.platform == 'android-aab'
@@ -216,21 +180,29 @@ jobs:
ls -R dist/ ls -R dist/
mkdir out mkdir out
mkdir tmp_out mkdir tmp_out
EXT="${{ matrix.targets }}"
mv dist/*/*.$EXT tmp_out/${{matrix.filename}}.$EXT for EXT in $(echo ${{ matrix.targets }} | tr ',' '\n'); do
chmod +x tmp_out/${{matrix.filename}}.$EXT KEY=TARGET_NAME_${EXT}
if [ "${{matrix.platform}}" == "linux" ];then FILENAME=${!KEY}
cp ./.github/help/linux/* tmp_out/ echo "For $EXT ($KEY) filename is ${FILENAME}"
else mv dist/*/*.$EXT tmp_out/${FILENAME}.$EXT
cp ./.github/help/mac-windows/* tmp_out/ chmod +x tmp_out/${FILENAME}.$EXT
fi if [ "${{matrix.platform}}" == "linux" ];then
if [[ "${{matrix.platform}}" == 'ios' ]];then cp ./.github/help/linux/* tmp_out/
mv tmp_out/${{matrix.filename}}.ipa bin/${{matrix.filename}}.ipa else
else cp ./.github/help/mac-windows/* tmp_out/
cd tmp_out fi
7z a ${{matrix.filename}}.zip ./ if [[ "${{matrix.platform}}" == 'ios' ]];then
mv *.zip ../out/ mv tmp_out/${FILENAME}.$EXT bin/${FILENAME}.$EXT
fi else
cd tmp_out
# 7z a ${FILENAME}.zip ./
# mv ${FILENAME}.zip ../out/
# [[ $EXT == 'AppImage' ]]&& mv ${FILENAME}.$EXT ../out/ # added for appimage link
mv ${FILENAME}.$EXT ../out/
cd ..
fi
done
- name: Clean up keychain and provisioning profile - name: Clean up keychain and provisioning profile
if: ${{ always() && startsWith(matrix.os,'macos')}} if: ${{ always() && startsWith(matrix.os,'macos')}}
@@ -341,5 +313,4 @@ jobs:
packageName: app.hiddify.com packageName: app.hiddify.com
releaseName: ${{ env.TAG_NAME }} releaseName: ${{ env.TAG_NAME }}
releaseFiles: ./hiddify-android-market.aab releaseFiles: ./hiddify-android-market.aab
track: 'beta' track: 'beta'

206
.github/workflows/dev-i copy.yml vendored Normal file
View File

@@ -0,0 +1,206 @@
name: dev i new
on:
push:
branches:
- ios
paths-ignore:
- '**.md'
- 'docs/**'
- '.github/**'
- '!.github/workflows/*'
- 'appcast.xml'
concurrency:
group: ${{ github.ref }}-${{ github.workflow }}
cancel-in-progress: true
env:
CHANNEL: ${{ github.ref_type == 'tag' && endsWith(github.ref_name, 'dev') && 'dev' || github.ref_type != 'tag' && 'dev' || 'prod' }}
NDK_VERSION: r26b
jobs:
build:
permissions: write-all
strategy:
fail-fast: false
matrix:
include:
# - platform: android-apk
# os: ubuntu-latest
# targets: apk
# - platform: android-aab
# os: ubuntu-latest
# targets: aab
# - platform: windows
# os: windows-latest
# aarch: amd64
# targets: exe
# filename: hiddify-windows-x64
# - platform: linux
# os: ubuntu-latest
# aarch: amd64
# targets: AppImage
# filename: hiddify-linux-x64
# - platform: macos
# os: macos-13
# aarch: universal
# targets: dmg
# filename: hiddify-macos-universal
- platform: ios
os: macos-13
aarch: universal
filename: hiddify-ios
targets: ipa
runs-on: ${{ matrix.os }}
steps:
- name: checkout
uses: actions/checkout@v3
- name: Install macos dmg needed tools
if: matrix.platform == 'macos' || matrix.platform == 'ios'
run: |
# xcode-select --install || softwareupdate --all --install --force
# brew uninstall --force $(brew list | grep python@) && brew cleanup || echo "python not installed"
brew uninstall --ignore-dependencies python@3.12
brew reinstall python@3.10
python3 -m pip install --upgrade setuptools pip
brew install create-dmg tree
npm install -g appdmg
brew install graphicsmagick imagemagick
gem install fastlane
bundle install
pip install setuptools
npm install --global create-dmg
- name: Fastlane Release
shell: bash
run: fastlane release
env:
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 120 # x86 is slooooooow
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '15.0.1'
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.16.x'
channel: 'stable'
cache: true
- name: Setup Flutter Distributor
if: ${{ !startsWith(matrix.platform,'android') }}
run: |
dart pub global activate flutter_distributor
- name: Get Geo Assets
run: |
make get-geo-assets
- name: Get Dependencies
run: |
make get
- name: Generate
run: |
make translate
make gen
- name: Get Libs ${{ matrix.platform }}
run: |
make ${{ matrix.platform }}-libs
- name: Setup Apple certificate and provisioning profile
if: startsWith(matrix.os,'macos')
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.APPLE_BUILD_PROVISION_PROFILE_BASE64 }}
BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64: ${{ secrets.APPLE_BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
PP_PACKET_TUNNEL_PATH=$RUNNER_TEMP/build_pppt.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate and provisioning profile from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
echo -n "$BUILD_PACKET_TUNNEL_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PACKET_TUNNEL_PATH
# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
# apply provisioning profile
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PACKET_TUNNEL_PATH ~/Library/MobileDevice/Provisioning\ Profiles
- name: Release ${{ matrix.platform }}
env:
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
run: |
make ${{ matrix.platform }}-release
- name: Upload Debug Symbols
if: ${{ github.ref_type == 'tag' }}
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}
SENTRY_DIST: ${{ matrix.platform == 'android-aab' && 'google-play' || 'general' }}
run: |
flutter packages pub run sentry_dart_plugin
- name: Copy to out unix
if: matrix.platform == 'linux' || matrix.platform == 'macos' || matrix.platform == 'ios'
run: |
ls -R dist/
mkdir out
mkdir tmp_out
EXT="${{ matrix.targets }}"
mv dist/*/*.$EXT tmp_out/${{matrix.filename}}.$EXT
chmod +x tmp_out/${{matrix.filename}}.$EXT
if [ "${{matrix.platform}}" == "linux" ];then
cp ./.github/help/linux/* tmp_out/
else
cp ./.github/help/mac-windows/* tmp_out/
fi
if [[ "${{matrix.platform}}" == 'ios' ]];then
mv tmp_out/${{matrix.filename}}.ipa bin/${{matrix.filename}}.ipa
else
cd tmp_out
7z a ${{matrix.filename}}.zip ./
mv *.zip ../out/
fi
- name: Clean up keychain and provisioning profile
if: ${{ always() && startsWith(matrix.os,'macos')}}
run: |
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision
- name: Upload Artifact
uses: actions/upload-artifact@v3
with:
name: artifact
path: ./out
retention-days: 2

View File

@@ -2,7 +2,7 @@ name: dev i
on: on:
push: push:
branches: branches:
- main - ios
paths-ignore: paths-ignore:
- '**.md' - '**.md'
- 'docs/**' - 'docs/**'

3
.gitignore vendored
View File

@@ -35,9 +35,8 @@ migrate_working_dir/
# generated files # generated files
**/*.g.dart **/*.g.dart
**/*.freezed.dart **/*.freezed.dart
**/*.mapper.dart
**/*.gen.dart **/*.gen.dart
**/libclash.so
**/libclash.h
**/*.dll **/*.dll
**/*.dylib **/*.dylib
**/*.xcframework **/*.xcframework

31
.stignore Normal file
View File

@@ -0,0 +1,31 @@
#include /.stignore
#include /android/.stignore
#include /ios/.stignore
#include /linux/.stignore
#include /windows/.stignore
#include /macos/.stignore
.git
.DS_Store
.idea
.dart_tool
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache
.pub
build
*.log
*.iml
*.ipr
*.iws
**/ios/Flutter/.last_build_id
/android/app/debug
/android/app/profile
/android/app/release

10
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,10 @@
{
"recommendations": [
"dart-code.dart-code",
"dart-code.flutter",
"github.vscode-github-actions",
"golang.go",
"redhat.vscode-yaml",
"codeium.codeium"
]
}

View File

@@ -203,7 +203,7 @@
- Added Geo Asset Settings - Added Geo Asset Settings
- Update geo assets and use recommended providers - Update geo assets and use recommended providers
- Added **winget** Release - Added **winget** Release
- Now you're able to install and update Hiddify Next on Windows using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/). - Now you're able to install and update Hiddify on Windows using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/).
- Added Turkish Translations. [PR#173](https://github.com/hiddify/hiddify-next/pull/173) by [Hasan Karlı](https://github.com/hasankarli) - Added Turkish Translations. [PR#173](https://github.com/hiddify/hiddify-next/pull/173) by [Hasan Karlı](https://github.com/hasankarli)
- Changed in-app Toasts - Changed in-app Toasts
- Updated Core Sing-box Version to 1.7.0 - Updated Core Sing-box Version to 1.7.0

View File

@@ -1,6 +1,6 @@
# Contributing # Contributing
Every contribution to Hiddify Next is welcome, whether it is reporting a bug, submitting a fix, proposing new features, or just asking a question. To make contributing to Hiddify Next as easy as possible, you will find more details for the development flow in this documentation. Every contribution to Hiddify is welcome, whether it is reporting a bug, submitting a fix, proposing new features, or just asking a question. To make contributing to Hiddify as easy as possible, you will find more details for the development flow in this documentation.
Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-next/blob/main/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project. Please note, we have a [Code of Conduct](https://github.com/hiddify/hiddify-next/blob/main/CODE_OF_CONDUCT.md), please follow it in all your interactions with the project.
@@ -23,11 +23,16 @@ If you encounter any issue, or you have an idea to improve, please:
## Adding new Features ## Adding new Features
When contributing a complex change to the Hiddify Next repository, please discuss the change you wish to make within a GitHub issue with the owners of this repository before making the change. When contributing a complex change to the Hiddify repository, please discuss the change you wish to make within a GitHub issue with the owners of this repository before making the change.
## Development ## Development
Hiddify Next uses [Flutter](https://flutter.dev) and [Go](https://go.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version: ### Adding Feature / Fix bug in Core:
Please follow our [Go Core Development repository](https://github.com/hiddify/hiddify-next-core/main/CONTRIBUTING.m).
### Working with the Flutter Code
Hiddify uses [Flutter](https://flutter.dev), make sure that you have the correct version installed before starting development. You can use the following commands to check your installed version:
```shell ```shell
$ flutter --version $ flutter --version
@@ -37,62 +42,31 @@ Flutter 3.13.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 367f9ea16b (4 weeks ago) • 2023-09-12 23:27:53 -0500 Framework • revision 367f9ea16b (4 weeks ago) • 2023-09-12 23:27:53 -0500
Engine • revision 9064459a8b Engine • revision 9064459a8b
Tools • Dart 3.1.2 • DevTools 2.25.0 Tools • Dart 3.1.2 • DevTools 2.25.0
$ go version
# example response
go version go1.21.1 darwin/arm64
``` ```
### Working with the Go Code
> if you're not interested in building/contributing to the Go code, you can skip this section
The Go code for Hiddify Next can be found in the `libcore` folder, as a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules) and in [core repository](https://github.com/hiddify/hiddify-next-core). The entrypoints for the desktop version are available in the [`libcore/custom`](https://github.com/hiddify/hiddify-next-core/tree/main/custom) folder and for the mobile version they can be found in the [`libcore/mobile`](https://github.com/hiddify/hiddify-next-core/tree/main/mobile) folder.
For the desktop version, we have to compile the Go code into a C shared library. We are providing a Makefile to generate the C shared libraries for all operating systems. The following Make commands will build libcore and copy the resulting output in [`libcore/bin`](https://github.com/hiddify/hiddify-next-core/tree/main/bin):
- `make windows-amd64`
- `make linux-amd64`
- `make macos-universal`
For the mobile version, we are using the [`gomobile`](https://github.com/golang/go/wiki/Mobile) tools. The following Make commands will build libcore for Android and iOS and copy the resulting output in [`libcore/bin`](https://github.com/hiddify/hiddify-next-core/tree/main/bin):
- `make android`
- `make ios`
### Working with the Flutter Code
We recommend using [Visual Studio Code](https://docs.flutter.dev/development/tools/vs-code) extensions for development. We recommend using [Visual Studio Code](https://docs.flutter.dev/development/tools/vs-code) extensions for development.
#### Setting up the Environment #### Setting up the Environment
We have extensive use of code generation in the form of [freezed](https://github.com/rrousselGit/freezed), [riverpod](https://github.com/rrousselGit/riverpod), etc. So it's generate these before running the code. Execute the following make commands in order: We have extensive use of code generation in the form of [freezed](https://github.com/rrousselGit/freezed), [riverpod](https://github.com/rrousselGit/riverpod), etc. So it's generate these before running the code. Execute the following make commands in order:
```shell
# fetch dependencies
$ make get
# generate translations
$ make translate
# fetch geo assets
$ make get-geo-assets
# generate dart code using build_runner
$ make gen
```
Assuming you have not built the `libcore` and want to use [existing releases](https://github.com/hiddify/hiddify-next-core/releases), you should run the following command (based on your target platform): Assuming you have not built the `libcore` and want to use [existing releases](https://github.com/hiddify/hiddify-next-core/releases), you should run the following command (based on your target platform):
- `make windows-libs`
- `make linux-libs`
- `make macos-libs`
- `make android-libs`
- `make ios-libs`
If you want to build the `libcore` from source, prefix the above command with `build-` like `make build-windows-libs`. - `make windows-prepare`
- `make linux-prepare`
- `make macos-prepare`
- `make ios-prepare`
- `make android-prepare`
##### build the `libcore` from source (Optional)
If you want to build the `libcore` from source after `make prepare`, use:
- `make build-windows-libs`
- `make build-linux-libs`
- `make build-macos-libs`
- `make build-ios-libs`
- `make build-android-libs`
#### Run Release Build on a Device #### Run Release Build on a Device
@@ -112,7 +86,9 @@ Chrome (web) • chrome • web-javascript • Google Chrome 117.0.5938.1
Then we can use one of the listed devices and execute the following command to build and run the app on this device: Then we can use one of the listed devices and execute the following command to build and run the app on this device:
```shell ```shell
flutter run --release --target lib/main_dev.dart --device-id=35492ae2 flutter run
# or
flutter run --device-id=35492ae2
``` ```
## Release ## Release
@@ -132,7 +108,6 @@ We need your collaboration in order to develop this project. If you have experie
- Flutter Developing - Flutter Developing
- Swift Developing - Swift Developing
- Kotlin Developing
- Go Developing - Go Developing
<div align=center> <div align=center>

125
Makefile
View File

@@ -1,14 +1,14 @@
include dependencies.properties include dependencies.properties
MKDIR := mkdir -p
RM := rm -rf
SEP :=/
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
MKDIR := -mkdir ifeq ($(IS_GITHUB_ACTIONS),)
RM := rmdir /s /q MKDIR := -mkdir
SEP:=\\ RM := rmdir /s /q
PLATFORM_REQ:= @set /p platform="Run 'make prepare platform=ios' or enter platform name:"; SEP:=\\
else endif
MKDIR := mkdir -p
RM := rm -rf
SEP :=/
PLATFORM_REQ:= @read -p "Run make prepare platform=ios or enter platform name: " platform;
endif endif
BINDIR=libcore$(SEP)bin BINDIR=libcore$(SEP)bin
@@ -19,17 +19,18 @@ GEO_ASSETS_DIR=assets$(SEP)core
CORE_PRODUCT_NAME=hiddify-core CORE_PRODUCT_NAME=hiddify-core
CORE_NAME=$(CORE_PRODUCT_NAME) CORE_NAME=$(CORE_PRODUCT_NAME)
LIB_NAME=libcore
SRV_NAME=HiddifyService SRV_NAME=HiddifyService
ifeq ($(CHANNEL),prod) ifeq ($(CHANNEL),prod)
CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version) CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version)
else else
CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft CORE_URL=https://github.com/hiddify/hiddify-next-core/releases/download/draft
endif endif
ifeq ($(CHANNEL),prod) ifeq ($(CHANNEL),prod)
TARGET=lib/main_prod.dart TARGET=lib/main_prod.dart
else else
TARGET=lib/main.dart TARGET=lib/main.dart
endif endif
BUILD_ARGS=--dart-define sentry_dsn=$(SENTRY_DSN) BUILD_ARGS=--dart-define sentry_dsn=$(SENTRY_DSN)
@@ -37,8 +38,6 @@ DISTRIBUTOR_ARGS=--skip-clean --build-target $(TARGET) --build-dart-define sentr
get: get:
flutter pub get flutter pub get
@@ -50,7 +49,7 @@ translate:
prepare: #get-geo-assets get gen translate prepare:
@echo use the following commands to prepare the library for each platform: @echo use the following commands to prepare the library for each platform:
@echo make android-prepare @echo make android-prepare
@echo make windows-prepare @echo make windows-prepare
@@ -62,11 +61,54 @@ windows-prepare: get-geo-assets get gen translate windows-libs
ios-prepare: get-geo-assets get gen translate ios-libs ios-prepare: get-geo-assets get gen translate ios-libs
macos-prepare: get-geo-assets get gen translate macos-libs macos-prepare: get-geo-assets get gen translate macos-libs
linux-prepare: get-geo-assets get gen translate linux-libs linux-prepare: get-geo-assets get gen translate linux-libs
linux-appimage-prepare:linux-prepare
linux-rpm-prepare:linux-prepare
linux-deb-prepare:linux-prepare
android-prepare: get-geo-assets get gen translate android-libs android-prepare: get-geo-assets get gen translate android-libs
android-apk-prepare:android-prepare
android-aab-prepare:android-prepare
macos-install-dependencies:
brew install create-dmg tree
npm install -g appdmg
dart pub global activate flutter_distributor
sync_translate: ios-install-dependencies:
echo "not yet implemented"
android-install-dependencies:
echo "nothing yet"
android-apk-install-dependencies: android-install-dependencies
android-aab-install-dependencies: android-install-dependencies
linux-install-dependencies:
if [ "$(flutter)" = "true" ]; then \
wget -O ~/Downloads/flutter_linux_3.16.9-stable.tar.xz https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.16.9-stable.tar.xz; \
mkdir -p ~/develop; \
cd ~/develop; \
tar xf ~/Downloads/flutter_linux_3.16.9-stable.tar.xz; \
export PATH="$$PATH:$$HOME/develop/flutter/bin"; \
echo 'export PATH="$$PATH:$$HOME/develop/flutter/bin"' >> ~/.bashrc; \
fi
PATH="$$PATH":"$$HOME/.pub-cache/bin"
echo 'export PATH="$$PATH:$$HOME/.pub-cache/bin"' >>~/.bashrc
sudo apt install -y clang ninja-build pkg-config cmake libgtk-3-dev locate ninja-build pkg-config libgtk-3-dev libglib2.0-dev libgio2.0-cil-dev libayatana-appindicator3-dev fuse rpm patchelf file appstream
sudo modprobe fuse
wget -O appimagetool "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage"
chmod +x appimagetool
sudo mv appimagetool /usr/local/bin/
dart pub global activate --source git https://github.com/hiddify/flutter_distributor --git-path packages/flutter_distributor
windows-install-dependencies:
dart pub global activate flutter_distributor
gen_translations: #generating missing translations using google translate
cd .github && bash sync_translate.sh cd .github && bash sync_translate.sh
make translate make translate
@@ -81,20 +123,13 @@ android-aab-release:
ls -R build/app/outputs ls -R build/app/outputs
windows-release: windows-release:
flutter_distributor package --platform windows --targets exe $(DISTRIBUTOR_ARGS) flutter_distributor package --flutter-build-args=verbose --platform windows --targets exe $(DISTRIBUTOR_ARGS)
linux-release: linux-appimage-release linux-deb-release linux-rpm-release
linux-appimage-release:
flutter_distributor package --platform linux --targets appimage $(DISTRIBUTOR_ARGS)
linux-deb-release:
flutter_distributor package --platform linux --targets deb $(DISTRIBUTOR_ARGS)
linux-rpm-release:
flutter_distributor package --platform linux --targets rpm $(DISTRIBUTOR_ARGS)
linux-release:
flutter_distributor package --platform linux --targets deb,rpm,appimage $(DISTRIBUTOR_ARGS)
macos-release: macos-release:
flutter_distributor package --platform macos --targets dmg $(DISTRIBUTOR_ARGS) flutter_distributor package --platform macos --targets dmg,pkg $(DISTRIBUTOR_ARGS)
ios-release: #not tested ios-release: #not tested
flutter_distributor package --platform ios --targets ipa --build-export-options-plist ios/exportOptions.plist $(DISTRIBUTOR_ARGS) flutter_distributor package --platform ios --targets ipa --build-export-options-plist ios/exportOptions.plist $(DISTRIBUTOR_ARGS)
@@ -107,25 +142,22 @@ android-apk-libs: android-libs
android-aab-libs: android-libs android-aab-libs: android-libs
windows-libs: windows-libs:
@$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... $(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping...
curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ curl -L $(CORE_URL)/$(CORE_NAME)-windows-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)$(SEP)
ls $(DESKTOP_OUT) || dir $(DESKTOP_OUT)$(SEP)
linux-libs: linux-libs:
@$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... mkdir -p $(DESKTOP_OUT)
curl -L $(CORE_URL)/$(CORE_NAME)-linux-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/ curl -L $(CORE_URL)/$(CORE_NAME)-linux-amd64.tar.gz | tar xz -C $(DESKTOP_OUT)/
linux-deb-libs:linux-libs
linux-rpm-libs:linux-libs
linux-appimage-libs:linux-libs
macos-libs: macos-libs:
@$(MKDIR) $(DESKTOP_OUT) || echo Folder already exists. Skipping... mkdir -p $(DESKTOP_OUT)
curl -L $(CORE_URL)/$(CORE_NAME)-macos-universal.tar.gz | tar xz -C $(DESKTOP_OUT) curl -L $(CORE_URL)/$(CORE_NAME)-macos-universal.tar.gz | tar xz -C $(DESKTOP_OUT)
ios-libs: #not tested ios-libs: #not tested
@$(MKDIR) $(IOS_OUT) || echo Folder already exists. Skipping... mkdir -p $(IOS_OUT)
@$(RM) $(IOS_OUT)/Libcore.xcframework rm -rf $(IOS_OUT)/Libcore.xcframework
curl -L $(CORE_URL)/$(CORE_NAME)-ios.tar.gz | tar xz -C "$(IOS_OUT)" curl -L $(CORE_URL)/$(CORE_NAME)-ios.tar.gz | tar xz -C "$(IOS_OUT)"
get-geo-assets: get-geo-assets:
@@ -137,34 +169,29 @@ build-headers:
build-android-libs: build-android-libs:
make -C libcore -f Makefile android make -C libcore -f Makefile android
mv $(BINDIR)/$(CORE_NAME).aar $(ANDROID_OUT)/ mv $(BINDIR)/$(LIB_NAME).aar $(ANDROID_OUT)/
build-windows-libs: build-windows-libs:
make -C libcore -f Makefile windows-amd64 make -C libcore -f Makefile windows-amd64
mv $(BINDIR)/$(CORE_NAME).dll $(DESKTOP_OUT)/
mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/
build-linux-libs: build-linux-libs:
make -C libcore -f Makefile linux-amd64 make -C libcore -f Makefile linux-amd64
mv $(BINDIR)/$(CORE_NAME).so $(DESKTOP_OUT)/
mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/
build-macos-libs: build-macos-libs:
make -C libcore -f Makefile macos-universal make -C libcore -f Makefile macos-universal
mv $(BINDIR)/$(CORE_NAME).dylib $(DESKTOP_OUT)/
mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/ mv $(BINDIR)/$(SRV_NAME) $(DESKTOP_OUT)/
build-ios-libs: build-ios-libs:
@$(RM) $(IOS_OUT)/Libcore.xcframework && \ rf -rf $(IOS_OUT)/Libcore.xcframework
make -C libcore -f Makefile ios && \ make -C libcore -f Makefile ios
mv $(BINDIR)/$(CORE_NAME)-ios.xcframework $(IOS_OUT)/Libcore.xcframework mv $(BINDIR)/Libcore.xcframework $(IOS_OUT)/Libcore.xcframework
release: # Create a new tag for release. release: # Create a new tag for release.
@echo "previous version was $$(git describe --tags $$(git rev-list --tags --max-count=1))" @echo "previous version was $$(git describe --tags $$(git rev-list --tags --max-count=1))"
@echo "WARNING: This operation will creates version tag and push to github" @echo "WARNING: This operation will creates version tag and push to github"
@bash -c '\ @bash -c '\
[ "404" == $$(curl -I -s -w "%{http_code}" https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version)/hiddify-libcore-windows-amd64.h.gz -o /dev/null) ]&&{ echo "Core Not Found"; exit 1 ; };\ [ "404" == $$(curl -I -s -w "%{http_code}" https://github.com/hiddify/hiddify-next-core/releases/download/v$(core.version)/hiddify-core-linux-amd64.tar.gz -o /dev/null) ]&&{ echo "Core Not Found"; exit 1 ; };\
cversion_string=`grep -e "^version:" pubspec.yaml | cut -d: -f2-`; \ cversion_string=`grep -e "^version:" pubspec.yaml | cut -d: -f2-`; \
cstr_version=`echo "$${cversion_string}" | sed -n "s/[ ]*\\([0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\)+.*/\\1/p"`; \ cstr_version=`echo "$${cversion_string}" | sed -n "s/[ ]*\\([0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\)+.*/\\1/p"`; \
cbuild_number=`echo "$${cversion_string}" | sed -n "s/.*+\\([0-9]\\+\\)/\\1/p"`; \ cbuild_number=`echo "$${cversion_string}" | sed -n "s/.*+\\([0-9]\\+\\)/\\1/p"`; \
@@ -190,7 +217,7 @@ release: # Create a new tag for release.
ios-temp-prepare: ios-temp-prepare:
make prepare platform=ios make ios-prepare
flutter build ios-framework flutter build ios-framework
cd ios cd ios
pod install pod install

View File

@@ -3,9 +3,10 @@
[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**简体中文 🇨🇳**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**日本語 🇯🇵**](README_ja.md) [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**简体中文 🇨🇳**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**日本語 🇯🇵**](README_ja.md)
</div> </div>
<br>
<p align="center"><img src="assets/images/logo.svg" width="168"/></p> <p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
<br>
<div align="center"> <div align="center">
@@ -23,7 +24,7 @@
## What is Hiddify-Next? ## What is Hiddify-Next?
<p dir="ltr" style="font-size: 16px">A multi-platform proxy client based on <a href="https://github.com/SagerNet/sing-box">Sing-box</a> universal proxy tool-chain. Hiddify Next offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify Next is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet.</p> <p dir="ltr" style="font-size: 16px">A multi-platform proxy client based on <a href="https://github.com/SagerNet/sing-box">Sing-box</a> universal proxy tool-chain. Hiddify offers a wide range of capabilities, like automatic node selection, TUN mode, remote profiles etc. Hiddify is ad-free and open-source. With support for a wide range of protocols, it provides a secure and private way for accessing free internet.</p>
<div align=center> <div align=center>
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2"> <img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
@@ -144,7 +145,7 @@ We also need financial support for our services. All of our activities are done
## 👩‍🏫 Collaboration and Contact Information ## 👩‍🏫 Collaboration and Contact Information
Hiddify Next is a community driven project. If you're interested in contributing, please read the [contribution guidelines](./CONTRIBUTING.md). We would specially appreciate any help we can get in these areas: **Flutter, Go, iOS development (Swift), Android development (Kotlin).** Hiddify is a community driven project. If you're interested in contributing, please read the [contribution guidelines](./CONTRIBUTING.md). We would specially appreciate any help we can get in these areas: **Flutter, Go, iOS development (Swift), Android development (Kotlin).**
<div align=center> <div align=center>

View File

@@ -3,8 +3,10 @@
[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**English 🇺🇸**](README.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**日本語 🇯🇵**](README_ja.md) [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**English 🇺🇸**](README.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**日本語 🇯🇵**](README_ja.md)
</div> </div>
<br>
<p align="center"><img src="assets/images/logo.svg" width="168"/></p> <p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
<br>
<div align="center"> <div align="center">
@@ -18,7 +20,7 @@
## Hiddify-Next 是什么? ## Hiddify-Next 是什么?
<p dir="ltr" style="font-size: 16px">一款基于 <a href="https://github.com/SagerNet/sing-box">Sing-box</a> 通用代理工具的跨平台代理客户端。Hiddify Next 提供了较全面的代理功能例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify Next 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。</p> <p dir="ltr" style="font-size: 16px">一款基于 <a href="https://github.com/SagerNet/sing-box">Sing-box</a> 通用代理工具的跨平台代理客户端。Hiddify 提供了较全面的代理功能例如自动选择节点、TUN 模式、使用远程配置文件等。Hiddify 无广告,并且代码开源。它为大家自由访问互联网提供了一个支持多种协议的、安全且私密的工具。</p>
<div align=center> <div align=center>
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2"> <img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
@@ -138,7 +140,7 @@
## 👩‍🏫 合作及联系信息 ## 👩‍🏫 合作及联系信息
Hiddify Next 是一个由社区驱动的项目。如果您有兴趣为本项目做出贡献,请阅读 [贡献指南](./CONTRIBUTING.md)。我们将非常感谢您如果您能够在以下领域提供任何帮助Flutter、Go、iOS 开发 (Swift)、Android 开发 (Kotlin)。 Hiddify 是一个由社区驱动的项目。如果您有兴趣为本项目做出贡献,请阅读 [贡献指南](./CONTRIBUTING.md)。我们将非常感谢您如果您能够在以下领域提供任何帮助Flutter、Go、iOS 开发 (Swift)、Android 开发 (Kotlin)。
<div align=center> <div align=center>

View File

@@ -1,10 +1,12 @@
<div align="left" markdown="1" dir="ltr"> <div align="left" markdown="1" dir="ltr">
[**🇺🇸 English**](README.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**🇨🇳 简体中文**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**🇷🇺 Русский**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**日本語 🇯🇵**](README_ja.md) [**🇺🇸 English**](README.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**🇨🇳 简体中文**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**🇷🇺 Русский**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**🇯🇵 日本語**](README_ja.md)
</div> </div>
<br>
<p align="center"><img src="assets/images/logo.svg" width="168"/></p> <p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
<br>
<div align="center"> <div align="center">

View File

@@ -3,9 +3,10 @@
[**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**简体中文 🇨🇳**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**English 🇺🇸**](README.md) [**![Lang_farsi](https://user-images.githubusercontent.com/125398461/234186932-52f1fa82-52c6-417f-8b37-08fe9250a55f.png) فارسی**](README_fa.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**Русский 🇷🇺**](README_ru.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**简体中文 🇨🇳**](README_cn.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[**English 🇺🇸**](README.md)
</div> </div>
<br>
<p align="center"><img src="assets/images/logo.svg" width="168"/></p> <p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
<br>
<div align="center"> <div align="center">
@@ -23,7 +24,7 @@
## Hiddify-Next とは? ## Hiddify-Next とは?
<p dir="ltr" style="font-size: 16px"><a href="https://github.com/SagerNet/sing-box">Sing-box</a> ユニバーサルプロキシツールチェーンに基づくマルチプラットフォームプロキシクライアントです。Hiddify Next は、自動ード選択、TUN モード、リモートプロファイルなど、幅広い機能を提供します。Hiddify Next は無料でオープンソースです。幅広いプロトコルをサポートし、無料インターネットにアクセスするための安全でプライベートな方法を提供します。</p> <p dir="ltr" style="font-size: 16px"><a href="https://github.com/SagerNet/sing-box">Sing-box</a> ユニバーサルプロキシツールチェーンに基づくマルチプラットフォームプロキシクライアントです。Hiddify は、自動ード選択、TUN モード、リモートプロファイルなど、幅広い機能を提供します。Hiddify は無料でオープンソースです。幅広いプロトコルをサポートし、無料インターネットにアクセスするための安全でプライベートな方法を提供します。</p>
<div align=center> <div align=center>
<img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2"> <img width=90% alt="English Demo" src="https://github.com/hiddify/hiddify-next/assets/125398461/ffe5346d-3404-470f-b5e0-4364e23743d2">
@@ -144,7 +145,7 @@ Vless、Vmess、Reality、TUIC、Hysteria、SSHなど。
## 👩‍🏫 コラボレーションおよび連絡先 ## 👩‍🏫 コラボレーションおよび連絡先
Hiddify Next はコミュニティドリブンのプロジェクトです。コントリビュートすることに興味がある方は、[コントリビューションガイドライン](./CONTRIBUTING.md)をお読みください。私たちは特に以下の分野において、どのような協力でもいただけるとありがたいです: **Flutter、Go、iOS開発Swift、Androi d開発Kotlin** Hiddify はコミュニティドリブンのプロジェクトです。コントリビュートすることに興味がある方は、[コントリビューションガイドライン](./CONTRIBUTING.md)をお読みください。私たちは特に以下の分野において、どのような協力でもいただけるとありがたいです: **Flutter、Go、iOS開発Swift、Androi d開発Kotlin**
<div align=center> <div align=center>

View File

@@ -5,8 +5,10 @@
[**日本語 🇯🇵**](README_ja.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [**日本語 🇯🇵**](README_ja.md)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</div> </div>
<br>
<p align="center"><img src="assets/images/logo.svg" width="168"/></p> <p align="center"><img src="https://github.com/hiddify/hiddify-next/assets/125398461/d821cfe0-b4c4-441f-be4e-eb9209f59542" /></p>
<br>
<div align="center"> <div align="center">

11
android/.stignore Normal file
View File

@@ -0,0 +1,11 @@
gradle-wrapper.jar
.gradle
captures/
gradlew
gradlew.bat
local.properties
GeneratedPluginRegistrant.java
key.properties
**.keystore
**.jks

View File

@@ -22,9 +22,9 @@
<application <application
android:name=".Application" android:name=".Application"
android:banner="@mipmap/ic_launcher_banner" android:banner="@mipmap/ic_banner"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="Hiddify Next" android:label="Hiddify"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
tools:targetApi="31"> tools:targetApi="31">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -0,0 +1,60 @@
package com.hiddify.hiddify
import android.util.Log
import com.google.gson.Gson
import com.hiddify.hiddify.utils.CommandClient
import com.hiddify.hiddify.utils.ParsedOutboundGroup
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.EventChannel
import io.nekohasekai.libbox.OutboundGroup
import kotlinx.coroutines.CoroutineScope
class ActiveGroupsChannel(private val scope: CoroutineScope) : FlutterPlugin,
CommandClient.Handler {
companion object {
const val TAG = "A/ActiveGroupsChannel"
const val CHANNEL = "com.hiddify.app/active-groups"
val gson = Gson()
}
private val client =
CommandClient(scope, CommandClient.ConnectionType.GroupOnly, this)
private var channel: EventChannel? = null
private var event: EventChannel.EventSink? = null
override fun updateGroups(groups: List<OutboundGroup>) {
MainActivity.instance.runOnUiThread {
val parsedGroups = groups.map { group -> ParsedOutboundGroup.fromOutbound(group) }
event?.success(gson.toJson(parsedGroups))
}
}
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
channel = EventChannel(
flutterPluginBinding.binaryMessenger,
CHANNEL
)
channel!!.setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
event = events
Log.d(TAG, "connecting active groups command client")
client.connect()
}
override fun onCancel(arguments: Any?) {
event = null
Log.d(TAG, "disconnecting active groups command client")
client.disconnect()
}
})
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
event = null
client.disconnect()
channel?.setStreamHandler(null)
}
}

View File

@@ -2,85 +2,57 @@ package com.hiddify.hiddify
import android.util.Log import android.util.Log
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.annotations.SerializedName
import com.hiddify.hiddify.utils.CommandClient import com.hiddify.hiddify.utils.CommandClient
import com.hiddify.hiddify.utils.ParsedOutboundGroup
import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel
import io.nekohasekai.libbox.OutboundGroup import io.nekohasekai.libbox.OutboundGroup
import io.nekohasekai.libbox.OutboundGroupItem
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler { class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler {
companion object { companion object {
const val TAG = "A/GroupsChannel" const val TAG = "A/GroupsChannel"
const val GROUP_CHANNEL = "com.hiddify.app/groups" const val CHANNEL = "com.hiddify.app/groups"
val gson = Gson() val gson = Gson()
} }
private val commandClient = private val client =
CommandClient(scope, CommandClient.ConnectionType.Groups, this) CommandClient(scope, CommandClient.ConnectionType.Groups, this)
private var groupsChannel: EventChannel? = null private var channel: EventChannel? = null
private var event: EventChannel.EventSink? = null
private var groupsEvent: EventChannel.EventSink? = null
override fun updateGroups(groups: List<OutboundGroup>) { override fun updateGroups(groups: List<OutboundGroup>) {
MainActivity.instance.runOnUiThread { MainActivity.instance.runOnUiThread {
val kGroups = groups.map { group -> KOutboundGroup.fromOutbound(group) } val parsedGroups = groups.map { group -> ParsedOutboundGroup.fromOutbound(group) }
groupsEvent?.success(gson.toJson(kGroups)) event?.success(gson.toJson(parsedGroups))
} }
} }
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
groupsChannel = EventChannel( channel = EventChannel(
flutterPluginBinding.binaryMessenger, flutterPluginBinding.binaryMessenger,
GROUP_CHANNEL CHANNEL
) )
groupsChannel!!.setStreamHandler(object : EventChannel.StreamHandler { channel!!.setStreamHandler(object : EventChannel.StreamHandler {
override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
groupsEvent = events event = events
Log.d(TAG, "connecting groups command client") Log.d(TAG, "connecting groups command client")
commandClient.connect() client.connect()
} }
override fun onCancel(arguments: Any?) { override fun onCancel(arguments: Any?) {
groupsEvent = null event = null
Log.d(TAG, "disconnecting groups command client") Log.d(TAG, "disconnecting groups command client")
commandClient.disconnect() client.disconnect()
} }
}) })
} }
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
groupsEvent = null event = null
commandClient.disconnect() client.disconnect()
groupsChannel?.setStreamHandler(null) channel?.setStreamHandler(null)
}
data class KOutboundGroup(
@SerializedName("tag") val tag: String,
@SerializedName("type") val type: String,
@SerializedName("selected") val selected: String,
@SerializedName("items") val items: List<KOutboundGroupItem>
) {
companion object {
fun fromOutbound(group: OutboundGroup): KOutboundGroup {
val outboundItems = group.items
val items = mutableListOf<KOutboundGroupItem>()
while (outboundItems.hasNext()) {
items.add(KOutboundGroupItem(outboundItems.next()))
}
return KOutboundGroup(group.tag, group.type, group.selected, items)
}
}
}
data class KOutboundGroupItem(
@SerializedName("tag") val tag: String,
@SerializedName("type") val type: String,
@SerializedName("url-test-delay") val urlTestDelay: Int,
) {
constructor(item: OutboundGroupItem) : this(item.tag, item.type, item.urlTestDelay)
} }
} }

View File

@@ -49,6 +49,7 @@ class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback {
flutterEngine.plugins.add(EventHandler()) flutterEngine.plugins.add(EventHandler())
flutterEngine.plugins.add(LogHandler()) flutterEngine.plugins.add(LogHandler())
flutterEngine.plugins.add(GroupsChannel(lifecycleScope)) flutterEngine.plugins.add(GroupsChannel(lifecycleScope))
flutterEngine.plugins.add(ActiveGroupsChannel(lifecycleScope))
flutterEngine.plugins.add(StatsChannel(lifecycleScope)) flutterEngine.plugins.add(StatsChannel(lifecycleScope))
} }

View File

@@ -92,7 +92,7 @@ object Settings {
} }
} }
private var currentServiceMode = ServiceMode.NORMAL; private var currentServiceMode : String? = null
suspend fun rebuildServiceMode(): Boolean { suspend fun rebuildServiceMode(): Boolean {
var newMode = ServiceMode.NORMAL var newMode = ServiceMode.NORMAL

View File

@@ -14,6 +14,7 @@ import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.hiddify.hiddify.Application import com.hiddify.hiddify.Application
import com.hiddify.hiddify.R
import com.hiddify.hiddify.Settings import com.hiddify.hiddify.Settings
import com.hiddify.hiddify.constant.Action import com.hiddify.hiddify.constant.Action
import com.hiddify.hiddify.constant.Alert import com.hiddify.hiddify.constant.Alert
@@ -140,6 +141,9 @@ class BoxService(
private suspend fun startService(delayStart: Boolean = false) { private suspend fun startService(delayStart: Boolean = false) {
try { try {
Log.d(TAG, "starting service") Log.d(TAG, "starting service")
withContext(Dispatchers.Main) {
notification.show(activeProfileName, R.string.status_starting)
}
val selectedConfigPath = Settings.activeConfigPath val selectedConfigPath = Settings.activeConfigPath
if (selectedConfigPath.isBlank()) { if (selectedConfigPath.isBlank()) {
@@ -168,6 +172,7 @@ class BoxService(
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
notification.show(activeProfileName, R.string.status_starting)
binder.broadcast { binder.broadcast {
it.onServiceResetLogs(listOf()) it.onServiceResetLogs(listOf())
} }
@@ -194,8 +199,9 @@ class BoxService(
status.postValue(Status.Started) status.postValue(Status.Started)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
notification.show(activeProfileName) notification.show(activeProfileName, R.string.status_started)
} }
notification.start()
} catch (e: Exception) { } catch (e: Exception) {
stopAndAlert(Alert.StartService, e.message) stopAndAlert(Alert.StartService, e.message)
return return

View File

@@ -9,6 +9,7 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.os.Build import android.os.Build
import androidx.annotation.StringRes
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.ServiceCompat import androidx.core.app.ServiceCompat
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
@@ -50,7 +51,7 @@ class ServiceNotification(private val status: MutableLiveData<Status>, private v
NotificationCompat.Builder(service, notificationChannel) NotificationCompat.Builder(service, notificationChannel)
.setShowWhen(false) .setShowWhen(false)
.setOngoing(true) .setOngoing(true)
.setContentTitle("Hiddify Next") .setContentTitle("Hiddify")
.setOnlyAlertOnce(true) .setOnlyAlertOnce(true)
.setSmallIcon(R.drawable.ic_stat_logo) .setSmallIcon(R.drawable.ic_stat_logo)
.setCategory(NotificationCompat.CATEGORY_SERVICE) .setCategory(NotificationCompat.CATEGORY_SERVICE)
@@ -79,25 +80,27 @@ class ServiceNotification(private val status: MutableLiveData<Status>, private v
} }
} }
suspend fun show(profileName: String) { fun show(profileName: String, @StringRes contentTextId: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Application.notification.createNotificationChannel( Application.notification.createNotificationChannel(
NotificationChannel( NotificationChannel(
notificationChannel, "hiddify service", NotificationManager.IMPORTANCE_LOW notificationChannel, "hiddify service", NotificationManager.IMPORTANCE_LOW
) )
) )
} }
service.startForeground( service.startForeground(
notificationId, notificationBuilder notificationId, notificationBuilder
.setContentTitle(profileName.takeIf { it.isNotBlank() } ?: "Hiddify Next") .setContentTitle(profileName.takeIf { it.isNotBlank() } ?: "Hiddify")
.setContentText("service started").build() .setContentText(service.getString(contentTextId)).build()
) )
withContext(Dispatchers.IO) { }
if (Settings.dynamicNotification) {
commandClient.connect()
withContext(Dispatchers.Main) { suspend fun start() {
registerReceiver() if (Settings.dynamicNotification) {
} commandClient.connect()
withContext(Dispatchers.Main) {
registerReceiver()
} }
} }
} }

View File

@@ -165,19 +165,14 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
} }
} }
if (options.isHTTPProxyEnabled) { if (options.isHTTPProxyEnabled && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
systemProxyAvailable = true systemProxyAvailable = true
systemProxyEnabled = Settings.systemProxyEnabled systemProxyEnabled = Settings.systemProxyEnabled
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (systemProxyEnabled) builder.setHttpProxy(
if (systemProxyEnabled) builder.setHttpProxy( ProxyInfo.buildDirectProxy(
ProxyInfo.buildDirectProxy( options.httpProxyServer, options.httpProxyServerPort
options.httpProxyServer,
options.httpProxyServerPort
)
) )
} else { )
error("android: tun.platform.http_proxy requires android 10 or higher")
}
} else { } else {
systemProxyAvailable = false systemProxyAvailable = false
systemProxyEnabled = false systemProxyEnabled = false

View File

@@ -23,7 +23,7 @@ open class CommandClient(
) { ) {
enum class ConnectionType { enum class ConnectionType {
Status, Groups, Log, ClashMode Status, Groups, Log, ClashMode, GroupOnly
} }
interface Handler { interface Handler {
@@ -50,6 +50,7 @@ open class CommandClient(
ConnectionType.Groups -> Libbox.CommandGroup ConnectionType.Groups -> Libbox.CommandGroup
ConnectionType.Log -> Libbox.CommandLog ConnectionType.Log -> Libbox.CommandLog
ConnectionType.ClashMode -> Libbox.CommandClashMode ConnectionType.ClashMode -> Libbox.CommandClashMode
ConnectionType.GroupOnly -> Libbox.CommandGroupInfoOnly
} }
options.statusInterval = 2 * 1000 * 1000 * 1000 options.statusInterval = 2 * 1000 * 1000 * 1000
val commandClient = CommandClient(clientHandler, options) val commandClient = CommandClient(clientHandler, options)

View File

@@ -0,0 +1,31 @@
package com.hiddify.hiddify.utils
import com.google.gson.annotations.SerializedName
import io.nekohasekai.libbox.OutboundGroup
import io.nekohasekai.libbox.OutboundGroupItem
data class ParsedOutboundGroup(
@SerializedName("tag") val tag: String,
@SerializedName("type") val type: String,
@SerializedName("selected") val selected: String,
@SerializedName("items") val items: List<ParsedOutboundGroupItem>
) {
companion object {
fun fromOutbound(group: OutboundGroup): ParsedOutboundGroup {
val outboundItems = group.items
val items = mutableListOf<ParsedOutboundGroupItem>()
while (outboundItems.hasNext()) {
items.add(ParsedOutboundGroupItem(outboundItems.next()))
}
return ParsedOutboundGroup(group.tag, group.type, group.selected, items)
}
}
}
data class ParsedOutboundGroupItem(
@SerializedName("tag") val tag: String,
@SerializedName("type") val type: String,
@SerializedName("url-test-delay") val urlTestDelay: Int,
) {
constructor(item: OutboundGroupItem) : this(item.tag, item.type, item.urlTestDelay)
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,29 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="2048"
android:viewportHeight="2048">
<group android:scaleX="0.85"
android:scaleY="0.85"
android:translateX="153.6"
android:translateY="153.6">
<group>
<clip-path
android:pathData="M645,608h795v795h-795z"/>
<path
android:pathData="M1230.8,787.2C1230.8,779.9 1234.6,773.1 1240.9,769.3L1408.3,668.9C1422.3,660.5 1440,670.5 1440,686.8V859C1440,870.6 1430.6,880 1419.1,880H1251.7C1240.2,880 1230.8,870.6 1230.8,859V787.2Z"
android:fillColor="#455FE9"/>
<path
android:pathData="M937.9,954.6C937.9,947.3 941.8,940.4 948.1,936.7L1115.4,836.2C1129.4,827.9 1147.1,837.9 1147.1,854.2V1152V1172.9V1361.2C1147.1,1372.7 1137.7,1382.1 1126.2,1382.1H958.8C947.3,1382.1 937.9,1372.7 937.9,1361.2V1172.9V1152V954.6ZM655.2,1124.9C648.9,1128.7 645,1135.6 645,1142.9V1361.2C645,1372.7 654.4,1382.1 665.9,1382.1H833.3C844.8,1382.1 854.2,1372.7 854.2,1361.2V1042.5C854.2,1026.2 836.5,1016.2 822.5,1024.5L655.2,1124.9Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M854.2,1172.9H728.7V1340.3H854.2V1298.4C854.2,1286.9 863.6,1277.5 875.1,1277.5H917C928.5,1277.5 937.9,1286.9 937.9,1298.4V1340.3H1105.3V1172.9H937.9V1214.7C937.9,1226.3 928.5,1235.6 917,1235.6H875.1C863.6,1235.6 854.2,1226.3 854.2,1214.7V1172.9Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M1230.8,942.8V1361.2C1230.8,1372.7 1240.2,1382.1 1251.7,1382.1H1419.1C1430.6,1382.1 1440,1372.7 1440,1361.2V942.8C1440,931.2 1430.6,921.8 1419.1,921.8H1251.7C1240.2,921.8 1230.8,931.2 1230.8,942.8Z"
android:fillColor="#455FE9"/>
</group>
</group>
</vector>

View File

@@ -0,0 +1,53 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="640dp"
android:height="360dp"
android:viewportWidth="640"
android:viewportHeight="360">
<group android:scaleX="0.6666667"
android:scaleY="0.6666667"
android:translateX="110"
android:translateY="65">
<group>
<clip-path
android:pathData="M60,115.28h114.5v113.28h-114.5z"/>
<path
android:pathData="M144.37,140.82C144.37,139.77 144.92,138.8 145.83,138.26L169.93,123.95C171.94,122.76 174.49,124.19 174.49,126.51V151.05C174.49,152.7 173.15,154.03 171.48,154.03H147.38C145.71,154.03 144.37,152.7 144.37,151.05V140.82Z"
android:fillColor="#455FE9"/>
<path
android:pathData="M102.18,164.67C102.18,163.62 102.74,162.65 103.64,162.11L127.75,147.8C129.76,146.61 132.31,148.04 132.31,150.36V192.79V195.77V222.6C132.31,224.25 130.96,225.58 129.3,225.58H105.2C103.53,225.58 102.18,224.25 102.18,222.6V195.77V192.79V164.67ZM61.46,188.94C60.56,189.48 60,190.45 60,191.5V222.6C60,224.25 61.35,225.58 63.01,225.58H87.12C88.78,225.58 90.13,224.25 90.13,222.6V177.19C90.13,174.87 87.58,173.44 85.57,174.63L61.46,188.94Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M90.13,195.77H72.05V219.62H90.13V213.66C90.13,212.01 91.48,210.68 93.14,210.68H99.17C100.83,210.68 102.18,212.01 102.18,213.66V219.62H126.29V195.77H102.18V201.73C102.18,203.38 100.83,204.71 99.17,204.71H93.14C91.48,204.71 90.13,203.38 90.13,201.73V195.77Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M144.37,162.98V222.6C144.37,224.25 145.71,225.58 147.38,225.58H171.48C173.15,225.58 174.49,224.25 174.49,222.6V162.98C174.49,161.33 173.15,160 171.48,160H147.38C145.71,160 144.37,161.33 144.37,162.98Z"
android:fillColor="#455FE9"/>
</group>
<path
android:pathData="M536.46,237.06C531.61,237.06 528.04,235.92 525.75,233.66C523.5,231.43 522.38,227.88 522.38,223.01C522.38,221.42 523.18,220.63 524.78,220.63C526.38,220.63 527.18,221.42 527.18,223.01C527.18,226.56 527.85,228.99 529.19,230.32C530.56,231.64 532.98,232.3 536.46,232.3H555.46C558.97,232.3 561.4,231.64 562.73,230.32C564.07,228.99 564.74,226.56 564.74,223.01V207.04C562.64,209.68 559.89,211.59 556.49,212.76C553.14,213.93 549.13,214.51 544.47,214.51H542.07C535.2,214.51 530.2,212.97 527.07,209.87C523.94,206.77 522.38,201.86 522.38,195.14V164.44C522.38,162.86 523.18,162.07 524.78,162.07C526.38,162.07 527.18,162.86 527.18,164.44V195.14C527.18,200.58 528.27,204.38 530.45,206.53C532.66,208.68 536.53,209.76 542.07,209.76H544.47C551.3,209.76 556.38,208.55 559.7,206.13C563.06,203.68 564.74,200.01 564.74,195.14V164.44C564.74,162.86 565.54,162.07 567.14,162.07C568.75,162.07 569.55,162.86 569.55,164.44V223.01C569.55,227.88 568.42,231.43 566.17,233.66C563.92,235.92 560.35,237.06 555.46,237.06H536.46Z"
android:fillColor="#495057"/>
<path
android:pathData="M491.05,214.4C489.45,214.4 488.64,213.61 488.64,212.02V166.94H483.61C482,166.94 481.2,166.15 481.2,164.56C481.2,162.97 482,162.18 483.61,162.18H488.64V155.72C488.64,148.93 490.21,143.98 493.34,140.88C496.47,137.79 501.47,136.24 508.34,136.24C510.02,136.24 510.86,137.03 510.86,138.62C510.86,140.2 510.02,141 508.34,141C502.84,141 498.99,142.09 496.77,144.28C494.56,146.47 493.45,150.29 493.45,155.72V162.18H508.45C510.05,162.18 510.86,162.97 510.86,164.56C510.86,166.15 510.05,166.94 508.45,166.94H493.45V212.02C493.45,213.61 492.65,214.4 491.05,214.4Z"
android:fillColor="#495057"/>
<path
android:pathData="M463.89,151.53C461.6,151.53 460.46,150.36 460.46,148.02V145.7C460.46,143.43 461.6,142.3 463.89,142.3H466.24C468.49,142.3 469.62,143.43 469.62,145.7V148.02C469.62,150.36 468.49,151.53 466.24,151.53H463.89ZM465.1,214.4C463.49,214.4 462.69,213.61 462.69,212.02V164.56C462.69,162.97 463.49,162.18 465.1,162.18C466.7,162.18 467.5,162.97 467.5,164.56V212.02C467.5,213.61 466.7,214.4 465.1,214.4Z"
android:fillColor="#495057"/>
<path
android:pathData="M413.71,214.4C406.73,214.4 401.63,212.84 398.43,209.7C395.26,206.53 393.68,201.49 393.68,194.58V182C393.68,175.09 395.26,170.07 398.43,166.94C401.63,163.77 406.73,162.18 413.71,162.18H438.33V138.62C438.33,137.03 439.13,136.24 440.73,136.24C442.34,136.24 443.14,137.03 443.14,138.62V212.02C443.14,213.61 442.34,214.4 440.73,214.4C439.13,214.4 438.33,213.61 438.33,212.02V205.79C436.73,208.63 434.28,210.78 431,212.25C427.76,213.68 423.45,214.4 418.06,214.4H413.71ZM413.71,209.64H418.06C424.32,209.64 429.27,208.63 432.89,206.59C436.52,204.51 438.33,201.41 438.33,197.3V166.94H413.71C408.1,166.94 404.15,168.07 401.86,170.34C399.61,172.56 398.48,176.45 398.48,182V194.58C398.48,200.13 399.61,204.04 401.86,206.3C404.15,208.53 408.1,209.64 413.71,209.64Z"
android:fillColor="#495057"/>
<path
android:pathData="M345.84,214.4C338.86,214.4 333.76,212.84 330.56,209.7C327.39,206.53 325.81,201.49 325.81,194.58V182C325.81,175.09 327.39,170.07 330.56,166.94C333.76,163.77 338.86,162.18 345.84,162.18H370.46V138.62C370.46,137.03 371.26,136.24 372.86,136.24C374.47,136.24 375.27,137.03 375.27,138.62V212.02C375.27,213.61 374.47,214.4 372.86,214.4C371.26,214.4 370.46,213.61 370.46,212.02V205.79C368.86,208.63 366.41,210.78 363.13,212.25C359.89,213.68 355.58,214.4 350.19,214.4H345.84ZM345.84,209.64H350.19C356.45,209.64 361.39,208.63 365.02,206.59C368.65,204.51 370.46,201.41 370.46,197.3V166.94H345.84C340.23,166.94 336.28,168.07 333.99,170.34C331.74,172.56 330.61,176.45 330.61,182V194.58C330.61,200.13 331.74,204.04 333.99,206.3C336.28,208.53 340.23,209.64 345.84,209.64Z"
android:fillColor="#495057"/>
<path
android:pathData="M302.77,151.53C300.48,151.53 299.34,150.36 299.34,148.02V145.7C299.34,143.43 300.48,142.3 302.77,142.3H305.12C307.37,142.3 308.5,143.43 308.5,145.7V148.02C308.5,150.36 307.37,151.53 305.12,151.53H302.77ZM303.97,214.4C302.37,214.4 301.57,213.61 301.57,212.02V164.56C301.57,162.97 302.37,162.18 303.97,162.18C305.58,162.18 306.38,162.97 306.38,164.56V212.02C306.38,213.61 305.58,214.4 303.97,214.4Z"
android:fillColor="#495057"/>
<path
android:pathData="M225.37,214.4C224.57,214.4 223.96,214.21 223.54,213.84C223.16,213.42 222.97,212.82 222.97,212.02V145.07C222.97,144.28 223.16,143.7 223.54,143.32C223.96,142.9 224.57,142.7 225.37,142.7C226.17,142.7 226.76,142.9 227.15,143.32C227.57,143.7 227.77,144.28 227.77,145.07V175.66H276.21V145.07C276.21,144.28 276.4,143.7 276.78,143.32C277.2,142.9 277.81,142.7 278.61,142.7C279.41,142.7 280,142.9 280.39,143.32C280.8,143.7 281.02,144.28 281.02,145.07V212.02C281.02,212.82 280.8,213.42 280.39,213.84C280,214.21 279.41,214.4 278.61,214.4C277.81,214.4 277.2,214.21 276.78,213.84C276.4,213.42 276.21,212.82 276.21,212.02V180.42H227.77V212.02C227.77,212.82 227.57,213.42 227.15,213.84C226.76,214.21 226.17,214.4 225.37,214.4Z"
android:fillColor="#495057"/>
</group>
</vector>

View File

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="2048dp"
android:height="2048dp"
android:viewportWidth="2048"
android:viewportHeight="2048">
<group>
<!-- Filled rectangle -->
<path
android:pathData="M0,0 L2048,0 L2048,2048 L0,2048 Z"
android:fillColor="#FFF0F3FA" />
</group>
</vector>

View File

@@ -0,0 +1,29 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="2048"
android:viewportHeight="2048">
<group android:scaleX="0.85"
android:scaleY="0.85"
android:translateX="153.6"
android:translateY="153.6">
<group>
<clip-path
android:pathData="M645,608h795v795h-795z"/>
<path
android:pathData="M1230.8,787.2C1230.8,779.9 1234.6,773.1 1240.9,769.3L1408.3,668.9C1422.3,660.5 1440,670.5 1440,686.8V859C1440,870.6 1430.6,880 1419.1,880H1251.7C1240.2,880 1230.8,870.6 1230.8,859V787.2Z"
android:fillColor="#455FE9"/>
<path
android:pathData="M937.9,954.6C937.9,947.3 941.8,940.4 948.1,936.7L1115.4,836.2C1129.4,827.9 1147.1,837.9 1147.1,854.2V1152V1172.9V1361.2C1147.1,1372.7 1137.7,1382.1 1126.2,1382.1H958.8C947.3,1382.1 937.9,1372.7 937.9,1361.2V1172.9V1152V954.6ZM655.2,1124.9C648.9,1128.7 645,1135.6 645,1142.9V1361.2C645,1372.7 654.4,1382.1 665.9,1382.1H833.3C844.8,1382.1 854.2,1372.7 854.2,1361.2V1042.5C854.2,1026.2 836.5,1016.2 822.5,1024.5L655.2,1124.9Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M854.2,1172.9H728.7V1340.3H854.2V1298.4C854.2,1286.9 863.6,1277.5 875.1,1277.5H917C928.5,1277.5 937.9,1286.9 937.9,1298.4V1340.3H1105.3V1172.9H937.9V1214.7C937.9,1226.3 928.5,1235.6 917,1235.6H875.1C863.6,1235.6 854.2,1226.3 854.2,1214.7V1172.9Z"
android:fillColor="#455FE9"
android:fillType="evenOdd"/>
<path
android:pathData="M1230.8,942.8V1361.2C1230.8,1372.7 1240.2,1382.1 1251.7,1382.1H1419.1C1430.6,1382.1 1440,1372.7 1440,1361.2V942.8C1440,931.2 1430.6,921.8 1419.1,921.8H1251.7C1240.2,921.8 1230.8,931.2 1230.8,942.8Z"
android:fillColor="#455FE9"/>
</group>
</group>
</vector>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_banner_background"/>
<foreground android:drawable="@drawable/ic_banner_foreground"/>
</adaptive-icon>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/> </adaptive-icon>
</adaptive-icon>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@mipmap/ic_launcher_background"/> <background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/> <foreground android:drawable="@drawable/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/> </adaptive-icon>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -6,7 +6,7 @@
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#ffffff</item> <item name="android:windowSplashScreenBackground">#F0F3FA</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="ic_launcher_background">#FFFFFFFF</color>
</resources> </resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_banner_background">#F0F3FA</color>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#F0F3FA</color>
</resources>

View File

@@ -2,4 +2,6 @@
<resources> <resources>
<string name="stop">Stop</string> <string name="stop">Stop</string>
<string name="quick_toggle">Toggle</string> <string name="quick_toggle">Toggle</string>
<string name="status_starting">Service starting…</string>
<string name="status_started">Service started</string>
</resources> </resources>

View File

@@ -1,12 +1,10 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_408_56)"> <g clip-path="url(#clip0_408_56)">
<path d="M47.1582 14.4283C47.1582 13.8368 47.4684 13.2886 47.9757 12.9842L61.4494 4.89891C62.5721 4.22529 64.0003 5.03389 64.0003 6.34306V20.2103C64.0003 21.1405 63.2461 21.8945 62.3161 21.8945H48.8424C47.9124 21.8945 47.1582 21.1405 47.1582 20.2103V14.4283Z" fill="#E29942"/> <path d="M47.1582 14.4283C47.1582 13.8368 47.4684 13.2886 47.9757 12.9842L61.4494 4.89891C62.5721 4.22529 64.0003 5.03389 64.0003 6.34306V20.2103C64.0003 21.1405 63.2461 21.8945 62.3161 21.8945H48.8424C47.9124 21.8945 47.1582 21.1405 47.1582 20.2103V14.4283Z" fill="#455FE9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.3966 26.4593C23.8893 26.7637 23.5789 27.3118 23.5789 27.9034V43.7921L23.5789 45.4751L23.5789 45.4763L23.5789 48.0001C23.5789 48.9301 22.8249 49.6001 21.8947 49.6001H18.5263C17.5962 49.6001 16.8421 48.9301 16.8421 48.0001V45.4751V34.976C16.8421 33.6669 15.4139 32.8583 14.2913 33.5319L0.817607 41.6171C0.310362 41.9216 0 42.4696 0 43.0615V60.6342C0 61.5642 0.754048 62.3184 1.68421 62.3184H15.1579C16.0881 62.3184 16.8421 61.5642 16.8421 60.6342V58.9488V56.8314C16.8421 55.9011 17.5962 55.3376 18.5263 55.3376H21.8947C22.8249 55.3376 23.5789 55.9011 23.5789 56.8314V58.9488L23.5789 60.6342C23.5789 61.5642 24.333 62.3184 25.2632 62.3184H38.7368C39.6669 62.3184 40.4211 61.5642 40.4211 60.6342V45.4763V43.7921V19.8182C40.4211 18.509 38.9928 17.7004 37.8701 18.374L24.3966 26.4593Z" fill="#E29942"/> <path fill-rule="evenodd" clip-rule="evenodd" d="M24.3966 26.4593C23.8893 26.7637 23.5789 27.3118 23.5789 27.9034V43.7921L23.5789 45.4751L23.5789 45.4763L23.5789 48.0001C23.5789 48.9301 22.8249 49.6001 21.8947 49.6001H18.5263C17.5962 49.6001 16.8421 48.9301 16.8421 48.0001V45.4751V34.976C16.8421 33.6669 15.4139 32.8583 14.2913 33.5319L0.817607 41.6171C0.310362 41.9216 0 42.4696 0 43.0615V60.6342C0 61.5642 0.754048 62.3184 1.68421 62.3184H15.1579C16.0881 62.3184 16.8421 61.5642 16.8421 60.6342V58.9488V56.8314C16.8421 55.9011 17.5962 55.3376 18.5263 55.3376H21.8947C22.8249 55.3376 23.5789 55.9011 23.5789 56.8314V58.9488L23.5789 60.6342C23.5789 61.5642 24.333 62.3184 25.2632 62.3184H38.7368C39.6669 62.3184 40.4211 61.5642 40.4211 60.6342V45.4763V43.7921V19.8182C40.4211 18.509 38.9928 17.7004 37.8701 18.374L24.3966 26.4593Z" fill="#455FE9"/>
<path d="M47.1592 28.7999V60.7999C47.1592 61.6836 47.9132 62.3999 48.8434 62.3999H62.3171C63.2472 62.3999 64.0013 61.6836 64.0013 60.7999V28.7999C64.0013 27.9162 63.2472 27.1999 62.3171 27.1999H48.8434C47.9132 27.1999 47.1592 27.9162 47.1592 28.7999Z" fill="#E29942"/> <path d="M47.1592 28.7999V60.7999C47.1592 61.6836 47.9132 62.3999 48.8434 62.3999H62.3171C63.2472 62.3999 64.0013 61.6836 64.0013 60.7999V28.7999C64.0013 27.9162 63.2472 27.1999 62.3171 27.1999H48.8434C47.9132 27.1999 47.1592 27.9162 47.1592 28.7999Z" fill="#455FE9"/>
</g> </g>
<defs> <defs>
<clipPath id="clip0_408_56">
<rect width="64" height="64" fill="white"/>
</clipPath>
</defs> </defs>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 121 KiB

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