From 47be68c52f4de77438eddbf046132344439c6d1d Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 29 Dec 2025 16:34:37 +0800 Subject: [PATCH] Remove legacy server config migration logic Deleted ServerConfig and MigrateManager classes, and removed the legacy migration call from MainActivity. This cleans up obsolete migration code now that server configuration migration is no longer required. --- .../java/com/v2ray/ang/dto/ServerConfig.kt | 86 ------- .../com/v2ray/ang/handler/MigrateManager.kt | 242 ------------------ .../java/com/v2ray/ang/ui/MainActivity.kt | 17 -- 3 files changed, 345 deletions(-) delete mode 100644 V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt delete mode 100644 V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt deleted file mode 100644 index baa1fe48..00000000 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/ServerConfig.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.v2ray.ang.dto - -import com.v2ray.ang.AppConfig.TAG_BLOCKED -import com.v2ray.ang.AppConfig.TAG_DIRECT -import com.v2ray.ang.AppConfig.TAG_PROXY - -data class ServerConfig( - val configVersion: Int = 3, - val configType: EConfigType, - var subscriptionId: String = "", - val addedTime: Long = System.currentTimeMillis(), - var remarks: String = "", - val outboundBean: V2rayConfig.OutboundBean? = null, - var fullConfig: V2rayConfig? = null -) { - companion object { - fun create(configType: EConfigType): ServerConfig { - when (configType) { - EConfigType.VMESS, - EConfigType.VLESS -> - return ServerConfig( - configType = configType, - outboundBean = V2rayConfig.OutboundBean( - protocol = configType.name.lowercase(), - settings = V2rayConfig.OutboundBean.OutSettingsBean( - vnext = listOf( - V2rayConfig.OutboundBean.OutSettingsBean.VnextBean( - users = listOf(V2rayConfig.OutboundBean.OutSettingsBean.VnextBean.UsersBean()) - ) - ) - ), - streamSettings = V2rayConfig.OutboundBean.StreamSettingsBean() - ) - ) - - EConfigType.CUSTOM -> - return ServerConfig(configType = configType) - - EConfigType.SHADOWSOCKS, - EConfigType.SOCKS, - EConfigType.HTTP, - EConfigType.TROJAN, - EConfigType.HYSTERIA2 -> - return ServerConfig( - configType = configType, - outboundBean = V2rayConfig.OutboundBean( - protocol = configType.name.lowercase(), - settings = V2rayConfig.OutboundBean.OutSettingsBean( - servers = listOf(V2rayConfig.OutboundBean.OutSettingsBean.ServersBean()) - ), - streamSettings = V2rayConfig.OutboundBean.StreamSettingsBean() - ) - ) - - EConfigType.WIREGUARD -> - return ServerConfig( - configType = configType, - outboundBean = V2rayConfig.OutboundBean( - protocol = configType.name.lowercase(), - settings = V2rayConfig.OutboundBean.OutSettingsBean( - secretKey = "", - peers = listOf(V2rayConfig.OutboundBean.OutSettingsBean.WireGuardBean()) - ) - ) - ) - } - } - } - - fun getProxyOutbound(): V2rayConfig.OutboundBean? { - if (configType != EConfigType.CUSTOM) { - return outboundBean - } - return fullConfig?.getProxyOutbound() - } - - fun getAllOutboundTags(): MutableList { - if (configType != EConfigType.CUSTOM) { - return mutableListOf(TAG_PROXY, TAG_DIRECT, TAG_BLOCKED) - } - fullConfig?.let { config -> - return config.outbounds.map { it.tag }.toMutableList() - } - return mutableListOf() - } -} diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt deleted file mode 100644 index 9dd90c76..00000000 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/MigrateManager.kt +++ /dev/null @@ -1,242 +0,0 @@ -package com.v2ray.ang.handler - -import android.util.Log -import com.tencent.mmkv.MMKV -import com.v2ray.ang.AppConfig -import com.v2ray.ang.dto.EConfigType -import com.v2ray.ang.dto.NetworkType -import com.v2ray.ang.dto.ProfileItem -import com.v2ray.ang.dto.ServerConfig -import com.v2ray.ang.extension.removeWhiteSpace -import com.v2ray.ang.handler.MmkvManager.decodeServerConfig -import com.v2ray.ang.util.JsonUtil - -object MigrateManager { - private const val ID_SERVER_CONFIG = "SERVER_CONFIG" - private val serverStorage by lazy { MMKV.mmkvWithID(ID_SERVER_CONFIG, MMKV.MULTI_PROCESS_MODE) } - - /** - * Migrates server configurations to profile items. - * - * @return True if migration was successful, false otherwise. - */ - fun migrateServerConfig2Profile(): Boolean { - if (serverStorage.count().toInt() == 0) { - return false - } - val serverList = serverStorage.allKeys() ?: return false - Log.i(AppConfig.TAG, "migrateServerConfig2Profile-" + serverList.count()) - - for (guid in serverList) { - var configOld = decodeServerConfigOld(guid) ?: continue - var config = decodeServerConfig(guid) - if (config != null) { - serverStorage.remove(guid) - continue - } - config = migrateServerConfig2ProfileSub(configOld) ?: continue - config.subscriptionId = configOld.subscriptionId - - MmkvManager.encodeServerConfig(guid, config) - - //check and remove old - decodeServerConfig(guid) ?: continue - serverStorage.remove(guid) - Log.i(AppConfig.TAG, "migrateServerConfig2Profile-" + config.remarks) - } - Log.i(AppConfig.TAG, "migrateServerConfig2Profile-end") - return true - } - - /** - * Migrates a server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrateServerConfig2ProfileSub(configOld: ServerConfig): ProfileItem? { - return when (configOld.getProxyOutbound()?.protocol) { - EConfigType.VMESS.name.lowercase() -> migrate2ProfileCommon(configOld) - EConfigType.VLESS.name.lowercase() -> migrate2ProfileCommon(configOld) - EConfigType.TROJAN.name.lowercase() -> migrate2ProfileCommon(configOld) - EConfigType.SHADOWSOCKS.name.lowercase() -> migrate2ProfileCommon(configOld) - - EConfigType.SOCKS.name.lowercase() -> migrate2ProfileSocks(configOld) - EConfigType.HTTP.name.lowercase() -> migrate2ProfileHttp(configOld) - EConfigType.WIREGUARD.name.lowercase() -> migrate2ProfileWireguard(configOld) - EConfigType.HYSTERIA2.name.lowercase() -> migrate2ProfileHysteria2(configOld) - - EConfigType.CUSTOM.name.lowercase() -> migrate2ProfileCustom(configOld) - - else -> null - } - } - - /** - * Migrates a common server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileCommon(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(configOld.configType) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - config.method = outbound.getSecurityEncryption() - config.password = outbound.getPassword() - config.flow = outbound?.settings?.vnext?.first()?.users?.first()?.flow ?: outbound?.settings?.servers?.first()?.flow - - config.network = outbound?.streamSettings?.network ?: NetworkType.TCP.type - outbound.getTransportSettingDetails()?.let { transportDetails -> - config.headerType = transportDetails[0].orEmpty() - config.host = transportDetails[1].orEmpty() - config.path = transportDetails[2].orEmpty() - } - - config.seed = outbound?.streamSettings?.kcpSettings?.seed - config.quicSecurity = outbound?.streamSettings?.quicSettings?.security - config.quicKey = outbound?.streamSettings?.quicSettings?.key - config.mode = if (outbound?.streamSettings?.grpcSettings?.multiMode == true) "multi" else "gun" - config.serviceName = outbound?.streamSettings?.grpcSettings?.serviceName - config.authority = outbound?.streamSettings?.grpcSettings?.authority - - config.security = outbound.streamSettings?.security - val tlsSettings = outbound?.streamSettings?.realitySettings ?: outbound?.streamSettings?.tlsSettings - config.insecure = tlsSettings?.allowInsecure - config.sni = tlsSettings?.serverName - config.fingerPrint = tlsSettings?.fingerprint - config.alpn = tlsSettings?.alpn?.joinToString(",").removeWhiteSpace().toString() - - config.publicKey = tlsSettings?.publicKey - config.shortId = tlsSettings?.shortId - config.spiderX = tlsSettings?.spiderX - - return config - } - - /** - * Migrates a SOCKS server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileSocks(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(EConfigType.SOCKS) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - config.username = outbound.settings?.servers?.first()?.users?.first()?.user - config.password = outbound.getPassword() - - return config - } - - /** - * Migrates an HTTP server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileHttp(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(EConfigType.HTTP) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - config.username = outbound.settings?.servers?.first()?.users?.first()?.user - config.password = outbound.getPassword() - - return config - } - - /** - * Migrates a WireGuard server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileWireguard(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(EConfigType.WIREGUARD) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - - outbound.settings?.let { wireguard -> - config.secretKey = wireguard.secretKey - config.localAddress = (wireguard.address as List<*>).joinToString(",").removeWhiteSpace().toString() - config.publicKey = wireguard.peers?.getOrNull(0)?.publicKey - config.mtu = wireguard.mtu - config.reserved = wireguard.reserved?.joinToString(",").removeWhiteSpace().toString() - } - return config - } - - /** - * Migrates a Hysteria2 server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileHysteria2(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(EConfigType.HYSTERIA2) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - config.password = outbound.getPassword() - - config.security = AppConfig.TLS - outbound.streamSettings?.tlsSettings?.let { tlsSetting -> - config.insecure = tlsSetting.allowInsecure - config.sni = tlsSetting.serverName - config.alpn = tlsSetting.alpn?.joinToString(",").removeWhiteSpace().orEmpty() - - } - config.obfsPassword = outbound.settings?.obfsPassword - - return config - } - - /** - * Migrates a custom server configuration to a profile item. - * - * @param configOld The old server configuration. - * @return The profile item. - */ - private fun migrate2ProfileCustom(configOld: ServerConfig): ProfileItem? { - val config = ProfileItem.create(EConfigType.CUSTOM) - - val outbound = configOld.getProxyOutbound() ?: return null - config.remarks = configOld.remarks - config.server = outbound.getServerAddress() - config.serverPort = outbound.getServerPort().toString() - - return config - } - - /** - * Decodes the old server configuration. - * - * @param guid The server GUID. - * @return The old server configuration. - */ - private fun decodeServerConfigOld(guid: String): ServerConfig? { - if (guid.isBlank()) { - return null - } - val json = serverStorage.decodeString(guid) - if (json.isNullOrBlank()) { - return null - } - return JsonUtil.fromJson(json, ServerConfig::class.java) - } -} 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 8fcb9c51..9f8a2fc5 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 @@ -35,7 +35,6 @@ import com.v2ray.ang.dto.EConfigType import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toastError import com.v2ray.ang.handler.AngConfigManager -import com.v2ray.ang.handler.MigrateManager import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.helper.SimpleItemTouchHelperCallback import com.v2ray.ang.handler.V2RayServiceManager @@ -174,7 +173,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList initGroupTab() setupViewModel() - migrateLegacy() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { @@ -226,21 +224,6 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList mainViewModel.initAssets(assets) } - private fun migrateLegacy() { - lifecycleScope.launch(Dispatchers.IO) { - val result = MigrateManager.migrateServerConfig2Profile() - launch(Dispatchers.Main) { - if (result) { - toast(getString(R.string.migration_success)) - mainViewModel.reloadServerList() - } else { - //toast(getString(R.string.migration_fail)) - } - } - - } - } - private fun initGroupTab() { binding.tabGroup.removeOnTabSelectedListener(tabGroupListener) binding.tabGroup.removeAllTabs()