一键连相关更改

This commit is contained in:
level 2025-06-18 12:28:19 +08:00
parent 09bcec1012
commit 428995e243
12 changed files with 187 additions and 58 deletions

View File

@ -31,7 +31,16 @@ import androidx.viewpager2.widget.ViewPager2
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
import com.airbnb.lottie.LottieAnimationView
import com.cncat.vpn.common.log.Log
import com.cncat.vpn.core.model.LogMessage
import com.cncat.vpn.service.ClashManager
import com.cncat.vpn.service.ProfileManager
import com.cncat.vpn.service.model.Profile
import com.cncat.vpn.service.remote.IClashManager
import com.cncat.vpn.service.remote.ILogObserver
import com.cncat.vpn.service.remote.IProfileManager
import com.cncat.vpn.service.remote.wrap
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.gson.Gson
import com.google.gson.JsonArray
import com.google.gson.JsonObject
@ -41,14 +50,13 @@ import com.yingmao.clash.BuildConfig
import com.yingmao.clash.R
import com.yingmao.clash.app.MainApplication
import com.yingmao.clash.base.BaseActivity
import com.cncat.vpn.common.log.Log
import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.conf.Conf
import com.cncat.vpn.core.model.LogMessage
import com.yingmao.clash.entity.BannerImgBean
import com.yingmao.clash.entity.CheckLoginRsp
import com.yingmao.clash.fragment.NewAccFragment
import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE
import com.yingmao.clash.fragment.mine.MineFragment
import com.yingmao.clash.fragment.recharge.BackupRechargeActivity
import com.yingmao.clash.listener.DownLoadListener
import com.yingmao.clash.net.http.HttpApi
import com.yingmao.clash.net.http.HttpReqType
@ -58,35 +66,21 @@ import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
import com.yingmao.clash.net.http.entity.GetActivityRsp
import com.yingmao.clash.net.http.entity.HeartBeatRsp
import com.yingmao.clash.net.http.entity.PhDownloadUrlRsp
import com.yingmao.clash.net.http.entity.ShowNode
import com.yingmao.clash.net.http.entity.SubscriptionRsp
import com.yingmao.clash.net.http.entity.VipSignRsp
import com.yingmao.clash.remote.Remote
import com.cncat.vpn.service.ClashManager
import com.cncat.vpn.service.ProfileManager
import com.cncat.vpn.service.model.Profile
import com.cncat.vpn.service.remote.IClashManager
import com.cncat.vpn.service.remote.ILogObserver
import com.cncat.vpn.service.remote.IProfileManager
import com.cncat.vpn.service.remote.wrap
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.yingmao.clash.entity.BannerImgBean
import com.yingmao.clash.fragment.NewAccFragment.Companion.CHECK_NODE_REQUEST_CODE
import com.yingmao.clash.net.http.entity.ExpensesRecordRsp
import com.yingmao.clash.net.http.entity.ShowNode
import com.yingmao.clash.util.AESUtil
import com.yingmao.clash.util.CommonUtils
import com.yingmao.clash.util.Utils
import com.yingmao.clash.view.RxToast
import com.yingmao.clash.view.adapter.MainVPAdapter
import com.yingmao.clash.view.dialog.ActivityViewDialog
import com.yingmao.clash.view.dialog.ActivityViewDialog.OnDialogClickListener
import com.yingmao.clash.view.dialog.DialogAppVersion
import com.yingmao.clash.view.dialog.DialogBandChoose
import com.yingmao.clash.view.dialog.DialogNotice
import com.yingmao.clash.view.dialog.HomeActivityDialog
import com.yingmao.clash.view.dialog.RxDialogShapeLoading
import com.yingmao.clash.vm.MainAtyVM
import com.yingmao.clash.webview.BZYWebViewKeFu
import com.yingmao.clash.webview.BZYWebViewNormal
import com.yingmao.clash.webview.CustomerServiceWebView
import kotlinx.coroutines.Dispatchers
@ -133,10 +127,14 @@ class NewMainActivity : BaseActivity() {
private var u_timerTask: TimerTask? = null
private lateinit var clDeepSeek:ConstraintLayout
private lateinit var floating:FloatingActionButton
var payResultLoading: RxDialogShapeLoading? = null
private var timerJob: Job? = null
private var loadingTimeoutNum = 3
companion object {
//记录心跳失败次数
var HEART_BEAT_FAILURE_FREQUENCY = 0
const val REQUEST_CODE_PAY_WEB_VIEW_ACTIVITY = 1000
var isSubbed = false
var isSubed = false
var newUuid: String? = null
var subUrl: String? = null
@ -495,8 +493,6 @@ class NewMainActivity : BaseActivity() {
checkPayResultDia?.dismiss()
mainAtyVM.getAirNodes()
RxToast.info(resources.getString(R.string.SuccessfullyUpdatedUserInformation))
} else {
// RxToast.info(resources.getString(R.string.PaymentResultsStr))
}
@ -983,9 +979,6 @@ class NewMainActivity : BaseActivity() {
dialog.show()
}
var payResultLoading: RxDialogShapeLoading? = null
private var timerJob: Job? = null
private var loadingTimeoutNum = 3
private fun showLoadingDialog(msg: String) {
payResultLoading = RxDialogShapeLoading(this)
payResultLoading!!.setMessage(msg)
@ -1199,42 +1192,58 @@ class NewMainActivity : BaseActivity() {
startActivity(intent)
}
public suspend fun setSub2(url: String) {
Log.d("setSub2 2")
private suspend fun setSub2(url: String) {
profileBinder?.let { pm ->
Log.d("setSub2 3")
pm.queryAll().forEach { itemPro ->
Log.d("setSub2 itemPro ==>${itemPro}")
if (itemPro.name != Conf.getClashConfName(this@NewMainActivity.applicationContext)) {
Log.d("setSub2 delete ==>${itemPro.name}")
pm.delete(itemPro.uuid)
}
}
val pro = pm.queryActive()
Log.d("setSub2 4")
pro?.let {
var actname = it.name
Log.d("new main actname==>" + actname)
Log.d("setSub2 pro 已存在 ==>")
pm.setActive(it)
delay(500)
//判断配置文件source
if (!TextUtils.isEmpty(pro.source)) {
// Log.d("setSub2 pro.source==>${pro.source}, url==>${url}")
Log.d("setSub2 pro.source==>${pro.source}, url==>${url}")
//订阅链接不同就更换
if (pro.source != url) {
Log.d("setSub2 patch")
pm.patch(pro.uuid, pro.name, url, 1800000L)
pm.patch(
pro.uuid, pro.name,
url, 1800000L
)
pm.commit(pro.uuid) { status ->
Log.d("setSub2 updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress)
android.util.Log.d(
Conf.TAG,
"new updateStatus: " + Gson().toJson(status.args) + ", pro==>" + status.progress
)
}
}
}
pm.update(it.uuid)
newUuid = pro.uuid.toString();
isSubed = true
Log.d("setSub2 setActive end")
newUuid = pro.uuid.toString()
isSubbed = true
} ?: run {
createMyProfile(pm, url)
val uuid: UUID = pm.create(
Profile.Type.Url, Conf.getClashConfName(this@NewMainActivity.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()
isSubbed = true
}
}
}
}

View File

@ -54,11 +54,13 @@ import com.yingmao.clash.util.DataUtils
import com.yingmao.clash.util.DataUtils.getAllFilePath
import com.yingmao.clash.view.RxToast
import com.yingmao.clash.view.adapter.LanguageAdapter
import com.yingmao.clash.view.dialog.DialogDoMainChoose
import com.yingmao.clash.view.dialog.RxDialogShapeLoading
import com.yingmao.clash.view.popwindow.CommonPopupWindow
import com.yingmao.clash.vm.MainAtyVM
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
@ -83,9 +85,11 @@ class SettingActivity : BaseActivity() {
private lateinit var clyszc: ConstraintLayout
private lateinit var clApplicationModeTitleStr: ConstraintLayout
private lateinit var llControlApplication: ConstraintLayout
private lateinit var clSwitching:ConstraintLayout
private lateinit var TVApplicationModeTxt:TextView
private var popupWindow: CommonPopupWindow? = null
private var layoutGravity: CommonPopupWindow.LayoutGravity? = null
var dialogDoMainChoose: DialogDoMainChoose? = null
@RequiresApi(Build.VERSION_CODES.R)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -106,6 +110,13 @@ class SettingActivity : BaseActivity() {
clApplicationModeTitleStr=findViewById(R.id.clApplicationModeTitleStr)
llControlApplication=findViewById(R.id.llControlApplication)
TVApplicationModeTxt=findViewById(R.id.TVApplicationModeTxt)
clSwitching=findViewById(R.id.clSwitching)
clSwitching.setOnClickListener {
RxToast.info(getString(R.string.Switching))
showDomainList()
}
clApplicationModeTitleStr.setOnClickListener {
if (NewAccFragment.clashRunning) {
RxToast.info("请关闭加速后再选择.")
@ -731,4 +742,51 @@ class SettingActivity : BaseActivity() {
}
private fun showDomainList() {
try {
SplashHelper(mainAtyVM).getHostWithFallback { success ->
MainScope().launch {
if (success) {
if (dialogDoMainChoose == null) {
dialogDoMainChoose = DialogDoMainChoose(this@SettingActivity)
}
if (dialogDoMainChoose?.isShowing == false) {
dialogDoMainChoose?.setOnTryButtonListener(object :
DialogDoMainChoose.OnTryButtonListener {
override fun tryButton() {
RxToast.info(getString(R.string.ModificationFailed))
dialogDoMainChoose?.dismiss()
}
override fun cancel() {
dialogDoMainChoose?.dismiss()
}
})
dialogDoMainChoose?.setOnListItemListener(object :
DialogDoMainChoose.OnListItemListener {
override fun listItemClick() {
RxToast.info(getString(R.string.StorageSuccessful))
MainApplication.restartApp(this@SettingActivity,object:MainApplication.OnRestartButtonListener{
override fun enterButton() {
}
override fun cancelButton() {
dialogDoMainChoose?.dismiss()
}
})
}
})
dialogDoMainChoose?.show()
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@ -21,7 +21,7 @@ import java.util.ArrayList
open class PublicViewMode : BaseViewMode() {
fun getHost(callback: AsyncCallback) {
val rt =
NetService.instances.createFreeBaseUrl("https://pubtofile.oss-cn-hongkong.aliyuncs.com/app_host/")
NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/")
doAsyncNoNeedReturn(HttpReqType.GET_HOST) {
try { //TODO bug 会引起崩溃
val host = when {

View File

@ -152,7 +152,7 @@ open class NewAccFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dis
accelerateIv.setOnClickListener(this)
refreshExpireIv=view.findViewById(R.id.refresh_expire_iv)
tvDelayMs=view.findViewById(R.id.tvDelayMs)
refreshExpireIv.setOnClickListener {
tvEndTime.setOnClickListener {
updateUserInfo()
}
setExpireDate()

View File

@ -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)
// }
if (BuildConfig.DEBUG) {
builder.addInterceptor(loggingInterceptor)
}
// builder.addInterceptor(loggingInterceptor)
return builder.build()
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:pathData="M783.1,848.5c-79.8,64.7 -175.9,96.6 -271.7,96.6 -111,0 -221.6,-42.8 -305.9,-127.1 -147.3,-147.3 -168,-374.8 -54.8,-544.7l29.5,96.9c2.9,9.6 11.7,15.8 21.3,15.8 2.1,0 4.3,-0.3 6.5,-1 11.8,-3.6 18.4,-16 14.8,-27.8l-41.9,-137.3c-2.9,-9.6 -11.7,-15.6 -21.2,-15.7h-2.2c-3.8,0 -7.5,0.9 -10.8,2.8L15.8,246.9C4,250.4 -2.6,262.9 1,274.6c3.6,11.8 16,18.4 27.8,14.8l73.2,-22.3c-48.2,80.3 -71.8,173.6 -67.1,268.6C40.7,654.1 90.1,765.5 174,849.4c83.9,83.9 195.3,133.3 313.7,139.1 7.9,0.4 15.8,0.6 23.6,0.6 109.2,0 214.9,-37.2 299.8,-106.1 9.6,-7.7 11,-21.8 3.3,-31.3 -7.8,-9.5 -21.8,-11 -31.3,-3.2zM1023,749.4c-3.6,-11.8 -16,-18.4 -27.8,-14.8L922,756.9c48.2,-80.3 71.8,-173.6 67.1,-268.6 -5.8,-118.4 -55.2,-229.8 -139.1,-313.7C766.2,90.7 654.8,41.3 536.4,35.5 418.8,29.7 303.9,67.2 212.9,141c-9.6,7.7 -11,21.8 -3.3,31.3 7.7,9.6 21.8,11 31.3,3.3C413.2,35.9 661.5,49 818.6,206.1c147.3,147.3 168,374.8 54.8,544.6l-29.5,-96.8c-3.6,-11.8 -16,-18.4 -27.8,-14.8 -11.8,3.6 -18.4,16 -14.8,27.8l41.9,137.3c1.7,5.6 5.6,10.4 10.8,13.2 3.3,1.7 6.9,2.6 10.5,2.6 0.3,0 0.7,-0.1 1,-0.1 0.3,0 0.6,0.1 1,0.1 3.9,0 7.7,-1 11.1,-3l130.8,-39.9c11.6,-3.5 18.2,-16 14.6,-27.7z"
android:fillColor="#FF8A04"/>
</vector>

View File

@ -114,9 +114,8 @@
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="22dp"
android:layout_marginBottom="22dp"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
>
<TextView
@ -125,7 +124,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/LanguageStr"
android:text="@string/LanguageSwitchingStr"
android:textColor="#5A2B31"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
@ -153,7 +152,54 @@
app:layout_constraintEnd_toStartOf="@+id/aiLanguage"
app:layout_constraintTop_toTopOf="@+id/aiLanguage" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clSwitching"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/clLanguageSwitchingStr"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintBottom_toBottomOf="parent"
>
<TextView
android:id="@+id/tvSwitching"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/source_switch"
android:textColor="#5A2B31"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aiSwitching"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/oc_xy"
app:layout_constraintBottom_toBottomOf="@+id/tvSwitching"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/tvSwitching" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:text="@string/Consistentdevice"
android:textColor="#828282"
android:visibility="gone"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="@+id/aiSwitching"
app:layout_constraintEnd_toStartOf="@+id/aiSwitching"
app:layout_constraintTop_toTopOf="@+id/aiSwitching" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
@ -279,7 +325,7 @@
app:layout_constraintTop_toTopOf="parent"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="22dp"
android:layout_marginTop="10dp"
>
<TextView
@ -312,7 +358,7 @@
android:background="#E59E4D"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="16dp"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/clServiceTerms"
@ -327,8 +373,8 @@
app:layout_constraintTop_toBottomOf="@+id/LineView"
android:layout_marginStart="21dp"
android:layout_marginEnd="21dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintBottom_toBottomOf="parent"
>

View File

@ -55,14 +55,17 @@
android:layout_marginStart="10dp"
android:textColor="@color/orange_FF8A04"
android:textSize="16sp"
android:textStyle="bold" />
android:textStyle="bold"
android:drawableRight="@drawable/ic_refresh"
android:drawablePadding="5dp"
/>
<ImageView
android:layout_marginStart="5dp"
android:id="@+id/refresh_expire_iv"
android:layout_width="25dp"
android:layout_height="25dp"
android:visibility="visible"
android:visibility="gone"
android:src="@drawable/refresh2"
android:tint="@color/orange_FF8A04"
tools:ignore="UseAppTint"

View File

@ -395,4 +395,5 @@ Service Description\n
<string name="RecommendedRoutes">Recommended route</string>
<string name="timeOut">Route timeout</string>
<string name="deepSeekStr">AI Chat</string>
<string name="Switching">Switching, please wait</string>
</resources>

View File

@ -385,4 +385,5 @@
<string name="RecommendedRoutes">推薦線路</string>
<string name="timeOut">線路超時</string>
<string name="deepSeekStr">AI 聊天</string>
<string name="Switching">切換中,請稍後</string>
</resources>

View File

@ -383,4 +383,5 @@
<string name="RecommendedRoutes">推薦線路</string>
<string name="timeOut">線路超時</string>
<string name="deepSeekStr">AI 聊天</string>
<string name="Switching">切換中,請稍後</string>
</resources>

View File

@ -409,4 +409,5 @@
<string name="RecommendedRoutes">推荐线路</string>
<string name="timeOut">线路超时</string>
<string name="deepSeekStr">AI聊天</string>
<string name="Switching">切换中,请稍后</string>
</resources>