From 09bcec101240c6a25faab6345ef9b46c882f4cc6 Mon Sep 17 00:00:00 2001 From: level <1364007522@qq.com> Date: Mon, 16 Jun 2025 10:10:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E9=94=AE=E8=BF=9E=E8=BF=9B=E5=85=A5?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=AE=A2=E9=98=85=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yingmao/clash/act/ChangeNodeActivity.kt | 113 +++++++++++++++++- .../com/yingmao/clash/act/NewMainActivity.kt | 2 +- .../com/yingmao/clash/net/http/NetService.kt | 8 +- build.gradle.kts | 19 +++ 4 files changed, 131 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/act/ChangeNodeActivity.kt b/app/src/main/java/com/yingmao/clash/act/ChangeNodeActivity.kt index 1b1c52e..88c22e2 100644 --- a/app/src/main/java/com/yingmao/clash/act/ChangeNodeActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/ChangeNodeActivity.kt @@ -15,6 +15,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout @@ -31,17 +32,20 @@ import com.tencent.mmkv.MMKV import com.yingmao.clash.R import com.yingmao.clash.act.ProxyModeActivity.ProxyMode 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.subUrl -import com.yingmao.clash.app.MainApplication import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.Conf import com.yingmao.clash.entity.ClashNodebBean import com.yingmao.clash.fragment.NewAccFragment 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.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.util.Utils import com.yingmao.clash.view.RxToast @@ -78,8 +82,8 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_change_node) - setMoreBar("线路测速", this) changeNodeVM = ViewModelProvider(this)[ChangeNodeVM::class.java] + observe(this, changeNodeVM) initData() initViews() } @@ -91,7 +95,9 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener { } 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) broadcastReceiver = NodeListBR() if (Build.VERSION.SDK_INT >= 34 && applicationInfo.targetSdkVersion >= 34) { @@ -106,8 +112,104 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener { 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") private fun initViews() { aiBack=findViewById(R.id.aiBack) @@ -298,6 +400,7 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener { swipeLayout.isRefreshing = true updateProfile(false) swipeLayout.isRefreshing = false + changeNodeVM.getAirNodes() } }) } @@ -395,8 +498,6 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener { nodeListAdapter.selectedPosition nodeListAdapter.setOnItemClickListener { baseQuickAdapter: BaseQuickAdapter<*, *>, view: View, position: Int -> (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) nodeListAdapter.notifyItemChanged(nodeListAdapter.selectedPosition) nodeListAdapter.selectedPosition = diff --git a/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt b/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt index 5e468dd..9015af0 100644 --- a/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt @@ -528,7 +528,7 @@ class NewMainActivity : BaseActivity() { } else { RxToast.error(resources.getString(R.string.NodeAcquisitionFailed) + "${data.msg}") } - data.data?.let { url -> + data.data.let { url -> android.util.Log.e("Data", "机场URL:=${url}") // var url2="https://api.ymvpnpro11.cc:8700/7air2vr7ikiqzgvxz/api/v1/client/subscribe?token=5af82930d222840cbc2dec572b21d6c6" if (url.isNotEmpty()) { diff --git a/app/src/main/java/com/yingmao/clash/net/http/NetService.kt b/app/src/main/java/com/yingmao/clash/net/http/NetService.kt index e05d3fa..2940309 100644 --- a/app/src/main/java/com/yingmao/clash/net/http/NetService.kt +++ b/app/src/main/java/com/yingmao/clash/net/http/NetService.kt @@ -93,10 +93,10 @@ class NetService private constructor() : INetService { // .sslSocketFactory(getSSLSocketFactory(), CustomTrustManager())//信任所有证书 .sslSocketFactory(getSSLSocketFactory(), trustAllCerts[0] as X509TrustManager) .hostnameVerifier(getHostnameVerifier()!!) - if (BuildConfig.DEBUG) { - builder.addInterceptor(loggingInterceptor) - } -// builder.addInterceptor(loggingInterceptor) +// if (BuildConfig.DEBUG) { +// builder.addInterceptor(loggingInterceptor) +// } + builder.addInterceptor(loggingInterceptor) return builder.build() } diff --git a/build.gradle.kts b/build.gradle.kts index 94fb210..7289f6a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -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 { getByName("8888") {