Compare commits

...

24 Commits

Author SHA1 Message Date
2dust
7438ee8308 up 1.9.25 2024-12-18 20:58:31 +08:00
2dust
f01cf7fcb5 Disable mux when using xhttp 2024-12-16 21:15:51 +08:00
Tamim Hossain
7a852f78e4 Update package info logic for better encapsulation (#4110)
Update package info logic for better encapsulation
2024-12-08 14:27:20 +08:00
kore kas nadar
0923659a49 Update Luri Bakhtiari translation (#4105) 2024-12-07 19:22:49 +08:00
phoenix6936
f9feb08607 Update translation (#4104)
* Update strings.xml

* Update persian translation
2024-12-07 19:22:40 +08:00
deepsm0ke
3b43fe39e5 Prevent showing the location of the USA during WebRTC Leak (#4103)
Changed tun2socks config private vlan4s and vlan6s to 10.10.10.1>10.10.10.2 and fc00::10:10:10:1>fc00::10:10:10:2 .

When visiting certain websites or using apps that could identify the real public IP, if the IP 26.26.26.1 was shown and it indicated a location in the USA, it unfortunately led to permanent account bans! . This issue is most likely resolved with this PR.
2024-12-06 10:50:45 +08:00
phoenix6936
de30fa15b3 Update persian translation (#4102) 2024-12-05 17:31:43 +08:00
solokot
25a4d7c14d Update Russian translation (#4101) 2024-12-05 17:31:32 +08:00
2dust
c8d3607efe Fix
https://github.com/2dust/v2rayNG/issues/4098
2024-12-05 09:25:57 +08:00
2dust
a0e73a9aa9 Fix typos 2024-12-05 09:25:11 +08:00
kore kas nadar
eaccf237a4 Update Luri Bakhtiari translation (#4097) 2024-12-05 09:13:13 +08:00
2dust
5124266346 up 1.9.24 2024-12-04 19:26:30 +08:00
phoenix6936
5cf2ea5a1e Update translation persian (#4096) 2024-12-04 19:10:05 +08:00
2dust
7a1af5914e Shows how many configurations have been test 2024-12-04 17:20:06 +08:00
2dust
e61f5eeb76 Shows how many configurations have been export/import/Update 2024-12-04 17:02:52 +08:00
2dust
6d92106f9d Shows how many configurations have been deleted
https://github.com/2dust/v2rayNG/issues/4078
2024-12-04 16:07:43 +08:00
2dust
8b06745e86 Using mixed local listening ports
Remove inbound http
2024-12-03 20:05:58 +08:00
2dust
85ad999975 Export complete configuration for hysteria2
https://github.com/2dust/v2rayNG/issues/4080
2024-12-02 14:05:41 +08:00
2dust
4c0f2d84cc Add stream-one
https://github.com/2dust/v2rayNG/issues/4083
2024-12-02 13:51:40 +08:00
2dust
6fc9803431 Delete splithttp 2024-11-30 19:29:41 +08:00
2dust
59a710bae5 up 1.9.23 2024-11-30 16:20:57 +08:00
2dust
98c642e1a8 Bug fix 2024-11-30 14:46:38 +08:00
phoenix6936
e91f4470fb Update persian translate (#4064)
* Update persian translate 

Update persian translate

* Update strings.xml
2024-11-30 14:40:01 +08:00
2dust
b33cc5284f Add restart button in notification
https://github.com/2dust/v2rayNG/issues/4069
2024-11-29 17:06:56 +08:00
34 changed files with 219 additions and 178 deletions

View File

@@ -12,8 +12,8 @@ android {
applicationId = "com.v2ray.ang" applicationId = "com.v2ray.ang"
minSdk = 21 minSdk = 21
targetSdk = 35 targetSdk = 35
versionCode = 618 versionCode = 621
versionName = "1.9.22" versionName = "1.9.25"
multiDexEnabled = true multiDexEnabled = true
splits { splits {

View File

@@ -45,9 +45,4 @@ class AngApplication : MultiDexApplication() {
SettingsManager.initRoutingRulesets(this) SettingsManager.initRoutingRulesets(this)
} }
fun getPackageInfo(packageName: String) = packageManager.getPackageInfo(
packageName, if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES
else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES
)!!
} }

View File

@@ -48,7 +48,6 @@ object AppConfig {
const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled" const val PREF_PROXY_SHARING = "pref_proxy_sharing_enabled"
const val PREF_ALLOW_INSECURE = "pref_allow_insecure" const val PREF_ALLOW_INSECURE = "pref_allow_insecure"
const val PREF_SOCKS_PORT = "pref_socks_port" const val PREF_SOCKS_PORT = "pref_socks_port"
const val PREF_HTTP_PORT = "pref_http_port"
const val PREF_REMOTE_DNS = "pref_remote_dns" const val PREF_REMOTE_DNS = "pref_remote_dns"
const val PREF_DOMESTIC_DNS = "pref_domestic_dns" const val PREF_DOMESTIC_DNS = "pref_domestic_dns"
const val PREF_DELAY_TEST_URL = "pref_delay_test_url" const val PREF_DELAY_TEST_URL = "pref_delay_test_url"
@@ -112,7 +111,6 @@ object AppConfig {
/** Ports and addresses for various services. */ /** Ports and addresses for various services. */
const val PORT_LOCAL_DNS = "10853" const val PORT_LOCAL_DNS = "10853"
const val PORT_SOCKS = "10808" const val PORT_SOCKS = "10808"
const val PORT_HTTP = "10809"
const val WIREGUARD_LOCAL_ADDRESS_V4 = "172.16.0.2/32" const val WIREGUARD_LOCAL_ADDRESS_V4 = "172.16.0.2/32"
const val WIREGUARD_LOCAL_ADDRESS_V6 = "2606:4700:110:8f81:d551:a0:532e:a2b3/128" const val WIREGUARD_LOCAL_ADDRESS_V6 = "2606:4700:110:8f81:d551:a0:532e:a2b3/128"
const val WIREGUARD_LOCAL_MTU = "1420" const val WIREGUARD_LOCAL_MTU = "1420"

View File

@@ -5,7 +5,6 @@ enum class NetworkType(val type: String) {
KCP("kcp"), KCP("kcp"),
WS("ws"), WS("ws"),
HTTP_UPGRADE("httpupgrade"), HTTP_UPGRADE("httpupgrade"),
SPLIT_HTTP("splithttp"),
XHTTP("xhttp"), XHTTP("xhttp"),
HTTP("http"), HTTP("http"),
H2("h2"), H2("h2"),

View File

@@ -9,5 +9,5 @@ data class RulesetItem(
var network: String? = null, var network: String? = null,
var protocol: List<String>? = null, var protocol: List<String>? = null,
var enabled: Boolean = true, var enabled: Boolean = true,
var looked: Boolean? = false, var locked: Boolean? = false,
) )

View File

@@ -404,7 +404,7 @@ data class V2rayConfig(
httpupgradeSettings = httpupgradeSetting httpupgradeSettings = httpupgradeSetting
} }
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> { NetworkType.XHTTP.type -> {
val xhttpSetting = XhttpSettingsBean() val xhttpSetting = XhttpSettingsBean()
xhttpSetting.host = host.orEmpty() xhttpSetting.host = host.orEmpty()
sni = host sni = host
@@ -596,7 +596,7 @@ data class V2rayConfig(
) )
} }
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> { NetworkType.XHTTP.type -> {
val xhttpSettings = streamSettings?.xhttpSettings ?: return null val xhttpSettings = streamSettings?.xhttpSettings ?: return null
listOf( listOf(
"", "",

View File

@@ -1,5 +1,6 @@
package com.v2ray.ang.fmt package com.v2ray.ang.fmt
import com.v2ray.ang.AppConfig
import com.v2ray.ang.dto.NetworkType import com.v2ray.ang.dto.NetworkType
import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.ProfileItem
import com.v2ray.ang.extension.isNotNullEmpty import com.v2ray.ang.extension.isNotNullEmpty
@@ -31,8 +32,6 @@ open class FmtBase {
fun getItemFormQuery(config: ProfileItem, queryParam: Map<String, String>, allowInsecure: Boolean) { fun getItemFormQuery(config: ProfileItem, queryParam: Map<String, String>, allowInsecure: Boolean) {
config.network = queryParam["type"] ?: NetworkType.TCP.type config.network = queryParam["type"] ?: NetworkType.TCP.type
//TODO
if (config.network == NetworkType.SPLIT_HTTP.type) config.network = NetworkType.XHTTP.type
config.headerType = queryParam["headerType"] config.headerType = queryParam["headerType"]
config.host = queryParam["host"] config.host = queryParam["host"]
config.path = queryParam["path"] config.path = queryParam["path"]
@@ -47,6 +46,9 @@ open class FmtBase {
config.xhttpExtra = queryParam["extra"] config.xhttpExtra = queryParam["extra"]
config.security = queryParam["security"] config.security = queryParam["security"]
if (config.security != AppConfig.TLS && config.security != AppConfig.REALITY) {
config.security = null
}
config.insecure = if (queryParam["allowInsecure"].isNullOrEmpty()) { config.insecure = if (queryParam["allowInsecure"].isNullOrEmpty()) {
allowInsecure allowInsecure
} else { } else {
@@ -91,7 +93,7 @@ open class FmtBase {
config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() } config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() }
} }
NetworkType.SPLIT_HTTP, NetworkType.XHTTP -> { NetworkType.XHTTP -> {
config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() } config.host.let { if (it.isNotNullEmpty()) dicQuery["host"] = it.orEmpty() }
config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() } config.path.let { if (it.isNotNullEmpty()) dicQuery["path"] = it.orEmpty() }
config.xhttpMode.let { if (it.isNotNullEmpty()) dicQuery["mode"] = it.orEmpty() } config.xhttpMode.let { if (it.isNotNullEmpty()) dicQuery["mode"] = it.orEmpty() }

View File

@@ -138,11 +138,11 @@ object AngConfigManager {
if (sb.count() > 0) { if (sb.count() > 0) {
Utils.setClipboard(context, sb.toString()) Utils.setClipboard(context, sb.toString())
} }
return sb.lines().count()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
return -1 return -1
} }
return 0
} }
/** /**
@@ -170,6 +170,13 @@ object AngConfigManager {
if (guid == null) return -1 if (guid == null) return -1
val result = V2rayConfigManager.getV2rayConfig(context, guid) val result = V2rayConfigManager.getV2rayConfig(context, guid)
if (result.status) { if (result.status) {
val config = MmkvManager.decodeServerConfig(guid)
if (config?.configType == EConfigType.HYSTERIA2) {
val socksPort = Utils.findFreePort(listOf(100 + SettingsManager.getSocksPort(), 0))
val hy2Config = Hysteria2Fmt.toNativeConfig(config, socksPort)
Utils.setClipboard(context, JsonUtil.toJsonPretty(hy2Config) + "\n" + result.content)
return 0
}
Utils.setClipboard(context, result.content) Utils.setClipboard(context, result.content)
} else { } else {
return -1 return -1

View File

@@ -164,18 +164,22 @@ object MmkvManager {
} }
} }
fun removeAllServer() { fun removeAllServer(): Int {
val count = profileFullStorage.allKeys()?.count() ?: 0
mainStorage.clearAll() mainStorage.clearAll()
profileFullStorage.clearAll() profileFullStorage.clearAll()
//profileStorage.clearAll() //profileStorage.clearAll()
serverAffStorage.clearAll() serverAffStorage.clearAll()
return count
} }
fun removeInvalidServer(guid: String) { fun removeInvalidServer(guid: String): Int {
var count = 0
if (guid.isNotEmpty()) { if (guid.isNotEmpty()) {
decodeServerAffiliationInfo(guid)?.let { aff -> decodeServerAffiliationInfo(guid)?.let { aff ->
if (aff.testDelayMillis < 0L) { if (aff.testDelayMillis < 0L) {
removeServer(guid) removeServer(guid)
count++
} }
} }
} else { } else {
@@ -183,10 +187,12 @@ object MmkvManager {
decodeServerAffiliationInfo(key)?.let { aff -> decodeServerAffiliationInfo(key)?.let { aff ->
if (aff.testDelayMillis < 0L) { if (aff.testDelayMillis < 0L) {
removeServer(key) removeServer(key)
count++
} }
} }
} }
} }
return count
} }
fun encodeServerRaw(guid: String, config: String) { fun encodeServerRaw(guid: String, config: String) {

View File

@@ -70,7 +70,7 @@ object SettingsManager {
private fun resetRoutingRulesetsCommon(rulesetList: MutableList<RulesetItem>) { private fun resetRoutingRulesetsCommon(rulesetList: MutableList<RulesetItem>) {
val rulesetNew: MutableList<RulesetItem> = mutableListOf() val rulesetNew: MutableList<RulesetItem> = mutableListOf()
MmkvManager.decodeRoutingRulesets()?.forEach { key -> MmkvManager.decodeRoutingRulesets()?.forEach { key ->
if (key.looked == true) { if (key.locked == true) {
rulesetNew.add(key) rulesetNew.add(key)
} }
} }
@@ -155,7 +155,7 @@ object SettingsManager {
} }
fun getHttpPort(): Int { fun getHttpPort(): Int {
return parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_HTTP_PORT), AppConfig.PORT_HTTP.toInt()) return getSocksPort() + (if (Utils.isXray()) 0 else 1)
} }
fun initAssets(context: Context, assets: AssetManager) { fun initAssets(context: Context, assets: AssetManager) {

View File

@@ -34,6 +34,7 @@ import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V4
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V6 import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V6
import com.v2ray.ang.dto.ConfigResult import com.v2ray.ang.dto.ConfigResult
import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.dto.EConfigType
import com.v2ray.ang.dto.NetworkType
import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.ProfileItem
import com.v2ray.ang.dto.RulesetItem import com.v2ray.ang.dto.RulesetItem
import com.v2ray.ang.dto.V2rayConfig import com.v2ray.ang.dto.V2rayConfig
@@ -120,7 +121,6 @@ object V2rayConfigManager {
private fun inbounds(v2rayConfig: V2rayConfig): Boolean { private fun inbounds(v2rayConfig: V2rayConfig): Boolean {
try { try {
val socksPort = SettingsManager.getSocksPort() val socksPort = SettingsManager.getSocksPort()
val httpPort = SettingsManager.getHttpPort()
v2rayConfig.inbounds.forEach { curInbound -> v2rayConfig.inbounds.forEach { curInbound ->
if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) { if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) {
@@ -142,14 +142,13 @@ object V2rayConfigManager {
v2rayConfig.inbounds[0].sniffing?.destOverride?.add("fakedns") v2rayConfig.inbounds[0].sniffing?.destOverride?.add("fakedns")
} }
if (Utils.isXray()) {
v2rayConfig.inbounds.removeAt(1)
} else {
val httpPort = SettingsManager.getHttpPort()
v2rayConfig.inbounds[1].port = httpPort v2rayConfig.inbounds[1].port = httpPort
}
// if (httpPort > 0) {
// val httpCopy = v2rayConfig.inbounds[0].copy()
// httpCopy.port = httpPort
// httpCopy.protocol = "http"
// v2rayConfig.inbounds.add(httpCopy)
// }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
return false return false
@@ -428,6 +427,8 @@ object V2rayConfigManager {
&& outbound.settings?.vnext?.first()?.users?.first()?.flow?.isNotEmpty() == true && outbound.settings?.vnext?.first()?.users?.first()?.flow?.isNotEmpty() == true
) { ) {
muxEnabled = false muxEnabled = false
} else if (outbound.streamSettings?.network == NetworkType.XHTTP.type) {
muxEnabled = false
} }
if (muxEnabled == true) { if (muxEnabled == true) {
outbound.mux?.enabled = true outbound.mux?.enabled = true

View File

@@ -22,6 +22,7 @@
package com.v2ray.ang.plugin package com.v2ray.ang.plugin
import android.content.pm.ComponentInfo import android.content.pm.ComponentInfo
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo import android.content.pm.ResolveInfo
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
@@ -33,13 +34,18 @@ abstract class ResolvedPlugin(protected val resolveInfo: ResolveInfo) : Plugin()
override val id by lazy { componentInfo.loadString(PluginContract.METADATA_KEY_ID)!! } override val id by lazy { componentInfo.loadString(PluginContract.METADATA_KEY_ID)!! }
override val version by lazy { override val version by lazy {
AngApplication.application.getPackageInfo(componentInfo.packageName).versionCode getPackageInfo(componentInfo.packageName).versionCode
} }
override val versionName: String by lazy { override val versionName: String by lazy {
AngApplication.application.getPackageInfo(componentInfo.packageName).versionName!! getPackageInfo(componentInfo.packageName).versionName!!
} }
override val label: CharSequence get() = resolveInfo.loadLabel(AngApplication.application.packageManager) override val label: CharSequence get() = resolveInfo.loadLabel(AngApplication.application.packageManager)
override val icon: Drawable get() = resolveInfo.loadIcon(AngApplication.application.packageManager) override val icon: Drawable get() = resolveInfo.loadIcon(AngApplication.application.packageManager)
override val packageName: String get() = componentInfo.packageName override val packageName: String get() = componentInfo.packageName
override val directBootAware get() = Build.VERSION.SDK_INT < 24 || componentInfo.directBootAware override val directBootAware get() = Build.VERSION.SDK_INT < 24 || componentInfo.directBootAware
fun getPackageInfo(packageName: String) = AngApplication.application.packageManager.getPackageInfo(
packageName, if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES
else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES
)!!
} }

View File

@@ -44,6 +44,7 @@ object V2RayServiceManager {
private const val NOTIFICATION_ID = 1 private const val NOTIFICATION_ID = 1
private const val NOTIFICATION_PENDING_INTENT_CONTENT = 0 private const val NOTIFICATION_PENDING_INTENT_CONTENT = 0
private const val NOTIFICATION_PENDING_INTENT_STOP_V2RAY = 1 private const val NOTIFICATION_PENDING_INTENT_STOP_V2RAY = 1
private const val NOTIFICATION_PENDING_INTENT_RESTART_V2RAY = 2
private const val NOTIFICATION_ICON_THRESHOLD = 3000 private const val NOTIFICATION_ICON_THRESHOLD = 3000
val v2rayPoint: V2RayPoint = Libv2ray.newV2RayPoint(V2RayCallback(), Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) val v2rayPoint: V2RayPoint = Libv2ray.newV2RayPoint(V2RayCallback(), Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1)
@@ -219,11 +220,15 @@ object V2RayServiceManager {
} }
AppConfig.MSG_STATE_STOP -> { AppConfig.MSG_STATE_STOP -> {
Log.d(ANG_PACKAGE, "Stop Service")
serviceControl.stopService() serviceControl.stopService()
} }
AppConfig.MSG_STATE_RESTART -> { AppConfig.MSG_STATE_RESTART -> {
startV2rayPoint() Log.d(ANG_PACKAGE, "Restart Service")
serviceControl.stopService()
Thread.sleep(500L)
startV2Ray(serviceControl.getService())
} }
AppConfig.MSG_MEASURE_DELAY -> { AppConfig.MSG_MEASURE_DELAY -> {
@@ -278,30 +283,24 @@ object V2RayServiceManager {
private fun showNotification() { private fun showNotification() {
val service = serviceControl?.get()?.getService() ?: return val service = serviceControl?.get()?.getService() ?: return
val startMainIntent = Intent(service, MainActivity::class.java) val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val contentPendingIntent = PendingIntent.getActivity(
service,
NOTIFICATION_PENDING_INTENT_CONTENT, startMainIntent,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else { } else {
PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT
} }
)
val startMainIntent = Intent(service, MainActivity::class.java)
val contentPendingIntent = PendingIntent.getActivity(service, NOTIFICATION_PENDING_INTENT_CONTENT, startMainIntent, flags)
val stopV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE) val stopV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE)
stopV2RayIntent.`package` = ANG_PACKAGE stopV2RayIntent.`package` = ANG_PACKAGE
stopV2RayIntent.putExtra("key", AppConfig.MSG_STATE_STOP) stopV2RayIntent.putExtra("key", AppConfig.MSG_STATE_STOP)
val stopV2RayPendingIntent = PendingIntent.getBroadcast(service, NOTIFICATION_PENDING_INTENT_STOP_V2RAY, stopV2RayIntent, flags)
val stopV2RayPendingIntent = PendingIntent.getBroadcast( val restartV2RayIntent = Intent(AppConfig.BROADCAST_ACTION_SERVICE)
service, restartV2RayIntent.`package` = ANG_PACKAGE
NOTIFICATION_PENDING_INTENT_STOP_V2RAY, stopV2RayIntent, restartV2RayIntent.putExtra("key", AppConfig.MSG_STATE_RESTART)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val restartV2RayPendingIntent = PendingIntent.getBroadcast(service, NOTIFICATION_PENDING_INTENT_RESTART_V2RAY, restartV2RayIntent, flags)
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
)
val channelId = val channelId =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -325,6 +324,11 @@ object V2RayServiceManager {
service.getString(R.string.notification_action_stop_v2ray), service.getString(R.string.notification_action_stop_v2ray),
stopV2RayPendingIntent stopV2RayPendingIntent
) )
.addAction(
R.drawable.ic_delete_24dp,
service.getString(R.string.title_service_restart),
restartV2RayPendingIntent
)
//.build() //.build()
//mBuilder?.setDefaults(NotificationCompat.FLAG_ONLY_ALERT_ONCE) //取消震动,铃声其他都不好使 //mBuilder?.setDefaults(NotificationCompat.FLAG_ONLY_ALERT_ONCE) //取消震动,铃声其他都不好使

View File

@@ -35,10 +35,10 @@ import java.lang.ref.SoftReference
class V2RayVpnService : VpnService(), ServiceControl { class V2RayVpnService : VpnService(), ServiceControl {
companion object { companion object {
private const val VPN_MTU = 1500 private const val VPN_MTU = 1500
private const val PRIVATE_VLAN4_CLIENT = "26.26.26.1" private const val PRIVATE_VLAN4_CLIENT = "10.10.10.1"
private const val PRIVATE_VLAN4_ROUTER = "26.26.26.2" private const val PRIVATE_VLAN4_ROUTER = "10.10.10.2"
private const val PRIVATE_VLAN6_CLIENT = "da26:2626::1" private const val PRIVATE_VLAN6_CLIENT = "fc00::10:10:10:1"
private const val PRIVATE_VLAN6_ROUTER = "da26:2626::2" private const val PRIVATE_VLAN6_ROUTER = "fc00::10:10:10:2"
private const val TUN2SOCKS = "libtun2socks.so" private const val TUN2SOCKS = "libtun2socks.so"
} }

View File

@@ -346,8 +346,8 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
val ret = mainViewModel.exportAllServer() val ret = mainViewModel.exportAllServer()
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
if (ret == 0) if (ret > 0)
toast(R.string.toast_success) toast(getString(R.string.title_export_config_count, ret))
else else
toast(R.string.toast_failure) toast(R.string.toast_failure)
binding.pbWaiting.hide() binding.pbWaiting.hide()
@@ -358,13 +358,13 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
} }
R.id.ping_all -> { R.id.ping_all -> {
toast(R.string.connection_test_testing) toast(getString(R.string.connection_test_testing_count, mainViewModel.serversCache.count()))
mainViewModel.testAllTcping() mainViewModel.testAllTcping()
true true
} }
R.id.real_ping_all -> { R.id.real_ping_all -> {
toast(R.string.connection_test_testing) toast(getString(R.string.connection_test_testing_count, mainViewModel.serversCache.count()))
mainViewModel.testAllRealPing() mainViewModel.testAllRealPing()
true true
} }
@@ -379,9 +379,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
.setPositiveButton(android.R.string.ok) { _, _ -> .setPositiveButton(android.R.string.ok) { _, _ ->
binding.pbWaiting.show() binding.pbWaiting.show()
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
mainViewModel.removeAllServer() val ret = mainViewModel.removeAllServer()
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
mainViewModel.reloadServerList() mainViewModel.reloadServerList()
toast(getString(R.string.title_del_config_count, ret))
binding.pbWaiting.hide() binding.pbWaiting.hide()
} }
} }
@@ -418,9 +419,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
.setPositiveButton(android.R.string.ok) { _, _ -> .setPositiveButton(android.R.string.ok) { _, _ ->
binding.pbWaiting.show() binding.pbWaiting.show()
lifecycleScope.launch(Dispatchers.IO) { lifecycleScope.launch(Dispatchers.IO) {
mainViewModel.removeInvalidServer() val ret = mainViewModel.removeInvalidServer()
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
mainViewModel.reloadServerList() mainViewModel.reloadServerList()
toast(getString(R.string.title_del_config_count, ret))
binding.pbWaiting.hide() binding.pbWaiting.hide()
} }
} }
@@ -517,7 +519,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
when { when {
count > 0 -> { count > 0 -> {
toast(R.string.toast_success) toast(getString(R.string.title_import_config_count, count))
mainViewModel.reloadServerList() mainViewModel.reloadServerList()
} }
@@ -623,7 +625,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
delay(500L) delay(500L)
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
if (count > 0) { if (count > 0) {
toast(R.string.toast_success) toast(getString(R.string.title_update_config_count, count))
mainViewModel.reloadServerList() mainViewModel.reloadServerList()
} else { } else {
toast(R.string.toast_failure) toast(R.string.toast_failure)

View File

@@ -37,7 +37,7 @@ class RoutingEditActivity : BaseActivity() {
private fun bindingServer(rulesetItem: RulesetItem): Boolean { private fun bindingServer(rulesetItem: RulesetItem): Boolean {
binding.etRemarks.text = Utils.getEditable(rulesetItem.remarks) binding.etRemarks.text = Utils.getEditable(rulesetItem.remarks)
binding.chkLocked.isChecked = rulesetItem.looked == true binding.chkLocked.isChecked = rulesetItem.locked == true
binding.etDomain.text = Utils.getEditable(rulesetItem.domain?.joinToString(",")) binding.etDomain.text = Utils.getEditable(rulesetItem.domain?.joinToString(","))
binding.etIp.text = Utils.getEditable(rulesetItem.ip?.joinToString(",")) binding.etIp.text = Utils.getEditable(rulesetItem.ip?.joinToString(","))
binding.etPort.text = Utils.getEditable(rulesetItem.port) binding.etPort.text = Utils.getEditable(rulesetItem.port)
@@ -60,7 +60,7 @@ class RoutingEditActivity : BaseActivity() {
rulesetItem.apply { rulesetItem.apply {
remarks = binding.etRemarks.text.toString() remarks = binding.etRemarks.text.toString()
looked = binding.chkLocked.isChecked locked = binding.chkLocked.isChecked
domain = binding.etDomain.text.toString().takeIf { it.isNotEmpty() } domain = binding.etDomain.text.toString().takeIf { it.isNotEmpty() }
?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() } ?.split(",")?.map { it.trim() }?.filter { it.isNotEmpty() }
ip = binding.etIp.text.toString().takeIf { it.isNotEmpty() } ip = binding.etIp.text.toString().takeIf { it.isNotEmpty() }

View File

@@ -25,7 +25,7 @@ class RoutingSettingRecyclerAdapter(val activity: RoutingSettingActivity) : Recy
holder.itemRoutingSettingBinding.domainIp.text = (ruleset.domain ?: ruleset.ip ?: ruleset.port)?.toString() holder.itemRoutingSettingBinding.domainIp.text = (ruleset.domain ?: ruleset.ip ?: ruleset.port)?.toString()
holder.itemRoutingSettingBinding.outboundTag.text = ruleset.outboundTag holder.itemRoutingSettingBinding.outboundTag.text = ruleset.outboundTag
holder.itemRoutingSettingBinding.chkEnable.isChecked = ruleset.enabled holder.itemRoutingSettingBinding.chkEnable.isChecked = ruleset.enabled
holder.itemRoutingSettingBinding.imgLocked.isVisible = ruleset.looked == true holder.itemRoutingSettingBinding.imgLocked.isVisible = ruleset.locked == true
holder.itemView.setBackgroundColor(Color.TRANSPARENT) holder.itemView.setBackgroundColor(Color.TRANSPARENT)
holder.itemRoutingSettingBinding.layoutEdit.setOnClickListener { holder.itemRoutingSettingBinding.layoutEdit.setOnClickListener {

View File

@@ -162,7 +162,7 @@ class ServerActivity : BaseActivity() {
sp_header_type_title?.text = sp_header_type_title?.text =
when (networks[position]) { when (networks[position]) {
NetworkType.GRPC.type -> getString(R.string.server_lab_mode_type) NetworkType.GRPC.type -> getString(R.string.server_lab_mode_type)
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> getString(R.string.server_lab_xhttp_mode) NetworkType.XHTTP.type -> getString(R.string.server_lab_xhttp_mode)
else -> getString(R.string.server_lab_head_type) else -> getString(R.string.server_lab_head_type)
}.orEmpty() }.orEmpty()
sp_header_type?.setSelection( sp_header_type?.setSelection(
@@ -170,7 +170,7 @@ class ServerActivity : BaseActivity() {
types, types,
when (networks[position]) { when (networks[position]) {
NetworkType.GRPC.type -> config?.mode NetworkType.GRPC.type -> config?.mode
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> config?.xhttpMode NetworkType.XHTTP.type -> config?.xhttpMode
else -> config?.headerType else -> config?.headerType
}.orEmpty() }.orEmpty()
) )
@@ -198,7 +198,7 @@ class ServerActivity : BaseActivity() {
NetworkType.TCP.type -> R.string.server_lab_request_host_http NetworkType.TCP.type -> R.string.server_lab_request_host_http
NetworkType.WS.type -> R.string.server_lab_request_host_ws NetworkType.WS.type -> R.string.server_lab_request_host_ws
NetworkType.HTTP_UPGRADE.type -> R.string.server_lab_request_host_httpupgrade NetworkType.HTTP_UPGRADE.type -> R.string.server_lab_request_host_httpupgrade
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> R.string.server_lab_request_host_xhttp NetworkType.XHTTP.type -> R.string.server_lab_request_host_xhttp
NetworkType.H2.type -> R.string.server_lab_request_host_h2 NetworkType.H2.type -> R.string.server_lab_request_host_h2
//"quic" -> R.string.server_lab_request_host_quic //"quic" -> R.string.server_lab_request_host_quic
NetworkType.GRPC.type -> R.string.server_lab_request_host_grpc NetworkType.GRPC.type -> R.string.server_lab_request_host_grpc
@@ -213,7 +213,7 @@ class ServerActivity : BaseActivity() {
NetworkType.KCP.type -> R.string.server_lab_path_kcp NetworkType.KCP.type -> R.string.server_lab_path_kcp
NetworkType.WS.type -> R.string.server_lab_path_ws NetworkType.WS.type -> R.string.server_lab_path_ws
NetworkType.HTTP_UPGRADE.type -> R.string.server_lab_path_httpupgrade NetworkType.HTTP_UPGRADE.type -> R.string.server_lab_path_httpupgrade
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> R.string.server_lab_path_xhttp NetworkType.XHTTP.type -> R.string.server_lab_path_xhttp
NetworkType.H2.type -> R.string.server_lab_path_h2 NetworkType.H2.type -> R.string.server_lab_path_h2
//"quic" -> R.string.server_lab_path_quic //"quic" -> R.string.server_lab_path_quic
NetworkType.GRPC.type -> R.string.server_lab_path_grpc NetworkType.GRPC.type -> R.string.server_lab_path_grpc
@@ -223,14 +223,14 @@ class ServerActivity : BaseActivity() {
) )
et_extra?.text = Utils.getEditable( et_extra?.text = Utils.getEditable(
when (networks[position]) { when (networks[position]) {
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> config?.xhttpExtra NetworkType.XHTTP.type -> config?.xhttpExtra
else -> null else -> null
}.orEmpty() }.orEmpty()
) )
layout_extra?.visibility = layout_extra?.visibility =
when (networks[position]) { when (networks[position]) {
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> View.VISIBLE NetworkType.XHTTP.type -> View.VISIBLE
else -> View.GONE else -> View.GONE
} }
} }
@@ -578,7 +578,7 @@ class ServerActivity : BaseActivity() {
grpcModes grpcModes
} }
NetworkType.SPLIT_HTTP.type, NetworkType.XHTTP.type -> { NetworkType.XHTTP.type -> {
xhttpMode xhttpMode
} }

View File

@@ -58,7 +58,6 @@ class SettingsActivity : BaseActivity() {
private val autoUpdateInterval by lazy { findPreference<EditTextPreference>(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL) } private val autoUpdateInterval by lazy { findPreference<EditTextPreference>(AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL) }
private val socksPort by lazy { findPreference<EditTextPreference>(AppConfig.PREF_SOCKS_PORT) } private val socksPort by lazy { findPreference<EditTextPreference>(AppConfig.PREF_SOCKS_PORT) }
private val httpPort by lazy { findPreference<EditTextPreference>(AppConfig.PREF_HTTP_PORT) }
private val remoteDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_REMOTE_DNS) } private val remoteDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_REMOTE_DNS) }
private val domesticDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_DOMESTIC_DNS) } private val domesticDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_DOMESTIC_DNS) }
private val delayTestUrl by lazy { findPreference<EditTextPreference>(AppConfig.PREF_DELAY_TEST_URL) } private val delayTestUrl by lazy { findPreference<EditTextPreference>(AppConfig.PREF_DELAY_TEST_URL) }
@@ -142,11 +141,7 @@ class SettingsActivity : BaseActivity() {
socksPort?.summary = if (TextUtils.isEmpty(nval)) AppConfig.PORT_SOCKS else nval socksPort?.summary = if (TextUtils.isEmpty(nval)) AppConfig.PORT_SOCKS else nval
true true
} }
httpPort?.setOnPreferenceChangeListener { _, any ->
val nval = any as String
httpPort?.summary = if (TextUtils.isEmpty(nval)) AppConfig.PORT_HTTP else nval
true
}
remoteDns?.setOnPreferenceChangeListener { _, any -> remoteDns?.setOnPreferenceChangeListener { _, any ->
val nval = any as String val nval = any as String
remoteDns?.summary = if (nval == "") AppConfig.DNS_PROXY else nval remoteDns?.summary = if (nval == "") AppConfig.DNS_PROXY else nval
@@ -197,7 +192,6 @@ class SettingsActivity : BaseActivity() {
autoUpdateInterval?.isEnabled = MmkvManager.decodeSettingsBool(AppConfig.SUBSCRIPTION_AUTO_UPDATE, false) autoUpdateInterval?.isEnabled = MmkvManager.decodeSettingsBool(AppConfig.SUBSCRIPTION_AUTO_UPDATE, false)
socksPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS) socksPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_SOCKS_PORT, AppConfig.PORT_SOCKS)
httpPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP)
remoteDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY) remoteDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY)
domesticDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT) domesticDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT)
delayTestUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DelayTestUrl) delayTestUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DelayTestUrl)
@@ -215,7 +209,6 @@ class SettingsActivity : BaseActivity() {
fragmentInterval, fragmentInterval,
autoUpdateInterval, autoUpdateInterval,
socksPort, socksPort,
httpPort,
remoteDns, remoteDns,
domesticDns, domesticDns,
delayTestUrl delayTestUrl

View File

@@ -498,5 +498,7 @@ object Utils {
ContextCompat.RECEIVER_NOT_EXPORTED ContextCompat.RECEIVER_NOT_EXPORTED
} }
fun isXray(): Boolean = (ANG_PACKAGE == "com.v2ray.ang")
} }

View File

@@ -6,7 +6,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.content.res.AssetManager import android.content.res.AssetManager
import android.os.Build
import android.util.Log import android.util.Log
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
@@ -274,7 +273,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
return deleteServer.count() return deleteServer.count()
} }
fun removeAllServer() { fun removeAllServer(): Int {
val count =
if (subscriptionId.isEmpty() && keywordFilter.isEmpty()) { if (subscriptionId.isEmpty() && keywordFilter.isEmpty()) {
MmkvManager.removeAllServer() MmkvManager.removeAllServer()
} else { } else {
@@ -282,18 +282,22 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
for (item in serversCopy) { for (item in serversCopy) {
MmkvManager.removeServer(item.guid) MmkvManager.removeServer(item.guid)
} }
serversCache.toList().count()
} }
return count
} }
fun removeInvalidServer() { fun removeInvalidServer(): Int {
var count = 0
if (subscriptionId.isEmpty() && keywordFilter.isEmpty()) { if (subscriptionId.isEmpty() && keywordFilter.isEmpty()) {
MmkvManager.removeInvalidServer("") count += MmkvManager.removeInvalidServer("")
} else { } else {
val serversCopy = serversCache.toList() val serversCopy = serversCache.toList()
for (item in serversCopy) { for (item in serversCopy) {
MmkvManager.removeInvalidServer(item.guid) count += MmkvManager.removeInvalidServer(item.guid)
} }
} }
return count
} }
fun sortByTestResults() { fun sortByTestResults() {

View File

@@ -34,7 +34,6 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application
AppConfig.PREF_DELAY_TEST_URL, AppConfig.PREF_DELAY_TEST_URL,
AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PREF_LOCAL_DNS_PORT,
AppConfig.PREF_SOCKS_PORT, AppConfig.PREF_SOCKS_PORT,
AppConfig.PREF_HTTP_PORT,
AppConfig.PREF_LOGLEVEL, AppConfig.PREF_LOGLEVEL,
AppConfig.PREF_LANGUAGE, AppConfig.PREF_LANGUAGE,
AppConfig.PREF_UI_MODE_NIGHT, AppConfig.PREF_UI_MODE_NIGHT,

View File

@@ -82,6 +82,7 @@
<string name="server_lab_encryption">التشفير</string> <string name="server_lab_encryption">التشفير</string>
<string name="server_lab_flow">التدفق</string> <string name="server_lab_flow">التدفق</string>
<string name="server_lab_public_key" translatable="false">المفتاح العام</string> <string name="server_lab_public_key" translatable="false">المفتاح العام</string>
<string name="server_lab_preshared_key">PreSharedKey(optional)</string>
<string name="server_lab_short_id" translatable="false">المعرّف القصير</string> <string name="server_lab_short_id" translatable="false">المعرّف القصير</string>
<string name="server_lab_spider_x" translatable="false">SpiderX</string> <string name="server_lab_spider_x" translatable="false">SpiderX</string>
<string name="server_lab_secret_key" translatable="false">المفتاح السري</string> <string name="server_lab_secret_key" translatable="false">المفتاح السري</string>
@@ -189,11 +190,8 @@
<string name="title_pref_allow_insecure">السماح غير الآمن</string> <string name="title_pref_allow_insecure">السماح غير الآمن</string>
<string name="summary_pref_allow_insecure">عند TLS، الافتراضي هو السماح غير الآمن</string> <string name="summary_pref_allow_insecure">عند TLS، الافتراضي هو السماح غير الآمن</string>
<string name="title_pref_socks_port">منفذ بروكسي SOCKS5</string> <string name="title_pref_socks_port">منفذ بروكسي Local</string>
<string name="summary_pref_socks_port">منفذ بروكسي SOCKS5</string> <string name="summary_pref_socks_port">منفذ بروكسي Local</string>
<string name="title_pref_http_port">منفذ بروكسي HTTP</string>
<string name="summary_pref_http_port">منفذ بروكسي HTTP</string>
<string name="title_pref_local_dns_port">منفذ DNS المحلي</string> <string name="title_pref_local_dns_port">منفذ DNS المحلي</string>
<string name="summary_pref_local_dns_port">منفذ DNS المحلي</string> <string name="summary_pref_local_dns_port">منفذ DNS المحلي</string>
@@ -214,6 +212,7 @@
<string name="title_privacy_policy">سياسة الخصوصية</string> <string name="title_privacy_policy">سياسة الخصوصية</string>
<string name="title_about">حول\nترجمة م. ابراهيم قاسم</string> <string name="title_about">حول\nترجمة م. ابراهيم قاسم</string>
<string name="title_source_code">الكود المصدري</string> <string name="title_source_code">الكود المصدري</string>
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">قناة Telegram</string> <string name="title_tg_channel">قناة Telegram</string>
<string name="title_configuration_backup">نسخ التكوين احتياطيًا</string> <string name="title_configuration_backup">نسخ التكوين احتياطيًا</string>
<string name="summary_configuration_backup">موقع التخزين: [%s]، سيتم مسح النسخة الاحتياطية بعد إلغاء تثبيت التطبيق أو مسح التخزين</string> <string name="summary_configuration_backup">موقع التخزين: [%s]، سيتم مسح النسخة الاحتياطية بعد إلغاء تثبيت التطبيق أو مسح التخزين</string>
@@ -260,6 +259,10 @@
<string name="filter_config_all">جميع مجموعات الاشتراك</string> <string name="filter_config_all">جميع مجموعات الاشتراك</string>
<string name="title_del_duplicate_config_count">حذف %d من الإعدادات المكررة</string> <string name="title_del_duplicate_config_count">حذف %d من الإعدادات المكررة</string>
<string name="title_del_config_count">Delete %d configurations</string>
<string name="title_import_config_count">Import %d configurations</string>
<string name="title_export_config_count">Export %d configurations</string>
<string name="title_update_config_count">Update %d configurations</string>
<string name="tasker_start_service">بدء الخدمة</string> <string name="tasker_start_service">بدء الخدمة</string>
<string name="tasker_setting_confirm">تأكيد</string> <string name="tasker_setting_confirm">تأكيد</string>
@@ -279,6 +282,7 @@
<string name="connection_test_pending">التحقق من الاتصال</string> <string name="connection_test_pending">التحقق من الاتصال</string>
<string name="connection_test_testing">يجري الاختبار…</string> <string name="connection_test_testing">يجري الاختبار…</string>
<string name="connection_test_testing_count">Testing %d configurations…</string>
<string name="connection_test_available">نجاح: استغرق اتصال HTTP %dms</string> <string name="connection_test_available">نجاح: استغرق اتصال HTTP %dms</string>
<string name="connection_test_error">فشل اكتشاف اتصال الإنترنت: %s</string> <string name="connection_test_error">فشل اكتشاف اتصال الإنترنت: %s</string>
<string name="connection_test_fail">الإنترنت غير متاح</string> <string name="connection_test_fail">الإنترنت غير متاح</string>

View File

@@ -81,6 +81,7 @@
<string name="server_lab_encryption">এনক্রিপশন</string> <string name="server_lab_encryption">এনক্রিপশন</string>
<string name="server_lab_flow">ফ্লো</string> <string name="server_lab_flow">ফ্লো</string>
<string name="server_lab_public_key" translatable="false">পাবলিক কী</string> <string name="server_lab_public_key" translatable="false">পাবলিক কী</string>
<string name="server_lab_preshared_key">PreSharedKey(optional)</string>
<string name="server_lab_short_id" translatable="false">শর্ট আইডি</string> <string name="server_lab_short_id" translatable="false">শর্ট আইডি</string>
<string name="server_lab_spider_x" translatable="false">SpiderX</string> <string name="server_lab_spider_x" translatable="false">SpiderX</string>
<string name="server_lab_secret_key" translatable="false">সিক্রেট কী</string> <string name="server_lab_secret_key" translatable="false">সিক্রেট কী</string>
@@ -189,11 +190,8 @@
<string name="title_pref_allow_insecure">allowInsecure</string> <string name="title_pref_allow_insecure">allowInsecure</string>
<string name="summary_pref_allow_insecure">যখন TLS, ডিফল্টভাবে allowInsecure</string> <string name="summary_pref_allow_insecure">যখন TLS, ডিফল্টভাবে allowInsecure</string>
<string name="title_pref_socks_port">SOCKS5 প্রক্সি পোর্ট</string> <string name="title_pref_socks_port">Local প্রক্সি পোর্ট</string>
<string name="summary_pref_socks_port">SOCKS5 প্রক্সি পোর্ট</string> <string name="summary_pref_socks_port">Local প্রক্সি পোর্ট</string>
<string name="title_pref_http_port">HTTP প্রক্সি পোর্ট</string>
<string name="summary_pref_http_port">HTTP প্রক্সি পোর্ট</string>
<string name="title_pref_local_dns_port">স্থানীয় DNS পোর্ট</string> <string name="title_pref_local_dns_port">স্থানীয় DNS পোর্ট</string>
<string name="summary_pref_local_dns_port">স্থানীয় DNS পোর্ট</string> <string name="summary_pref_local_dns_port">স্থানীয় DNS পোর্ট</string>
@@ -214,6 +212,7 @@
<string name="title_privacy_policy">গোপনীয়তা নীতি</string> <string name="title_privacy_policy">গোপনীয়তা নীতি</string>
<string name="title_about">সম্পর্কিত</string> <string name="title_about">সম্পর্কিত</string>
<string name="title_source_code">সোর্স কোড</string> <string name="title_source_code">সোর্স কোড</string>
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">টেলিগ্রাম চ্যানেল</string> <string name="title_tg_channel">টেলিগ্রাম চ্যানেল</string>
<string name="title_configuration_backup">কনফিগারেশন ব্যাকআপ</string> <string name="title_configuration_backup">কনফিগারেশন ব্যাকআপ</string>
<string name="summary_configuration_backup">স্টোরেজ অবস্থান: [%s], অ্যাপ আনইনস্টল বা স্টোরেজ ক্লিয়ার করার পরে ব্যাকআপ মুছে যাবে</string> <string name="summary_configuration_backup">স্টোরেজ অবস্থান: [%s], অ্যাপ আনইনস্টল বা স্টোরেজ ক্লিয়ার করার পরে ব্যাকআপ মুছে যাবে</string>
@@ -259,6 +258,10 @@
<string name="title_filter_config">কনফিগারেশন ফাইল ফিল্টার করুন</string> <string name="title_filter_config">কনফিগারেশন ফাইল ফিল্টার করুন</string>
<string name="filter_config_all">সব সাবস্ক্রিপশন গ্রুপ</string> <string name="filter_config_all">সব সাবস্ক্রিপশন গ্রুপ</string>
<string name="title_del_duplicate_config_count">%d ডুপ্লিকেট কনফিগারেশন মুছে ফেলুন</string> <string name="title_del_duplicate_config_count">%d ডুপ্লিকেট কনফিগারেশন মুছে ফেলুন</string>
<string name="title_del_config_count">Delete %d configurations</string>
<string name="title_import_config_count">Import %d configurations</string>
<string name="title_export_config_count">Export %d configurations</string>
<string name="title_update_config_count">Update %d configurations</string>
<string name="tasker_start_service">সার্ভিস শুরু করুন</string> <string name="tasker_start_service">সার্ভিস শুরু করুন</string>
<string name="tasker_setting_confirm">নিশ্চিত করুন</string> <string name="tasker_setting_confirm">নিশ্চিত করুন</string>
@@ -278,6 +281,7 @@
<string name="connection_test_pending">সংযোগ পরীক্ষা করুন</string> <string name="connection_test_pending">সংযোগ পরীক্ষা করুন</string>
<string name="connection_test_testing">পরীক্ষা চলছে…</string> <string name="connection_test_testing">পরীক্ষা চলছে…</string>
<string name="connection_test_testing_count">Testing %d configurations…</string>
<string name="connection_test_available">সফল: HTTP সংযোগ নিয়েছে %dms</string> <string name="connection_test_available">সফল: HTTP সংযোগ নিয়েছে %dms</string>
<string name="connection_test_error">ইন্টারনেট সংযোগ সনাক্ত করতে ব্যর্থ: %s</string> <string name="connection_test_error">ইন্টারনেট সংযোগ সনাক্ত করতে ব্যর্থ: %s</string>
<string name="connection_test_fail">ইন্টারনেট উপলব্ধ নয়</string> <string name="connection_test_fail">ইন্টারনেট উপলব্ধ নয়</string>

View File

@@ -14,10 +14,10 @@
<string name="toast_permission_denied">گرؽڌن موجوز مومکن نؽڌ</string> <string name="toast_permission_denied">گرؽڌن موجوز مومکن نؽڌ</string>
<string name="toast_permission_denied_notification">گرؽڌن موجوز وارسۊوی مومکن نؽڌ</string> <string name="toast_permission_denied_notification">گرؽڌن موجوز وارسۊوی مومکن نؽڌ</string>
<string name="notification_action_more">سی گرؽڌن دۉسمندیا بیشتر کیلیک کوݩ</string> <string name="notification_action_more">سی گرؽڌن دۉسمندیا بیشتر کیلیک کوݩ</string>
<string name="toast_services_start">ره وستن خدمات</string> <string name="toast_services_start">ر وستن خدمات</string>
<string name="toast_services_stop">واڌاشتن خدمات</string> <string name="toast_services_stop">واڌاشتن خدمات</string>
<string name="toast_services_success">ره وستن خدمات وا مووفقیت ٱنجوم وابی</string> <string name="toast_services_success">ر وستن خدمات وا مووفقیت ٱنجوم وابی</string>
<string name="toast_services_failure">ره وستن خدمات وا مووفقیت ٱنجوم نوابی</string> <string name="toast_services_failure">ر وستن خدمات وا مووفقیت ٱنجوم نوابی</string>
<!--ServerActivity--> <!--ServerActivity-->
<string name="title_server">فایل کانفیگ</string> <string name="title_server">فایل کانفیگ</string>
@@ -81,6 +81,7 @@
<string name="server_lab_encryption">رزم نگاری</string> <string name="server_lab_encryption">رزم نگاری</string>
<string name="server_lab_flow">جریان</string> <string name="server_lab_flow">جریان</string>
<string name="server_lab_public_key">کیلیت پوی وولاتی</string> <string name="server_lab_public_key">کیلیت پوی وولاتی</string>
<string name="server_lab_preshared_key">کیلیت رمز ناهاڌن ازاف (اختیاری)</string>
<string name="server_lab_short_id">ShortId</string> <string name="server_lab_short_id">ShortId</string>
<string name="server_lab_spider_x">SpiderX</string> <string name="server_lab_spider_x">SpiderX</string>
<string name="server_lab_secret_key">کیلیت سیخومی</string> <string name="server_lab_secret_key">کیلیت سیخومی</string>
@@ -139,11 +140,11 @@
<string name="title_vpn_settings">سامووا VPN</string> <string name="title_vpn_settings">سامووا VPN</string>
<string name="title_pref_per_app_proxy">پروکسی و ری برنومه</string> <string name="title_pref_per_app_proxy">پروکسی و ری برنومه</string>
<string name="summary_pref_per_app_proxy">پوی وولاتی: برنومه واجۊری بیڌه پروکسی هڌ، منپیز موستقیم بؽ نشووه هڌ. هالت دور زیڌن: برنومه نشووک ناڌه موستقیمن منپیز هڌ، پروکسی نشووک زیڌه نؽڌ. گۊزینه پسند خوتکار برنومه پروکسی من نومگه</string> <string name="summary_pref_per_app_proxy">پوی وولاتی: برنومه واجۊری بیڌه پروکسی هڌ، منپیز موستقیم بؽ نشووه هڌ. هالت دور زیڌن: برنومه نشووک ناڌه موستقیمن منپیز هڌ، پروکسی نشووک زیڌه نؽڌ. گۊزینه پسند خوتکار برنومه پروکسی من نومگه</string>
<string name="title_pref_is_booted">منپیز خوتکار مجال ره ونی</string> <string name="title_pref_is_booted">منپیز خوتکار مجال ر ونی</string>
<string name="summary_pref_is_booted">مجال ره وندن، خوساخوس و سرور پسند بیڌه منپیز ابۊ که گاشڌ نا مووفق بۊ.</string> <string name="summary_pref_is_booted">مجال ر وندن، خوساخوس و سرور پسند بیڌه منپیز ابۊ که گاشڌ نا مووفق بۊ.</string>
<string name="title_mux_settings">سامووا Mux</string> <string name="title_mux_settings">سامووا Mux</string>
<string name="title_pref_mux_enabled">ره وندن Mux</string> <string name="title_pref_mux_enabled">ر وندن Mux</string>
<string name="summary_pref_mux_enabled">زل تر، ٱما گاشڌ منپیز زی قت بۊ بارت دؽوۉداری، TCP، UDP و QUIC ن ای لم سفارشی کۊنین.</string> <string name="summary_pref_mux_enabled">زل تر، ٱما گاشڌ منپیز زی قت بۊ بارت دؽوۉداری، TCP، UDP و QUIC ن ای لم سفارشی کۊنین.</string>
<string name="title_pref_mux_concurency">منپیزا TCP (تلایه منجا 1-1024)</string> <string name="title_pref_mux_concurency">منپیزا TCP (تلایه منجا 1-1024)</string>
<string name="title_pref_mux_xudp_concurency">منپیزا XUDP (تلایه منجا 1-1024)</string> <string name="title_pref_mux_xudp_concurency">منپیزا XUDP (تلایه منجا 1-1024)</string>
@@ -154,24 +155,24 @@
<item>گوم زیڌن</item> <item>گوم زیڌن</item>
</string-array> </string-array>
<string name="title_pref_speed_enabled">ره وندن نشۉݩ داڌن سورعت</string> <string name="title_pref_speed_enabled">ر وندن نشۉݩ داڌن سورعت</string>
<string name="summary_pref_speed_enabled">نشۉݩ داڌن سورعت هیم سکویی من وارسۊویا. نماڌ وارسۊوی و ری و کار گرؽڌن آلشت ابۊ.</string> <string name="summary_pref_speed_enabled">نشۉݩ داڌن سورعت هیم سکویی من وارسۊویا. نماڌ وارسۊوی و ری و کار گرؽڌن آلشت ابۊ.</string>
<string name="title_pref_sniffing_enabled">ره وندن Sniffing</string> <string name="title_pref_sniffing_enabled">ر وندن Sniffing</string>
<string name="summary_pref_sniffing_enabled">دامنه sniff ن ز کتن امتهۉݩ کۊنین (پؽش فرز رۊشن)</string> <string name="summary_pref_sniffing_enabled">دامنه sniff ن ز کتن امتهۉݩ کۊنین (پؽش فرز رۊشن)</string>
<string name="title_pref_route_only_enabled">ره وندن routeOnly</string> <string name="title_pref_route_only_enabled">ر وندن routeOnly</string>
<string name="summary_pref_route_only_enabled">ز نوم دامنه sniffed تینا سی تور جوستن استفاڌه کۊنین وو آدرس مورد نزرن و عونوان آدرس IP ووردارین.</string> <string name="summary_pref_route_only_enabled">ز نوم دامنه sniffed تینا سی تور جوستن استفاڌه کۊنین وو آدرس مورد نزرن و عونوان آدرس IP ووردارین.</string>
<string name="title_pref_local_dns_enabled">ره وندن DNS مهلی</string> <string name="title_pref_local_dns_enabled">ر وندن DNS مهلی</string>
<string name="summary_pref_local_dns_enabled">DNS پردازشت وابیڌه و دس هسته ماژول DNS (پؽشنهاڌ ابۊ، ٱر نیاز هڌ ک جوستن تور وو ولات ٱسلین دور زنی)</string> <string name="summary_pref_local_dns_enabled">DNS پردازشت وابیڌه و دس هسته ماژول DNS (پؽشنهاڌ ابۊ، ٱر نیاز هڌ ک جوستن تور وو ولات ٱسلین دور زنی)</string>
<string name="title_pref_fake_dns_enabled">ره وندن DNS جئلی</string> <string name="title_pref_fake_dns_enabled">ر وندن DNS جئلی</string>
<string name="summary_pref_fake_dns_enabled">DNS مهلی آدرسا IP جئلی ن وورگنه (زل تر، ٱما گاشڌ من یقرد ز برنومیل کار نکونه)</string> <string name="summary_pref_fake_dns_enabled">DNS مهلی آدرسا IP جئلی ن وورگنه (زل تر، ٱما گاشڌ من یقرد ز برنومیل کار نکونه)</string>
<string name="title_pref_prefer_ipv6">ترجی IPv6</string> <string name="title_pref_prefer_ipv6">ترجی IPv6</string>
<string name="summary_pref_prefer_ipv6">ترجی داڌن نشۊوی وو تورا IPv6</string> <string name="summary_pref_prefer_ipv6">ترجی داڌن نشۊوی وو تورا IPv6</string>
<string name="title_pref_remote_dns">DNS ز ره دیر (اختیاری) (udp/tcp/https/quic) (اختیاری)</string> <string name="title_pref_remote_dns">DNS ز ر دیر (اختیاری) (udp/tcp/https/quic) (اختیاری)</string>
<string name="summary_pref_remote_dns">DNS</string> <string name="summary_pref_remote_dns">DNS</string>
<string name="title_pref_vpn_dns">VPN DNS (تینا IPv4/v6)</string> <string name="title_pref_vpn_dns">VPN DNS (تینا IPv4/v6)</string>
@@ -183,17 +184,14 @@
<string name="summary_pref_delay_test_url">نشۊوی اینترنتی</string> <string name="summary_pref_delay_test_url">نشۊوی اینترنتی</string>
<string name="title_pref_proxy_sharing_enabled">هشتن منپیزا ز LAN</string> <string name="title_pref_proxy_sharing_enabled">هشتن منپیزا ز LAN</string>
<string name="summary_pref_proxy_sharing_enabled">پوی دسگایل ترن وا آدرس IP ایسا، ز ره socks/http و پروکسی منپیز بۊن، تینا من شبکه قابل اعتماد فعال بۊ تا ز منپیز ؛یر موجاز جلو گری بۊ.</string> <string name="summary_pref_proxy_sharing_enabled">پوی دسگایل ترن وا آدرس IP ایسا، ز ر socks/http و پروکسی منپیز بۊن، تینا من شبکه قابل اعتماد فعال بۊ تا ز منپیز ؛یر موجاز جلو گری بۊ.</string>
<string name="toast_warning_pref_proxysharing_short">منپیزا ز LAN ن موجار کۊنین، موتمعن بۊین ک من ی شبکه قابل ائتماڌ هڌین.</string> <string name="toast_warning_pref_proxysharing_short">منپیزا ز LAN ن موجار کۊنین، موتمعن بۊین ک من ی شبکه قابل ائتماڌ هڌین.</string>
<string name="title_pref_allow_insecure">اجازه نا ٱمن</string> <string name="title_pref_allow_insecure">اجازه نا ٱمن</string>
<string name="summary_pref_allow_insecure">مجال و کار بردن TLS ب تۉر پؽش فرز، موجوز نا ٱمن فعال هڌ.</string> <string name="summary_pref_allow_insecure">مجال و کار بردن TLS ب تۉر پؽش فرز، موجوز نا ٱمن فعال هڌ.</string>
<string name="title_pref_socks_port">پورت پروکسی SOCKS5</string> <string name="title_pref_socks_port">پورت پروکسی مهلی</string>
<string name="summary_pref_socks_port">پورت پروکسی SOCKS5</string> <string name="summary_pref_socks_port">پورت پروکسی مهلی</string>
<string name="title_pref_http_port">پورت پروکسی HTTP</string>
<string name="summary_pref_http_port">پورت پروکسی HTTP</string>
<string name="title_pref_local_dns_port">پورت DNS مهلی</string> <string name="title_pref_local_dns_port">پورت DNS مهلی</string>
<string name="summary_pref_local_dns_port">پورت DNS مهلی</string> <string name="summary_pref_local_dns_port">پورت DNS مهلی</string>
@@ -201,8 +199,8 @@
<string name="title_pref_confirm_remove">قوۊل کردن پاک کردن کانفیگ</string> <string name="title_pref_confirm_remove">قوۊل کردن پاک کردن کانفیگ</string>
<string name="summary_pref_confirm_remove">سی پاک وابیڌن فایل کانفیگ نیاز به قوۊل کردن دووارته ز سمت منتور هڌ</string> <string name="summary_pref_confirm_remove">سی پاک وابیڌن فایل کانفیگ نیاز به قوۊل کردن دووارته ز سمت منتور هڌ</string>
<string name="title_pref_start_scan_immediate">زی اسکنن ره ون</string> <string name="title_pref_start_scan_immediate">زی اسکنن ر ون</string>
<string name="summary_pref_start_scan_immediate">شؽواتگرن سی اسکن، زی مجال ره وندن بۊگۊشین، اندی ترین کودن اسکن کۊنین یا شؽواتی ن منه نوار ٱوزار پسند کۊنین.</string> <string name="summary_pref_start_scan_immediate">شؽواتگرن سی اسکن، زی مجال ر وندن بۊگۊشین، اندی ترین کودن اسکن کۊنین یا شؽواتی ن منه نوار ٱوزار پسند کۊنین.</string>
<string name="title_pref_append_http_proxy">پروکسی HTTP ن و VPN ازاف کۊنین</string> <string name="title_pref_append_http_proxy">پروکسی HTTP ن و VPN ازاف کۊنین</string>
<string name="summary_pref_append_http_proxy">پروکسی HTTP ن موسقیمن ز (مۊرۊرگر/ی قرد ز برنومیل لادراری بیڌه)، بؽ استفاڌه ز دسگا NIC مجازی (Android 10+) استفاڌه ابۊ.</string> <string name="summary_pref_append_http_proxy">پروکسی HTTP ن موسقیمن ز (مۊرۊرگر/ی قرد ز برنومیل لادراری بیڌه)، بؽ استفاڌه ز دسگا NIC مجازی (Android 10+) استفاڌه ابۊ.</string>
@@ -238,7 +236,7 @@
<string name="title_logcat">داسووا</string> <string name="title_logcat">داسووا</string>
<string name="logcat_copy">لف گیری</string> <string name="logcat_copy">لف گیری</string>
<string name="logcat_clear">روفتن</string> <string name="logcat_clear">روفتن</string>
<string name="title_service_restart">ره وندن دووارته خدمات</string> <string name="title_service_restart">ر وندن دووارته خدمات</string>
<string name="title_del_all_config">پاک کردن پوی کانفیگا جرگه سکویی</string> <string name="title_del_all_config">پاک کردن پوی کانفیگا جرگه سکویی</string>
<string name="title_del_duplicate_config">پاک کردن کانفیگا تکراری جرگه سکویی</string> <string name="title_del_duplicate_config">پاک کردن کانفیگا تکراری جرگه سکویی</string>
<string name="title_del_invalid_config">پاک کردن کانفیگا نا موئتبر جرگه سکویی</string> <string name="title_del_invalid_config">پاک کردن کانفیگا نا موئتبر جرگه سکویی</string>
@@ -261,7 +259,11 @@
<string name="filter_config_all">پوی جرگیل</string> <string name="filter_config_all">پوی جرگیل</string>
<string name="title_del_duplicate_config_count">پاک کردن %d کانفیگ تکراری</string> <string name="title_del_duplicate_config_count">پاک کردن %d کانفیگ تکراری</string>
<string name="tasker_start_service">ره وندن خدمات</string> <string name="title_del_config_count">پاک کردن %d کانفیگ</string>
<string name="title_import_config_count">و من ٱووردن %d کانفیگ</string>
<string name="title_export_config_count">و در کشیڌن %d کانفیگ</string>
<string name="title_update_config_count">ورۊ کردن %d کانفیگ</string>
<string name="tasker_start_service">ر وندن خدمات</string>
<string name="tasker_setting_confirm">قوۊل</string> <string name="tasker_setting_confirm">قوۊل</string>
<string name="routing_settings_domain_strategy">نشقه دامنه</string> <string name="routing_settings_domain_strategy">نشقه دامنه</string>
@@ -288,6 +290,7 @@
<string name="connection_test_pending">منپیزن واجۊری کوݩ</string> <string name="connection_test_pending">منپیزن واجۊری کوݩ</string>
<string name="connection_test_testing">هونی آزمایش ابۊ…</string> <string name="connection_test_testing">هونی آزمایش ابۊ…</string>
<string name="connection_test_testing_count">%d کانفیگ هونی آزمایش ابۊ...</string>
<string name="connection_test_available">مووفق بی: منپیز HTTP %dms تۊل کشی</string> <string name="connection_test_available">مووفق بی: منپیز HTTP %dms تۊل کشی</string>
<string name="connection_test_error">منپیز و اینترنتن نجوست: %s</string> <string name="connection_test_error">منپیز و اینترنتن نجوست: %s</string>
<string name="connection_test_fail">اینترنت من دسرس نؽ</string> <string name="connection_test_fail">اینترنت من دسرس نؽ</string>
@@ -301,7 +304,7 @@
<string name="title_pref_fragment_packets">Fragment Packets</string> <string name="title_pref_fragment_packets">Fragment Packets</string>
<string name="title_pref_fragment_length">Fragment Length (min-max)</string> <string name="title_pref_fragment_length">Fragment Length (min-max)</string>
<string name="title_pref_fragment_interval">Fragment Interval (min-max)</string> <string name="title_pref_fragment_interval">Fragment Interval (min-max)</string>
<string name="title_pref_fragment_enabled">فعال کردن Fragment</string> <string name="title_pref_fragment_enabled">ر وندن Fragment</string>
<string-array name="share_method"> <string-array name="share_method">
<item>QRcode</item> <item>QRcode</item>

View File

@@ -30,10 +30,10 @@
<string name="menu_item_import_config_manually_vless">تایپ دستی[VLESS]</string> <string name="menu_item_import_config_manually_vless">تایپ دستی[VLESS]</string>
<string name="menu_item_import_config_manually_ss">تایپ دستی[SHADOWSOCKS]</string> <string name="menu_item_import_config_manually_ss">تایپ دستی[SHADOWSOCKS]</string>
<string name="menu_item_import_config_manually_socks">تایپ دستی[SOCKS]</string> <string name="menu_item_import_config_manually_socks">تایپ دستی[SOCKS]</string>
<string name="menu_item_import_config_manually_http">Type manually[HTTP]</string> <string name="menu_item_import_config_manually_http">تایپ دستی[HTTP]</string>
<string name="menu_item_import_config_manually_trojan">تایپ دستی[TROJAN]</string> <string name="menu_item_import_config_manually_trojan">تایپ دستی[TROJAN]</string>
<string name="menu_item_import_config_manually_wireguard">WIREGUARD]تایپ دستی</string> <string name="menu_item_import_config_manually_wireguard">‌تایپ دستی[WIREGUARD]</string>
<string name="menu_item_import_config_manually_hysteria2">TYPE MANUALLY[HYSTERIA2]</string> <string name="menu_item_import_config_manually_hysteria2">تایپ دستی[HYSTERIA2]</string>
<string name="menu_item_import_config_custom">کانفیگ سفارشی</string> <string name="menu_item_import_config_custom">کانفیگ سفارشی</string>
<string name="menu_item_import_config_custom_clipboard">کانفیگ سفارشی را از کلیپ ‌بورد وارد کنید</string> <string name="menu_item_import_config_custom_clipboard">کانفیگ سفارشی را از کلیپ ‌بورد وارد کنید</string>
<string name="menu_item_import_config_custom_local">کانفیگ سفارشی را به صورت محلی وارد کنید</string> <string name="menu_item_import_config_custom_local">کانفیگ سفارشی را به صورت محلی وارد کنید</string>
@@ -182,17 +182,14 @@
<string name="summary_pref_delay_test_url">URL</string> <string name="summary_pref_delay_test_url">URL</string>
<string name="title_pref_proxy_sharing_enabled">اجازه اتصالات از طریق LAN</string> <string name="title_pref_proxy_sharing_enabled">اجازه اتصالات از طریق LAN</string>
<string name="summary_pref_proxy_sharing_enabled">دستگاه‌ های دیگر می‌توانند از طریق socks/http به پراکسی توسط نشانی آی‌پی شما متصل شوند، فقط در شبکه مورد اعتماد فعال می‌شوند تا از اتصال غیرمجاز جلوگیری کنند.</string> <string name="summary_pref_proxy_sharing_enabled">سایر دستگاه‌ها می‌توانند با آدرس آی‌پی شما از طریق پراکسی محلی به پروکسی متصل شوند، فقط در شبکه قابل اعتماد فعال شود تا از اتصال غیرمجاز جلوگیری شود.</string>
<string name="toast_warning_pref_proxysharing_short">اتصالات از طریق LAN را مجاز کنید، مطمئن شوید که در یک شبکه قابل اعتماد هستید</string> <string name="toast_warning_pref_proxysharing_short">اتصالات از طریق LAN را مجاز کنید، مطمئن شوید که در یک شبکه قابل اعتماد هستید</string>
<string name="title_pref_allow_insecure">مجوز ناامن</string> <string name="title_pref_allow_insecure">اعطای مجوز ناامن</string>
<string name="summary_pref_allow_insecure">هنگام استفاده از TLS، به طور پیش‌ فرض مجوز ناامن فعال است.</string> <string name="summary_pref_allow_insecure">هنگام استفاده از TLS، به طور پیش‌ فرض مجوز ناامن فعال است.</string>
<string name="title_pref_socks_port">پورت پروکسی SOCKS5</string> <string name="title_pref_socks_port">پورت پروکسی محلی</string>
<string name="summary_pref_socks_port">پورت پروکسی SOCKS5</string> <string name="summary_pref_socks_port">پورت پروکسی محلی</string>
<string name="title_pref_http_port">پورت پروکسی HTTP</string>
<string name="summary_pref_http_port">پورت پروکسی HTTP</string>
<string name="title_pref_local_dns_port">پورت DNS محلی</string> <string name="title_pref_local_dns_port">پورت DNS محلی</string>
<string name="summary_pref_local_dns_port">پورت DNS محلی</string> <string name="summary_pref_local_dns_port">پورت DNS محلی</string>
@@ -259,6 +256,10 @@
<string name="filter_config_all">همه گروه‌های اشتراک</string> <string name="filter_config_all">همه گروه‌های اشتراک</string>
<string name="title_del_duplicate_config_count">حذف %d کانفیگ تکراری</string> <string name="title_del_duplicate_config_count">حذف %d کانفیگ تکراری</string>
<string name="title_del_config_count">حذف %d کانفیگ</string>
<string name="title_import_config_count">وارد کردن %d کانفیگ</string>
<string name="title_export_config_count">صادر کردن %d کانفیگ</string>
<string name="title_update_config_count">آپدیت کردن %d کانفیگ</string>
<string name="tasker_start_service">شروع خدمات</string> <string name="tasker_start_service">شروع خدمات</string>
<string name="tasker_setting_confirm">تایید</string> <string name="tasker_setting_confirm">تایید</string>
@@ -286,6 +287,7 @@
<string name="connection_test_pending">اتصال را بررسی کنید</string> <string name="connection_test_pending">اتصال را بررسی کنید</string>
<string name="connection_test_testing">در حال آزمایش...</string> <string name="connection_test_testing">در حال آزمایش...</string>
<string name="connection_test_testing_count">تست کردن %d کانفیگ…</string>
<string name="connection_test_available">موفقیت: اتصال HTTP %dms طول کشید</string> <string name="connection_test_available">موفقیت: اتصال HTTP %dms طول کشید</string>
<string name="connection_test_error">اتصال به اینترنت شناسایی نشد: %s</string> <string name="connection_test_error">اتصال به اینترنت شناسایی نشد: %s</string>
<string name="connection_test_fail">اینترنت در دسترس نیست</string> <string name="connection_test_fail">اینترنت در دسترس نیست</string>

View File

@@ -189,14 +189,11 @@
<string name="title_pref_allow_insecure">Разрешать небезопасные</string> <string name="title_pref_allow_insecure">Разрешать небезопасные</string>
<string name="summary_pref_allow_insecure">Для TLS по умолчанию разрешены небезопасные соединения</string> <string name="summary_pref_allow_insecure">Для TLS по умолчанию разрешены небезопасные соединения</string>
<string name="title_pref_socks_port">Порт SOCKS5-прокси</string> <string name="title_pref_socks_port">Порт локального прокси</string>
<string name="summary_pref_socks_port">Порт SOCKS5-прокси</string> <string name="summary_pref_socks_port">Порт локального прокси</string>
<string name="title_pref_http_port">Порт HTTP-прокси</string> <string name="title_pref_local_dns_port">Порт локальной DNS</string>
<string name="summary_pref_http_port">Порт HTTP-прокси</string> <string name="summary_pref_local_dns_port">Порт локальной DNS</string>
<string name="title_pref_local_dns_port">Локальный порт DNS</string>
<string name="summary_pref_local_dns_port">Локальный порт DNS</string>
<string name="title_pref_confirm_remove">Подтверждение удаления профиля</string> <string name="title_pref_confirm_remove">Подтверждение удаления профиля</string>
<string name="summary_pref_confirm_remove">Требовать двойное подтверждение удаления профиля</string> <string name="summary_pref_confirm_remove">Требовать двойное подтверждение удаления профиля</string>
@@ -260,6 +257,10 @@
<string name="title_filter_config">Фильтр групп</string> <string name="title_filter_config">Фильтр групп</string>
<string name="filter_config_all">Все группы</string> <string name="filter_config_all">Все группы</string>
<string name="title_del_duplicate_config_count">Удалено дубликатов профилей: %d</string> <string name="title_del_duplicate_config_count">Удалено дубликатов профилей: %d</string>
<string name="title_del_config_count">Удалено профилей: %d</string>
<string name="title_import_config_count">Импортировано профилей: %d</string>
<string name="title_export_config_count">Экспортировано профилей: %d</string>
<string name="title_update_config_count">Обновлено профилей: %d</string>
<string name="tasker_start_service">Запуск службы</string> <string name="tasker_start_service">Запуск службы</string>
<string name="tasker_setting_confirm">Подтвердить</string> <string name="tasker_setting_confirm">Подтвердить</string>
@@ -288,6 +289,7 @@
<string name="connection_test_pending">Проверить подключение</string> <string name="connection_test_pending">Проверить подключение</string>
<string name="connection_test_testing">Проверка…</string> <string name="connection_test_testing">Проверка…</string>
<string name="connection_test_testing_count">Проверено профилей: %d</string>
<string name="connection_test_available">Успешно: HTTP-соединение заняло %d мс</string> <string name="connection_test_available">Успешно: HTTP-соединение заняло %d мс</string>
<string name="connection_test_error">Сбой проверки интернет-соединения: %s</string> <string name="connection_test_error">Сбой проверки интернет-соединения: %s</string>
<string name="connection_test_fail">Интернет недоступен</string> <string name="connection_test_fail">Интернет недоступен</string>

View File

@@ -80,6 +80,7 @@
<string name="server_lab_encryption">Mã hóa</string> <string name="server_lab_encryption">Mã hóa</string>
<string name="server_lab_flow">Kiểm soát lưu lượng (Flow)</string> <string name="server_lab_flow">Kiểm soát lưu lượng (Flow)</string>
<string name="server_lab_public_key">PublicKey</string> <string name="server_lab_public_key">PublicKey</string>
<string name="server_lab_preshared_key">PreSharedKey(optional)</string>
<string name="server_lab_short_id">ShortId</string> <string name="server_lab_short_id">ShortId</string>
<string name="server_lab_spider_x">SpiderX</string> <string name="server_lab_spider_x">SpiderX</string>
<string name="server_lab_secret_key">SecretKey</string> <string name="server_lab_secret_key">SecretKey</string>
@@ -188,11 +189,8 @@
<string name="title_pref_allow_insecure">Bỏ qua xác minh chứng chỉ</string> <string name="title_pref_allow_insecure">Bỏ qua xác minh chứng chỉ</string>
<string name="summary_pref_allow_insecure">Khi nhập những cấu hình có bảo mật TLS, mặc định sẽ không xác minh chứng chỉ.</string> <string name="summary_pref_allow_insecure">Khi nhập những cấu hình có bảo mật TLS, mặc định sẽ không xác minh chứng chỉ.</string>
<string name="title_pref_socks_port">Cổng Proxy SOCKS5</string> <string name="title_pref_socks_port">Cổng Proxy Local</string>
<string name="summary_pref_socks_port">Cổng Proxy SOCKS5</string> <string name="summary_pref_socks_port">Cổng Proxy Local</string>
<string name="title_pref_http_port">Cổng Proxy HTTP</string>
<string name="summary_pref_http_port">Cổng Proxy HTTP</string>
<string name="title_pref_local_dns_port">Cổng Local DNS</string> <string name="title_pref_local_dns_port">Cổng Local DNS</string>
<string name="summary_pref_local_dns_port">Cổng Local DNS</string> <string name="summary_pref_local_dns_port">Cổng Local DNS</string>
@@ -214,6 +212,7 @@
<string name="title_privacy_policy">Chính sách bảo mật</string> <string name="title_privacy_policy">Chính sách bảo mật</string>
<string name="title_about">Giới thiệu</string> <string name="title_about">Giới thiệu</string>
<string name="title_source_code">Mã nguồn</string> <string name="title_source_code">Mã nguồn</string>
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Kênh Telegram</string> <string name="title_tg_channel">Kênh Telegram</string>
<string name="title_configuration_backup">Sao lưu cấu hình</string> <string name="title_configuration_backup">Sao lưu cấu hình</string>
<string name="summary_configuration_backup">Nơi lưu trữ: [%s], bản backup sẽ được dọn dẹp sau khi xóa ứng dụng hoặc xóa bộ nhớ.</string> <string name="summary_configuration_backup">Nơi lưu trữ: [%s], bản backup sẽ được dọn dẹp sau khi xóa ứng dụng hoặc xóa bộ nhớ.</string>
@@ -259,6 +258,10 @@
<string name="filter_config_all">Hiển thị tất cả các gói đăng ký</string> <string name="filter_config_all">Hiển thị tất cả các gói đăng ký</string>
<string name="title_del_duplicate_config_count">Xoá %d cấu hình trùng lặp</string> <string name="title_del_duplicate_config_count">Xoá %d cấu hình trùng lặp</string>
<string name="title_del_config_count">Delete %d configurations</string>
<string name="title_import_config_count">Import %d configurations</string>
<string name="title_export_config_count">Export %d configurations</string>
<string name="title_update_config_count">Update %d configurations</string>
<string name="tasker_start_service">Khởi động v2rayNG</string> <string name="tasker_start_service">Khởi động v2rayNG</string>
<string name="tasker_setting_confirm">Xác nhận</string> <string name="tasker_setting_confirm">Xác nhận</string>
@@ -278,6 +281,7 @@
<string name="connection_test_pending">Kiểm tra kết nối</string> <string name="connection_test_pending">Kiểm tra kết nối</string>
<string name="connection_test_testing">Đang kiểm tra kết nối mạng...</string> <string name="connection_test_testing">Đang kiểm tra kết nối mạng...</string>
<string name="connection_test_testing_count">Testing %d configurations…</string>
<string name="connection_test_available">Kiểm tra thành công: thời gian truy cập Google là %d ms</string> <string name="connection_test_available">Kiểm tra thành công: thời gian truy cập Google là %d ms</string>
<string name="connection_test_error">Lỗi kết nối mạng, hãy thử đổi cấu hình hoặc kiểm tra lại! Mã lỗi: %s</string> <string name="connection_test_error">Lỗi kết nối mạng, hãy thử đổi cấu hình hoặc kiểm tra lại! Mã lỗi: %s</string>
<string name="connection_test_fail">Không có kết nối mạng!</string> <string name="connection_test_fail">Không có kết nối mạng!</string>

View File

@@ -80,6 +80,7 @@
<string name="server_lab_encryption">加密方式(encryption)</string> <string name="server_lab_encryption">加密方式(encryption)</string>
<string name="server_lab_flow">流控(flow)</string> <string name="server_lab_flow">流控(flow)</string>
<string name="server_lab_public_key">PublicKey</string> <string name="server_lab_public_key">PublicKey</string>
<string name="server_lab_preshared_key">PreSharedKey(optional)</string>
<string name="server_lab_short_id">ShortId</string> <string name="server_lab_short_id">ShortId</string>
<string name="server_lab_spider_x">SpiderX</string> <string name="server_lab_spider_x">SpiderX</string>
<string name="server_lab_secret_key">SecretKey</string> <string name="server_lab_secret_key">SecretKey</string>
@@ -185,11 +186,8 @@
<string name="title_pref_allow_insecure">跳过证书验证(allowInsecure)</string> <string name="title_pref_allow_insecure">跳过证书验证(allowInsecure)</string>
<string name="summary_pref_allow_insecure">传输层安全选tls时默认跳过证书验证(allowInsecure)</string> <string name="summary_pref_allow_insecure">传输层安全选tls时默认跳过证书验证(allowInsecure)</string>
<string name="title_pref_socks_port">SOCKS5代理端口</string> <string name="title_pref_socks_port">本地代理端口</string>
<string name="summary_pref_socks_port">SOCKS5代理端口</string> <string name="summary_pref_socks_port">本地代理端口</string>
<string name="title_pref_http_port">HTTP代理端口</string>
<string name="summary_pref_http_port">HTTP代理端口</string>
<string name="title_pref_local_dns_port">本地DNS端口</string> <string name="title_pref_local_dns_port">本地DNS端口</string>
<string name="summary_pref_local_dns_port">本地DNS端口</string> <string name="summary_pref_local_dns_port">本地DNS端口</string>
@@ -210,6 +208,7 @@
<string name="title_privacy_policy">隐私权政策</string> <string name="title_privacy_policy">隐私权政策</string>
<string name="title_about">关于</string> <string name="title_about">关于</string>
<string name="title_source_code">源代码</string> <string name="title_source_code">源代码</string>
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Telegram 频道</string> <string name="title_tg_channel">Telegram 频道</string>
<string name="title_configuration_backup">备份配置</string> <string name="title_configuration_backup">备份配置</string>
<string name="summary_configuration_backup">存储位置: [%s], 卸载App或清除存储后备份将被清除</string> <string name="summary_configuration_backup">存储位置: [%s], 卸载App或清除存储后备份将被清除</string>
@@ -256,6 +255,10 @@
<string name="filter_config_all">所有分组</string> <string name="filter_config_all">所有分组</string>
<string name="title_del_duplicate_config_count">删除 %d 个重复配置</string> <string name="title_del_duplicate_config_count">删除 %d 个重复配置</string>
<string name="title_del_config_count">删除 %d 个配置</string>
<string name="title_import_config_count">导入 %d 个配置</string>
<string name="title_export_config_count">导出 %d 个配置</string>
<string name="title_update_config_count">更新 %d 个配置</string>
<string name="tasker_start_service">启动服务</string> <string name="tasker_start_service">启动服务</string>
<string name="tasker_setting_confirm">确定</string> <string name="tasker_setting_confirm">确定</string>
@@ -275,6 +278,7 @@
<string name="connection_test_pending">"检查网络连接"</string> <string name="connection_test_pending">"检查网络连接"</string>
<string name="connection_test_testing">"测试中…"</string> <string name="connection_test_testing">"测试中…"</string>
<string name="connection_test_testing_count">测试 %d 个配置中…</string>
<string name="connection_test_available">"连接成功:延时 %d 毫秒"</string> <string name="connection_test_available">"连接成功:延时 %d 毫秒"</string>
<string name="connection_test_error">"失败:%s"</string> <string name="connection_test_error">"失败:%s"</string>
<string name="connection_test_fail">"无互联网连接"</string> <string name="connection_test_fail">"无互联网连接"</string>

View File

@@ -80,6 +80,7 @@
<string name="server_lab_encryption">加密 (encryption)</string> <string name="server_lab_encryption">加密 (encryption)</string>
<string name="server_lab_flow">流程 (flow)</string> <string name="server_lab_flow">流程 (flow)</string>
<string name="server_lab_public_key">PublicKey</string> <string name="server_lab_public_key">PublicKey</string>
<string name="server_lab_preshared_key">PreSharedKey(optional)</string>
<string name="server_lab_short_id">ShortId</string> <string name="server_lab_short_id">ShortId</string>
<string name="server_lab_spider_x">SpiderX</string> <string name="server_lab_spider_x">SpiderX</string>
<string name="server_lab_secret_key">SecretKey</string> <string name="server_lab_secret_key">SecretKey</string>
@@ -187,11 +188,8 @@
<string name="title_pref_allow_insecure">跳過憑證驗證 (allowInsecure)</string> <string name="title_pref_allow_insecure">跳過憑證驗證 (allowInsecure)</string>
<string name="summary_pref_allow_insecure">傳輸層安全選 tls 時,預設跳過憑證驗證 (allowInsecure)</string> <string name="summary_pref_allow_insecure">傳輸層安全選 tls 時,預設跳過憑證驗證 (allowInsecure)</string>
<string name="title_pref_socks_port">SOCKS5 Proxy 埠</string> <string name="title_pref_socks_port">本地 Proxy 埠</string>
<string name="summary_pref_socks_port">SOCKS5 Proxy 埠</string> <string name="summary_pref_socks_port">本地 Proxy 埠</string>
<string name="title_pref_http_port">HTTP Proxy 埠</string>
<string name="summary_pref_http_port">HTTP Proxy 埠</string>
<string name="title_pref_local_dns_port">本機 DNS 埠</string> <string name="title_pref_local_dns_port">本機 DNS 埠</string>
<string name="summary_pref_local_dns_port">本機 DNS 埠</string> <string name="summary_pref_local_dns_port">本機 DNS 埠</string>
@@ -212,6 +210,7 @@
<string name="title_privacy_policy">隱私權政策</string> <string name="title_privacy_policy">隱私權政策</string>
<string name="title_about">關於</string> <string name="title_about">關於</string>
<string name="title_source_code">原始碼</string> <string name="title_source_code">原始碼</string>
<string name="title_oss_license">Open Source licenses</string>
<string name="title_tg_channel">Telegram 頻道</string> <string name="title_tg_channel">Telegram 頻道</string>
<string name="title_configuration_backup">備份設定</string> <string name="title_configuration_backup">備份設定</string>
<string name="summary_configuration_backup">儲存位置: [%s], 卸載App或清除儲存後備份將被清除</string> <string name="summary_configuration_backup">儲存位置: [%s], 卸載App或清除儲存後備份將被清除</string>
@@ -256,8 +255,12 @@
<string name="title_sort_by_test_results">依偵測結果排序</string> <string name="title_sort_by_test_results">依偵測結果排序</string>
<string name="title_filter_config">過濾設定</string> <string name="title_filter_config">過濾設定</string>
<string name="filter_config_all">所有分組</string> <string name="filter_config_all">所有分組</string>
<string name="title_del_duplicate_config_count">Delete %d duplicate configurations</string> <string name="title_del_duplicate_config_count">删除 %d 个重复配置</string>
<string name="title_del_config_count">删除 %d 个配置</string>
<string name="title_import_config_count">导入 %d 个配置</string>
<string name="title_export_config_count">导出 %d 个配置</string>
<string name="title_update_config_count">更新 %d 个配置</string>
<string name="tasker_start_service">啟動服務</string> <string name="tasker_start_service">啟動服務</string>
<string name="tasker_setting_confirm">確定</string> <string name="tasker_setting_confirm">確定</string>
@@ -277,6 +280,7 @@
<string name="connection_test_pending">"測試連線能力"</string> <string name="connection_test_pending">"測試連線能力"</string>
<string name="connection_test_testing">"測試中……"</string> <string name="connection_test_testing">"測試中……"</string>
<string name="connection_test_testing_count">測試 %d 个配置中…</string>
<string name="connection_test_available">"成功:%d ms延遲"</string> <string name="connection_test_available">"成功:%d ms延遲"</string>
<string name="connection_test_error">"測試網際網路連線失敗:%s"</string> <string name="connection_test_error">"測試網際網路連線失敗:%s"</string>
<string name="connection_test_fail">"無法使用網際網路"</string> <string name="connection_test_fail">"無法使用網際網路"</string>

View File

@@ -27,7 +27,6 @@
<item>ws</item> <item>ws</item>
<item>httpupgrade</item> <item>httpupgrade</item>
<item>xhttp</item> <item>xhttp</item>
<item>splithttp</item>
<item>h2</item> <item>h2</item>
<item>grpc</item> <item>grpc</item>
</string-array> </string-array>
@@ -210,5 +209,6 @@
<item>auto</item> <item>auto</item>
<item>packet-up</item> <item>packet-up</item>
<item>stream-up</item> <item>stream-up</item>
<item>stream-one</item>
</string-array> </string-array>
</resources> </resources>

View File

@@ -186,17 +186,14 @@
<string name="summary_pref_delay_test_url">Url</string> <string name="summary_pref_delay_test_url">Url</string>
<string name="title_pref_proxy_sharing_enabled">Allow connections from the LAN</string> <string name="title_pref_proxy_sharing_enabled">Allow connections from the LAN</string>
<string name="summary_pref_proxy_sharing_enabled">Other devices can connect to proxy by your ip address through socks/http, Only enable in trusted network to avoid unauthorized connection</string> <string name="summary_pref_proxy_sharing_enabled">Other devices can connect to proxy by your ip address through local proxy, Only enable in trusted network to avoid unauthorized connection</string>
<string name="toast_warning_pref_proxysharing_short">Allow connections from the LAN, Make sure you are in a trusted network</string> <string name="toast_warning_pref_proxysharing_short">Allow connections from the LAN, Make sure you are in a trusted network</string>
<string name="title_pref_allow_insecure">allowInsecure</string> <string name="title_pref_allow_insecure">allowInsecure</string>
<string name="summary_pref_allow_insecure">When TLS, the default allowInsecure</string> <string name="summary_pref_allow_insecure">When TLS, the default allowInsecure</string>
<string name="title_pref_socks_port">SOCKS5 proxy port</string> <string name="title_pref_socks_port">Local proxy port</string>
<string name="summary_pref_socks_port">SOCKS5 proxy port</string> <string name="summary_pref_socks_port">Local proxy port</string>
<string name="title_pref_http_port">HTTP proxy port</string>
<string name="summary_pref_http_port">HTTP proxy port</string>
<string name="title_pref_local_dns_port">Local DNS port</string> <string name="title_pref_local_dns_port">Local DNS port</string>
<string name="summary_pref_local_dns_port">Local DNS port</string> <string name="summary_pref_local_dns_port">Local DNS port</string>
@@ -263,6 +260,10 @@
<string name="title_filter_config">Filter configuration file</string> <string name="title_filter_config">Filter configuration file</string>
<string name="filter_config_all">All groups</string> <string name="filter_config_all">All groups</string>
<string name="title_del_duplicate_config_count">Delete %d duplicate configurations</string> <string name="title_del_duplicate_config_count">Delete %d duplicate configurations</string>
<string name="title_del_config_count">Delete %d configurations</string>
<string name="title_import_config_count">Import %d configurations</string>
<string name="title_export_config_count">Export %d configurations</string>
<string name="title_update_config_count">Update %d configurations</string>
<string name="tasker_start_service">Start Service</string> <string name="tasker_start_service">Start Service</string>
<string name="tasker_setting_confirm">Confirm</string> <string name="tasker_setting_confirm">Confirm</string>
@@ -291,6 +292,7 @@
<string name="connection_test_pending">Check Connectivity</string> <string name="connection_test_pending">Check Connectivity</string>
<string name="connection_test_testing">Testing…</string> <string name="connection_test_testing">Testing…</string>
<string name="connection_test_testing_count">Testing %d configurations…</string>
<string name="connection_test_available">Success: HTTP connection took %dms</string> <string name="connection_test_available">Success: HTTP connection took %dms</string>
<string name="connection_test_error">Fail to detect internet connection: %s</string> <string name="connection_test_error">Fail to detect internet connection: %s</string>
<string name="connection_test_fail">Internet Unavailable</string> <string name="connection_test_fail">Internet Unavailable</string>

View File

@@ -180,12 +180,6 @@
android:summary="10808" android:summary="10808"
android:title="@string/title_pref_socks_port" /> android:title="@string/title_pref_socks_port" />
<EditTextPreference
android:inputType="number"
android:key="pref_http_port"
android:summary="10809"
android:title="@string/title_pref_http_port" />
<EditTextPreference <EditTextPreference
android:key="pref_remote_dns" android:key="pref_remote_dns"
android:summary="@string/summary_pref_remote_dns" android:summary="@string/summary_pref_remote_dns"

View File

@@ -9,7 +9,7 @@ appcompat = "1.7.0"
material = "1.12.0" material = "1.12.0"
activity = "1.9.3" activity = "1.9.3"
constraintlayout = "2.2.0" constraintlayout = "2.2.0"
mmkvStatic = "1.3.9" mmkvStatic = "1.3.11"
gson = "2.11.0" gson = "2.11.0"
ossLicensesPlugin = "0.10.6" ossLicensesPlugin = "0.10.6"
playServicesOssLicenses = "17.1.0" playServicesOssLicenses = "17.1.0"