diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 55ed4c0..dc576d9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -165,6 +165,10 @@
android:name=".act.ChangeNodeActivity"
android:process=":background"
android:screenOrientation="portrait" />
+
? = null
private lateinit var aiBack: AppCompatImageView
private var broadcastReceiver: BroadcastReceiver? = null
@@ -123,6 +125,8 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
@SuppressLint("SetTextI18n")
private fun initViews() {
aiBack = findViewById(R.id.aiBack)
+ nodeItemTest = findViewById(R.id.node_item_test)
+ nodeItemTest.setOnClickListener(this@ChangeNodeActivity)
aiBack.setOnClickListener {
onBackPressed()
}
@@ -329,13 +333,19 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
}
private fun changeSubUrl(originalUrl: String, newUrl: String) {
- nowSubUrl = originalUrl.replace(Regex("https://[^/]+/"), "$newUrl/")
- MMKV.defaultMMKV().encode(BZYConstants.PROFILE_SUB_URL, nowSubUrl)
+ if (!originalUrl.isNullOrEmpty() && !newUrl.isNullOrEmpty()) {
+ nowSubUrl = originalUrl.replace(Regex("https://[^/]+/"), "$newUrl/")
+ MMKV.defaultMMKV().encode(BZYConstants.PROFILE_SUB_URL, nowSubUrl)
+ }
+ }
+
+ private fun updateTestBut(str: String) {
+ nodeItemTest.text=str
}
val reloadLock = Semaphore(10)
private fun setPing() {
- if (!NewAccFragment.clashRunning) {
+ if (!HomeFragment.clashRunning) {
RxToast.info("请先开启加速后,再进行测试.");
return
}
@@ -344,20 +354,23 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
return
}
testRuning = true
- updateMoreBar("测速中")
+// updateMoreBar("测速中")
+ updateTestBut("测速中")
launch(Dispatchers.IO) {
var group = reloadLock.withPermit {
UIMainActivity.clashBinder?.let { cb ->
var names = cb.queryProxyGroupNames(false)
if (names.isNotEmpty()) {
cb.healthCheck(names[0])
+ delay(1000)
+ cb.queryProxyGroup(names[0], uiStore.proxySort);
+ } else {
+ null
}
- delay(1000)
- cb.queryProxyGroup(names[0], uiStore.proxySort);
}
}
testRuning = false
- runOnUiThread { updateMoreBar("线路测速") }
+ runOnUiThread { updateTestBut("线路测速") }
var newDatas = mutableListOf();
group?.proxies?.forEach { proxy ->
Log.d("node==>${proxy}")
@@ -590,7 +603,7 @@ class ChangeNodeActivity : BaseActivity(), View.OnClickListener {
override fun onClick(p0: View?) {
when (p0?.id) {
- R.id.tv_more -> {
+ R.id.node_item_test -> {
setPing()
}
diff --git a/app/src/main/java/com/yingmao/clash/act/ChangeNodeTzActivity.kt b/app/src/main/java/com/yingmao/clash/act/ChangeNodeTzActivity.kt
new file mode 100644
index 0000000..fcd72e3
--- /dev/null
+++ b/app/src/main/java/com/yingmao/clash/act/ChangeNodeTzActivity.kt
@@ -0,0 +1,606 @@
+package com.yingmao.clash.act
+
+
+import android.annotation.SuppressLint
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.graphics.Color
+import android.os.Build
+import android.os.Bundle
+import android.text.TextUtils
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.lifecycle.ViewModelProvider
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.google.gson.Gson
+import com.google.gson.JsonParser
+import com.tencent.mmkv.MMKV
+import com.yingmao.clash.R
+import com.yingmao.clash.base.BaseActivity
+import com.cncat.vpn.common.constants.Intents
+import com.cncat.vpn.common.log.Log
+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_RESULT_CODE
+import com.yingmao.clash.remote.Resource
+import com.cncat.vpn.service.model.Profile
+import com.cncat.vpn.service.remote.IProfileManager
+import com.cncat.vpn.service.remote.IRemoteService
+import com.yingmao.clash.app.MainApplication
+import com.yingmao.clash.util.Utils
+import com.yingmao.clash.view.RxToast
+import com.yingmao.clash.view.adapter.NodeListAdapter
+import com.yingmao.clash.view.adapter.NodeTzListAdapter
+import com.yingmao.clash.view.dialog.DialogDoMainChoose
+import com.yingmao.clash.view.dialog.DialogSureRestartChoose
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.sync.Semaphore
+import kotlinx.coroutines.sync.withPermit
+import java.util.Timer
+import java.util.TimerTask
+import java.util.UUID
+
+class ChangeNodeTzActivity : BaseActivity(), View.OnClickListener {
+
+ companion object {
+ private var currentNode: MutableList = mutableListOf()
+
+// var clash: ClashManager? = null
+ }
+
+ private lateinit var swipeLayout: SwipeRefreshLayout
+ private lateinit var changeNodeVM: ChangeNodeVM
+ private lateinit var nodeListRv: RecyclerView
+ private var names: List? = null
+ private lateinit var aiBack: AppCompatImageView
+ private var broadcastReceiver: BroadcastReceiver? = null
+ private var cacheNodeStr: String? = ""
+
+ // private var checkedNode: ClashNodebBean? = null
+ private var uuid: UUID? = null
+
+ private var testRuning = false
+ // var cprofile: ProfileManager? = null
+ // private var currentNode: Profile? = null
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_change_node)
+ setMoreBar("线路测速", this)
+ changeNodeVM = ViewModelProvider(this).get(ChangeNodeVM::class.java)
+ initData()
+ initViews()
+
+// cprofile = ProfileManager(this)
+ }
+
+ override fun onBackPressed() {
+ intent.putExtra(BZYConstants.EXTRA_KEY_IS_RUNING, is_runing)
+ setResult(CHECK_NODE_RESULT_CODE, intent)
+ super.onBackPressed()
+ }
+
+ private fun initData() {
+// clash = MainApplication.getApp()?.let { ClashManager(it) }
+ 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) {
+ registerReceiver(
+ broadcastReceiver,
+ intentFilter,
+ Context.RECEIVER_EXPORTED
+ )
+ } else {
+ registerReceiver(
+ broadcastReceiver,
+ intentFilter
+ )
+ }
+// registerReceiver(
+// broadcastReceiver,
+// intentFilter
+// )
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun initViews() {
+ aiBack = findViewById(R.id.aiBack)
+ aiBack.setOnClickListener {
+ onBackPressed()
+ }
+ swipeLayout = findViewById(R.id.swipeLayout)
+ initRefreshLayout()
+ nodeListRv = findViewById(R.id.rv_node_list)
+ var userTrafficTv: TextView = findViewById(R.id.node_user_traffic)
+
+ findViewById(R.id.iv_back).setOnClickListener {
+ onBackPressed()
+ }
+ initAdapter()
+// Log.d("initViews cacheNodeStr==>${cacheNodeStr}")
+ if (!TextUtils.isEmpty(cacheNodeStr)) {
+ currentNode = getNodesInfo(cacheNodeStr!!)
+ setNewData(currentNode)
+ }
+
+// if (!TextUtils.isEmpty(serStore.userTraffic)) {
+// userTrafficTv.visibility=View.VISIBLE
+// var jo = JsonParser.parseString(serStore.userTraffic).asJsonObject
+// var t = jo.get("total")
+// var d = jo.get("download").asLong
+// var u = jo.get("upload").asLong
+// val trafficUsedInGB = String.format("%.2f", (d + u) / 1024.0 / 1024.0 / 1024.0)
+// userTrafficTv.text="已用流量:${trafficUsedInGB}GB"
+// }
+ }
+
+ private fun getNodesInfo(json: String): MutableList {
+ var mList: MutableList = mutableListOf()
+ if (TextUtils.isEmpty(json)) {
+ return mList
+ }
+ val gson = Gson()
+ var ja = JsonParser.parseString(json).asJsonArray
+
+ var cnb = ClashNodebBean("自动选择", "", "", 1, "", "", 0, true);
+ mList.add(cnb)
+ for (i in 0 until ja.size()) {
+ var bean = gson.fromJson(ja.get(i).asString, ClashNodebBean::class.java)
+ bean.delay = Utils.generateRandomTwoDigitNumber(10, 60)
+ mList.add(bean)
+ }
+ return mList
+ }
+
+ inner class NodeListBR : BroadcastReceiver() {
+ override fun onReceive(context: Context?, intent: Intent?) {
+ when (intent?.action) {
+ Intents.ACTION_NODE_LIST -> {
+ Log.d("ACTION_NODE_LIST ACTION_NODE_LIST")
+// val parcelableArrayListExtra = intent.getParcelableArrayListExtra