Merge branch 'main' into main
6
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@@ -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
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -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
|
||||||
|
|||||||
20
.github/release_message.md
vendored
@@ -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>
|
||||||
|
|||||||
125
.github/workflows/build.yml
vendored
@@ -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
@@ -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
|
||||||
2
.github/workflows/dev-i.yml
vendored
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"dart-code.dart-code",
|
||||||
|
"dart-code.flutter",
|
||||||
|
"github.vscode-github-actions",
|
||||||
|
"golang.go",
|
||||||
|
"redhat.vscode-yaml",
|
||||||
|
"codeium.codeium"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -3,9 +3,10 @@
|
|||||||
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**简体中文 🇨🇳**](README_cn.md) [**日本語 🇯🇵**](README_ja.md)
|
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**简体中文 🇨🇳**](README_cn.md) [**日本語 🇯🇵**](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>
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,10 @@
|
|||||||
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**English 🇺🇸**](README.md) [**日本語 🇯🇵**](README_ja.md)
|
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**English 🇺🇸**](README.md) [**日本語 🇯🇵**](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>
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
<div align="left" markdown="1" dir="ltr">
|
<div align="left" markdown="1" dir="ltr">
|
||||||
|
|
||||||
[**🇺🇸 English**](README.md) [**🇨🇳 简体中文**](README_cn.md) [**🇷🇺 Русский**](README_ru.md) [**日本語 🇯🇵**](README_ja.md)
|
[**🇺🇸 English**](README.md) [**🇨🇳 简体中文**](README_cn.md) [**🇷🇺 Русский**](README_ru.md) [**🇯🇵 日本語**](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">
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,10 @@
|
|||||||
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**简体中文 🇨🇳**](README_cn.md) [**English 🇺🇸**](README.md)
|
[** فارسی**](README_fa.md) [**Русский 🇷🇺**](README_ru.md) [**简体中文 🇨🇳**](README_cn.md) [**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>
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,10 @@
|
|||||||
[**日本語 🇯🇵**](README_ja.md)
|
[**日本語 🇯🇵**](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">
|
||||||
|
|
||||||
|
|||||||
11
android/.stignore
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
.gradle
|
||||||
|
captures/
|
||||||
|
gradlew
|
||||||
|
gradlew.bat
|
||||||
|
local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
|
||||||
|
key.properties
|
||||||
|
**.keystore
|
||||||
|
**.jks
|
||||||
@@ -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">
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 7.3 KiB |
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.1 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 815 B |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 2.5 KiB |
29
android/app/src/main/res/drawable/android12splash.xml
Normal 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>
|
||||||
53
android/app/src/main/res/drawable/ic_banner_foreground.xml
Normal 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>
|
||||||
12
android/app/src/main/res/drawable/ic_launcher_background.xml
Normal 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>
|
||||||
29
android/app/src/main/res/drawable/ic_launcher_foreground.xml
Normal 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>
|
||||||
5
android/app/src/main/res/mipmap-anydpi-v26/ic_banner.xml
Normal 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>
|
||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 824 B |
|
Before Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1018 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 646 B |
|
Before Width: | Height: | Size: 331 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_banner.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 682 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1019 B |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
@@ -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.
|
||||||
|
|||||||
@@ -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>
|
||||||
4
android/app/src/main/res/values/ic_banner_background.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_banner_background">#F0F3FA</color>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#F0F3FA</color>
|
||||||
|
</resources>
|
||||||
@@ -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>
|
||||||
@@ -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 |
BIN
assets/images/source/hiddify.ico
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 121 KiB |