一键连进入获取订阅地址

This commit is contained in:
level 2025-06-16 10:10:21 +08:00
parent 3fad9e6843
commit 09bcec1012
4 changed files with 131 additions and 11 deletions

View File

@ -15,6 +15,7 @@ import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatImageView
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@ -31,17 +32,20 @@ import com.tencent.mmkv.MMKV
import com.yingmao.clash.R import com.yingmao.clash.R
import com.yingmao.clash.act.ProxyModeActivity.ProxyMode import com.yingmao.clash.act.ProxyModeActivity.ProxyMode
import com.yingmao.clash.act.NewMainActivity.Companion.clashBinder import com.yingmao.clash.act.NewMainActivity.Companion.clashBinder
import com.yingmao.clash.act.NewMainActivity.Companion.isSubed
import com.yingmao.clash.act.NewMainActivity.Companion.newUuid
import com.yingmao.clash.act.NewMainActivity.Companion.profileBinder import com.yingmao.clash.act.NewMainActivity.Companion.profileBinder
import com.yingmao.clash.act.NewMainActivity.Companion.subUrl import com.yingmao.clash.act.NewMainActivity.Companion.subUrl
import com.yingmao.clash.app.MainApplication
import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.base.BaseActivity
import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.conf.Conf import com.yingmao.clash.conf.Conf
import com.yingmao.clash.entity.ClashNodebBean import com.yingmao.clash.entity.ClashNodebBean
import com.yingmao.clash.fragment.NewAccFragment import com.yingmao.clash.fragment.NewAccFragment
import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE
import com.yingmao.clash.fragment.NewAccFragment.Companion.clashRunning
import com.yingmao.clash.fragment.NewAccFragment.Companion.isGlo import com.yingmao.clash.fragment.NewAccFragment.Companion.isGlo
import com.yingmao.clash.net.http.HttpReqType
import com.yingmao.clash.net.http.HttpStatus
import com.yingmao.clash.net.http.entity.SubscriptionRsp
import com.yingmao.clash.remote.Resource import com.yingmao.clash.remote.Resource
import com.yingmao.clash.util.Utils import com.yingmao.clash.util.Utils
import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.RxToast
@ -78,8 +82,8 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_change_node) setContentView(R.layout.activity_change_node)
setMoreBar("线路测速", this)
changeNodeVM = ViewModelProvider(this)[ChangeNodeVM::class.java] changeNodeVM = ViewModelProvider(this)[ChangeNodeVM::class.java]
observe(this, changeNodeVM)
initData() initData()
initViews() initViews()
} }
@ -91,7 +95,9 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
} }
private fun initData() { private fun initData() {
cacheNodeStr = MMKV.defaultMMKV().decodeString(BZYConstants.NODE_All_ITEM_NAME_KEY, ""); //进入获取订阅地址信息
changeNodeVM.getAirNodes()
cacheNodeStr = MMKV.defaultMMKV().decodeString(BZYConstants.NODE_All_ITEM_NAME_KEY, "")
val intentFilter = IntentFilter(Intents.ACTION_NODE_LIST) val intentFilter = IntentFilter(Intents.ACTION_NODE_LIST)
broadcastReceiver = NodeListBR() broadcastReceiver = NodeListBR()
if (Build.VERSION.SDK_INT >= 34 && applicationInfo.targetSdkVersion >= 34) { if (Build.VERSION.SDK_INT >= 34 && applicationInfo.targetSdkVersion >= 34) {
@ -106,8 +112,104 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
intentFilter intentFilter
) )
} }
} }
override fun httpSuccess(httpStatus: HttpStatus.Success) {
if(httpStatus.reqType == HttpReqType.GET_AIRNODES){
val data = httpStatus.rsp as SubscriptionRsp
if (data.code=="1000") {
data.data.let { url ->
if(subUrl!=url){
// var url2="https://api.ymvpnpro11.cc:8700/7air2vr7ikiqzgvxz/api/v1/client/subscribe?token=5af82930d222840cbc2dec572b21d6c6"
if (url.isNotEmpty()) {
//todo 判断订阅地址是否修改过,未修改就用接口返回的地址反之使用本地修改的地址
val proSubUrl =
MMKV.defaultMMKV().decodeString(BZYConstants.PROFILE_SUB_URL, "")
subUrl = if (!TextUtils.isEmpty(proSubUrl)){
if (proSubUrl == url) {
url
} else {
proSubUrl
}
}else{
url
}
lifecycleScope.launch(Dispatchers.IO) {
subUrl?.let { setSubUrl(it) }
}
}
}
}
} else {
RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}")
}
}
}
private suspend fun setSubUrl(url: String) {
Log.d("setSub2 2")
profileBinder?.let { pm ->
Log.d("setSub2 3")
pm.queryAll().forEach { itemPro ->
Log.d("setSub2 itemPro ==>${itemPro}")
if (itemPro.name != Conf.getClashConfName(this@ChangeNodeActivity.applicationContext)) {
Log.d("setSub2 delete ==>${itemPro.name}")
pm.delete(itemPro.uuid)
}
}
val pro = pm.queryActive()
Log.d("setSub2 4")
pro?.let {
val actName = it.name
Log.d("new main actname==>$actName")
Log.d("setSub2 pro 已存在 ==>")
pm.setActive(it)
delay(500)
if (!TextUtils.isEmpty(pro.source)) {
if (pro.source != url) {
Log.d("setSub2 patch")
pm.patch(pro.uuid, pro.name, url, 1800000L)
pm.commit(pro.uuid) { status ->
Log.d("setSub2 updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress)
}
}
}
pm.update(it.uuid)
newUuid = pro.uuid.toString();
isSubed = true
Log.d("setSub2 setActive end")
} ?: run {
createMyProfile(pm, url)
}
}
}
private suspend fun createMyProfile(pm: IProfileManager, url: String) {
val uuid: UUID = pm.create(
Profile.Type.Url, Conf.getClashConfName(this@ChangeNodeActivity.applicationContext)
)
delay(500)
pm.queryByUUID(uuid)?.let { qPro ->
pm.setActive(qPro)
pm.patch(
qPro.uuid, qPro.name,
url, 1800000L
)
pm.commit(qPro.uuid) { status ->
android.util.Log.d(
Conf.TAG,
"new updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress
)
}
newUuid = qPro.uuid.toString()
isSubed = true
}
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun initViews() { private fun initViews() {
aiBack=findViewById(R.id.aiBack) aiBack=findViewById(R.id.aiBack)
@ -298,6 +400,7 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
swipeLayout.isRefreshing = true swipeLayout.isRefreshing = true
updateProfile(false) updateProfile(false)
swipeLayout.isRefreshing = false swipeLayout.isRefreshing = false
changeNodeVM.getAirNodes()
} }
}) })
} }
@ -395,8 +498,6 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
nodeListAdapter.selectedPosition nodeListAdapter.selectedPosition
nodeListAdapter.setOnItemClickListener { baseQuickAdapter: BaseQuickAdapter<*, *>, view: View, position: Int -> nodeListAdapter.setOnItemClickListener { baseQuickAdapter: BaseQuickAdapter<*, *>, view: View, position: Int ->
(baseQuickAdapter.getItem(position) as ClashNodebBean).let { profile -> (baseQuickAdapter.getItem(position) as ClashNodebBean).let { profile ->
com.cncat.vpn.common.log.Log.i("select_node : ${profile.name}")
// checkedNode = profile
MMKV.defaultMMKV().encode(BZYConstants.NODE_SELECTED_NAME_KEY, profile.name) MMKV.defaultMMKV().encode(BZYConstants.NODE_SELECTED_NAME_KEY, profile.name)
nodeListAdapter.notifyItemChanged(nodeListAdapter.selectedPosition) nodeListAdapter.notifyItemChanged(nodeListAdapter.selectedPosition)
nodeListAdapter.selectedPosition = nodeListAdapter.selectedPosition =

View File

@ -528,7 +528,7 @@ class NewMainActivity : BaseActivity() {
} else { } else {
RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}") RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}")
} }
data.data?.let { url -> data.data.let { url ->
android.util.Log.e("Data", "机场URL=${url}") android.util.Log.e("Data", "机场URL=${url}")
// var url2="https://api.ymvpnpro11.cc:8700/7air2vr7ikiqzgvxz/api/v1/client/subscribe?token=5af82930d222840cbc2dec572b21d6c6" // var url2="https://api.ymvpnpro11.cc:8700/7air2vr7ikiqzgvxz/api/v1/client/subscribe?token=5af82930d222840cbc2dec572b21d6c6"
if (url.isNotEmpty()) { if (url.isNotEmpty()) {

View File

@ -93,10 +93,10 @@ class NetService private constructor() : INetService {
// .sslSocketFactory(getSSLSocketFactory(), CustomTrustManager())//信任所有证书 // .sslSocketFactory(getSSLSocketFactory(), CustomTrustManager())//信任所有证书
.sslSocketFactory(getSSLSocketFactory(), trustAllCerts[0] as X509TrustManager) .sslSocketFactory(getSSLSocketFactory(), trustAllCerts[0] as X509TrustManager)
.hostnameVerifier(getHostnameVerifier()!!) .hostnameVerifier(getHostnameVerifier()!!)
if (BuildConfig.DEBUG) { // if (BuildConfig.DEBUG) {
builder.addInterceptor(loggingInterceptor) // builder.addInterceptor(loggingInterceptor)
} // }
// builder.addInterceptor(loggingInterceptor) builder.addInterceptor(loggingInterceptor)
return builder.build() return builder.build()
} }

View File

@ -138,6 +138,25 @@ subprojects {
) )
) )
} }
create("9505") {
isDefault = true
dimension = flavorDimensionList[0]
buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")")
buildConfigField("boolean", "is_back_cn", "false")
buildConfigField("boolean", "is_ym", "true")
buildConfigField("boolean", "is_tz", "false")
buildConfigField("boolean", "is_yunti", "false")
buildConfigField("String", "applicationId", "\"com.jsq.wufu\"")
buildConfigField("String", "service_url", "\"https://api.yijianlianjsq.com/\"")
buildConfigField("boolean", "is_free", "false")
buildConfigField("String", "productId", "\"9505\"")
manifestPlaceholders(
mapOf(
"APP_NAME" to "@string/wf",
"APP_ICON" to "@mipmap/oneclickconnection"
)
)
}
} }
sourceSets { sourceSets {
getByName("8888") { getByName("8888") {