diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt index dd05ab83..843c7f61 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ProfileItem.kt @@ -15,6 +15,7 @@ data class ProfileItem( var addedTime: Long = System.currentTimeMillis(), var remarks: String = "", + var description: String? = null, var server: String? = null, var serverPort: String? = null, diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt index 4b716949..ccfe17a3 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/AngConfigManager.kt @@ -271,13 +271,14 @@ object AngConfigManager { ) { try { val serverList: Array = - JsonUtil.fromJson(server, Array::class.java)?: arrayOf() + JsonUtil.fromJson(server, Array::class.java) ?: arrayOf() if (serverList.isNotEmpty()) { var count = 0 for (srv in serverList.reversed()) { val config = CustomFmt.parse(JsonUtil.toJson(srv)) ?: continue config.subscriptionId = subid + config.description = generateDescription(config) val key = MmkvManager.encodeServerConfig("", config) MmkvManager.encodeServerRaw(key, JsonUtil.toJsonPretty(srv) ?: "") count += 1 @@ -292,6 +293,7 @@ object AngConfigManager { // For compatibility val config = CustomFmt.parse(server) ?: return 0 config.subscriptionId = subid + config.description = generateDescription(config) val key = MmkvManager.encodeServerConfig("", config) MmkvManager.encodeServerRaw(key, server) return 1 @@ -302,6 +304,7 @@ object AngConfigManager { } else if (server.startsWith("[Interface]") && server.contains("[Peer]")) { try { val config = WireguardFmt.parseWireguardConfFile(server) ?: return R.string.toast_incorrect_protocol + config.description = generateDescription(config) val key = MmkvManager.encodeServerConfig("", config) MmkvManager.encodeServerRaw(key, server) return 1 @@ -363,6 +366,7 @@ object AngConfigManager { } config.subscriptionId = subid + config.description = generateDescription(config) val guid = MmkvManager.encodeServerConfig("", config) if (removedSelectedServer != null && config.server == removedSelectedServer.server && config.serverPort == removedSelectedServer.serverPort @@ -493,4 +497,25 @@ object AngConfigManager { MmkvManager.encodeSubscription("", subItem) return 1 } + + /** Generates a description for the profile. + * + * @param profile The profile item. + * @return The generated description. + */ + fun generateDescription(profile: ProfileItem): String { + // Hide xxx:xxx:***/xxx.xxx.xxx.*** + val server = profile.server + val port = profile.serverPort + if (server.isNullOrBlank() && port.isNullOrBlank()) return "" + + val addrPart = server?.let { + if (it.contains(":")) + it.split(":").take(2).joinToString(":", postfix = ":***") + else + it.split('.').dropLast(1).joinToString(".", postfix = ".***") + } ?: "" + + return "$addrPart : ${port ?: ""}" + } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt index 09a2211e..806d6323 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainRecyclerAdapter.kt @@ -14,6 +14,8 @@ import com.v2ray.ang.databinding.ItemRecyclerFooterBinding import com.v2ray.ang.databinding.ItemRecyclerMainBinding import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.ServersCache +import com.v2ray.ang.extension.nullIfBlank +import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.helper.ItemTouchHelperAdapter import com.v2ray.ang.helper.ItemTouchHelperViewHolder @@ -121,19 +123,7 @@ class MainRecyclerAdapter( * @return Formatted address string */ private fun getAddress(profile: ProfileItem): String { - // Hide xxx:xxx:***/xxx.xxx.xxx.*** - val server = profile.server - val port = profile.serverPort - if (server.isNullOrBlank() && port.isNullOrBlank()) return "" - - val addrPart = server?.let { - if (it.contains(":")) - it.split(":").take(2).joinToString(":", postfix = ":***") - else - it.split('.').dropLast(1).joinToString(".", postfix = ".***") - } ?: "" - - return "$addrPart : ${port ?: ""}" + return profile.description.nullIfBlank() ?: AngConfigManager.generateDescription(profile) } /** diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt index 8c7cc1c6..8f25052f 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerActivity.kt @@ -26,6 +26,7 @@ import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.extension.isNotNullEmpty import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastSuccess +import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.util.JsonUtil import com.v2ray.ang.util.Utils @@ -494,6 +495,8 @@ class ServerActivity : BaseActivity() { saveStreamSettings(config) saveTls(config) + config.description = AngConfigManager.generateDescription(config) + if (config.subscriptionId.isEmpty() && !subscriptionId.isNullOrEmpty()) { config.subscriptionId = subscriptionId.orEmpty() } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt index c7df349a..8dd4ca86 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerCustomConfigActivity.kt @@ -16,6 +16,7 @@ import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastSuccess import com.v2ray.ang.fmt.CustomFmt +import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.util.Utils @@ -89,6 +90,7 @@ class ServerCustomConfigActivity : BaseActivity() { } config.server = profileItem?.server config.serverPort = profileItem?.serverPort + config.description = AngConfigManager.generateDescription(config) MmkvManager.encodeServerConfig(editGuid, config) MmkvManager.encodeServerRaw(editGuid, binding.editor.text.toString()) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt index b1c3ebab..d37508a0 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/ServerGroupActivity.kt @@ -10,8 +10,10 @@ import com.v2ray.ang.R import com.v2ray.ang.databinding.ActivityServerGroupBinding import com.v2ray.ang.enums.EConfigType import com.v2ray.ang.dto.ProfileItem +import com.v2ray.ang.extension.isNotNullEmpty import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastSuccess +import com.v2ray.ang.handler.AngConfigManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.util.Utils @@ -66,6 +68,11 @@ class ServerGroupActivity : BaseActivity() { private fun clearServer(): Boolean { binding.etRemarks.text = null binding.etPolicyGroupFilter.text = null + + if (subscriptionId.isNotNullEmpty()) { + val pos = subIds.indexOf(subscriptionId).let { if (it >= 0) it else 0 } + binding.spPolicyGroupSubId.setSelection(pos) + } return true } @@ -90,6 +97,9 @@ class ServerGroupActivity : BaseActivity() { if (config.subscriptionId.isEmpty() && !subscriptionId.isNullOrEmpty()) { config.subscriptionId = subscriptionId.orEmpty() } + + config.description = "${binding.spPolicyGroupType.selectedItem} - ${binding.spPolicyGroupSubId.selectedItem} - ${config.policyGroupFilter}" + MmkvManager.encodeServerConfig(editGuid, config) toastSuccess(R.string.toast_success) finish()