diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index af13115d..8bec1f33 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -65,7 +65,7 @@ object AppConfig { const val CACHE_KEYWORD_FILTER = "cache_keyword_filter" /** Protocol identifiers. */ - const val PROTOCOL_FREEDOM: String = "freedom" + const val PROTOCOL_FREEDOM = "freedom" /** Broadcast actions. */ const val BROADCAST_ACTION_SERVICE = "com.v2ray.ang.action.service" @@ -90,16 +90,19 @@ object AppConfig { const val DOWNLINK = "downlink" /** URLs for various resources. */ - const val androidpackagenamelistUrl = "https://raw.githubusercontent.com/2dust/androidpackagenamelist/master/proxy.txt" - const val v2rayNGUrl = "https://github.com/2dust/v2rayNG" - const val v2rayNGAPIUrl = "https://api.github.com/repos/2dust/v2rayNG/releases" - const val v2rayNGIssues = "$v2rayNGUrl/issues" - const val v2rayNGWikiMode = "$v2rayNGUrl/wiki/Mode" - const val v2rayNGPrivacyPolicy = "https://raw.githubusercontent.com/2dust/v2rayNG/master/CR.md" - const val PromotionUrl = "aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=" - const val TgChannelUrl = "https://t.me/github_2dust" - const val DelayTestUrl = "https://www.gstatic.com/generate_204" - const val DelayTestUrl2 = "https://www.google.com/generate_204" + const val GITHUB_URL = "https://github.com" + const val GITHUB_RAW_URL = "https://raw.githubusercontent.com" + const val GITHUB_DOWNLOAD = "releases/latest/download" + const val ANDROID_PACKAGE_NAME_LIST_URL = "$GITHUB_RAW_URL/2dust/androidpackagenamelist/master/proxy.txt" + const val APP_URL = "$GITHUB_URL/2dust/v2rayNG" + const val APP_API_URL = "https://api.github.com/repos/2dust/v2rayNG/releases" + const val APP_ISSUES_URL = "$APP_URL/issues" + const val APP_WIKI_MODE = "$APP_URL/wiki/Mode" + const val APP_PRIVACY_POLICY = "$GITHUB_RAW_URL/2dust/v2rayNG/master/CR.md" + const val APP_PROMOTION_URL = "aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=" + const val TG_CHANNEL_URL = "https://t.me/github_2dust" + const val DELAY_TEST_URL = "https://www.gstatic.com/generate_204" + const val DELAY_TEST_URL2 = "https://www.google.com/generate_204" /** DNS server addresses. */ const val DNS_PROXY = "1.1.1.1" @@ -200,9 +203,9 @@ object AppConfig { "240.0.0.0/4" ) val GEO_FILES_SOURCES = arrayListOf( - "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/", - "https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/", - "https://github.com/Chocolate4U/Iran-v2ray-rules/releases/latest/download/" + "$GITHUB_URL/Loyalsoldier/v2ray-rules-dat/$GITHUB_DOWNLOAD", + "$GITHUB_URL/runetfreedom/russia-v2ray-rules-dat/$GITHUB_DOWNLOAD", + "$GITHUB_URL/Chocolate4U/Iran-v2ray-rules/$GITHUB_DOWNLOAD" ) } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt index d0703f09..5a8d1e60 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/AssetUrlItem.kt @@ -4,5 +4,6 @@ data class AssetUrlItem( var remarks: String = "", var url: String = "", val addedTime: Long = System.currentTimeMillis(), - var lastUpdated: Long = -1 + var lastUpdated: Long = -1, + var locked: Boolean? = false, ) \ No newline at end of file diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt index 9be86b6c..6e5c6bb4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/extension/_Ext.kt @@ -197,3 +197,16 @@ inline fun Intent.serializable(key: String): T? = whe * @return True if the CharSequence is not null and not empty, false otherwise. */ fun CharSequence?.isNotNullEmpty(): Boolean = this != null && this.isNotEmpty() + +fun String.concatUrl(vararg paths: String): String { + val builder = StringBuilder(this.trimEnd('/')) + + paths.forEach { path -> + val trimmedPath = path.trim('/') + if (trimmedPath.isNotEmpty()) { + builder.append('/').append(trimmedPath) + } + } + + return builder.toString() +} \ No newline at end of file diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt index aaf69d37..cb364531 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt @@ -316,10 +316,10 @@ object SettingsManager { */ fun getDelayTestUrl(second: Boolean = false): String { return if (second) { - AppConfig.DelayTestUrl2 + AppConfig.DELAY_TEST_URL2 } else { MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) - ?: AppConfig.DelayTestUrl + ?: AppConfig.DELAY_TEST_URL } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/UpdateCheckerManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/UpdateCheckerManager.kt index 518c780b..e152002f 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/UpdateCheckerManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/UpdateCheckerManager.kt @@ -7,6 +7,7 @@ import com.v2ray.ang.AppConfig import com.v2ray.ang.BuildConfig import com.v2ray.ang.dto.CheckUpdateResult import com.v2ray.ang.dto.GitHubRelease +import com.v2ray.ang.extension.concatUrl import com.v2ray.ang.util.HttpUtil import com.v2ray.ang.util.JsonUtil import kotlinx.coroutines.Dispatchers @@ -18,9 +19,9 @@ object UpdateCheckerManager { suspend fun checkForUpdate(includePreRelease: Boolean = false): CheckUpdateResult = withContext(Dispatchers.IO) { try { val url = if (includePreRelease) { - AppConfig.v2rayNGAPIUrl + AppConfig.APP_API_URL } else { - "${AppConfig.v2rayNGAPIUrl}/latest" + AppConfig.APP_API_URL.concatUrl("latest") } var response = HttpUtil.getUrlContent(url, 5000) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt index da79f3ed..7c2ffdba 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/AboutActivity.kt @@ -123,11 +123,11 @@ class AboutActivity : BaseActivity() { binding.checkPreRelease.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_CHECK_UPDATE_PRE_RELEASE, false) binding.layoutSoureCcode.setOnClickListener { - Utils.openUri(this, AppConfig.v2rayNGUrl) + Utils.openUri(this, AppConfig.APP_URL) } binding.layoutFeedback.setOnClickListener { - Utils.openUri(this, AppConfig.v2rayNGIssues) + Utils.openUri(this, AppConfig.APP_ISSUES_URL) } binding.layoutOssLicenses.setOnClickListener { @@ -141,11 +141,11 @@ class AboutActivity : BaseActivity() { } binding.layoutTgChannel.setOnClickListener { - Utils.openUri(this, AppConfig.TgChannelUrl) + Utils.openUri(this, AppConfig.TG_CHANNEL_URL) } binding.layoutPrivacyPolicy.setOnClickListener { - Utils.openUri(this, AppConfig.v2rayNGPrivacyPolicy) + Utils.openUri(this, AppConfig.APP_PRIVACY_POLICY) } "v${BuildConfig.VERSION_NAME} (${SpeedtestManager.getLibVersion()})".also { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index b4e8ac44..bb9abc68 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -683,7 +683,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList .putExtra("isRunning", mainViewModel.isRunning.value == true) ) - R.id.promotion -> Utils.openUri(this, "${Utils.decode(AppConfig.PromotionUrl)}?t=${System.currentTimeMillis()}") + R.id.promotion -> Utils.openUri(this, "${Utils.decode(AppConfig.APP_PROMOTION_URL)}?t=${System.currentTimeMillis()}") R.id.logcat -> startActivity(Intent(this, LogcatActivity::class.java)) R.id.about -> startActivity(Intent(this, AboutActivity::class.java)) } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt index 97afe573..54e10974 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/PerAppProxyActivity.kt @@ -157,7 +157,7 @@ class PerAppProxyActivity : BaseActivity() { toast(R.string.msg_downloading_content) binding.pbWaiting.show() - val url = AppConfig.androidpackagenamelistUrl + val url = AppConfig.ANDROID_PACKAGE_NAME_LIST_URL lifecycleScope.launch(Dispatchers.IO) { var content = HttpUtil.getUrlContent(url, 5000) if (content.isNullOrEmpty()) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index 9423310c..4ec2294a 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -161,7 +161,7 @@ class SettingsActivity : BaseActivity() { } delayTestUrl?.setOnPreferenceChangeListener { _, any -> val nval = any as String - delayTestUrl?.summary = if (nval == "") AppConfig.DelayTestUrl else nval + delayTestUrl?.summary = if (nval == "") AppConfig.DELAY_TEST_URL else nval true } mode?.setOnPreferenceChangeListener { _, newValue -> @@ -202,7 +202,7 @@ class SettingsActivity : BaseActivity() { remoteDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY) domesticDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT) dnsHosts?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DNS_HOSTS) - delayTestUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DelayTestUrl) + delayTestUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DELAY_TEST_URL) initSharedPreference() } @@ -364,6 +364,6 @@ class SettingsActivity : BaseActivity() { } fun onModeHelpClicked(view: View) { - Utils.openUri(this, AppConfig.v2rayNGWikiMode) + Utils.openUri(this, AppConfig.APP_WIKI_MODE) } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt index 41cad466..526dfc88 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/UserAssetActivity.kt @@ -24,6 +24,7 @@ import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityUserAssetBinding import com.v2ray.ang.databinding.ItemRecyclerUserAssetBinding import com.v2ray.ang.dto.AssetUrlItem +import com.v2ray.ang.extension.concatUrl import com.v2ray.ang.extension.toTrafficString import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastError @@ -121,8 +122,11 @@ class UserAssetActivity : BaseActivity() { } private fun setGeoFilesSources() { - AlertDialog.Builder(this).setItems(AppConfig.GEO_FILES_SOURCES - .toTypedArray()) { _, i -> + AlertDialog.Builder(this).setItems( + AppConfig.GEO_FILES_SOURCES + .map { it.replace(AppConfig.GITHUB_URL + "/", "").replace("/" + AppConfig.GITHUB_DOWNLOAD, "") } + .toTypedArray() + ) { _, i -> try { val value = AppConfig.GEO_FILES_SOURCES[i] MmkvManager.encodeSettings(AppConfig.PREF_GEO_FILES_SOURCES, value) @@ -286,7 +290,8 @@ class UserAssetActivity : BaseActivity() { list.add( Utils.getUuid() to AssetUrlItem( it, - getGeoFilesSources() + it + getGeoFilesSources().concatUrl(it), + locked = true ) ) } @@ -337,7 +342,7 @@ class UserAssetActivity : BaseActivity() { holder.itemUserAssetBinding.assetProperties.text = getString(R.string.msg_file_not_found) } - if (item.second.remarks in builtInGeoFiles && item.second.url == getGeoFilesSources() + item.second.remarks) { + if (item.second.locked == true) { holder.itemUserAssetBinding.layoutEdit.visibility = GONE //holder.itemUserAssetBinding.layoutRemove.visibility = GONE } else {