diff --git a/V2rayNG/app/build.gradle.kts b/V2rayNG/app/build.gradle.kts
index 24416585..e90855be 100644
--- a/V2rayNG/app/build.gradle.kts
+++ b/V2rayNG/app/build.gradle.kts
@@ -1,11 +1,11 @@
plugins {
- id("com.android.application")
- id("org.jetbrains.kotlin.android")
+ alias(libs.plugins.android.application)
+ alias(libs.plugins.kotlin.android)
}
android {
namespace = "com.v2ray.ang"
- compileSdk = 34
+ compileSdk = 35
defaultConfig {
applicationId = "com.v2ray.ang"
@@ -14,6 +14,7 @@ android {
versionCode = 612
versionName = "1.9.16"
multiDexEnabled = true
+
splits {
abi {
isEnable = true
@@ -27,20 +28,16 @@ android {
}
}
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
- }
buildTypes {
release {
isMinifyEnabled = false
-
- }
- debug {
- isMinifyEnabled = false
-
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
}
}
@@ -50,8 +47,13 @@ android {
}
}
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
kotlinOptions {
- jvmTarget = JavaVersion.VERSION_1_8.toString()
+ jvmTarget = JavaVersion.VERSION_11.toString()
}
applicationVariants.all {
@@ -69,7 +71,8 @@ android {
output.outputFileName = "v2rayNG_${variant.versionName}_${abi}.apk"
if (versionCodes.containsKey(abi)) {
- output.versionCodeOverride = (1000000 * versionCodes[abi]!!).plus(variant.versionCode)
+ output.versionCodeOverride =
+ (1000000 * versionCodes[abi]!!).plus(variant.versionCode)
} else {
return@forEach
}
@@ -86,49 +89,60 @@ android {
useLegacyPackaging = true
}
}
+
}
dependencies {
+ // Core Libraries
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar", "*.jar"))))
- testImplementation(libs.junit)
- testImplementation(libs.org.mockito.mockito.inline)
- testImplementation(libs.mockito.kotlin)
- implementation(libs.flexbox)
- // Androidx
- implementation(libs.constraintlayout)
- implementation(libs.legacy.support.v4)
- implementation(libs.appcompat)
- implementation(libs.material)
- implementation(libs.cardview)
+ // AndroidX Core Libraries
+ implementation(libs.androidx.core.ktx)
+ implementation(libs.androidx.appcompat)
+ implementation(libs.androidx.activity)
+ implementation(libs.androidx.constraintlayout)
implementation(libs.preference.ktx)
implementation(libs.recyclerview)
- implementation(libs.fragment.ktx)
- implementation(libs.multidex)
- implementation(libs.viewpager2)
- // Androidx ktx
- implementation(libs.activity.ktx)
+ // UI Libraries
+ implementation(libs.material)
+ implementation(libs.toastcompat)
+ implementation(libs.editorkit)
+ implementation(libs.flexbox)
+
+ // Data and Storage Libraries
+ implementation(libs.mmkv.static)
+ implementation(libs.gson)
+
+ // Reactive and Utility Libraries
+ implementation(libs.rxjava)
+ implementation(libs.rxandroid)
+ implementation(libs.rxpermissions)
+
+ // Language and Processing Libraries
+ implementation(libs.language.base)
+ implementation(libs.language.json)
+
+ // Intent and Utility Libraries
+ implementation(libs.quickie.bundled)
+ implementation(libs.core)
+
+ // AndroidX Lifecycle and Architecture Components
implementation(libs.lifecycle.viewmodel.ktx)
implementation(libs.lifecycle.livedata.ktx)
implementation(libs.lifecycle.runtime.ktx)
- //kotlin
- implementation(libs.kotlin.reflect)
- implementation(libs.kotlinx.coroutines.core)
- implementation(libs.kotlinx.coroutines.android)
-
- implementation(libs.mmkv.static)
- implementation(libs.gson)
- implementation(libs.rxjava)
- implementation(libs.rxandroid)
- implementation(libs.rxpermissions)
- implementation(libs.toastcompat)
- implementation(libs.editorkit)
- implementation(libs.language.base)
- implementation(libs.language.json)
- implementation(libs.quickie.bundled)
- implementation(libs.core)
+ // Background Task Libraries
implementation(libs.work.runtime.ktx)
implementation(libs.work.multiprocess)
-}
\ No newline at end of file
+
+ // Multidex Support
+ implementation(libs.multidex)
+
+ // Testing Libraries
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.androidx.junit)
+ androidTestImplementation(libs.androidx.espresso.core)
+ testImplementation(libs.org.mockito.mockito.inline)
+ testImplementation(libs.mockito.kotlin)
+}
diff --git a/V2rayNG/app/proguard-rules.pro b/V2rayNG/app/proguard-rules.pro
index e69de29b..481bb434 100644
--- a/V2rayNG/app/proguard-rules.pro
+++ b/V2rayNG/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AngApplication.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/AngApplication.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/AngApplication.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/AppConfig.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AppInfo.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AppInfo.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AppInfo.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/AppInfo.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AssetUrlItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/AssetUrlItem.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ConfigResult.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ConfigResult.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ConfigResult.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ConfigResult.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/EConfigType.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/EConfigType.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/EConfigType.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/EConfigType.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/Hysteria2Bean.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Hysteria2Bean.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/Hysteria2Bean.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Language.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/Language.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/Language.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/Language.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/NetworkType.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/NetworkType.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/NetworkType.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/NetworkType.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ProfileItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ProfileItem.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ProfileLiteItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileLiteItem.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ProfileLiteItem.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileLiteItem.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/RoutingType.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/RoutingType.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/RoutingType.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/RoutingType.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/RulesetItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/RulesetItem.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/RulesetItem.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/RulesetItem.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServerAffiliationInfo.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerAffiliationInfo.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServerAffiliationInfo.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerAffiliationInfo.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServerConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServerConfig.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServersCache.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServersCache.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/ServersCache.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServersCache.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/SubscriptionItem.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/SubscriptionItem.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/SubscriptionItem.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/V2rayConfig.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/VmessQRCode.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/dto/VmessQRCode.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/dto/VmessQRCode.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/CustomFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/CustomFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/CustomFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/CustomFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/FmtBase.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/FmtBase.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/FmtBase.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/HttpFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/HttpFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/HttpFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/HttpFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/Hysteria2Fmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/Hysteria2Fmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/Hysteria2Fmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/ShadowsocksFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/ShadowsocksFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/ShadowsocksFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/ShadowsocksFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/SocksFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/SocksFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/SocksFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/SocksFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/TrojanFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/TrojanFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/TrojanFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/TrojanFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/VlessFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VlessFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/VlessFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VlessFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/VmessFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/VmessFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/VmessFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/WireguardFmt.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/fmt/WireguardFmt.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/fmt/WireguardFmt.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/AngConfigManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MigrateManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MmkvManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/MmkvManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/SettingsManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/handler/V2rayConfigManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.java b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.kt
similarity index 53%
rename from V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.java
rename to V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.kt
index 566feffc..8707d16f 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.java
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperAdapter.kt
@@ -13,46 +13,41 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.v2ray.ang.helper;
-
-import androidx.recyclerview.widget.ItemTouchHelper;
-import androidx.recyclerview.widget.RecyclerView;
+package com.v2ray.ang.helper
/**
- * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}.
+ * Interface to listen for a move or dismissal event from a [ItemTouchHelper.Callback].
*
* @author Paul Burke (ipaulpro)
*/
-public interface ItemTouchHelperAdapter {
-
+interface ItemTouchHelperAdapter {
/**
* Called when an item has been dragged far enough to trigger a move. This is called every time
- * an item is shifted, and not at the end of a "drop" event.
- *
- * Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after
+ * an item is shifted, and **not** at the end of a "drop" event.
+ *
+ * Implementations should call [RecyclerView.Adapter.notifyItemMoved] after
* adjusting the underlying data to reflect this move.
*
* @param fromPosition The start position of the moved item.
* @param toPosition Then resolved position of the moved item.
* @return True if the item was moved to the new adapter position.
- * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)
- * @see RecyclerView.ViewHolder#getAdapterPosition()
+ * @see RecyclerView.getAdapterPositionFor
+ * @see RecyclerView.ViewHolder.getAdapterPosition
*/
- boolean onItemMove(int fromPosition, int toPosition);
+ fun onItemMove(fromPosition: Int, toPosition: Int): Boolean
- void onItemMoveCompleted();
+ fun onItemMoveCompleted()
/**
- * Called when an item has been dismissed by a swipe.
- *
- * Implementations should call {@link RecyclerView.Adapter#notifyItemRemoved(int)} after
+ * Called when an item has been dismissed by a swipe.
+ *
+ * Implementations should call [RecyclerView.Adapter.notifyItemRemoved] after
* adjusting the underlying data to reflect this removal.
*
* @param position The position of the item dismissed.
- * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)
- * @see RecyclerView.ViewHolder#getAdapterPosition()
+ * @see RecyclerView.getAdapterPositionFor
+ * @see RecyclerView.ViewHolder.getAdapterPosition
*/
- void onItemDismiss(int position);
+ fun onItemDismiss(position: Int)
}
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.java b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.kt
similarity index 67%
rename from V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.java
rename to V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.kt
index 149768fc..75655b0c 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.java
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/ItemTouchHelperViewHolder.kt
@@ -13,29 +13,26 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package com.v2ray.ang.helper
-package com.v2ray.ang.helper;
-
-import androidx.recyclerview.widget.ItemTouchHelper;
+import androidx.recyclerview.widget.ItemTouchHelper
/**
- * Interface to notify an item ViewHolder of relevant callbacks from {@link
- * ItemTouchHelper.Callback}.
+ * Interface to notify an item ViewHolder of relevant callbacks from [ ].
*
* @author Paul Burke (ipaulpro)
*/
-public interface ItemTouchHelperViewHolder {
-
+interface ItemTouchHelperViewHolder {
/**
- * Called when the {@link ItemTouchHelper} first registers an item as being moved or swiped.
+ * Called when the [ItemTouchHelper] first registers an item as being moved or swiped.
* Implementations should update the item view to indicate it's active state.
*/
- void onItemSelected();
+ fun onItemSelected()
/**
- * Called when the {@link ItemTouchHelper} has completed the move or swipe, and the active item
+ * Called when the [ItemTouchHelper] has completed the move or swipe, and the active item
* state should be cleared.
*/
- void onItemClear();
+ fun onItemClear()
}
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.java b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.java
deleted file mode 100644
index e4e5845d..00000000
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2015 Paul Burke
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.v2ray.ang.helper;
-
-import android.animation.ValueAnimator;
-import android.graphics.Canvas;
-import android.view.animation.DecelerateInterpolator;
-
-import androidx.annotation.NonNull;
-import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.ItemTouchHelper;
-import androidx.recyclerview.widget.RecyclerView;
-
-/**
- * An implementation of {@link ItemTouchHelper.Callback} that enables basic drag & drop and
- * swipe-to-dismiss. Drag events are automatically started by an item long-press.
- *
- * Expects the RecyclerView.Adapter to listen for {@link
- * ItemTouchHelperAdapter} callbacks and the RecyclerView.ViewHolder to implement
- * {@link ItemTouchHelperViewHolder}.
- *
- * @author Paul Burke (ipaulpro)
- */
-public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
-
- private static final float ALPHA_FULL = 1.0f;
- private static final float SWIPE_THRESHOLD = 0.25f;
- private static final long ANIMATION_DURATION = 200;
-
- private final ItemTouchHelperAdapter mAdapter;
- private ValueAnimator mReturnAnimator;
-
- public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
- mAdapter = adapter;
- }
-
- @Override
- public boolean isLongPressDragEnabled() {
- return true;
- }
-
- @Override
- public boolean isItemViewSwipeEnabled() {
- return true;
- }
-
- @Override
- public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
- if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
- final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
- final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
- return makeMovementFlags(dragFlags, swipeFlags);
- } else {
- final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
- final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
- return makeMovementFlags(dragFlags, swipeFlags);
- }
- }
-
- @Override
- public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder source, @NonNull RecyclerView.ViewHolder target) {
- if (source.getItemViewType() != target.getItemViewType()) {
- return false;
- }
- mAdapter.onItemMove(source.getBindingAdapterPosition(), target.getBindingAdapterPosition());
- return true;
- }
-
- @Override
- public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
- // 不执行删除操作,仅返回项目到原位
- returnViewToOriginalPosition(viewHolder);
- }
-
- @Override
- public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
- @NonNull RecyclerView.ViewHolder viewHolder,
- float dX, float dY, int actionState, boolean isCurrentlyActive) {
- if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
- float maxSwipeDistance = viewHolder.itemView.getWidth() * SWIPE_THRESHOLD;
- float swipeAmount = Math.abs(dX);
- float direction = Math.signum(dX);
-
- // 限制最大滑动距离
- float translationX = Math.min(swipeAmount, maxSwipeDistance) * direction;
- float alpha = ALPHA_FULL - Math.min(swipeAmount, maxSwipeDistance) / maxSwipeDistance;
-
- viewHolder.itemView.setTranslationX(translationX);
- viewHolder.itemView.setAlpha(alpha);
-
- if (swipeAmount >= maxSwipeDistance && isCurrentlyActive) {
- returnViewToOriginalPosition(viewHolder);
- }
- } else {
- super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
- }
- }
-
- private void returnViewToOriginalPosition(RecyclerView.ViewHolder viewHolder) {
- if (mReturnAnimator != null && mReturnAnimator.isRunning()) {
- mReturnAnimator.cancel();
- }
-
- mReturnAnimator = ValueAnimator.ofFloat(viewHolder.itemView.getTranslationX(), 0f);
- mReturnAnimator.addUpdateListener(animation -> {
- float value = (float) animation.getAnimatedValue();
- viewHolder.itemView.setTranslationX(value);
- viewHolder.itemView.setAlpha(1f - Math.abs(value) / (viewHolder.itemView.getWidth() * SWIPE_THRESHOLD));
- });
- mReturnAnimator.setInterpolator(new DecelerateInterpolator());
- mReturnAnimator.setDuration(ANIMATION_DURATION);
- mReturnAnimator.start();
- }
-
- @Override
- public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
- if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
- if (viewHolder instanceof ItemTouchHelperViewHolder) {
- ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
- itemViewHolder.onItemSelected();
- }
- }
- super.onSelectedChanged(viewHolder, actionState);
- }
-
- @Override
- public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
- super.clearView(recyclerView, viewHolder);
- viewHolder.itemView.setAlpha(ALPHA_FULL);
- if (viewHolder instanceof ItemTouchHelperViewHolder) {
- ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
- itemViewHolder.onItemClear();
- }
- mAdapter.onItemMoveCompleted();
- }
-
- @Override
- public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
- return 1.1f; // 设置一个大于1的值,确保不会触发默认的滑动删除操作
- }
-
- @Override
- public float getSwipeEscapeVelocity(float defaultValue) {
- return defaultValue * 10; // 增加滑动逃逸速度,使得更难触发滑动
- }
-}
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.kt
new file mode 100644
index 00000000..ff61aadc
--- /dev/null
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/helper/SimpleItemTouchHelperCallback.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2015 Paul Burke
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.v2ray.ang.helper
+
+import android.animation.ValueAnimator
+import android.animation.ValueAnimator.AnimatorUpdateListener
+import android.graphics.Canvas
+import android.view.animation.DecelerateInterpolator
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.ItemTouchHelper
+import androidx.recyclerview.widget.RecyclerView
+import kotlin.math.abs
+import kotlin.math.min
+import kotlin.math.sign
+
+/**
+ * An implementation of [ItemTouchHelper.Callback] that enables basic drag & drop and
+ * swipe-to-dismiss. Drag events are automatically started by an item long-press.
+ *
+ * Expects the `RecyclerView.Adapter` to listen for [ ] callbacks and the `RecyclerView.ViewHolder` to implement
+ * [ItemTouchHelperViewHolder].
+ *
+ * @author Paul Burke (ipaulpro)
+ */
+class SimpleItemTouchHelperCallback(private val mAdapter: ItemTouchHelperAdapter) : ItemTouchHelper.Callback() {
+ private var mReturnAnimator: ValueAnimator? = null
+
+ override fun isLongPressDragEnabled(): Boolean = true
+
+ override fun isItemViewSwipeEnabled(): Boolean = true
+
+ override fun getMovementFlags(
+ recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder
+ ): Int {
+ val dragFlags: Int
+ val swipeFlags: Int
+ if (recyclerView.layoutManager is GridLayoutManager) {
+ dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
+ swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
+ } else {
+ dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
+ swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
+ }
+ return makeMovementFlags(dragFlags, swipeFlags)
+ }
+
+ override fun onMove(
+ recyclerView: RecyclerView,
+ source: RecyclerView.ViewHolder,
+ target: RecyclerView.ViewHolder
+ ): Boolean {
+ return if (source.itemViewType != target.itemViewType) {
+ false
+ } else {
+ mAdapter.onItemMove(source.bindingAdapterPosition, target.bindingAdapterPosition)
+ true
+ }
+ }
+
+ override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
+ // Do not delete; simply return item to original position
+ returnViewToOriginalPosition(viewHolder)
+ }
+
+ override fun onChildDraw(
+ c: Canvas, recyclerView: RecyclerView,
+ viewHolder: RecyclerView.ViewHolder,
+ dX: Float, dY: Float, actionState: Int, isCurrentlyActive: Boolean
+ ) {
+ if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
+ val maxSwipeDistance = viewHolder.itemView.width * SWIPE_THRESHOLD
+ val swipeAmount = abs(dX)
+ val direction = sign(dX)
+
+ // Limit maximum swipe distance
+ val translationX = min(swipeAmount, maxSwipeDistance) * direction
+ val alpha = ALPHA_FULL - min(swipeAmount, maxSwipeDistance) / maxSwipeDistance
+
+ viewHolder.itemView.translationX = translationX
+ viewHolder.itemView.alpha = alpha
+
+ if (swipeAmount >= maxSwipeDistance && isCurrentlyActive) {
+ returnViewToOriginalPosition(viewHolder)
+ }
+ } else {
+ super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
+ }
+ }
+
+ private fun returnViewToOriginalPosition(viewHolder: RecyclerView.ViewHolder) {
+ mReturnAnimator?.takeIf { it.isRunning }?.cancel()
+
+ mReturnAnimator = ValueAnimator.ofFloat(viewHolder.itemView.translationX, 0f).apply {
+ addUpdateListener { animation ->
+ val value = animation.animatedValue as Float
+ viewHolder.itemView.translationX = value
+ viewHolder.itemView.alpha = (1f - abs(value) / (viewHolder.itemView.width * SWIPE_THRESHOLD))
+ }
+ interpolator = DecelerateInterpolator()
+ duration = ANIMATION_DURATION
+ start()
+ }
+ }
+
+ override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
+ if (actionState != ItemTouchHelper.ACTION_STATE_IDLE && viewHolder is ItemTouchHelperViewHolder) {
+ viewHolder.onItemSelected()
+ }
+ super.onSelectedChanged(viewHolder, actionState)
+ }
+
+ override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
+ super.clearView(recyclerView, viewHolder)
+ viewHolder.itemView.alpha = ALPHA_FULL
+ if (viewHolder is ItemTouchHelperViewHolder) {
+ viewHolder.onItemClear()
+ }
+ mAdapter.onItemMoveCompleted()
+ }
+
+ override fun getSwipeThreshold(viewHolder: RecyclerView.ViewHolder): Float {
+ return 1.1f // Set a value greater than 1 to prevent default swipe delete
+ }
+
+ override fun getSwipeEscapeVelocity(defaultValue: Float): Float {
+ return defaultValue * 10 // Increase swipe escape velocity to make swipe harder to trigger
+ }
+
+ companion object {
+ private const val ALPHA_FULL = 1.0f
+ private const val SWIPE_THRESHOLD = 0.25f
+ private const val ANIMATION_DURATION: Long = 200
+ }
+}
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/NativePlugin.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/NativePlugin.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/NativePlugin.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/Plugin.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/Plugin.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/Plugin.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginContract.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginContract.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginContract.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginList.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginList.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginList.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/PluginManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/PluginManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/plugin/ResolvedPlugin.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/plugin/ResolvedPlugin.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/plugin/ResolvedPlugin.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/BootReceiver.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/BootReceiver.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/receiver/BootReceiver.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/TaskerReceiver.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/TaskerReceiver.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/receiver/TaskerReceiver.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/receiver/WidgetProvider.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/ProcessService.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ProcessService.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/ProcessService.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/QSTileService.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ServiceControl.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/ServiceControl.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/ServiceControl.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/ServiceControl.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/SubscriptionUpdater.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/SubscriptionUpdater.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayProxyOnlyService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayProxyOnlyService.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayServiceManager.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayTestService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayTestService.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayTestService.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/AboutActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/AboutActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/BaseActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/BaseActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/BaseActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/FragmentAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/FragmentAdapter.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/FragmentAdapter.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/FragmentAdapter.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/LogcatActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/LogcatActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainRecyclerAdapter.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyAdapter.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyAdapter.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyAdapter.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingEditActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingEditActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingRecyclerAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingRecyclerAdapter.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingRecyclerAdapter.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/RoutingSettingRecyclerAdapter.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScScannerActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScScannerActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScSwitchActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScSwitchActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScSwitchActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/ScannerActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubEditActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubEditActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubSettingActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubSettingActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/TaskerActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/TaskerActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UrlSchemeActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UrlSchemeActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UrlSchemeActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/UrlSchemeActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetUrlActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetUrlActivity.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/UserAssetUrlActivity.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetUrlActivity.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AppManagerUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt
similarity index 83%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AppManagerUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt
index 28107108..8ce94751 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AppManagerUtil.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/util/AppManagerUtil.kt
@@ -13,13 +13,11 @@ object AppManagerUtil {
val apps = ArrayList()
for (pkg in packages) {
- //if (!pkg.hasInternetPermission && pkg.packageName != "android") continue
-
- val applicationInfo = pkg.applicationInfo
+ val applicationInfo = pkg.applicationInfo ?: continue
val appName = applicationInfo.loadLabel(packageManager).toString()
- val appIcon = applicationInfo.loadIcon(packageManager)
- val isSystemApp = applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM > 0
+ val appIcon = applicationInfo.loadIcon(packageManager) ?: continue
+ val isSystemApp = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) > 0
val appInfo = AppInfo(appName, pkg.packageName, appIcon, isSystemApp, 0)
apps.add(appInfo)
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/JsonUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/JsonUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/MessageUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/MessageUtil.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/MessageUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/MessageUtil.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/MyContextWrapper.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/MyContextWrapper.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/MyContextWrapper.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/PluginUtil.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/PluginUtil.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/QRCodeDecoder.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/QRCodeDecoder.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/QRCodeDecoder.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/QRCodeDecoder.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/SpeedtestUtil.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SpeedtestUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/SpeedtestUtil.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/Utils.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/Utils.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/Utils.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/ZipUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/ZipUtil.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/ZipUtil.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/util/ZipUtil.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt
similarity index 100%
rename from V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/SettingsViewModel.kt
rename to V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt
diff --git a/V2rayNG/app/src/test/java/com/v2ray/ang/AngUnitTest.kt b/V2rayNG/app/src/test/java/com/v2ray/ang/AngUnitTest.kt
new file mode 100644
index 00000000..61de199e
--- /dev/null
+++ b/V2rayNG/app/src/test/java/com/v2ray/ang/AngUnitTest.kt
@@ -0,0 +1,47 @@
+package com.v2ray.ang
+
+import com.v2ray.ang.util.Utils
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class AngUnitTest {
+
+ @Test
+ fun test_parseInt() {
+ assertEquals(Utils.parseInt("1234"), 1234)
+ }
+
+ @Test
+ fun test_isIpAddress() {
+ assertFalse(Utils.isIpAddress("114.113.112.266"))
+ assertFalse(Utils.isIpAddress("666.666.666.666"))
+ assertFalse(Utils.isIpAddress("256.0.0.0"))
+ assertFalse(Utils.isIpAddress("::ffff:127.0.0.0.1"))
+ assertFalse(Utils.isIpAddress("baidu.com"))
+ assertFalse(Utils.isIpAddress(""))
+
+ assertTrue(Utils.isIpAddress("127.0.0.1"))
+ assertTrue(Utils.isIpAddress("127.0.0.1:80"))
+ assertTrue(Utils.isIpAddress("0.0.0.0/0"))
+ assertTrue(Utils.isIpAddress("::1"))
+ assertTrue(Utils.isIpAddress("[::1]:80"))
+ assertTrue(Utils.isIpAddress("2605:2700:0:3::4713:93e3"))
+ assertTrue(Utils.isIpAddress("[2605:2700:0:3::4713:93e3]:80"))
+ assertTrue(Utils.isIpAddress("::ffff:192.168.173.22"))
+ assertTrue(Utils.isIpAddress("[::ffff:192.168.173.22]:80"))
+ assertTrue(Utils.isIpAddress("1::"))
+ assertTrue(Utils.isIpAddress("::"))
+ assertTrue(Utils.isIpAddress("::/0"))
+ assertTrue(Utils.isIpAddress("10.24.56.0/24"))
+ assertTrue(Utils.isIpAddress("2001:4321::1"))
+ assertTrue(Utils.isIpAddress("240e:1234:abcd:12::6666"))
+ assertTrue(Utils.isIpAddress("240e:1234:abcd:12::/64"))
+ }
+
+}
\ No newline at end of file
diff --git a/V2rayNG/app/src/test/java/com/v2ray/ang/ExampleUnitTest.java b/V2rayNG/app/src/test/java/com/v2ray/ang/ExampleUnitTest.java
deleted file mode 100644
index 3e28d640..00000000
--- a/V2rayNG/app/src/test/java/com/v2ray/ang/ExampleUnitTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.v2ray.ang;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-/**
- * To work on unit tests, switch the Test Artifact in the Build Variants view.
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
diff --git a/V2rayNG/app/src/test/kotlin/com/v2ray/ang/ExampleUnitTest.kt b/V2rayNG/app/src/test/kotlin/com/v2ray/ang/ExampleUnitTest.kt
deleted file mode 100644
index 08872d0c..00000000
--- a/V2rayNG/app/src/test/kotlin/com/v2ray/ang/ExampleUnitTest.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-import com.v2ray.ang.util.Utils
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
-import org.junit.Test
-
-class UtilTest {
-
- @Test
- fun test_parseInt() {
- assertEquals(Utils.parseInt("1234"), 1234)
- }
-
- @Test
- fun test_isIpAddress() {
- assertFalse(Utils.isIpAddress("114.113.112.266"))
- assertFalse(Utils.isIpAddress("666.666.666.666"))
- assertFalse(Utils.isIpAddress("256.0.0.0"))
- assertFalse(Utils.isIpAddress("::ffff:127.0.0.0.1"))
- assertFalse(Utils.isIpAddress("baidu.com"))
- assertFalse(Utils.isIpAddress(""))
-
- assertTrue(Utils.isIpAddress("127.0.0.1"))
- assertTrue(Utils.isIpAddress("127.0.0.1:80"))
- assertTrue(Utils.isIpAddress("0.0.0.0/0"))
- assertTrue(Utils.isIpAddress("::1"))
- assertTrue(Utils.isIpAddress("[::1]:80"))
- assertTrue(Utils.isIpAddress("2605:2700:0:3::4713:93e3"))
- assertTrue(Utils.isIpAddress("[2605:2700:0:3::4713:93e3]:80"))
- assertTrue(Utils.isIpAddress("::ffff:192.168.173.22"))
- assertTrue(Utils.isIpAddress("[::ffff:192.168.173.22]:80"))
- assertTrue(Utils.isIpAddress("1::"))
- assertTrue(Utils.isIpAddress("::"))
- assertTrue(Utils.isIpAddress("::/0"))
- assertTrue(Utils.isIpAddress("10.24.56.0/24"))
- assertTrue(Utils.isIpAddress("2001:4321::1"))
- assertTrue(Utils.isIpAddress("240e:1234:abcd:12::6666"))
- assertTrue(Utils.isIpAddress("240e:1234:abcd:12::/64"))
- }
-
-// @Test
-// fun test_fmtHysteria2Parse() {
-// val url2 = "hysteria2://password2@127.0.0.1:443?obfs=salamander&obfs-password=obfs2&insecure=0#Hy22"
-// var result2 = Hysteria2Fmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// assertTrue(result2?.obfsPassword == "obfs2")
-// assertTrue(result2?.security == "tls")
-//
-// var url22 = Hysteria2Fmt.toUri(result2!!)
-// assertTrue(url22.contains("obfs2"))
-// }
-//
-// @Test
-// fun test_fmtSsParse() {
-// val url2 = "ss://aa:bb@127.0.0.1:10000#sss"
-// var result2 = ShadowsocksFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-//
-// var result = ShadowsocksFmt.parse("ss://YWVzLTI1Ni1nY206cGFzc3dvcmQy@127.0.0.1:10000#sss")
-// assertTrue(result != null)
-// assertTrue(result?.server == "127.0.0.1")
-// }
-//
-// @Test
-// fun test_fmtSocksParse() {
-// val url2 = "socks://Og%3D%3D@127.0.0.1:1000#socks2"
-// var result2 = SocksFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// var url22 = SocksFmt.toUri(result2!!)
-// assertTrue(url2.contains(url22))
-//
-// var result = SocksFmt.parse("socks://dXNlcjpwYXNz@127.0.0.1:1000#socks2")
-// assertTrue(result != null)
-// assertTrue(result?.server == "127.0.0.1")
-// }
-//
-// @Test
-// fun test_fmtTrojanParse() {
-// val url2 = "trojan://password2@127.0.0.1:443?flow=xtls-rprx-vision&security=tls&type=tcp&headerType=none#Trojan"
-// var result2 = TrojanFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// assertTrue(result2?.flow == "xtls-rprx-vision")
-//
-// val url = "trojan://password2@127.0.0.1:443#Trojan"
-// var result = TrojanFmt.parse(url)
-// assertTrue(result != null)
-// assertTrue(result?.server == "127.0.0.1")
-// assertTrue(result?.security == "tls")
-//
-//
-// }
-//
-// @Test
-// fun test_fmtVlessParse() {
-// val url2 =
-// "vless://cae1dc39-0547-4b1d-9e7a-01132c7ae3a7@127.0.0.1:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=sni2&fp=chrome&pbk=publickkey&sid=123456&spx=%2F&type=ws&host=host2&path=path2#VLESS"
-// var result2 = VlessFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// assertTrue(result2?.flow == "xtls-rprx-vision")
-//
-//
-// var url22 = VlessFmt.toUri(result2!!)
-// assertTrue(url22.contains("xtls-rprx-vision"))
-//
-// }
-//
-// @Test
-// fun test_fmtVmessParse() {
-// val url2 =
-// "vmess://ew0KICAidiI6ICIyIiwNCiAgInBzIjogIlZtZXNzIiwNCiAgImFkZCI6ICIxMjcuMC4wLjEiLA0KICAicG9ydCI6ICIxMDAwMCIsDQogICJpZCI6ICJlYmI5MWM5OS1lZjA3LTRmZjUtOThhYS01OTAyYWI0ZDAyODYiLA0KICAiYWlkIjogIjEyMyIsDQogICJzY3kiOiAiYWVzLTEyOC1nY20iLA0KICAibmV0IjogInRjcCIsDQogICJ0eXBlIjogIm5vbmUiLA0KICAiaG9zdCI6ICJob3N0MiIsDQogICJwYXRoIjogInBhdGgyIiwNCiAgInRscyI6ICIiLA0KICAic25pIjogIiIsDQogICJhbHBuIjogIiINCn0="
-// var result2 = VmessFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// assertTrue(result2?.method == "aes-128-gcm")
-//
-// }
-//
-//
-// @Test
-// fun test_fmtWireguardParse() {
-// val url2 = "wireguard://privatekey2@127.0.0.1:2000?publickey=publickey2&reserved=2%2C2%2C3&address=127.0.0.127&mtu=1250#WGG"
-// var result2 = WireguardFmt.parse(url2)
-// assertTrue(result2 != null)
-// assertTrue(result2?.server == "127.0.0.1")
-// assertTrue(result2?.publicKey == "publickey2")
-// assertTrue(result2?.localAddress == "127.0.0.127")
-//
-//
-// var url22 = WireguardFmt.toUri(result2!!)
-// assertTrue(url22.contains("publickey2"))
-// }
-}
-
diff --git a/V2rayNG/build.gradle.kts b/V2rayNG/build.gradle.kts
index acb2cb0e..f55768e8 100644
--- a/V2rayNG/build.gradle.kts
+++ b/V2rayNG/build.gradle.kts
@@ -2,5 +2,5 @@
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
- alias(libs.plugins.android.kotlin) apply false
-}
+ alias(libs.plugins.kotlin.android) apply false
+}
\ No newline at end of file
diff --git a/V2rayNG/gradle.properties b/V2rayNG/gradle.properties
index 9e2f93c2..8126f5d5 100644
--- a/V2rayNG/gradle.properties
+++ b/V2rayNG/gradle.properties
@@ -1,6 +1,24 @@
-kotlin.incremental=true
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# 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=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
-android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
-org.gradle.jvmargs=-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+kotlin.incremental=true
\ No newline at end of file
diff --git a/V2rayNG/gradle/libs.versions.toml b/V2rayNG/gradle/libs.versions.toml
index a1d57aeb..6cf7ef5a 100644
--- a/V2rayNG/gradle/libs.versions.toml
+++ b/V2rayNG/gradle/libs.versions.toml
@@ -1,71 +1,63 @@
[versions]
-activityKtx = "1.9.3"
-appcompat = "1.7.0"
-cardview = "1.0.0"
-constraintlayout = "2.2.0"
-core = "3.5.3"
-editorkit = "2.9.0"
-flexbox = "3.0.0"
-fragmentKtx = "1.8.5"
-gson = "2.11.0"
+agp = "8.7.2"
+kotlin = "2.0.21"
+coreKtx = "1.15.0"
junit = "4.13.2"
-kotlinReflect = "2.0.21"
-kotlinxCoroutinesCore = "1.9.0"
-legacySupportV4 = "1.0.0"
-lifecycleViewmodelKtx = "2.8.7"
+junitVersion = "1.2.1"
+espressoCore = "3.6.1"
+appcompat = "1.7.0"
material = "1.12.0"
+activity = "1.9.3"
+constraintlayout = "2.2.0"
mmkvStatic = "1.3.9"
-multidex = "2.0.1"
-preferenceKtx = "1.2.1"
-quickieBundled = "1.10.0"
-recyclerview = "1.3.2"
-rxandroid = "3.0.2"
+gson = "2.11.0"
rxjava = "3.1.9"
+rxandroid = "3.0.2"
rxpermissions = "0.12"
toastcompat = "1.1.0"
-viewpager2 = "1.1.0"
-workRuntimeKtx = "2.9.1"
-androidGradlePlugin = "8.7.2"
-androidKotlinPlugin = "2.0.21"
+editorkit = "2.9.0"
+quickieBundled = "1.10.0"
+core = "3.5.3"
+workRuntimeKtx = "2.10.0"
+lifecycleViewmodelKtx = "2.8.7"
+multidex = "2.0.1"
mockitoMockitoInline = "4.0.0"
-
+flexbox = "3.0.0"
+preferenceKtx = "1.2.1"
+recyclerview = "1.3.2"
[libraries]
-activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activityKtx" }
-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
-cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" }
-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }
-core = { module = "com.google.zxing:core", version.ref = "core" }
-editorkit = { module = "com.blacksquircle.ui:editorkit", version.ref = "editorkit" }
-flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" }
-fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentKtx" }
-gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
-junit = { module = "junit:junit", version.ref = "junit" }
-kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlinReflect" }
-kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesCore" }
-kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" }
-language-base = { module = "com.blacksquircle.ui:language-base", version.ref = "editorkit" }
-language-json = { module = "com.blacksquircle.ui:language-json", version.ref = "editorkit" }
-legacy-support-v4 = { module = "androidx.legacy:legacy-support-v4", version.ref = "legacySupportV4" }
-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycleViewmodelKtx" }
-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleViewmodelKtx" }
-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" }
-material = { module = "com.google.android.material:material", version.ref = "material" }
+androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
+junit = { group = "junit", name = "junit", version.ref = "junit" }
+androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
+androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
+androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
+material = { group = "com.google.android.material", name = "material", version.ref = "material" }
+androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
+androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
mmkv-static = { module = "com.tencent:mmkv-static", version.ref = "mmkvStatic" }
-multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" }
-quickie-bundled = { module = "io.github.g00fy2.quickie:quickie-bundled", version.ref = "quickieBundled" }
-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
-preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preferenceKtx" }
-rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" }
+gson = { module = "com.google.code.gson:gson", version.ref = "gson" }
rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" }
+rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" }
rxpermissions = { module = "com.github.tbruyelle:rxpermissions", version.ref = "rxpermissions" }
toastcompat = { module = "me.drakeet.support:toastcompat", version.ref = "toastcompat" }
-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" }
-work-multiprocess = { module = "androidx.work:work-multiprocess", version.ref = "workRuntimeKtx" }
+editorkit = { module = "com.blacksquircle.ui:editorkit", version.ref = "editorkit" }
+language-base = { module = "com.blacksquircle.ui:language-base", version.ref = "editorkit" }
+language-json = { module = "com.blacksquircle.ui:language-json", version.ref = "editorkit" }
+quickie-bundled = { module = "io.github.g00fy2.quickie:quickie-bundled", version.ref = "quickieBundled" }
+core = { module = "com.google.zxing:core", version.ref = "core" }
work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workRuntimeKtx" }
-mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoMockitoInline" }
+work-multiprocess = { module = "androidx.work:work-multiprocess", version.ref = "workRuntimeKtx" }
+lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewmodelKtx" }
+lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycleViewmodelKtx" }
+lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycleViewmodelKtx" }
+multidex = { module = "androidx.multidex:multidex", version.ref = "multidex" }
org-mockito-mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockitoMockitoInline" }
-
+mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoMockitoInline" }
+flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" }
+recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
+preference-ktx = { module = "androidx.preference:preference-ktx", version.ref = "preferenceKtx" }
[plugins]
-android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
-android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
-android-kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "androidKotlinPlugin" }
+android-application = { id = "com.android.application", version.ref = "agp" }
+kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+android-library = { id = "com.android.library", version.ref = "agp" }
+
diff --git a/V2rayNG/gradle/wrapper/gradle-wrapper.jar b/V2rayNG/gradle/wrapper/gradle-wrapper.jar
index 13372aef..e708b1c0 100644
Binary files a/V2rayNG/gradle/wrapper/gradle-wrapper.jar and b/V2rayNG/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/V2rayNG/gradle/wrapper/gradle-wrapper.properties b/V2rayNG/gradle/wrapper/gradle-wrapper.properties
index 87d9b395..20a15d02 100644
--- a/V2rayNG/gradle/wrapper/gradle-wrapper.properties
+++ b/V2rayNG/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Jul 28 13:40:50 CST 2024
+#Thu Nov 14 12:42:51 BDT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-8.10.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/V2rayNG/gradlew b/V2rayNG/gradlew
index 9d82f789..4f906e0c 100755
--- a/V2rayNG/gradlew
+++ b/V2rayNG/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
##
@@ -6,42 +22,6 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
@@ -60,8 +40,49 @@ cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -85,7 +106,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -105,10 +126,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
@@ -134,27 +156,30 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
- i=$((i+1))
+ i=`expr $i + 1`
done
case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=`save "$@"`
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/V2rayNG/gradlew.bat b/V2rayNG/gradlew.bat
index 8a0b282a..107acd32 100644
--- a/V2rayNG/gradlew.bat
+++ b/V2rayNG/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,20 +24,23 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,34 +64,14 @@ echo location of your Java installation.
goto fail
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/V2rayNG/settings.gradle.kts b/V2rayNG/settings.gradle.kts
index 60ba4300..3f61841e 100644
--- a/V2rayNG/settings.gradle.kts
+++ b/V2rayNG/settings.gradle.kts
@@ -1,8 +1,14 @@
pluginManagement {
repositories {
- gradlePluginPortal()
- google()
+ google {
+ content {
+ includeGroupByRegex("com\\.android.*")
+ includeGroupByRegex("com\\.google.*")
+ includeGroupByRegex("androidx.*")
+ }
+ }
mavenCentral()
+ gradlePluginPortal()
}
}
dependencyResolutionManagement {
@@ -14,5 +20,6 @@ dependencyResolutionManagement {
maven { url = uri("https://jitpack.io") }
}
}
+
rootProject.name = "v2rayNG"
include(":app")