Compare commits
7 Commits
revert-29-main
...
v3.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ba7721091 | |||
| 98bb9235aa | |||
| 855b17c2ee | |||
| 3d946b66ab | |||
| 81baa8ccf6 | |||
| 3a944a7aeb | |||
| 37723c3fca |
@@ -139,3 +139,4 @@ app.*.symbols
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
!/dev/ci/**/Gemfile.lock
|
||||
!.vscode/settings.json
|
||||
/Android-kotlin-Code/core/.cxx
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
- Android 7.0+ (recommend)
|
||||
- `armeabi-v7a` , `arm64-v8a`, `x86` or `x86_64` Architecture
|
||||
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
1. Update submodules
|
||||
@@ -67,6 +69,15 @@ Please read 服务器配置+Kotlin-Android 文档教程.docx
|
||||
}
|
||||
```
|
||||
|
||||

|
||||
|
||||
```
|
||||
测试的 URL 配置地址: https://vungles.com/api/test/config
|
||||
测试账号:
|
||||
binance3980@gmail.com
|
||||
Tinkl123
|
||||
```
|
||||
|
||||
上面字段的意思:
|
||||
以下是您提供的 JSON 配置文件的字段解释:
|
||||
|
||||
|
||||
@@ -46,8 +46,9 @@ android {
|
||||
externalNativeBuild {
|
||||
cmake {
|
||||
// 设置cmake版本
|
||||
version = "3.31.6"
|
||||
// version = "3.31.6" //macos下不需要指定 cmake 的版本信息
|
||||
path = file("src/main/cpp/CMakeLists.txt")
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* 当前编译core版本号
|
||||
*/
|
||||
|
||||
#define GIT_VERSION _920e728_241219
|
||||
#define GIT_VERSION
|
||||
#define make_Str(x) #x
|
||||
#define make_String(x) make_Str(x)
|
||||
|
||||
|
||||
+52
-56
@@ -5,7 +5,7 @@ import android.content.res.Configuration
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
// import android.view.WindowManager
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
@@ -20,16 +20,16 @@ import com.github.kr328.clash.design.adapter.PlanDataAdapter
|
||||
import com.github.kr328.clash.design.adapter.TicketDetailAdapter
|
||||
import com.github.kr328.clash.design.adapter.TicketsDataAdapter
|
||||
import com.github.kr328.clash.design.databinding.ActivityBaseListBinding
|
||||
import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding
|
||||
// import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding
|
||||
import com.github.kr328.clash.design.ui.DayNight
|
||||
import com.github.kr328.clash.design.ui.Surface
|
||||
import com.github.kr328.clash.design.util.applyFrom
|
||||
import com.github.kr328.clash.design.util.layoutInflater
|
||||
// import com.github.kr328.clash.design.util.layoutInflater
|
||||
import com.github.kr328.clash.design.util.resolveThemedBoolean
|
||||
import com.github.kr328.clash.design.util.resolveThemedColor
|
||||
import com.github.kr328.clash.design.util.root
|
||||
import com.github.kr328.clash.design.util.setOnInsertsChangedListener
|
||||
import com.github.kr328.clash.design.view.ActivityBarLayout
|
||||
// import com.github.kr328.clash.design.view.ActivityBarLayout
|
||||
import com.github.kr328.clash.network.OrderData
|
||||
import com.github.kr328.clash.network.PlanData
|
||||
import com.github.kr328.clash.network.TicketMessage
|
||||
@@ -190,65 +190,61 @@ abstract class BaseListActivity<T> : AppCompatActivity() {
|
||||
this.dayNight = DayNight.Night //dayNight
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化列表数据。
|
||||
* 如果数据为空,显示提示信息;否则,在UI线程上更新适配器数据。
|
||||
*
|
||||
* @param data 要显示的数据列表,可能为null
|
||||
*/
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun initList(data: List<T>?) {
|
||||
|
||||
if (data.isNullOrEmpty()) {
|
||||
runOnUiThread {
|
||||
Toast.makeText(this, "没有更多数据", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
showEmptyDataToast()
|
||||
} else {
|
||||
// 更新列表
|
||||
runOnUiThread {
|
||||
// 更新适配器的数据
|
||||
|
||||
when (adapter) {
|
||||
is PlanDataAdapter -> {
|
||||
// 使用 PlanDataAdapter 类型进行操作
|
||||
val planDataAdapter = adapter as PlanDataAdapter
|
||||
// 执行 PlanDataAdapter 的操作
|
||||
planDataAdapter.setData(data as List<PlanData>)
|
||||
}
|
||||
|
||||
|
||||
is OrdersDataAdapter -> {
|
||||
// 使用 PlanDataAdapter 类型进行操作
|
||||
val ordersDataAdapter = adapter as OrdersDataAdapter
|
||||
// 执行 PlanDataAdapter 的操作
|
||||
ordersDataAdapter.setData(data as List<OrderData>)
|
||||
|
||||
}
|
||||
|
||||
is TicketsDataAdapter->{
|
||||
val ordersDataAdapter = adapter as TicketsDataAdapter
|
||||
ordersDataAdapter.setData(data as List<TicketsData>)
|
||||
}
|
||||
|
||||
is TicketDetailAdapter ->{
|
||||
|
||||
val ordersDataAdapter = adapter as TicketDetailAdapter
|
||||
ordersDataAdapter.setData(data as List<TicketMessage>)
|
||||
|
||||
}
|
||||
else -> {
|
||||
// 处理不匹配的适配器类型
|
||||
println( "Unknown adapter type.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
val subscriptionAdapter = adapter as? PlanDataAdapter
|
||||
|
||||
if ( subscriptionAdapter != null ){
|
||||
subscriptionAdapter.setData(data as List<PlanData>) // 假设你实现了一个 setData 方法来更新适配器的数据
|
||||
}
|
||||
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
updateAdapterDataOnUiThread(data)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 在UI线程上显示"没有更多数据"的Toast提示。
|
||||
*/
|
||||
private fun showEmptyDataToast() {
|
||||
runOnUiThread {
|
||||
Toast.makeText(this, "没有更多数据", Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 在UI线程上更新适配器数据。
|
||||
* 这个方法作为一个中间层,避免在runOnUiThread的lambda中直接捕获外部变量。
|
||||
*
|
||||
* @param data 要更新到适配器的数据列表
|
||||
*/
|
||||
private fun updateAdapterDataOnUiThread(data: List<T>) {
|
||||
runOnUiThread {
|
||||
doUpdateAdapterData(data)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行实际的适配器数据更新操作。
|
||||
* 根据适配器类型,将数据设置到相应的适配器中,并通知数据集变化。
|
||||
*
|
||||
* @param data 要更新到适配器的数据列表
|
||||
*/
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
private fun doUpdateAdapterData(data: List<T>) {
|
||||
when (adapter) {
|
||||
is PlanDataAdapter -> (adapter as PlanDataAdapter).setData(data as List<PlanData>)
|
||||
is OrdersDataAdapter -> (adapter as OrdersDataAdapter).setData(data as List<OrderData>)
|
||||
is TicketsDataAdapter -> (adapter as TicketsDataAdapter).setData(data as List<TicketsData>)
|
||||
is TicketDetailAdapter -> (adapter as TicketDetailAdapter).setData(data as List<TicketMessage>)
|
||||
else -> println("Unknown adapter type.")
|
||||
}
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun updateList(data: List<T>?) {
|
||||
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ object ApiClient {
|
||||
}
|
||||
|
||||
object ApiClientConfig {
|
||||
private const val ConfigURL = "https://api.xxxx.com/api/" // BASE 请求配置文件地址 见说明文档
|
||||
private const val ConfigURL = "https://vungles.com/api/test/" // BASE 请求配置文件地址 见说明文档
|
||||
//const val ConfigNodeURL = "https://api.xxxx.com/api/parseyamlclash.php?target=clashmeta&url=" //通过香港服务器转接一次Clash转化的订阅地址
|
||||
const val ConfigNodeURL = ""
|
||||
|
||||
|
||||
@@ -194,8 +194,8 @@
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginHorizontal="16dp"/>
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginHorizontal="0dp"/>
|
||||
</androidx.cardview.widget.CardView>
|
||||
<!-- TabLayout作为页指示器 -->
|
||||
<com.google.android.material.tabs.TabLayout
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||
# Specifies the JVM arguments used for the daemon process.
|
||||
# The setting is particularly useful for tweaking memory settings.
|
||||
org.gradle.jvmargs=-Xmx4g -XX:+UseZGC -Dfile.encoding=UTF-8
|
||||
#org.gradle.jvmargs=-Xmx4g -XX:+UseZGC -Dfile.encoding=UTF-8
|
||||
org.gradle.jvmargs=-Xmx4g -XX:+UseG1GC
|
||||
# When configured, Gradle will run in incubating parallel mode.
|
||||
# This option should only be used with decoupled projects. More details, visit
|
||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
# Location of the SDK. This is only used by Gradle.
|
||||
# For customization when using a Version Control System, please read the
|
||||
# header note.
|
||||
#Wed Dec 11 11:56:02 CST 2024
|
||||
sdk.dir=/Volumes/TOSHIBA/androidstudio/sdk
|
||||
|
||||
# 设置cmake(使用android studio SDK manager安装)路径至版本
|
||||
cmake.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\cmake\\3.31.6
|
||||
#Fri Jul 18 13:36:50 CST 2025
|
||||
#cmake.dir=/Volumes/WD/androidstudio/sdk/cmake/3.22.1
|
||||
# C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\cmake\\3.31.6
|
||||
sdk.dir=/Volumes/WD/androidstudio/sdk
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
@@ -0,0 +1,194 @@
|
||||
## UUVPN - Redesigned for Performance, Stability, and [V2Board](https://github.com/cedar2025/Xboard) Compatibility
|
||||
|
||||
The original UUVPN was built using Flutter, which led to increasing challenges in maintaining the codebase due to performance issues, subpar UI quality, and a lack of stability. To address these concerns, UUVPN has been completely redeveloped for native performance on iOS/macOS and Android, utilizing the powerful SINGBOX and CLASH cores.
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
### The new version features:
|
||||
|
||||
- A sleek, more responsive user interface
|
||||
- Enhanced app stability
|
||||
- Significant performance optimizations
|
||||
- Additionally, UUVPN now supports server backend protocols with full compatibility for V2Board, providing a more seamless and flexible user experience for VPN management.
|
||||
|
||||
### Key Features:
|
||||
- Native Performance: Utilizing SINGBOX for iOS/macOS and CLASH for Android, UUVPN is optimized for stability and speed.
|
||||
- V2Board Compatibility: Fully supports V2Board protocols, offering smooth integration for backend management.
|
||||
- Refined UI: A completely redesigned interface with a modern look and feel, providing a user-friendly experience.
|
||||
|
||||
### Server :
|
||||
- https://github.com/cedar2025/Xboard
|
||||
|
||||
|
||||
### Download iOS and android
|
||||
- [iOS TestFlight (Beta)](https://t.me/dcgzeus)
|
||||
- [Android Apk](https://github.com/nicolastinkl/UUVPN/releases)
|
||||
|
||||
## iOS Screenshots and Demo Video:
|
||||
|
||||
### SKIN 1:
|
||||
<table>
|
||||
<tr>
|
||||
|
||||
<td><img src="screenshots/IMG_8546.PNG" width="300" /></td>
|
||||
<td><img src="screenshots/IMG_8544.PNG" width="300" /></td>
|
||||
<td><img src="screenshots/IMG_8547.PNG" width="300" /></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
### SKIN 2:
|
||||
|
||||
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
|
||||
<td><img src="screenshots/21-31-06.png" width="300" /></td>
|
||||
<td><img src="screenshots/IMG_8728.PNG" width="300" /></td>
|
||||
<td><img src="screenshots/IMG_8725.PNG" width="300" /></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
### LOGIC VIEWS:
|
||||
|
||||
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
|
||||
<td><img src="screenshots/mmexport1730598307009.png" width="300" /></td>
|
||||
<td><img src="screenshots/mmexport1730598308041.png" width="300" /></td>
|
||||
<td><img src="screenshots/mmexport1730598311150.png" width="300" /></td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
|
||||
<td><img src="screenshots/gongdan.png" width="300" /></td>
|
||||
<td><img src="screenshots/gongdanchat.png" width="300" /></td>
|
||||
<td><img src="screenshots/mmexport1730598305428.jpg" width="300" /></td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
## Vidos:
|
||||
<table>
|
||||
<tr>
|
||||
<td><img src="screenshots/13264cf9-99e7-4ff8-8e32-2564eea05670.gif" width="200" /></td>
|
||||
<td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b92821256632.gif" width="200" /></td>
|
||||
<td><img src="screenshots/8a51ed33-248b-45eb-b5ba-b928212566321.gif" width="200" /></td>
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
## [iOS Youtu视频预览地址](https://www.youtube.com/shorts/tnr38-IM-Xo)
|
||||
|
||||
|
||||
# Android App Project
|
||||
|
||||
|
||||
## [Android Youtu视频预览地址](https://youtube.com/shorts/zI1hrpFJbtg?feature=share)
|
||||
|
||||
|
||||

|
||||
## Prerequisites
|
||||
|
||||
Before you begin, ensure you have met the following requirements:
|
||||
|
||||
- **Operating System**: Any system that supports Android development (Windows, macOS, Linux).
|
||||
- **Java Development Kit (JDK)**: JDK 11 or higher.
|
||||
- **Android Studio**: The official IDE for Android development, version 4.1 or higher.
|
||||
- **Android SDK**: The latest version of the Android SDK tools.
|
||||
- **Go**: go version go1.23.2 darwin/amd64
|
||||
|
||||
# Legacy Version (Original Flutter-based UUVPN)
|
||||
The following section contains information about the original Flutter-based UUVPN for historical reference. If you need the source code, you can check out the **flutter** branch
|
||||
|
||||
<details> <summary>Click to view the legacy version details</summary>
|
||||
# Old Description:
|
||||
|
||||

|
||||
|
||||
# UUVPN
|
||||
基于Flutter开发的VPN客户端(ios/android),自主设计,精美UI,优化VPN速度,完全开源。
|
||||
|
||||
A VPN application for [V2Board](https://github.com/v2board/v2board)
|
||||
|
||||
Support iOS and Android now.
|
||||
|
||||
|
||||
|
||||
**IF THIS PROJECT HELPS YOU, PLEASE GIVE ME A LITTLE STAR⭐️.**
|
||||
|
||||
## Screenshots
|
||||

|
||||
|
||||
## App Store
|
||||

|
||||
|
||||
|
||||
## Environment
|
||||
|
||||
- Flutter Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git
|
||||
Framework • revision d3d8effc68 (6 weeks ago) • 2023-05-16 17:59:05 -0700
|
||||
Engine • revision b4fb11214d
|
||||
Tools • Dart 3.0.1 • DevTools 2.23.1
|
||||
- Download this version url: https://drive.google.com/file/d/1ksM4_PK9Ibk7ycyrfF7XffM_99_4JYV3/view?usp=sharing
|
||||
- leaf sdk downlaod url: https://github.com/eycorsican/leaf/releases/tag/v0.10.7
|
||||
|
||||
- macOS 13.3.1 +
|
||||
- Xcode 14 +
|
||||
- iOS 15.0 +
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
flutter pub get
|
||||
```
|
||||
|
||||
## Develop
|
||||
```shell
|
||||
flutter run
|
||||
```
|
||||
|
||||
## Build
|
||||
build android apk
|
||||
```shell
|
||||
flutter build apk
|
||||
```
|
||||
|
||||
build ios
|
||||
```shell
|
||||
flutter build ios
|
||||
```
|
||||
|
||||
----------------------
|
||||
|
||||
# How to use it?
|
||||

|
||||

|
||||

|
||||
|
||||
- 1: Change Domain File Path : ~UUVPN/flutter/lib/constant/app_urls.dart
|
||||
```
|
||||
static const String baseUrl = "https://xxxx.com";
|
||||
```
|
||||
|
||||
- 2: Xcode Settings:
|
||||

|
||||

|
||||

|
||||
|
||||
- 3: running screenshot:
|
||||

|
||||
|
||||
Reference in New Issue
Block a user