diff --git a/V2rayNG/app/build.gradle b/V2rayNG/app/build.gradle
index 2fc17ae5..b563513f 100644
--- a/V2rayNG/app/build.gradle
+++ b/V2rayNG/app/build.gradle
@@ -13,7 +13,7 @@ android {
defaultConfig {
applicationId "com.v2ray.ang"
- minSdkVersion 17
+ minSdkVersion 21
targetSdkVersion Integer.parseInt("$targetSdkVer")
multiDexEnabled true
versionCode 212
@@ -59,7 +59,9 @@ android {
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
- output.versionCodeOverride =
+ output.outputFileName = "v2rayNG_" + variant.versionName + "_" + output.getFilter(com.android.build.OutputFile.ABI) + ".apk"
+
+ output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) *
1000000 + android.defaultConfig.versionCode
}
@@ -72,7 +74,7 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
- testImplementation 'junit:junit:4.13'
+ testImplementation 'junit:junit:4.13.2'
// Androidx
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
@@ -91,12 +93,11 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
//kotlin
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.1"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2"
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2"
- implementation 'com.tencent:mmkv-static:1.2.7'
+ implementation 'com.tencent:mmkv-static:1.2.12'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.reactivex:rxjava:1.3.4'
implementation 'io.reactivex:rxandroid:1.2.1'
@@ -105,15 +106,18 @@ dependencies {
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar'
implementation 'me.drakeet.support:toastcompat:1.1.0'
- implementation 'com.blacksquircle.ui:editorkit:2.0.0'
- implementation 'com.blacksquircle.ui:language-json:2.0.0'
+ implementation 'com.blacksquircle.ui:editorkit:2.1.1'
+ implementation 'com.blacksquircle.ui:language-base:2.1.1'
+ implementation 'com.blacksquircle.ui:language-json:2.1.1'
}
buildscript {
repositories {
google()
- jcenter()
+ mavenCentral()
maven { url 'https://maven.google.com' }
+ maven { url 'https://jitpack.io' }
+ jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlinVersion"
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
index 4d317e67..e238ff27 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/extension/_Ext.kt
@@ -15,13 +15,13 @@ import java.net.URLConnection
val Context.v2RayApplication: AngApplication
get() = applicationContext as AngApplication
-inline fun Context.toast(message: Int): Toast = ToastCompat
+fun Context.toast(message: Int): Toast = ToastCompat
.makeText(this, message, Toast.LENGTH_SHORT)
.apply {
show()
}
-inline fun Context.toast(message: CharSequence): Toast = ToastCompat
+fun Context.toast(message: CharSequence): Toast = ToastCompat
.makeText(this, message, Toast.LENGTH_SHORT)
.apply {
show()
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt
index 20259d4e..826bf24f 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/receiver/WidgetProvider.kt
@@ -6,6 +6,7 @@ import android.appwidget.AppWidgetProvider
import android.content.ComponentName
import android.content.Context
import android.content.Intent
+import android.os.Build
import android.widget.RemoteViews
import com.v2ray.ang.R
import com.v2ray.ang.AppConfig
@@ -21,16 +22,33 @@ class WidgetProvider : AppWidgetProvider() {
updateWidgetBackground(context, appWidgetManager, appWidgetIds, V2RayServiceManager.v2rayPoint.isRunning)
}
+
private fun updateWidgetBackground(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray, isRunning: Boolean) {
val remoteViews = RemoteViews(context.packageName, R.layout.widget_switch)
val intent = Intent(context, WidgetProvider::class.java)
intent.action = AppConfig.BROADCAST_ACTION_WIDGET_CLICK
- val pendingIntent = PendingIntent.getBroadcast(context, R.id.layout_switch, intent, PendingIntent.FLAG_UPDATE_CURRENT)
+ val pendingIntent = PendingIntent.getBroadcast(
+ context,
+ R.id.layout_switch,
+ intent,
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
+ } else {
+ PendingIntent.FLAG_UPDATE_CURRENT
+ })
remoteViews.setOnClickPendingIntent(R.id.layout_switch, pendingIntent)
if (isRunning) {
- remoteViews.setInt(R.id.layout_switch, "setBackgroundResource", R.drawable.ic_rounded_corner_theme)
+ remoteViews.setInt(
+ R.id.layout_switch,
+ "setBackgroundResource",
+ R.drawable.ic_rounded_corner_theme
+ )
} else {
- remoteViews.setInt(R.id.layout_switch, "setBackgroundResource", R.drawable.ic_rounded_corner_grey)
+ remoteViews.setInt(
+ R.id.layout_switch,
+ "setBackgroundResource",
+ R.drawable.ic_rounded_corner_grey
+ )
}
for (appWidgetId in appWidgetIds) {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt
index cf44bfa2..8ee39792 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt
@@ -237,7 +237,11 @@ object V2RayServiceManager {
val startMainIntent = Intent(service, MainActivity::class.java)
val contentPendingIntent = PendingIntent.getActivity(service,
NOTIFICATION_PENDING_INTENT_CONTENT, startMainIntent,
- PendingIntent.FLAG_UPDATE_CURRENT)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
+ } else {
+ PendingIntent.FLAG_UPDATE_CURRENT
+ })
val stopV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE)
stopV2RayIntent.`package` = ANG_PACKAGE
@@ -245,7 +249,11 @@ object V2RayServiceManager {
val stopV2RayPendingIntent = PendingIntent.getBroadcast(service,
NOTIFICATION_PENDING_INTENT_STOP_V2RAY, stopV2RayIntent,
- PendingIntent.FLAG_UPDATE_CURRENT)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
+ } else {
+ PendingIntent.FLAG_UPDATE_CURRENT
+ })
val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
index 586c5c00..240e6db8 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayVpnService.kt
@@ -132,8 +132,7 @@ class V2RayVpnService : VpnService(), ServiceControl {
builder.setSession(V2RayServiceManager.currentConfig?.remarks.orEmpty())
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
- settingsStorage?.decodeBool(AppConfig.PREF_PER_APP_PROXY) == true) {
+ if (settingsStorage?.decodeBool(AppConfig.PREF_PER_APP_PROXY) == true) {
val apps = settingsStorage?.decodeStringSet(AppConfig.PREF_PER_APP_PROXY_SET)
val bypassApps = settingsStorage?.decodeBool(AppConfig.PREF_BYPASS_APPS) ?: false
apps?.forEach {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
index 146884fa..7128010f 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/LogcatActivity.kt
@@ -70,7 +70,7 @@ class LogcatActivity : BaseActivity() {
}
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_logcat, menu)
return super.onCreateOptionsMenu(menu)
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
index 09a6dff9..c876fe3e 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/MainActivity.kt
@@ -169,7 +169,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
super.onPause()
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
return true
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
index 003e06dd..435bd1e7 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/PerAppProxyActivity.kt
@@ -188,7 +188,7 @@ class PerAppProxyActivity : BaseActivity() {
}
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_bypass_list, menu)
return super.onCreateOptionsMenu(menu)
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
index 37d1788a..70269460 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingsFragment.kt
@@ -4,33 +4,38 @@ import android.Manifest
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Bundle
+import android.text.TextUtils
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import android.view.*
-import com.v2ray.ang.R
-import com.v2ray.ang.util.Utils
import kotlinx.android.synthetic.main.fragment_routing_settings.*
import android.view.MenuInflater
import androidx.activity.result.contract.ActivityResultContracts
import com.tbruyelle.rxpermissions.RxPermissions
import com.v2ray.ang.AppConfig
+import com.v2ray.ang.R
+import com.v2ray.ang.databinding.FragmentRoutingSettingsBinding
import com.v2ray.ang.extension.toast
+import com.v2ray.ang.extension.v2RayApplication
+import com.v2ray.ang.util.Utils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.net.URL
class RoutingSettingsFragment : Fragment() {
+ private lateinit var binding: FragmentRoutingSettingsBinding
companion object {
private const val routing_arg = "routing_arg"
}
- val defaultSharedPreferences by lazy { PreferenceManager.getDefaultSharedPreferences(context) }
+ val defaultSharedPreferences by lazy { PreferenceManager.getDefaultSharedPreferences(requireContext()) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
- return inflater.inflate(R.layout.fragment_routing_settings, container, false)
+ binding = FragmentRoutingSettingsBinding.inflate(layoutInflater)
+ return binding.root// inflater.inflate(R.layout.fragment_routing_settings, container, false)
}
fun newInstance(arg: String): Fragment {
@@ -45,7 +50,7 @@ class RoutingSettingsFragment : Fragment() {
super.onViewCreated(view, savedInstanceState)
val content = defaultSharedPreferences.getString(requireArguments().getString(routing_arg), "")
- et_routing_content.text = Utils.getEditable(content!!)
+ binding.etRoutingContent.text = Utils.getEditable(content!!)
setHasOptionsMenu(true)
}
@@ -63,7 +68,7 @@ class RoutingSettingsFragment : Fragment() {
true
}
R.id.del_routing -> {
- et_routing_content.text = null
+ binding.etRoutingContent.text = null
true
}
R.id.scan_replace -> {
@@ -81,6 +86,12 @@ class RoutingSettingsFragment : Fragment() {
else -> super.onOptionsItemSelected(item)
}
+ private fun saveRouting() {
+ val content = binding.etRoutingContent.text.toString()
+ defaultSharedPreferences.edit().putString(requireArguments().getString(routing_arg), content).apply()
+ activity?.toast(R.string.toast_success)
+ }
+
fun scanQRcode(forReplace: Boolean): Boolean {
// try {
// startActivityForResult(Intent("com.google.zxing.client.android.SCAN")
@@ -105,14 +116,14 @@ class RoutingSettingsFragment : Fragment() {
private val scanQRCodeForReplace = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val content = it.data?.getStringExtra("SCAN_RESULT")
- et_routing_content.text = Utils.getEditable(content!!)
+ binding.etRoutingContent.text = Utils.getEditable(content!!)
}
}
private val scanQRCodeForAppend = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val content = it.data?.getStringExtra("SCAN_RESULT")
- et_routing_content.text = Utils.getEditable("${et_routing_content.text},$content")
+ binding.etRoutingContent.text = Utils.getEditable("${binding.etRoutingContent.text},$content")
}
}
@@ -139,8 +150,14 @@ class RoutingSettingsFragment : Fragment() {
""
}
launch(Dispatchers.Main) {
- et_routing_content.text = Utils.getEditable(content)
- activity?.toast(R.string.toast_success)
+ val routingList = if (TextUtils.isEmpty(content)) {
+ Utils.readTextFromAssets(activity?.v2RayApplication!!, "custom_routing_$tag")
+ } else {
+ content
+ }
+ binding.etRoutingContent.text = Utils.getEditable(routingList)
+ saveRouting()
+ //toast(R.string.toast_success)
}
}
return true
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
index 03fb791e..e4982d83 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ScannerActivity.kt
@@ -63,7 +63,7 @@ class ScannerActivity : BaseActivity(), ZXingScannerView.ResultHandler {
finish()
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_scanner, menu)
return true
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
index 17fd859a..a0139dff 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerActivity.kt
@@ -315,10 +315,10 @@ class ServerActivity : BaseActivity() {
return true
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.action_server, menu)
- val delButton = menu?.findItem(R.id.del_config)
- val saveButton = menu?.findItem(R.id.save_config)
+ val delButton = menu.findItem(R.id.del_config)
+ val saveButton = menu.findItem(R.id.save_config)
if (editGuid.isNotEmpty()) {
if (isRunning) {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
index e445b744..a38c1783 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt
@@ -113,10 +113,10 @@ class ServerCustomConfigActivity : BaseActivity() {
return true
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.action_server, menu)
- val delButton = menu?.findItem(R.id.del_config)
- val saveButton = menu?.findItem(R.id.save_config)
+ val delButton = menu.findItem(R.id.del_config)
+ val saveButton = menu.findItem(R.id.save_config)
if (editGuid.isNotEmpty()) {
if (isRunning) {
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
index 87226b08..6ac19920 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SettingsActivity.kt
@@ -4,7 +4,6 @@ import android.content.Intent
import android.os.Bundle
import androidx.preference.*
import android.text.TextUtils
-import android.view.View
import androidx.activity.viewModels
import com.v2ray.ang.R
import com.v2ray.ang.AppConfig
@@ -203,7 +202,7 @@ class SettingsActivity : BaseActivity() {
override fun onStart() {
super.onStart()
- val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
+ val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity())
updateMode(defaultSharedPreferences.getString(AppConfig.PREF_MODE, "VPN"))
var remoteDnsString = defaultSharedPreferences.getString(AppConfig.PREF_REMOTE_DNS, "")
domesticDns.summary = defaultSharedPreferences.getString(AppConfig.PREF_DOMESTIC_DNS, "")
@@ -222,10 +221,10 @@ class SettingsActivity : BaseActivity() {
}
private fun updateMode(mode: String?) {
- val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
+ val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity())
val vpn = mode == "VPN"
perAppProxy.isEnabled = vpn
- perAppProxy.isChecked = PreferenceManager.getDefaultSharedPreferences(activity)
+ perAppProxy.isChecked = PreferenceManager.getDefaultSharedPreferences(requireActivity())
.getBoolean(AppConfig.PREF_PER_APP_PROXY, false)
localDns?.isEnabled = vpn
fakeDns?.isEnabled = vpn
@@ -243,7 +242,7 @@ class SettingsActivity : BaseActivity() {
}
}
- fun onModeHelpClicked(view: View) {
+ fun onModeHelpClicked() {
Utils.openUri(this, AppConfig.v2rayNGWikiMode)
}
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
index dbc04895..f7b1c30a 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubEditActivity.kt
@@ -106,10 +106,10 @@ class SubEditActivity : BaseActivity() {
return true
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.action_server, menu)
- del_config = menu?.findItem(R.id.del_config)
- save_config = menu?.findItem(R.id.save_config)
+ del_config = menu.findItem(R.id.del_config)
+ save_config = menu.findItem(R.id.save_config)
if (editSubId.isEmpty()) {
del_config?.isVisible = false
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
index 32abe229..a0030730 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/SubSettingActivity.kt
@@ -37,10 +37,10 @@ class SubSettingActivity : BaseActivity() {
adapter.notifyDataSetChanged()
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.action_sub_setting, menu)
- menu?.findItem(R.id.del_config)?.isVisible = false
- menu?.findItem(R.id.save_config)?.isVisible = false
+ menu.findItem(R.id.del_config)?.isVisible = false
+ menu.findItem(R.id.save_config)?.isVisible = false
return super.onCreateOptionsMenu(menu)
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt
index 8ee9d68f..1fff3fbc 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/TaskerActivity.kt
@@ -95,9 +95,9 @@ class TaskerActivity : BaseActivity() {
finish()
}
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.action_server, menu)
- val del_config = menu?.findItem(R.id.del_config)
+ val del_config = menu.findItem(R.id.del_config)
del_config?.isVisible = false
return super.onCreateOptionsMenu(menu)
}
diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt
index 74844498..8888ecb0 100644
--- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt
+++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt
@@ -167,7 +167,7 @@ object AngConfigManager {
}
//maybe sub
- if (str.startsWith(HTTP_PROTOCOL) || str.startsWith(HTTPS_PROTOCOL)) {
+ if (TextUtils.isEmpty(subid) && (str.startsWith(HTTP_PROTOCOL) || str.startsWith(HTTPS_PROTOCOL))) {
MmkvManager.importUrlAsSubscription(str)
return 0
}
diff --git a/V2rayNG/app/src/main/res/color-v21/color_highlight_material.xml b/V2rayNG/app/src/main/res/color/color_highlight_material.xml
similarity index 100%
rename from V2rayNG/app/src/main/res/color-v21/color_highlight_material.xml
rename to V2rayNG/app/src/main/res/color/color_highlight_material.xml
diff --git a/V2rayNG/app/src/main/res/values-v21/strings.xml b/V2rayNG/app/src/main/res/values-v21/strings.xml
deleted file mode 100644
index fd9dac4a..00000000
--- a/V2rayNG/app/src/main/res/values-v21/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- Set proxy for selected apps
-
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/res/values-v21/styles.xml b/V2rayNG/app/src/main/res/values-v21/styles.xml
deleted file mode 100644
index fd7a0584..00000000
--- a/V2rayNG/app/src/main/res/values-v21/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/V2rayNG/app/src/main/res/values-zh-rCN-v21/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN-v21/strings.xml
deleted file mode 100644
index 740864c2..00000000
--- a/V2rayNG/app/src/main/res/values-zh-rCN-v21/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- 为应用程序分别设置代理
-
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
index e03f27e6..dfa430f5 100644
--- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml
@@ -78,7 +78,7 @@
进阶设置
VPN 设置
分应用代理
- 分应用代理仅支持 Android 5.0 Lollipop 及更高
+ 常规:勾选的App被代理,未勾选的直连;\n绕行模式:勾选的App直连,未勾选的被代理.\n不明白者在菜单中选择自动选中需代理应用
启用Mux多路复用
开启可能会加速,关闭可能会减少断流
diff --git a/V2rayNG/app/src/main/res/values-zh-rTW-v21/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW-v21/strings.xml
deleted file mode 100644
index 81da2b40..00000000
--- a/V2rayNG/app/src/main/res/values-zh-rTW-v21/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
- 為選擇的應用程式設定 Proxy
-
diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
index f4224783..fc4f240c 100644
--- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
+++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml
@@ -79,7 +79,7 @@
進階
VPN 設定
Proxy 個別應用程式
- Proxy 個別應用程式模式只支援 Android 5.0 (Lollipop) 或更高
+ 常規:勾選的App被代理,未勾選的直連;\n繞行模式:勾選的App直連,未勾選的被代理.\n不明白者在菜單中選擇自動選中需代理應用
啟用 Mux
啟用或許會加快網路速度,關閉或許會閃爍
diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml
index 171a069a..f6d5ec5c 100644
--- a/V2rayNG/app/src/main/res/values/strings.xml
+++ b/V2rayNG/app/src/main/res/values/strings.xml
@@ -79,7 +79,7 @@
Advanced Settings
VPN Settings
Per-app proxy
- Per-app proxy mode only support Android 5.0 Lollipop or higher
+ General: Checked App is proxy, unchecked direct connection; \nbypass mode: checked app directly connected, unchecked proxy. \nThe option to automatically select the proxy application in the menu
Enable Mux
Enable maybe speed up network and switch network maybe flash
diff --git a/V2rayNG/app/src/main/res/values/styles.xml b/V2rayNG/app/src/main/res/values/styles.xml
index 827b4ded..ee224975 100644
--- a/V2rayNG/app/src/main/res/values/styles.xml
+++ b/V2rayNG/app/src/main/res/values/styles.xml
@@ -11,6 +11,7 @@