From 548216d93d7e805c8819871f9b2e161a1ba15bd0 Mon Sep 17 00:00:00 2001 From: level <1364007522@qq.com> Date: Mon, 15 Dec 2025 17:41:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E9=94=AE=E8=BF=9E=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E9=80=80=E5=87=BA=E8=B4=A6=E5=8F=B7=E6=9C=AA=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E7=94=A8=E6=88=B7=E6=8F=90=E7=A4=BA=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/MainActivity.kt | 2 +- .../yingmao/clash/act/NodeGroupActivity.kt | 123 ------------------ .../com/yingmao/clash/act/RegisterActivity.kt | 40 ++++++ .../com/yingmao/clash/act/SettingActivity.kt | 47 ++++++- app/src/main/res/drawable/exit_check_bg.xml | 24 ++++ app/src/main/res/layout/user_bing_exit.xml | 68 ++++++++++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 179 insertions(+), 126 deletions(-) create mode 100644 app/src/main/res/drawable/exit_check_bg.xml create mode 100644 app/src/main/res/layout/user_bing_exit.xml diff --git a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt index e9a87c0..8266349 100644 --- a/app/src/main/java/com/yingmao/clash/act/MainActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/MainActivity.kt @@ -377,7 +377,7 @@ class MainActivity : BaseActivity() { mmkv.decodeLong(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD, 0) val nowExpireTime = checkLoginRsp.data!!.vpnExpireTime - if (nowExpireTime > oldExpireTime) { + if (nowExpireTime!=oldExpireTime) { val expired = checkLoginRsp.data.expired mmkv.encode(BZYConstants.MMKV_KEY_VPN_EXPIRED, expired ?: true) mmkv.encode(BZYConstants.MMKV_KEY_VPN_VALID_PERIOD, nowExpireTime) diff --git a/app/src/main/java/com/yingmao/clash/act/NodeGroupActivity.kt b/app/src/main/java/com/yingmao/clash/act/NodeGroupActivity.kt index 5132cc2..77b90bd 100644 --- a/app/src/main/java/com/yingmao/clash/act/NodeGroupActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/NodeGroupActivity.kt @@ -448,127 +448,4 @@ class NodeGroupActivity : BaseActivity(){ intent.setPackage(this.packageName) ) } - - private fun checkGlo() { - val isGlobal = isGlo - val isGlobal2 = MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false) - Log.i("checkGlo isGlobal==>${isGlobal}, isGlobal2==>${isGlobal2}") - val px: ProxyMode = if (isGlobal2) { - ProxyMode.GLOBAL - } else { - ProxyMode.PAC - } - setBackground(px) - - launch(Dispatchers.IO) { - if (isGlobal) { - if (clashRunning) { - getNodes() - } - } else { - if (clashRunning) { - delay(1000) - clashBinder?.let { cm -> - val names = cm.queryProxyGroupNames(false) - Log.i("checkGlo names==>${names}") - if (names.isNotEmpty()) { - val selectedName = - MMKV.defaultMMKV() - .decodeString(BZYConstants.NODE_SELECTED_NAME_KEY, ""); - Log.i("selected_name ==>${selectedName}") - if (!TextUtils.isEmpty(selectedName)) { - val o = cm.queryOverride(Clash.OverrideSlot.Session) - o.mode = TunnelState.Mode.Rule - cm.patchOverride(Clash.OverrideSlot.Session, o) - delay(500) - var gName = names[0] - //全局模式下 names[0]会自动添加一个 "GLOBAL" 组 - if (names.size >= 2) { - if ("GLOBAL" == gName) { - //names[0] 为 "GLOBAL" //names[1]才是规则模式下的组名,所以需要手动赋值 - gName = names[1] - } - } - cm.patchSelector(gName, selectedName!!) - - } - } - } - } - } - } - } - private suspend fun getNodes() { - coroutineScope { - val selectedName = - MMKV.defaultMMKV().decodeString(BZYConstants.NODE_SELECTED_NAME_KEY, "") - Log.d("getNodes selected_name==>${selectedName}") - if (TextUtils.isEmpty(selectedName)) { - subUrl?.let { - val json = serStore.nodes - Log.d("getNodes json==>${json}") - currentNode=getNodesInfo(json) - Log.d("getNodes currentNode==>${currentNode} dataname:${currentNode[0].proxies[0]}") - val baseNodeName=currentNode[0].proxies[0] - - if (!TextUtils.isEmpty(baseNodeName)) { - GlobalScope.launch(Dispatchers.IO) { - clashBinder?.let { cm -> - - val o = cm.queryOverride(Clash.OverrideSlot.Session) - o.mode = TunnelState.Mode.Global - cm.patchOverride(Clash.OverrideSlot.Session, o) - delay(3000) - //等待全局模式生效 - var maxIndex = 0 - while (true) { - if (maxIndex > 3) { - break - } - val names = cm.queryProxyGroupNames(false) - if (names.isNotEmpty()) { - if (names[0] == "GLOBAL") { - Log.d("repeat end") - break - } - } - Log.d("repeat agent") - maxIndex++ - delay(1000) - } - - cm.patchSelector("GLOBAL", baseNodeName) - } - } - } - } - } else { - clashBinder?.let { cm -> - val o = cm.queryOverride(Clash.OverrideSlot.Session) - o.mode = TunnelState.Mode.Global - cm.patchOverride(Clash.OverrideSlot.Session, o) - delay(3000) - //等待全局 - var maxIndex = 0 - while (true) { - if (maxIndex > 3) { - break - } - val names = cm.queryProxyGroupNames(false) - if (names.isNotEmpty()) { - if (names[0] == "GLOBAL") { - Log.d("repeat end") - break - } - } - Log.d("repeat agent") - maxIndex++ - delay(1000) - } - - cm.patchSelector("GLOBAL", selectedName!!) - } - } - } - } } diff --git a/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt b/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt index 8028481..bb2cd8f 100644 --- a/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt @@ -5,15 +5,19 @@ import android.content.Intent import android.os.Bundle import android.os.CountDownTimer import android.text.method.HideReturnsTransformationMethod +import android.util.Log import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager +import android.webkit.WebView import android.widget.* import androidx.appcompat.widget.AppCompatImageView import androidx.lifecycle.ViewModelProvider import com.cncat.vpn.service.ClashManager import com.cncat.vpn.service.remote.IClashManager import com.cncat.vpn.service.remote.wrap +import com.github.gzuliyujiang.oaid.DeviceID +import com.github.gzuliyujiang.oaid.DeviceIdentifier import com.google.gson.JsonObject import com.yingmao.clash.view.dialog.RxDialogShapeLoading @@ -22,6 +26,7 @@ import com.tencent.mmkv.MMKV import com.yingmao.clash.BuildConfig import com.yingmao.clash.R import com.yingmao.clash.app.MainApplication +import com.yingmao.clash.app.MainApplication.Companion.OAID import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.net.http.HttpReqType @@ -177,7 +182,38 @@ class RegisterActivity : BaseActivity(), View.OnClickListener { override fun onClick(v: View?) { when (v?.id) { R.id.tv_register -> { + var userAgent = System.getProperty("http.agent") + Log.i("SplashRegister", "userAgent::$userAgent") + if (userAgent != null) { + if (userAgent.isEmpty() || userAgent.length < 5) { + val webView = WebView(this@RegisterActivity) + userAgent = webView.settings.userAgentString + } + } else { + val webView = WebView(this@RegisterActivity) + userAgent = webView.settings.userAgentString + } + var oaId = OAID + Log.i( + "SplashRegister", + "OAID::" + OAID + "oaId.isEmpty()::" + oaId.isEmpty() + "userAgent::" + userAgent + ) + val equipmentModel = Utils.getEquipmentModel() + Log.i("equipmentModel", "equipmentModel::" + equipmentModel) + if (oaId.isEmpty()) { + if (DeviceID.supportedOAID(MainApplication.getApp())) { + //同步获取oaid + val aOaId = DeviceIdentifier.getOAID(MainApplication.getApp()) + oaId = aOaId + OAID = aOaId + Log.i( + "doRegisterByEncryption", + "aOaId::" + aOaId + "oaId::" + oaId + "OAID::" + OAID + ) + } + + } val smsCode =etSmSCode.text.trim().toString() if(smsCode.isEmpty()){ RxToast.error("验证码不能为空") @@ -192,6 +228,10 @@ class RegisterActivity : BaseActivity(), View.OnClickListener { reqJson.addProperty("from", "5") reqJson.addProperty("androidDevice", Utils.getUniqueID(this)) reqJson.addProperty("smsCode", smsCode) + reqJson.addProperty("userAgent", userAgent) + reqJson.addProperty("oaid", oaId) + reqJson.addProperty("equipmentModel", equipmentModel) + reqJson.addProperty("pkg", BuildConfig.applicationId) if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) { val data = AESUtil.byteArrayToHexStr( AESUtil.RegisterEncrypt(reqJson.toString(), registerKey, registerIV2) diff --git a/app/src/main/java/com/yingmao/clash/act/SettingActivity.kt b/app/src/main/java/com/yingmao/clash/act/SettingActivity.kt index 2e18547..b65638f 100644 --- a/app/src/main/java/com/yingmao/clash/act/SettingActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SettingActivity.kt @@ -15,6 +15,9 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.customview.customView +import com.afollestad.materialdialogs.customview.getCustomView import com.alibaba.sdk.android.oss.ClientException import com.alibaba.sdk.android.oss.OSSClient import com.alibaba.sdk.android.oss.ServiceException @@ -49,9 +52,11 @@ import com.yingmao.clash.net.http.entity.UploadParamData import com.yingmao.clash.util.CommonUtils import com.yingmao.clash.util.DataUtils import com.yingmao.clash.util.DataUtils.getAllFilePath +import com.yingmao.clash.util.Utils import com.yingmao.clash.util.stopClashService import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.adapter.LanguageAdapter +import com.yingmao.clash.view.dialog.DialogBandChoose import com.yingmao.clash.view.dialog.DialogDoMainChoose import com.yingmao.clash.view.dialog.DialogSureCancelLogOut import com.yingmao.clash.view.popwindow.CommonPopupWindow @@ -126,10 +131,48 @@ class SettingActivity : BaseActivity() { }) } tvExit.setOnClickListener { - cleanUserInfo() + val userAccount = + MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")!! + if (Utils.isEmail(userAccount) || Utils.isPhoneNumber(userAccount)) { + cleanUserInfo() + }else{ + MaterialDialog(this@SettingActivity).show { + this.cancelable(true) + cornerRadius(res = R.dimen.dp_10) + customView( + R.layout.user_bing_exit, + scrollable = false, + noVerticalPadding = true, + horizontalPadding = false + ) + getCustomView().findViewById(R.id.tvExitBt) + .setOnClickListener { + cleanUserInfo() + dismiss() + } + + getCustomView().findViewById(R.id.tvBindingBt) + .setOnClickListener { + showBingDialogChoose() + dismiss() + } + + } + } } } - + private fun showBingDialogChoose() { + val dialog = DialogBandChoose(this) + dialog.setOnBandClickListener(object : DialogBandChoose.OnBandClickListener { + override fun onBandClick(isPhone: Boolean) { + val intent = Intent(CommonUtils.getApp(), BandPhoneActivity::class.java) + intent.putExtra("isPhone", isPhone) + startActivity(intent) + dialog.dismiss() + } + }) + dialog.show() + } override fun httpLoading(httpStatus: HttpStatus.Loading) { super.httpLoading(httpStatus) diff --git a/app/src/main/res/drawable/exit_check_bg.xml b/app/src/main/res/drawable/exit_check_bg.xml new file mode 100644 index 0000000..fcea726 --- /dev/null +++ b/app/src/main/res/drawable/exit_check_bg.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/user_bing_exit.xml b/app/src/main/res/layout/user_bing_exit.xml new file mode 100644 index 0000000..54b28a3 --- /dev/null +++ b/app/src/main/res/layout/user_bing_exit.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5291ff6..7204d09 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -483,4 +483,5 @@ 全局模式加速下暂不支持切换节点,请切换至智能模式! 获取节点中,请稍后点击加速 获取节点信息出错,请手动点击 [源切换] 或联系客服处理! + 当前账号尚未绑定,直接退出可能会造成账号丢失,推荐前往绑定账号或保存临时账号后在进行退出 \ No newline at end of file