Remove function migrateLegacy()

This commit is contained in:
2dust
2024-04-16 10:29:07 +08:00
parent a26bf3eeda
commit 723ab70170
2 changed files with 240 additions and 221 deletions

View File

@@ -111,7 +111,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
setupViewModel()
copyAssets()
migrateLegacy()
//migrateLegacy()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
RxPermissions(this)
@@ -188,21 +188,21 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
}
}
private fun migrateLegacy() {
lifecycleScope.launch(Dispatchers.IO) {
val result = AngConfigManager.migrateLegacyConfig(this@MainActivity)
if (result != null) {
launch(Dispatchers.Main) {
if (result) {
toast(getString(R.string.migration_success))
mainViewModel.reloadServerList()
} else {
toast(getString(R.string.migration_fail))
}
}
}
}
}
// private fun migrateLegacy() {
// lifecycleScope.launch(Dispatchers.IO) {
// val result = AngConfigManager.migrateLegacyConfig(this@MainActivity)
// if (result != null) {
// launch(Dispatchers.Main) {
// if (result) {
// toast(getString(R.string.migration_success))
// mainViewModel.reloadServerList()
// } else {
// toast(getString(R.string.migration_fail))
// }
// }
// }
// }
// }
fun startV2Ray() {
if (mainStorage?.decodeString(MmkvManager.KEY_SELECTED_SERVER).isNullOrEmpty()) {

View File

@@ -1,35 +1,31 @@
package com.v2ray.ang.util
import android.content.Context
import android.content.SharedPreferences
import android.graphics.Bitmap
import android.text.TextUtils
import android.util.Log
import androidx.preference.PreferenceManager
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonPrimitive
import com.google.gson.JsonSerializationContext
import com.google.gson.JsonSerializer
import com.google.gson.annotations.SerializedName
import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV
import com.v2ray.ang.AppConfig
import com.v2ray.ang.AppConfig.ANG_CONFIG
import com.v2ray.ang.AppConfig.PROTOCOL_HTTPS
import com.v2ray.ang.AppConfig.PROTOCOL_HTTP
import com.v2ray.ang.AppConfig.PROTOCOL_HTTPS
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_ADDRESS_V4
import com.v2ray.ang.AppConfig.WIREGUARD_LOCAL_MTU
import com.v2ray.ang.R
import com.v2ray.ang.dto.*
import com.v2ray.ang.dto.V2rayConfig.Companion.DEFAULT_SECURITY
import com.v2ray.ang.dto.V2rayConfig.Companion.TLS
import com.v2ray.ang.util.MmkvManager.KEY_SELECTED_SERVER
import java.net.URI
import java.util.*
import java.lang.reflect.Type
import com.v2ray.ang.extension.idnHost
import com.v2ray.ang.extension.removeWhiteSpace
import com.v2ray.ang.util.MmkvManager.KEY_SELECTED_SERVER
import java.lang.reflect.Type
import java.net.URI
import java.util.*
object AngConfigManager {
private val mainStorage by lazy {
@@ -55,158 +51,158 @@ object AngConfigManager {
/**
* Legacy loading config
*/
fun migrateLegacyConfig(c: Context): Boolean? {
try {
val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(c)
val context = defaultSharedPreferences.getString(ANG_CONFIG, "")
if (context.isNullOrBlank()) {
return null
}
val angConfig = Gson().fromJson(context, AngConfig::class.java)
for (i in angConfig.vmess.indices) {
upgradeServerVersion(angConfig.vmess[i])
}
copyLegacySettings(defaultSharedPreferences)
migrateVmessBean(angConfig, defaultSharedPreferences)
migrateSubItemBean(angConfig)
defaultSharedPreferences.edit().remove(ANG_CONFIG).apply()
return true
} catch (e: Exception) {
e.printStackTrace()
}
return false
}
private fun copyLegacySettings(sharedPreferences: SharedPreferences) {
listOf(
AppConfig.PREF_MODE,
AppConfig.PREF_REMOTE_DNS,
AppConfig.PREF_DOMESTIC_DNS,
AppConfig.PREF_LOCAL_DNS_PORT,
AppConfig.PREF_SOCKS_PORT,
AppConfig.PREF_HTTP_PORT,
AppConfig.PREF_LOGLEVEL,
AppConfig.PREF_ROUTING_DOMAIN_STRATEGY,
AppConfig.PREF_ROUTING_MODE,
AppConfig.PREF_V2RAY_ROUTING_AGENT,
AppConfig.PREF_V2RAY_ROUTING_BLOCKED,
AppConfig.PREF_V2RAY_ROUTING_DIRECT,
).forEach { key ->
settingsStorage?.encode(key, sharedPreferences.getString(key, null))
}
listOf(
AppConfig.PREF_SPEED_ENABLED,
AppConfig.PREF_PROXY_SHARING,
AppConfig.PREF_LOCAL_DNS_ENABLED,
AppConfig.PREF_ALLOW_INSECURE,
AppConfig.PREF_PREFER_IPV6,
AppConfig.PREF_PER_APP_PROXY,
AppConfig.PREF_BYPASS_APPS,
).forEach { key ->
settingsStorage?.encode(key, sharedPreferences.getBoolean(key, false))
}
settingsStorage?.encode(
AppConfig.PREF_SNIFFING_ENABLED,
sharedPreferences.getBoolean(AppConfig.PREF_SNIFFING_ENABLED, true)
)
settingsStorage?.encode(
AppConfig.PREF_PER_APP_PROXY_SET,
sharedPreferences.getStringSet(AppConfig.PREF_PER_APP_PROXY_SET, setOf())
)
}
private fun migrateVmessBean(angConfig: AngConfig, sharedPreferences: SharedPreferences) {
angConfig.vmess.forEachIndexed { index, vmessBean ->
val type = EConfigType.fromInt(vmessBean.configType) ?: return@forEachIndexed
val config = ServerConfig.create(type)
config.remarks = vmessBean.remarks
config.subscriptionId = vmessBean.subid
if (type == EConfigType.CUSTOM) {
val jsonConfig = sharedPreferences.getString(ANG_CONFIG + vmessBean.guid, "")
val v2rayConfig = try {
Gson().fromJson(jsonConfig, V2rayConfig::class.java)
} catch (e: Exception) {
e.printStackTrace()
return@forEachIndexed
}
config.fullConfig = v2rayConfig
serverRawStorage?.encode(vmessBean.guid, jsonConfig)
} else {
config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
vnext.address = vmessBean.address
vnext.port = vmessBean.port
vnext.users[0].id = vmessBean.id
if (config.configType == EConfigType.VMESS) {
vnext.users[0].alterId = vmessBean.alterId
vnext.users[0].security = vmessBean.security
} else if (config.configType == EConfigType.VLESS) {
vnext.users[0].encryption = vmessBean.security
vnext.users[0].flow = vmessBean.flow
}
}
config.outboundBean?.settings?.servers?.get(0)?.let { server ->
server.address = vmessBean.address
server.port = vmessBean.port
if (config.configType == EConfigType.SHADOWSOCKS) {
server.password = vmessBean.id
server.method = vmessBean.security
} else if (config.configType == EConfigType.SOCKS) {
if (TextUtils.isEmpty(vmessBean.security) && TextUtils.isEmpty(vmessBean.id)) {
server.users = null
} else {
val socksUsersBean =
V2rayConfig.OutboundBean.OutSettingsBean.ServersBean.SocksUsersBean()
socksUsersBean.user = vmessBean.security
socksUsersBean.pass = vmessBean.id
server.users = listOf(socksUsersBean)
}
} else if (config.configType == EConfigType.TROJAN) {
server.password = vmessBean.id
}
}
config.outboundBean?.streamSettings?.let { streamSetting ->
val sni = streamSetting.populateTransportSettings(
vmessBean.network,
vmessBean.headerType,
vmessBean.requestHost,
vmessBean.path,
vmessBean.path,
vmessBean.requestHost,
vmessBean.path,
vmessBean.headerType,
vmessBean.path,
vmessBean.requestHost,
)
val allowInsecure = if (vmessBean.allowInsecure.isBlank()) {
settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
} else {
vmessBean.allowInsecure.toBoolean()
}
var fingerprint = streamSetting.tlsSettings?.fingerprint
streamSetting.populateTlsSettings(
vmessBean.streamSecurity, allowInsecure,
vmessBean.sni.ifBlank { sni }, fingerprint, null, null, null, null
)
}
}
val key = MmkvManager.encodeServerConfig(vmessBean.guid, config)
if (index == angConfig.index) {
mainStorage?.encode(KEY_SELECTED_SERVER, key)
}
}
}
private fun migrateSubItemBean(angConfig: AngConfig) {
angConfig.subItem.forEach {
val subItem = SubscriptionItem()
subItem.remarks = it.remarks
subItem.url = it.url
subItem.enabled = it.enabled
subStorage?.encode(it.id, Gson().toJson(subItem))
}
}
// fun migrateLegacyConfig(c: Context): Boolean? {
// try {
// val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(c)
// val context = defaultSharedPreferences.getString(ANG_CONFIG, "")
// if (context.isNullOrBlank()) {
// return null
// }
// val angConfig = Gson().fromJson(context, AngConfig::class.java)
// for (i in angConfig.vmess.indices) {
// upgradeServerVersion(angConfig.vmess[i])
// }
//
// copyLegacySettings(defaultSharedPreferences)
// migrateVmessBean(angConfig, defaultSharedPreferences)
// migrateSubItemBean(angConfig)
//
// defaultSharedPreferences.edit().remove(ANG_CONFIG).apply()
// return true
// } catch (e: Exception) {
// e.printStackTrace()
// }
// return false
// }
//
// private fun copyLegacySettings(sharedPreferences: SharedPreferences) {
// listOf(
// AppConfig.PREF_MODE,
// AppConfig.PREF_REMOTE_DNS,
// AppConfig.PREF_DOMESTIC_DNS,
// AppConfig.PREF_LOCAL_DNS_PORT,
// AppConfig.PREF_SOCKS_PORT,
// AppConfig.PREF_HTTP_PORT,
// AppConfig.PREF_LOGLEVEL,
// AppConfig.PREF_ROUTING_DOMAIN_STRATEGY,
// AppConfig.PREF_ROUTING_MODE,
// AppConfig.PREF_V2RAY_ROUTING_AGENT,
// AppConfig.PREF_V2RAY_ROUTING_BLOCKED,
// AppConfig.PREF_V2RAY_ROUTING_DIRECT,
// ).forEach { key ->
// settingsStorage?.encode(key, sharedPreferences.getString(key, null))
// }
// listOf(
// AppConfig.PREF_SPEED_ENABLED,
// AppConfig.PREF_PROXY_SHARING,
// AppConfig.PREF_LOCAL_DNS_ENABLED,
// AppConfig.PREF_ALLOW_INSECURE,
// AppConfig.PREF_PREFER_IPV6,
// AppConfig.PREF_PER_APP_PROXY,
// AppConfig.PREF_BYPASS_APPS,
// ).forEach { key ->
// settingsStorage?.encode(key, sharedPreferences.getBoolean(key, false))
// }
// settingsStorage?.encode(
// AppConfig.PREF_SNIFFING_ENABLED,
// sharedPreferences.getBoolean(AppConfig.PREF_SNIFFING_ENABLED, true)
// )
// settingsStorage?.encode(
// AppConfig.PREF_PER_APP_PROXY_SET,
// sharedPreferences.getStringSet(AppConfig.PREF_PER_APP_PROXY_SET, setOf())
// )
// }
//
// private fun migrateVmessBean(angConfig: AngConfig, sharedPreferences: SharedPreferences) {
// angConfig.vmess.forEachIndexed { index, vmessBean ->
// val type = EConfigType.fromInt(vmessBean.configType) ?: return@forEachIndexed
// val config = ServerConfig.create(type)
// config.remarks = vmessBean.remarks
// config.subscriptionId = vmessBean.subid
// if (type == EConfigType.CUSTOM) {
// val jsonConfig = sharedPreferences.getString(ANG_CONFIG + vmessBean.guid, "")
// val v2rayConfig = try {
// Gson().fromJson(jsonConfig, V2rayConfig::class.java)
// } catch (e: Exception) {
// e.printStackTrace()
// return@forEachIndexed
// }
// config.fullConfig = v2rayConfig
// serverRawStorage?.encode(vmessBean.guid, jsonConfig)
// } else {
// config.outboundBean?.settings?.vnext?.get(0)?.let { vnext ->
// vnext.address = vmessBean.address
// vnext.port = vmessBean.port
// vnext.users[0].id = vmessBean.id
// if (config.configType == EConfigType.VMESS) {
// vnext.users[0].alterId = vmessBean.alterId
// vnext.users[0].security = vmessBean.security
// } else if (config.configType == EConfigType.VLESS) {
// vnext.users[0].encryption = vmessBean.security
// vnext.users[0].flow = vmessBean.flow
// }
// }
// config.outboundBean?.settings?.servers?.get(0)?.let { server ->
// server.address = vmessBean.address
// server.port = vmessBean.port
// if (config.configType == EConfigType.SHADOWSOCKS) {
// server.password = vmessBean.id
// server.method = vmessBean.security
// } else if (config.configType == EConfigType.SOCKS) {
// if (TextUtils.isEmpty(vmessBean.security) && TextUtils.isEmpty(vmessBean.id)) {
// server.users = null
// } else {
// val socksUsersBean =
// V2rayConfig.OutboundBean.OutSettingsBean.ServersBean.SocksUsersBean()
// socksUsersBean.user = vmessBean.security
// socksUsersBean.pass = vmessBean.id
// server.users = listOf(socksUsersBean)
// }
// } else if (config.configType == EConfigType.TROJAN) {
// server.password = vmessBean.id
// }
// }
// config.outboundBean?.streamSettings?.let { streamSetting ->
// val sni = streamSetting.populateTransportSettings(
// vmessBean.network,
// vmessBean.headerType,
// vmessBean.requestHost,
// vmessBean.path,
// vmessBean.path,
// vmessBean.requestHost,
// vmessBean.path,
// vmessBean.headerType,
// vmessBean.path,
// vmessBean.requestHost,
// )
// val allowInsecure = if (vmessBean.allowInsecure.isBlank()) {
// settingsStorage?.decodeBool(AppConfig.PREF_ALLOW_INSECURE) ?: false
// } else {
// vmessBean.allowInsecure.toBoolean()
// }
// var fingerprint = streamSetting.tlsSettings?.fingerprint
// streamSetting.populateTlsSettings(
// vmessBean.streamSecurity, allowInsecure,
// vmessBean.sni.ifBlank { sni }, fingerprint, null, null, null, null
// )
// }
// }
// val key = MmkvManager.encodeServerConfig(vmessBean.guid, config)
// if (index == angConfig.index) {
// mainStorage?.encode(KEY_SELECTED_SERVER, key)
// }
// }
// }
//
// private fun migrateSubItemBean(angConfig: AngConfig) {
// angConfig.subItem.forEach {
// val subItem = SubscriptionItem()
// subItem.remarks = it.remarks
// subItem.url = it.url
// subItem.enabled = it.enabled
// subStorage?.encode(it.id, Gson().toJson(subItem))
// }
// }
/**
* import config form qrcode or...
@@ -599,14 +595,24 @@ object AngConfigManager {
if (idx == -1) {
queryPairs[Utils.urlDecode(pair)] = "";
} else {
queryPairs[Utils.urlDecode(pair.substring(0, idx))] = Utils.urlDecode(pair.substring(idx + 1))
queryPairs[Utils.urlDecode(pair.substring(0, idx))] =
Utils.urlDecode(pair.substring(idx + 1))
}
}
Log.d(AppConfig.ANG_PACKAGE, queryPairs.toString())
var sni: String? = ""
if (queryPairs["plugin"] == "obfs-local" && queryPairs["obfs"] == "http") {
sni = config.outboundBean?.streamSettings?.populateTransportSettings(
"tcp", "http", queryPairs["obfs-host"], queryPairs["path"], null, null, null, null, null, null
"tcp",
"http",
queryPairs["obfs-host"],
queryPairs["path"],
null,
null,
null,
null,
null,
null
)
} else if (queryPairs["plugin"] == "v2ray-plugin") {
var network = "ws";
@@ -614,7 +620,16 @@ object AngConfigManager {
network = "quic";
}
sni = config.outboundBean?.streamSettings?.populateTransportSettings(
network, null, queryPairs["host"], queryPairs["path"], null, null, null, null, null, null
network,
null,
queryPairs["host"],
queryPairs["path"],
null,
null,
null,
null,
null,
null
)
}
if ("tls" in queryPairs) {
@@ -622,9 +637,9 @@ object AngConfigManager {
"tls", false, sni ?: "", null, null, null, null, null
)
}
}
config.outboundBean?.settings?.servers?.get(0)?.let { server ->
server.address = uri.idnHost
server.port = uri.port
@@ -935,38 +950,38 @@ object AngConfigManager {
return 0
}
/**
* upgrade
*/
private fun upgradeServerVersion(vmess: AngConfig.VmessBean): Int {
try {
if (vmess.configVersion == 2) {
return 0
}
when (vmess.network) {
"ws", "h2" -> {
var path = ""
var host = ""
val lstParameter = vmess.requestHost.split(";")
if (lstParameter.isNotEmpty()) {
path = lstParameter[0].trim()
}
if (lstParameter.size > 1) {
path = lstParameter[0].trim()
host = lstParameter[1].trim()
}
vmess.path = path
vmess.requestHost = host
}
}
vmess.configVersion = 2
return 0
} catch (e: Exception) {
e.printStackTrace()
return -1
}
}
// /**
// * upgrade
// */
// private fun upgradeServerVersion(vmess: AngConfig.VmessBean): Int {
// try {
// if (vmess.configVersion == 2) {
// return 0
// }
//
// when (vmess.network) {
// "ws", "h2" -> {
// var path = ""
// var host = ""
// val lstParameter = vmess.requestHost.split(";")
// if (lstParameter.isNotEmpty()) {
// path = lstParameter[0].trim()
// }
// if (lstParameter.size > 1) {
// path = lstParameter[0].trim()
// host = lstParameter[1].trim()
// }
// vmess.path = path
// vmess.requestHost = host
// }
// }
// vmess.configVersion = 2
// return 0
// } catch (e: Exception) {
// e.printStackTrace()
// return -1
// }
// }
fun importBatchConfig(servers: String?, subid: String, append: Boolean): Int {
try {
@@ -1038,15 +1053,19 @@ object AngConfigManager {
try {
//val gson = GsonBuilder().setPrettyPrinting().create()
val gson = GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
.registerTypeAdapter( // custom serialiser is needed here since JSON by default parse number as Double, core will fail to start
object : TypeToken<Double>() {}.type,
JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? -> JsonPrimitive(src?.toInt()) }
.setPrettyPrinting()
.disableHtmlEscaping()
.registerTypeAdapter( // custom serialiser is needed here since JSON by default parse number as Double, core will fail to start
object : TypeToken<Double>() {}.type,
JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? ->
JsonPrimitive(
src?.toInt()
)
.create()
}
)
.create()
val serverList: Array<V2rayConfig> =
Gson().fromJson(server, Array<V2rayConfig>::class.java)
Gson().fromJson(server, Array<V2rayConfig>::class.java)
if (serverList.isNotEmpty()) {
var count = 0