From 0b6a9433c70f1d743b63ecaa0e0a6172d41b7d52 Mon Sep 17 00:00:00 2001 From: cyh Date: Tue, 13 May 2025 15:58:41 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E5=92=8C=E9=9A=90=E7=A7=81=E6=94=BF=E7=AD=96=E5=BC=B9?= =?UTF-8?q?=E7=AA=97(=E5=A4=AA=E5=AD=90=E6=8C=87=E5=AE=9A=E6=B8=A0?= =?UTF-8?q?=E9=81=93)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 +- .../clash/act/AgreementAndPrivacyActivity.kt | 42 ++- .../com/yingmao/clash/act/RegisterActivity.kt | 7 +- .../com/yingmao/clash/act/SplashActivity.kt | 258 +++++++++++++----- .../com/yingmao/clash/app/MainApplication.kt | 72 ++--- .../com/yingmao/clash/conf/BZYConstants.kt | 2 + .../clash/fragment/home/HomeFragment.kt | 4 +- .../clash/fragment/setting/SettingFragment.kt | 5 + .../com/yingmao/clash/net/http/NetService.kt | 1 + .../main/java/com/yingmao/clash/util/Utils.kt | 25 -- .../dialog/DialogAgreementPrivacyChoose.kt | 187 +++++++++++++ .../dialog_agreement_privacy_choose.xml | 92 +++++++ .../res/layout/layout_splash_activity.xml | 19 ++ app/src/main/res/values-en/strings.xml | 2 + app/src/main/res/values-zh-rHK/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values/strings.xml | 3 + 17 files changed, 578 insertions(+), 148 deletions(-) create mode 100644 app/src/main/java/com/yingmao/clash/view/dialog/DialogAgreementPrivacyChoose.kt create mode 100644 app/src/main/res/layout/dialog_agreement_privacy_choose.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc576d9..83af42f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ - + = android.os.Build.VERSION_CODES.LOLLIPOP) { settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW } - webView.webViewClient = object : WebViewClient() { - override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { - Logger.d("访问的url地址:$url") - return true - } - } +// webView.webViewClient = object : WebViewClient() { +// override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { +// Logger.d("访问的url地址:$url") +// return true +// } +// } webView.webChromeClient = object : WebChromeClient() { override fun onProgressChanged(view: WebView?, newProgress: Int) { } } + // 处理所有点击跳转 + webView.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + + val url = request.url.toString() + com.cncat.vpn.common.log.Log.d("shouldOverrideUrlLoading url ==>${url}") + // 可选:跳转外部浏览器 + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + view.context.startActivity(intent) + return true // 表示拦截并自处理 + } + } } fun loadAgreeHtml(){ if (BuildConfig.is_ym){ webView.loadUrl("file:android_asset/agreement.html") }else if (BuildConfig.is_tz){ - webView.loadUrl("file:android_asset/agreement_taizi_hk.html") + webView.loadUrl("https://www.taiziapp.com/agreement.html") } else{ webView.loadUrl("file:android_asset/agreement_bzy.html") @@ -75,7 +91,7 @@ class AgreementAndPrivacyActivity : BaseActivity() { if (BuildConfig.is_ym){ webView.loadUrl("file:android_asset/privacy.html") } else if (BuildConfig.is_tz){ - webView.loadUrl("file:android_asset/privacy_hk.html") + webView.loadUrl("https://www.taiziapp.com/privacy.html") } else{ webView.loadUrl("file:android_asset/privacy_bzy.html") @@ -95,7 +111,7 @@ class AgreementAndPrivacyActivity : BaseActivity() { if (language.equals("en")) { webView.loadUrl("file:android_asset/agreement_en.html") } else if (language.equals("zh") && country.equals("HK")) { - webView.loadUrl("file:android_asset/agreement_hk.html") + loadAgreeHtml() } else { loadAgreeHtml() } @@ -106,7 +122,7 @@ class AgreementAndPrivacyActivity : BaseActivity() { } "Chinese-HK" -> { - webView.loadUrl("file:android_asset/agreement_hk.html") + loadAgreeHtml() } "English" -> { @@ -125,7 +141,7 @@ class AgreementAndPrivacyActivity : BaseActivity() { if (language.equals("en")) { webView.loadUrl("file:android_asset/privacy_en.html") } else if (language.equals("zh") && country.equals("HK")) { - webView.loadUrl("file:android_asset/privacy_hk.html") + loadPriHtml() } else { loadPriHtml() } @@ -136,7 +152,7 @@ class AgreementAndPrivacyActivity : BaseActivity() { } "Chinese-HK" -> { - webView.loadUrl("file:android_asset/privacy_hk.html") + loadPriHtml() } "English" -> { 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 a0625aa..8331647 100644 --- a/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/RegisterActivity.kt @@ -23,7 +23,6 @@ import com.yingmao.clash.net.http.HttpStatus import com.yingmao.clash.net.http.entity.RegisterRsp import com.yingmao.clash.util.AESUtil import com.yingmao.clash.util.CommonUtils -import com.yingmao.clash.util.Utils import com.yingmao.clash.view.PasswordTransformationMethodBigDot import com.yingmao.clash.view.RxToast import com.yingmao.clash.view.SlidingVerification @@ -146,7 +145,7 @@ class RegisterActivity : BaseActivity(), View.OnClickListener { req_json.addProperty("password", password) req_json.addProperty("checkPassword", password) req_json.addProperty("invitationCode", BuildConfig.productId) - req_json.addProperty("clientIp", Utils.getIPAddress()) + req_json.addProperty("clientIp", "127.0.0.1") req_json.addProperty("from", "5") var data = AESUtil.byteArrayToHexStr( AESUtil.encrypt(req_json.toString()) @@ -187,14 +186,14 @@ class RegisterActivity : BaseActivity(), View.OnClickListener { Log.d("it.progress==>${it.progress}") if (it.progress >= it.max) { it.isEnabled = false - verificationSv.progress=it.max + verificationSv.progress = it.max verificationTipTv.text = getString(R.string.verification_success) verificationTipTv.setTextColor(R.color.black) verificationSv.setProgressDrawableTiled(getDrawable(R.drawable.login_btn_bg_selector)) if (!checkInput()) { - }else { + } else { } } else it.progress = 0 diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt index 0143ca1..dc5da34 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -2,6 +2,7 @@ package com.yingmao.clash.act import android.Manifest import android.annotation.SuppressLint +import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap @@ -10,10 +11,17 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings +import android.text.SpannableString +import android.text.TextPaint import android.text.TextUtils +import android.text.style.ClickableSpan import android.util.Log import android.view.View import android.view.WindowManager +import android.webkit.JavascriptInterface +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient import android.widget.ProgressBar import android.widget.RelativeLayout import android.widget.TextView @@ -56,6 +64,7 @@ import com.yingmao.clash.net.http.entity.StartingBeans import com.yingmao.clash.util.AESUtil import com.yingmao.clash.util.Utils import com.yingmao.clash.view.RxToast +import com.yingmao.clash.view.dialog.DialogAgreementPrivacyChoose import com.yingmao.clash.view.dialog.DialogAppVersion import com.yingmao.clash.view.dialog.DialogDoMainChoose import com.yingmao.clash.view.dialog.RxDialogSureCancel @@ -73,14 +82,21 @@ class SplashActivity : BaseActivity() { private val mPermissions = hashSetOf() private val PERMISSION_REQUEST_CODE: Int = 1 private val PERMISSION_SETTING_REQUEST_CODE = 2 + private val Captcha_REQUEST_CODE = 3333 private lateinit var rlPb: View private lateinit var ll_action: View - private lateinit var username: String - private lateinit var rlMain: RelativeLayout + + private lateinit var rlMain: RelativeLayout private lateinit var splashAtyVM: SplashAtyVM - private var registerKey = "" - private var registerIV2 = "" + + companion object { + public var registerKey = "" + public var registerIV2 = "" + public lateinit var username: String + } + + private var captchaInfo = "" private var initErrMsg = "" override fun onCreate(savedInstanceState: Bundle?) { @@ -89,13 +105,13 @@ class SplashActivity : BaseActivity() { setLocalLanguage() initErrMsg = resources.getString(R.string.splashErrorTips) - username = Utils.getUniqueID(this) + // var username2 = Utils.getUniqueID2(this); // com.cncat.vpn.common.log.Log.d("username==>" + username + ", username2==>" + username2) splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java) observe(this, splashAtyVM) setContentView(R.layout.layout_splash_activity) - rlMain=findViewById(R.id.rlMain) + rlMain = findViewById(R.id.rlMain) rlPb = findViewById(R.id.rl_pb) ll_action = findViewById(R.id.ll_action) @@ -107,8 +123,14 @@ class SplashActivity : BaseActivity() { serStore.isBZY = true } } + if (BuildConfig.productId=="182268"){ - + }else{ + //隐私政策先授权后获取 + username = Utils.getUniqueID(this) + MainApplication.initUtil() + } + initWebView() // mPermissions.add(Manifest.permission.READ_PHONE_STATE) // mPermissions.add(Manifest.permission.INTERNET) // mPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE) @@ -179,8 +201,7 @@ class SplashActivity : BaseActivity() { // "ym encrypt:" + // AESUtil.byteArrayToHexStr( // AESUtil.encrypt( -// "https://api.yingmaohot.org+https://api.yingmao888.net+" + -// "https://api.ymsohot.com+https://ma.wztgyh.com+https://ymapi.yingmaox.cc" +// "" // ) // ) // ) @@ -202,55 +223,14 @@ class SplashActivity : BaseActivity() { } } } -// splashAtyVM.getHostByGithub(object : AsyncCallback { -// override suspend fun suc() { -// Log.e("data", "getHostByGithub suc") -// MainScope().launch { -// isNeedRegister() -// } -// } -// -// override fun err() { -// Log.e("data", "getHostByGithub err") -// splashAtyVM.getHostByAWS(object : AsyncCallback { -// override suspend fun suc() { -// Log.e("data", "getHostByAWS suc") -// MainScope().launch { -// isNeedRegister() -// } -// } -// -// override fun err() { -// Log.e("data", "getHostByAWS err") -// splashAtyVM.getHost(object : AsyncCallback { -// override suspend fun suc() { -// Log.e("data", "getHost suc") -// MainScope().launch { -// isNeedRegister() -// } -// } -// -// override fun err() { -// Log.e("data", "getHost err") -// //全部失败后也调用 -// MainScope().launch { -// isNeedRegister() -// } -// } -// }) -// } -// }) -// } -// }) + } } } } -// val Sgtr= AESUtil.Registerdecrypt("CCBF308D702235C8F810876987A43AB02B84EBB47DBFF1B915D5FBB29FF2DBAE90DB72D58351D09D223D49E44A2A073D9156E84D6B7EB89D7493A3F0A7240EE076ADC83B5A12AC37616CEDED00643AD1E6851AFECA82E373CB4E518DF2190708F5191AE195758E8EA41A5242A6C94216B64FF8715B35C54CB894113FC93361F32FDA86CF34093DF924230DEBE27A69293C761A9A797A652A1C35C95C27FB5EB4" -// ,registerKey,registerIV2) +// val Sgtr= AESUtil.decrypt("73CC9D719D4B46616F7FB72DBFABFA88B716D1AF0F8B8A42929F9EE5D198EB059A7934DD0074D1810CD56B5312FD5FDACC25EED6C6B2351DB11A3BF78E3010A417CDE40EEFF768849AEF25773AF541C01464DB7C9B0B7C30D36EEA414EA86F9923AAF325C15BB75170C148C4F257AA2D6A32BFB582D498B13B38E49BB8DF1663") // println("Sgtr==>$Sgtr") - // OpenInstall.getWakeUp(intent, wakeUpAdapter) // OpenInstall.getInstall { appData, error -> // var appData = appData @@ -281,6 +261,104 @@ class SplashActivity : BaseActivity() { // 此处要调用,否则App在后台运行时,会无法获取 // OpenInstall.getWakeUp(intent, wakeUpAdapter) } + + private lateinit var webView: WebView + private lateinit var pb_web: ProgressBar + var dialogAgreementPrivacyChoose: DialogAgreementPrivacyChoose? = null + private fun initAgreementPrivacy(){ + if (BuildConfig.is_tz && BuildConfig.productId == "182268") { + if (dialogAgreementPrivacyChoose == null) { + dialogAgreementPrivacyChoose = DialogAgreementPrivacyChoose(this@SplashActivity) + } + if (dialogAgreementPrivacyChoose?.isShowing == false) { + dialogAgreementPrivacyChoose?.setOnTryButtonListener(object : + DialogAgreementPrivacyChoose.OnTryButtonListener { + override fun agree() { + username = Utils.getUniqueID(this@SplashActivity) + MainApplication.initUtil() + dialogAgreementPrivacyChoose?.dismiss() + } + + override fun cancel() { + dialogAgreementPrivacyChoose?.dismiss() + finish() + } + }) + dialogAgreementPrivacyChoose?.show() + } + } + } + private fun initWebView() { + + webView = findViewById(R.id.webView) + pb_web = findViewById(R.id.pb_web) + + if (!BuildConfig.is_ym) { + + rlPb.visibility = View.INVISIBLE + } else { + webView.visibility = View.GONE + } + } + + @SuppressLint("JavascriptInterface") + private fun setWebView() { + initAgreementPrivacy() + // WebView设置 + val webSettings = webView.settings + // 可选,设置开启Chrome调试 + WebView.setWebContentsDebuggingEnabled(true) + // 设置屏幕自适应 + webSettings.useWideViewPort = true + webSettings.loadWithOverviewMode = true + // 建议禁止缓存加载,以确保在攻击发生时可快速获取最新的阿里云验证码2.0进行对抗 + webSettings.cacheMode = WebSettings.LOAD_NO_CACHE + // 设置WebView组件支持加载JavaScript + webSettings.javaScriptEnabled = true + webSettings.domStorageEnabled = true + + + // 设置不使用默认浏览器,而直接使用WebView组件加载页面 + webView.webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + view.loadUrl(url) + return true + } + } + webView.addJavascriptInterface(CaptchaJsInterface(), "CaptchaJsInterface") +// testWebview.addJavascriptInterface(new testJsInterface(), "testInterface"); + // 加载业务页面 + webView.loadUrl("file:///android_asset/captcha.html") +// webView.loadUrl("https://api.yingmaovpnpro.win:18002/78zccgy0nsgknh9n4/captcha.html") + } + + inner class CaptchaJsInterface() { + + @JavascriptInterface + public fun getVerifyResult(verifyResult: String): Boolean { + com.cncat.vpn.common.log.Log.d("verifyResult==>${verifyResult}") + captchaInfo = verifyResult + + launch { + webView.setOnTouchListener { _, _ -> true } + pb_web.visibility = View.VISIBLE + } + + + + doRegisterByEncryption() + return true + } + } + + private class CaptchaJsSuccessInterface { + @JavascriptInterface + public fun result(verifyResult: String) { +// Log.d("verifyResult==>${verifyResult}") + + } + } + private fun setLocalLanguage() { var defLan = "" if (BuildConfig.is_tz) { @@ -386,7 +464,14 @@ class SplashActivity : BaseActivity() { splashAtyVM.checkLogin() } else { // doRegister() - doRegisterByEncryption() + if (!BuildConfig.is_ym) { + rlPb.visibility = View.INVISIBLE + webView.visibility = View.VISIBLE + setWebView() + } else { + webView.visibility = View.GONE + doRegisterByEncryption() + } } } else {//非渠道自由包 val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN) @@ -424,7 +509,7 @@ class SplashActivity : BaseActivity() { "password" to BZYConstants.defaultPassword, "checkPassword" to BZYConstants.defaultPassword, "id" to BuildConfig.productId, - "clientIp" to Utils.getIPAddress(), + "clientIp" to "127.0.0.1", "from" to "5", ) splashAtyVM.register(params) @@ -432,14 +517,16 @@ class SplashActivity : BaseActivity() { @Synchronized fun doRegisterByEncryption() { - var req_json = JsonObject() req_json.addProperty("password", BZYConstants.defaultPassword) req_json.addProperty("checkPassword", BZYConstants.defaultPassword) req_json.addProperty("invitationCode", BuildConfig.productId) - req_json.addProperty("clientIp", Utils.getIPAddress()) + req_json.addProperty("clientIp", "127.0.0.1") req_json.addProperty("from", "5") req_json.addProperty("androidDevice", username) + if (captchaInfo.isNotEmpty()) { + req_json.addProperty("captchaVerifyParam", captchaInfo) + } if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) { val data = AESUtil.byteArrayToHexStr( AESUtil.RegisterEncrypt(req_json.toString(), registerKey, registerIV2) @@ -543,6 +630,7 @@ class SplashActivity : BaseActivity() { // // } + @SuppressLint("ClickableViewAccessibility") override fun httpSuccess(httpStatus: HttpStatus.Success) { when (httpStatus.reqType) { HttpReqType.REGISTER -> { @@ -602,6 +690,12 @@ class SplashActivity : BaseActivity() { startActivity(intent) finish() // graphicVerificationDialog() + } else if (code == "403") { + pb_web.visibility = View.INVISIBLE + message?.let { + RxToast.error(it) + } + webView.setOnTouchListener { _, _ -> false } } else { MaterialDialog(this@SplashActivity).show { message(text = initErrMsg) @@ -676,19 +770,23 @@ class SplashActivity : BaseActivity() { } } } - HttpReqType.SplashBg->{ + + HttpReqType.SplashBg -> { val startingBeans = httpStatus.rsp as StartingBeans startingBeans.data - if(startingBeans.data!=null){ - if(startingBeans.data!!.exist){ - Log.d("SplashActivityStarting","startingBeans.data!!.img::"+ startingBeans.data!!.img) + if (startingBeans.data != null) { + if (startingBeans.data!!.exist) { + Log.d( + "SplashActivityStarting", + "startingBeans.data!!.img::" + startingBeans.data!!.img + ) startingBeans.data!!.img.let { Glide.with(this).asBitmap() .load(startingBeans.data!!.img) - .into(object :SimpleTarget(){ + .into(object : SimpleTarget() { override fun onResourceReady( resource: Bitmap, - transition: Transition? + transition: Transition?, ) { val bitmapDrawable = BitmapDrawable(resource) rlMain.setBackgroundDrawable(bitmapDrawable) @@ -701,7 +799,8 @@ class SplashActivity : BaseActivity() { } } - HttpReqType.App_VERION_CHECK->{ + + HttpReqType.App_VERION_CHECK -> { (httpStatus.rsp as AppVersionCheckRsp).let { avcr -> com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr") if (avcr.code == 200) { @@ -714,13 +813,13 @@ class SplashActivity : BaseActivity() { if (!TextUtils.isEmpty(md.versionPath)) { showUpdateDialog(md.versionPath!!, md.illustrate!!, false) } - }else{ + } else { val intent = Intent(this@SplashActivity, UIMainActivity::class.java) startActivity(intent) finish() } } - }else{ + } else { val intent = Intent(this@SplashActivity, UIMainActivity::class.java) startActivity(intent) finish() @@ -737,14 +836,14 @@ class SplashActivity : BaseActivity() { when (httpStatus.reqType) { HttpReqType.REGISTER -> { rlPb.visibility = View.GONE - + pb_web.visibility = View.INVISIBLE com.cncat.vpn.common.log.Log.d("httpFailure HttpReqType.REGISTER") try { RxToast.error("检测到网络异常,请尝试切换其他地址.") - if (dialogDoMainChoose==null) { + if (dialogDoMainChoose == null) { dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity) } - if (dialogDoMainChoose?.isShowing==false){ + if (dialogDoMainChoose?.isShowing == false) { dialogDoMainChoose?.setOnTryButtonListener(object : DialogDoMainChoose.OnTryButtonListener { override fun tryButton() { @@ -757,7 +856,7 @@ class SplashActivity : BaseActivity() { override fun cancel() { com.cncat.vpn.common.log.Log.d("tryButton REGISTER cancel") dialogDoMainChoose?.dismiss() - dialogDoMainChoose=null + dialogDoMainChoose = null } }) dialogDoMainChoose?.setOnListItemListener(object : @@ -817,15 +916,18 @@ class SplashActivity : BaseActivity() { SplashHelper(splashAtyVM).getHostWithFallback { success -> MainScope().launch { if (success) { - if (dialogDoMainChoose==null) { + if (dialogDoMainChoose == null) { dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity) } - if (dialogDoMainChoose?.isShowing==false){ + if (dialogDoMainChoose?.isShowing == false) { dialogDoMainChoose?.setOnTryButtonListener(object : DialogDoMainChoose.OnTryButtonListener { override fun tryButton() { var currentHost = MMKV.defaultMMKV() - .decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, "") + .decodeString( + BZYConstants.MMKV_KEY_CURRENT_HOST, + "" + ) // com.cncat.vpn.common.log.Log.d("tryButton CHECK_LOGIN currentHost==>${currentHost}") splashAtyVM.checkLogin() } @@ -974,13 +1076,23 @@ class SplashActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.M) override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) + com.cncat.vpn.common.log.Log.d("onActivityResult requestCode==>${requestCode}") if (requestCode == PERMISSION_SETTING_REQUEST_CODE) { if (checkPermissions(mPermissions)) { isNeedRegister() //TODO } else { requestPermissions(deniedPermissions.toTypedArray(), PERMISSION_REQUEST_CODE) } + } else if (requestCode == Captcha_REQUEST_CODE) { + + + captchaInfo = + data?.extras?.getString(BZYConstants.REQUEST_CODE_Captcha_Result_Key).toString() + com.cncat.vpn.common.log.Log.d("onActivityResult captchaInfo==>${captchaInfo}") + doRegisterByEncryption() + } + } private fun toMainPage() { @@ -1002,6 +1114,7 @@ class SplashActivity : BaseActivity() { config.locale = locale resources.updateConfiguration(config, metrics) } + private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) { if (TextUtils.isEmpty(url)) { RxToast.error(resources.getString(R.string.downloadEmpty)) @@ -1061,6 +1174,7 @@ class SplashActivity : BaseActivity() { }) dialog.show() } + fun installApk(filePath: String) { val file = File(filePath) val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { diff --git a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt index 05b2c25..cc8a2a2 100644 --- a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt +++ b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt @@ -64,7 +64,7 @@ class MainApplication : Application() { userBean = bean } - fun restartApp(activity: Activity,listener:OnRestartButtonListener) { + fun restartApp(activity: Activity, listener: OnRestartButtonListener) { var dialogDoMainChoose = DialogSureRestartChoose(activity) if (!dialogDoMainChoose.isShowing) { @@ -91,11 +91,49 @@ class MainApplication : Application() { } + fun initUtil() { + getApp()?.let { mainApplication -> + + + /* + * 错误日志上传捕获 + * */ + val crashCatchHandler: CrashCatchHandler = CrashCatchHandler.getInstance() //获得单例 + crashCatchHandler.init(mainApplication) //初始化,传入context + + if (DeviceID.supportedOAID(mainApplication)) { + // 获取OAID/AAID,异步回调 + DeviceID.getOAID(mainApplication, object : IGetter { + override fun onOAIDGetComplete(result: String) { + // 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一 + Log.d("onOAIDGetComplete ${result}") + OAID = result + } + + override fun onOAIDGetError(error: Exception) { + // 获取OAID/AAID失败 + error.printStackTrace() + } + }) + } + //openinstall +// OpenInstall.init(applicationContext); + PaymentConfiguration.init( + mainApplication, + "pk_live_51Nkl6vLWP3xWXY4LfXtdMtXzHazv6pav2rH1p1BfICeh5meGGjglExiw4GgmSzWO7NptEM1c549Fe11zRy9nCfxs009zEwLpXP" + ) +// OpenInstall.preInit(applicationContext) +// OpenInstall.init(applicationContext) + } + } + } - interface OnRestartButtonListener{ + + interface OnRestartButtonListener { fun enterButton() fun cancelButton() } + override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) } @@ -121,37 +159,7 @@ class MainApplication : Application() { val MMKVRootDir = MMKV.initialize(applicationContext) Logger.i("MMKV_ROOT_DIR:$MMKVRootDir") updateNotificationChannels() - /* - * 错误日志上传捕获 - * */ - val crashCatchHandler: CrashCatchHandler = CrashCatchHandler.getInstance() //获得单例 - crashCatchHandler.init(applicationContext) //初始化,传入context - if (DeviceID.supportedOAID(applicationContext)) { - // 获取OAID/AAID,异步回调 - DeviceID.getOAID(applicationContext, object : IGetter { - override fun onOAIDGetComplete(result: String) { - // 不同厂商的OAID/AAID格式是不一样的,可进行MD5、SHA1之类的哈希运算统一 - Log.d("onOAIDGetComplete ${result}") - OAID = result - } - - override fun onOAIDGetError(error: Exception) { - // 获取OAID/AAID失败 - error.printStackTrace() - } - }) - } - - - //openinstall -// OpenInstall.init(applicationContext); - PaymentConfiguration.init( - applicationContext, - "pk_live_51Nkl6vLWP3xWXY4LfXtdMtXzHazv6pav2rH1p1BfICeh5meGGjglExiw4GgmSzWO7NptEM1c549Fe11zRy9nCfxs009zEwLpXP" - ) -// OpenInstall.preInit(applicationContext) -// OpenInstall.init(applicationContext) } fun updateActivity(language: String, locale: Locale) { diff --git a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt index 0fbf6d2..253f546 100644 --- a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt +++ b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt @@ -38,6 +38,8 @@ class BZYConstants { const val REQUEST_CODE_PAY_WEB_Stripe = 1001 const val REQUEST_CODE_PAY_WEB_BiLai = 1002 + const val REQUEST_CODE_Captcha_Result_Key = "REQUEST_CODE_Captcha_Result_Key" + //是否需要完善资料 const val MMKV_KEY_IS_PERFECT = "isPerfect" diff --git a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt index 1c30731..2df728a 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/home/HomeFragment.kt @@ -186,7 +186,9 @@ class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatcher llLine = view.findViewById(R.id.llLine) clActivity = view.findViewById(R.id.clActivity) clMember = view.findViewById(R.id.clMember) - + if (BuildConfig.productId=="182268"&&BuildConfig.is_tz){ + clActivity.visibility=View.INVISIBLE + } llLine.setOnClickListener { if (checkExpire()) { diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index 7ba03e6..4dc1c16 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -250,6 +250,11 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc tvVersion = view.findViewById(R.id.tvVersion) clFire = view.findViewById(R.id.clFire) + if (BuildConfig.productId=="182268" && BuildConfig.is_tz){ + clFire.visibility=View.GONE + clTelegraph.visibility=View.GONE + clPreventLoss.visibility=View.INVISIBLE + } setExpireDate() if (checkExpire()) { 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 dba2407..e05d3fa 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 @@ -59,6 +59,7 @@ class NetService private constructor() : INetService { // "https://api.gaogaoshousoft.cc:18001" // "https://api.yingmaox.cc:8700" // "https://113.108.210.50:21002" +// "https://bc5b-14-146-29-2.ngrok-free.app" MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, BuildConfig.service_url)!! // MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, "https://app.bazhuayujiasu.cc:18001") } else { diff --git a/app/src/main/java/com/yingmao/clash/util/Utils.kt b/app/src/main/java/com/yingmao/clash/util/Utils.kt index 4e8dd07..bd68f1d 100644 --- a/app/src/main/java/com/yingmao/clash/util/Utils.kt +++ b/app/src/main/java/com/yingmao/clash/util/Utils.kt @@ -254,32 +254,7 @@ object Utils { } } - fun getIPAddress(): String { - try { - val en: Enumeration = NetworkInterface.getNetworkInterfaces() - while (en.hasMoreElements()) { - val intf: NetworkInterface = en.nextElement() - val enumIpAddr: Enumeration = intf.getInetAddresses() - while (enumIpAddr.hasMoreElements()) { - val inetAddress: InetAddress = enumIpAddr.nextElement() - if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) { - return inetAddress.getHostAddress() - } - } - } - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - return "0.0.0.0" - } - fun getIPAddress(context: Context): String? { - val wifiManager = - context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager - val wifiInfo = wifiManager.connectionInfo - val ipAddress = wifiInfo.ipAddress - return (ipAddress and 0xFF).toString() + "." + (ipAddress shr 8 and 0xFF) + "." + (ipAddress shr 16 and 0xFF) + "." + (ipAddress shr 24 and 0xFF) - } public fun isAppInstalled(context: Context, packageName: String): Boolean { return try { diff --git a/app/src/main/java/com/yingmao/clash/view/dialog/DialogAgreementPrivacyChoose.kt b/app/src/main/java/com/yingmao/clash/view/dialog/DialogAgreementPrivacyChoose.kt new file mode 100644 index 0000000..b2088f9 --- /dev/null +++ b/app/src/main/java/com/yingmao/clash/view/dialog/DialogAgreementPrivacyChoose.kt @@ -0,0 +1,187 @@ +package com.yingmao.clash.view.dialog + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.graphics.Color +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.TextUtils +import android.text.method.LinkMovementMethod +import android.text.style.BackgroundColorSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.chad.library.adapter.base.BaseQuickAdapter +import com.cncat.vpn.common.log.Log +import com.tencent.mmkv.MMKV + +import com.yingmao.clash.R +import com.yingmao.clash.act.AgreementAndPrivacyActivity +import com.yingmao.clash.act.MyClickableSpan +import com.yingmao.clash.act.UIMainActivity +import com.yingmao.clash.conf.BZYConstants +import com.yingmao.clash.entity.DomainItemBean + +import com.yingmao.clash.view.adapter.DomainListAdapter + + +/** + * @author tamsiree + * @date 2016/7/19 + * 确认 取消 Dialog + */ +open class DialogAgreementPrivacyChoose : RxDialog { + lateinit var titleView: TextView + private set + lateinit var but_agree: TextView + private set + lateinit var but_cancel: TextView + private set + lateinit var dialog_agreement_info: TextView + private set + lateinit var onTryListener: OnTryButtonListener + + lateinit var onDomainListItemListener: OnListItemListener + + constructor(context: Context?, themeResId: Int) : super(context!!, themeResId) { + initView() + } + + constructor( + context: Context?, + cancelable: Boolean, + cancelListener: DialogInterface.OnCancelListener?, + ) : super(context!!, cancelable, cancelListener) { + initView() + } + + constructor(context: Context?) : super(context!!) { + initView() + } + + constructor(context: Activity?) : super(context!!) { + initView() + } + + constructor(context: Context?, alpha: Float, gravity: Int) : super(context, alpha, gravity) { + initView() + } + + + @SuppressLint("MissingInflatedId") + private fun initView() { + val dialogView = + LayoutInflater.from(context).inflate(R.layout.dialog_agreement_privacy_choose, null) + titleView = dialogView.findViewById(R.id.tv_title) + but_agree = dialogView.findViewById(R.id.but_agree) + but_cancel = dialogView.findViewById(R.id.but_cancel) + dialog_agreement_info = dialogView.findViewById(R.id.dialog_agreement_info) + + initUserAgreementView(context, dialog_agreement_info) + + but_agree.setOnClickListener { + onTryListener.agree() + } + but_cancel.setOnClickListener { onTryListener.cancel() } + + setContentView(dialogView) + setCancelable(false) + window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + + + } + + private fun initUserAgreementView(activity: Context, textView: TextView) { + var privacy_s = 16 + var privacy_e = 22 + var agreement_s = 9 + var agreement_e = 15 + + val spannableStringBuilder = + SpannableStringBuilder(activity.resources.getString(R.string.AgreeAgreement2)) + val clickableSpan: MyClickableSpan = object : MyClickableSpan() { + override fun onClick(view: View) { + val backgroundColorSpan = BackgroundColorSpan(Color.parseColor("#4072FE")) + spannableStringBuilder.setSpan( + backgroundColorSpan, + agreement_s, + agreement_e, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE + ) + textView.text = spannableStringBuilder + val intent = Intent(activity, AgreementAndPrivacyActivity::class.java) + intent.putExtra( + BZYConstants.EXTRA_KEY_AGREEMENT, + BZYConstants.EXTRA_PRIVACY_AGREEMENT + ) + activity.startActivity(intent) + } + } + spannableStringBuilder.setSpan( + clickableSpan, + agreement_s, + agreement_e, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE + ) + + val privacyClickableSpan: MyClickableSpan = object : MyClickableSpan() { + override fun onClick(view: View) { + val backgroundColorSpan = BackgroundColorSpan(Color.parseColor("#4072FE")) + spannableStringBuilder.setSpan( + backgroundColorSpan, + privacy_s, + privacy_e, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE + ) + textView.text = spannableStringBuilder + val intent = Intent(activity, AgreementAndPrivacyActivity::class.java) + intent.putExtra( + BZYConstants.EXTRA_KEY_AGREEMENT, + BZYConstants.EXTRA_USER_AGREEMENT + ) + activity.startActivity(intent) + } + } + spannableStringBuilder.setSpan( + privacyClickableSpan, + privacy_s, + privacy_e, + Spannable.SPAN_EXCLUSIVE_INCLUSIVE + ) + textView.text = spannableStringBuilder + textView.movementMethod = LinkMovementMethod.getInstance() + + + } + + fun setOnTryButtonListener(listener: OnTryButtonListener) { + this.onTryListener = listener + } + + fun setOnListItemListener(listener: OnListItemListener) { + this.onDomainListItemListener = listener + } + + + private fun changeSubUrl(originalUrl: String, newUrl: String): String { + return originalUrl.replace(Regex("https://[^/]+/"), "$newUrl/") + + } + + interface OnTryButtonListener { + fun agree() + fun cancel() + } + + interface OnListItemListener { + fun listItemClick() + + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_agreement_privacy_choose.xml b/app/src/main/res/layout/dialog_agreement_privacy_choose.xml new file mode 100644 index 0000000..68b271b --- /dev/null +++ b/app/src/main/res/layout/dialog_agreement_privacy_choose.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/layout_splash_activity.xml b/app/src/main/res/layout/layout_splash_activity.xml index 09c57cd..c3a5ba2 100644 --- a/app/src/main/res/layout/layout_splash_activity.xml +++ b/app/src/main/res/layout/layout_splash_activity.xml @@ -12,6 +12,25 @@ android:layout_height="match_parent" > + + + + + Suggest restarting Restart Speed test + Agree + Disagree \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 5d9881f..02399cc 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -341,4 +341,6 @@ "建議重啓 " "重啓 " 線路測速 + 同意 + 不同意 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cb6a362..8e4b81f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -340,4 +340,6 @@ "建議重啓 " "重啓 " 線路測速 + 同意 + 不同意 \ 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 fd4a078..bd488dd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -131,6 +131,7 @@ 检查登录失败 登录异常 同意《隐私协议》和《用户协议》 + 请您充分阅读并理解《隐私政策》和《用户协议》我们非常重视您的隐私和个人信息,在您使用过程中,我们会收集部分个人信息。例如,会申请设备信息等。您可以点击《用户协议》和《隐私政策》查看详细内容。您可以选择“同意”继续使用我们的服务,或者选择“不同意”退出。 请仔细阅读并同意《隐私协议》和《用户协议》 小提示:自动注册初始密码为 123456,手动注册请忽略 小提示2:华为鸿蒙系统由于鉴定机制的问题,将App误报为诈骗软件,请忽略正常放心使用,有任何问题联系客服及售后 @@ -359,4 +360,6 @@ 建议重启 重启 线路测速 + 同意 + 不同意 \ No newline at end of file From 7e386d02a67b2c7b15233d5ef58392b9e6c28ff5 Mon Sep 17 00:00:00 2001 From: cyh Date: Tue, 20 May 2025 16:32:01 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix=20=E5=9B=BE=E5=BD=A2=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E7=A0=81,=E4=BA=91=E6=A2=AF=E4=BA=A7=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/LoginActivity.kt | 133 +++++-- .../yingmao/clash/act/MyClickableSpan.java | 2 +- .../com/yingmao/clash/act/NewMainActivity.kt | 31 +- .../com/yingmao/clash/act/SplashActivity.kt | 329 +++++++++++++----- .../com/yingmao/clash/app/MainApplication.kt | 29 +- .../com/yingmao/clash/base/PublicViewMode.kt | 93 ++++- .../com/yingmao/clash/conf/BZYConstants.kt | 1 + .../clash/fragment/setting/SettingFragment.kt | 16 +- .../com/yingmao/clash/net/http/HttpApi.kt | 13 +- .../java/com/yingmao/clash/vm/LoginAtyVM.kt | 40 +-- .../yingmao/clash/webview/BZYWebViewKeFu.kt | 76 +++- .../dialog_agreement_privacy_choose.xml | 1 + .../res/layout/layout_splash_activity.xml | 81 +++-- app/src/main/res/mipmap-hdpi/img.png | Bin 0 -> 5152 bytes app/src/main/res/mipmap-hdpi/yunti_logo.webp | Bin 0 -> 688 bytes app/src/main/res/mipmap-mdpi/yunti_logo.webp | Bin 0 -> 380 bytes app/src/main/res/mipmap-xhdpi/yunti_logo.webp | Bin 0 -> 962 bytes app/src/main/res/values-en/strings.xml | 3 + app/src/main/res/values-zh-rHK/strings.xml | 3 + app/src/main/res/values-zh-rTW/strings.xml | 3 + app/src/main/res/values/strings.xml | 4 + 21 files changed, 643 insertions(+), 215 deletions(-) create mode 100644 app/src/main/res/mipmap-hdpi/img.png create mode 100644 app/src/main/res/mipmap-hdpi/yunti_logo.webp create mode 100644 app/src/main/res/mipmap-mdpi/yunti_logo.webp create mode 100644 app/src/main/res/mipmap-xhdpi/yunti_logo.webp diff --git a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt index 2bc569a..e4ce76f 100644 --- a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt @@ -161,7 +161,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { ) } } - }else if(httpStatus.reqType == HttpReqType.GETAPPVERION){ + } else if (httpStatus.reqType == HttpReqType.GETAPPVERION) { (httpStatus.rsp as AppVersionCheckRsp).let { avcr -> com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr") if (avcr.code == 200) { @@ -198,7 +198,11 @@ class LoginActivity : BaseActivity(), View.OnClickListener { var currentHost = MMKV.defaultMMKV() .decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, "") // com.cncat.vpn.common.log.Log.d("tryButton CHECK_LOGIN currentHost==>${currentHost}") - loginViewMode.login(username_encrypt, password_encrypt,user_oaid) + loginViewMode.login( + username_encrypt, + password_encrypt, + user_oaid + ) } override fun cancel() { @@ -209,7 +213,11 @@ class LoginActivity : BaseActivity(), View.OnClickListener { dialogDoMainChoose?.setOnListItemListener(object : DialogDoMainChoose.OnListItemListener { override fun listItemClick() { - loginViewMode.login(username_encrypt, password_encrypt,user_oaid) + loginViewMode.login( + username_encrypt, + password_encrypt, + user_oaid + ) } @@ -481,8 +489,8 @@ class LoginActivity : BaseActivity(), View.OnClickListener { password_encrypt = AESUtil.byteArrayToHexStr( AESUtil.encrypt(password) ) - Log.d("OALD","OAID.....::"+MainApplication.OAID) - user_oaid=AESUtil.byteArrayToHexStr( + Log.d("OALD", "OAID.....::" + MainApplication.OAID) + user_oaid = AESUtil.byteArrayToHexStr( AESUtil.encrypt(MainApplication.OAID) ) loginUserName = username @@ -490,37 +498,53 @@ class LoginActivity : BaseActivity(), View.OnClickListener { RxToast.warning(resources.getString(R.string.ReadAgreement)) return } - loginViewMode.login(username_encrypt, password_encrypt,user_oaid) + loginViewMode.login(username_encrypt, password_encrypt, user_oaid) } R.id.tv_register -> { -// val intent = Intent(applicationContext, RegisterActivity::class.java) -// startActivityForResult(intent, LOGIN_TO_REGISTER_REQUEST_CODE) - if (TextUtils.isEmpty(registerHost)) { - if (BuildConfig.is_tz) { - getTzRegister() - } else { - if (BuildConfig.is_ym) { - getYmRegister() - } else { - getBzyRegister() - } - } - } else { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) - } + val intent = Intent(applicationContext, SplashActivity::class.java) + startActivity(intent) +// if (TextUtils.isEmpty(registerHost)) { +// when { +// BuildConfig.is_ym -> { +// getYmRegister() +// } +// +// BuildConfig.is_tz -> { +// getTzRegister() +// } +// +// BuildConfig.is_yunti -> { +// getYunTiRegister() +// } +// +// else -> { +// getBzyRegister() +// } +// } +// } else { +// startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) +// } } R.id.tv_kefu -> { var mmkvHost = MMKV.defaultMMKV() .decodeString(BZYConstants.MMKV_KEY_KEFU_HOST, "") if (TextUtils.isEmpty(kefuHost)) { - if (BuildConfig.is_tz) { - getTzKefu(mmkvHost) - } else { - if (BuildConfig.is_ym) { + when { + BuildConfig.is_ym -> { getYmKefu(mmkvHost) - } else { + } + + BuildConfig.is_tz -> { + getTzKefu(mmkvHost) + } + + BuildConfig.is_yunti -> { + getYunTiKefu(mmkvHost) + } + + else -> { getBzyKefu(mmkvHost) } } @@ -631,6 +655,37 @@ class LoginActivity : BaseActivity(), View.OnClickListener { }) } + private fun getYunTiRegister() { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost==>${mmkvHost}") + loginViewMode.getYunTiRegisterHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_REGISTER_HOST, str) + } +// mmkvHost = str + registerHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + + } + + }) + } + private fun getYmKefu(mmkvHost: String?) { loginViewMode.getYmKefuHost(object : AsyncBodyCallback { @@ -656,6 +711,30 @@ class LoginActivity : BaseActivity(), View.OnClickListener { }) } + private fun getYunTiKefu(mmkvHost: String?) { + loginViewMode.getYunTiKefuHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_KEFU_HOST, str) + } + kefuHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + } + }) + } + private fun getBzyKefu(mmkvHost: String?) { loginViewMode.getBzyKefuHost(object : AsyncBodyCallback { override suspend fun suc(str: String) { @@ -729,6 +808,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { passwordEt.transformationMethod = PasswordTransformationMethodBigDot() } } + private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) { if (TextUtils.isEmpty(url)) { RxToast.error(resources.getString(R.string.downloadEmpty)) @@ -785,6 +865,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener { }) dialog.show() } + fun installApk(filePath: String) { val file = File(filePath) val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { diff --git a/app/src/main/java/com/yingmao/clash/act/MyClickableSpan.java b/app/src/main/java/com/yingmao/clash/act/MyClickableSpan.java index 9a6b2c3..d3240f6 100644 --- a/app/src/main/java/com/yingmao/clash/act/MyClickableSpan.java +++ b/app/src/main/java/com/yingmao/clash/act/MyClickableSpan.java @@ -51,7 +51,7 @@ public abstract class MyClickableSpan extends ClickableSpan { */ @Override public void updateDrawState(@NonNull TextPaint ds) { - ds.setColor(Color.parseColor("#B0BFFA")); + ds.setColor(Color.parseColor("#f11f04")); ds.setUnderlineText(false); } 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 14b696c..948ba02 100644 --- a/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/NewMainActivity.kt @@ -526,13 +526,13 @@ class NewMainActivity : BaseActivity() { //todo 判断订阅地址是否修改过,未修改就用接口返回的地址反之使用本地修改的地址 var pro_sub_url = MMKV.defaultMMKV().decodeString(BZYConstants.PROFILE_SUB_URL, "") - if (!TextUtils.isEmpty(pro_sub_url)){ + if (!TextUtils.isEmpty(pro_sub_url)) { if (pro_sub_url == url) { subUrl = url } else { subUrl = pro_sub_url } - }else{ + } else { subUrl = url } @@ -786,26 +786,39 @@ class NewMainActivity : BaseActivity() { drawer.close() } val telegramBtn = findViewById(R.id.tv_dianbao) + telegramBtn.setOnClickListener {//电报 var uri = Uri.parse(BZYConstants.DefTGUrl) val intent = Intent(Intent.ACTION_VIEW) - if (BuildConfig.is_tz) { - uri = Uri.parse(BZYConstants.TZTGUrl) - } else { - if (BuildConfig.is_ym) { + when { + BuildConfig.is_ym -> { uri = Uri.parse(BZYConstants.YMTGUrl) } + + BuildConfig.is_tz -> { + uri = Uri.parse(BZYConstants.TZTGUrl) + } + + BuildConfig.is_yunti -> { + uri = Uri.parse(BZYConstants.YunTiTGUrl) + } + + else -> { + uri = Uri.parse(BZYConstants.DefTGUrl) + } } intent.setData(uri) startActivity(intent) drawer.close() } + findViewById(R.id.tv_kefu).setOnClickListener {//客服 startActivity(Intent(this, BZYWebViewKeFu::class.java)) drawer.close() } - findViewById(R.id.tv_fds).setOnClickListener {//防丢失 + var fds_view = findViewById(R.id.tv_fds); + fds_view.setOnClickListener {//防丢失 startActivity(Intent(this, LossPreventionActivity::class.java)) drawer.close() @@ -819,6 +832,10 @@ class NewMainActivity : BaseActivity() { drawer.openDrawer(GravityCompat.START) } } + if (BuildConfig.is_tz && BuildConfig.productId == "182268") { + telegramBtn.visibility = View.INVISIBLE + fds_view.visibility = View.INVISIBLE + } } var checkPayResultDia: MaterialDialog? = null diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt index dc5da34..642f1ed 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -22,6 +22,7 @@ import android.webkit.JavascriptInterface import android.webkit.WebSettings import android.webkit.WebView import android.webkit.WebViewClient +import android.widget.Button import android.widget.ProgressBar import android.widget.RelativeLayout import android.widget.TextView @@ -54,6 +55,7 @@ import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_NOTE_DEFAULT_PSW import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_REMEMBER_PASSWORD import com.yingmao.clash.conf.BZYConstants.Companion.MMKV_KEY_REMEMBER_USERNAME import com.yingmao.clash.entity.CheckLoginRsp +import com.yingmao.clash.listener.AsyncBodyCallback import com.yingmao.clash.listener.DownLoadListener import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpStatus @@ -85,11 +87,13 @@ class SplashActivity : BaseActivity() { private val Captcha_REQUEST_CODE = 3333 private lateinit var rlPb: View private lateinit var ll_action: View + private lateinit var but_skip: Button + private lateinit var but_register: Button private lateinit var rlMain: RelativeLayout private lateinit var splashAtyVM: SplashAtyVM - + private var registerHost = "" companion object { public var registerKey = "" public var registerIV2 = "" @@ -102,10 +106,7 @@ class SplashActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) super.onCreate(savedInstanceState) - - setLocalLanguage() initErrMsg = resources.getString(R.string.splashErrorTips) - // var username2 = Utils.getUniqueID2(this); // com.cncat.vpn.common.log.Log.d("username==>" + username + ", username2==>" + username2) splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java) @@ -123,14 +124,16 @@ class SplashActivity : BaseActivity() { serStore.isBZY = true } } - if (BuildConfig.productId=="182268"){ - - }else{ - //隐私政策先授权后获取 - username = Utils.getUniqueID(this) - MainApplication.initUtil() - } initWebView() + if (BuildConfig.productId == "182268") { + + initAgreementPrivacy() + } else { + //隐私政策先授权后获取权限 + initApplication(false) + } + + // mPermissions.add(Manifest.permission.READ_PHONE_STATE) // mPermissions.add(Manifest.permission.INTERNET) // mPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE) @@ -175,6 +178,40 @@ class SplashActivity : BaseActivity() { // com.cncat.vpn.common.log.Log.d("onOAIDGetComplete result==>${ DeviceIdentifier.getOAID(this)}") //获取配置背景 + + +// val Sgtr= AESUtil.decrypt("6A9E6037E4E31FDFE8E09A79FAD64B5CE7AA2D6C0DF34000998651C877C8005AD68274B63FCB1FC35DAFAD278B3EF19B79E83738A3AD5DB70D9601E43050BE0E") +// println("Sgtr==>$Sgtr") + +// OpenInstall.getWakeUp(intent, wakeUpAdapter) +// OpenInstall.getInstall { appData, error -> +// var appData = appData +// if (error != null && error.shouldRetry()) { +// // 获取数据异常,可以尝试重新获取 +// } else { +// if (appData == null) appData = AppData() +// val channelCode = appData.getChannel() // 获取渠道编号参数 +// val bindData = appData.getData() // 获取自定义参数 +// Log.d("OpenInstall", "getInstall : channelCode = $channelCode"+"bindData::"+bindData) +// } +// } + } +// private var wakeUpAdapter: AppWakeUpAdapter = object : AppWakeUpAdapter() { +// override fun onWakeUp(appData: AppData) { +// // 打印数据便于调试 +// Log.d("OpenInstall", "getWakeUp : wakeupData = $appData") +// // 获取渠道编号参数 +// val channelCode = appData.getChannel() +// // 获取自定义参数 +// val bindData = appData.getData() +// Log.d("OpenInstall", "channelCode : bindData = $channelCode"+"bindData::"+bindData) +// } +// } + + private fun initApplication(isNeedRegister: Boolean) { + username = Utils.getUniqueID(this) + MainApplication.initUtil() + setLocalLanguage() splashAtyVM.getSplashBg() var clashBinder = MainApplication.getApp()?.let { ClashManager(it).wrap() as IClashManager @@ -208,18 +245,17 @@ class SplashActivity : BaseActivity() { val routerSet = MMKV.defaultMMKV().decodeStringSet(BZYConstants.MMKV_KEY_ROUTER_HOST) if (routerSet != null && routerSet.size > 0) { - isNeedRegister() + isNeedRegister(isNeedRegister) } else { - rlPb.visibility = View.VISIBLE if (BuildConfig.is_back_cn == true) { //没有备用域名所以无需调用getHost - isNeedRegister() + isNeedRegister(isNeedRegister) } else { SplashHelper(splashAtyVM).getHostWithFallback { success -> MainScope().launch { if (success) { - isNeedRegister() + isNeedRegister(isNeedRegister) } else { - isNeedRegister() + isNeedRegister(isNeedRegister) } } } @@ -228,33 +264,7 @@ class SplashActivity : BaseActivity() { } } } -// val Sgtr= AESUtil.decrypt("73CC9D719D4B46616F7FB72DBFABFA88B716D1AF0F8B8A42929F9EE5D198EB059A7934DD0074D1810CD56B5312FD5FDACC25EED6C6B2351DB11A3BF78E3010A417CDE40EEFF768849AEF25773AF541C01464DB7C9B0B7C30D36EEA414EA86F9923AAF325C15BB75170C148C4F257AA2D6A32BFB582D498B13B38E49BB8DF1663") -// println("Sgtr==>$Sgtr") - -// OpenInstall.getWakeUp(intent, wakeUpAdapter) -// OpenInstall.getInstall { appData, error -> -// var appData = appData -// if (error != null && error.shouldRetry()) { -// // 获取数据异常,可以尝试重新获取 -// } else { -// if (appData == null) appData = AppData() -// val channelCode = appData.getChannel() // 获取渠道编号参数 -// val bindData = appData.getData() // 获取自定义参数 -// Log.d("OpenInstall", "getInstall : channelCode = $channelCode"+"bindData::"+bindData) -// } -// } } -// private var wakeUpAdapter: AppWakeUpAdapter = object : AppWakeUpAdapter() { -// override fun onWakeUp(appData: AppData) { -// // 打印数据便于调试 -// Log.d("OpenInstall", "getWakeUp : wakeupData = $appData") -// // 获取渠道编号参数 -// val channelCode = appData.getChannel() -// // 获取自定义参数 -// val bindData = appData.getData() -// Log.d("OpenInstall", "channelCode : bindData = $channelCode"+"bindData::"+bindData) -// } -// } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) @@ -265,45 +275,78 @@ class SplashActivity : BaseActivity() { private lateinit var webView: WebView private lateinit var pb_web: ProgressBar var dialogAgreementPrivacyChoose: DialogAgreementPrivacyChoose? = null - private fun initAgreementPrivacy(){ + private fun initAgreementPrivacy() { if (BuildConfig.is_tz && BuildConfig.productId == "182268") { - if (dialogAgreementPrivacyChoose == null) { - dialogAgreementPrivacyChoose = DialogAgreementPrivacyChoose(this@SplashActivity) - } - if (dialogAgreementPrivacyChoose?.isShowing == false) { - dialogAgreementPrivacyChoose?.setOnTryButtonListener(object : - DialogAgreementPrivacyChoose.OnTryButtonListener { - override fun agree() { - username = Utils.getUniqueID(this@SplashActivity) - MainApplication.initUtil() - dialogAgreementPrivacyChoose?.dismiss() - } + if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { + rlPb.visibility = View.VISIBLE + webView.visibility = View.GONE + initApplication(false) + } else { + setWebView() + if (dialogAgreementPrivacyChoose == null) { + dialogAgreementPrivacyChoose = DialogAgreementPrivacyChoose(this@SplashActivity) + } + if (dialogAgreementPrivacyChoose?.isShowing == false) { + dialogAgreementPrivacyChoose?.setOnTryButtonListener(object : + DialogAgreementPrivacyChoose.OnTryButtonListener { + override fun agree() { + initApplication(false) + dialogAgreementPrivacyChoose?.dismiss() + } + + override fun cancel() { + dialogAgreementPrivacyChoose?.dismiss() + finish() + } + }) + dialogAgreementPrivacyChoose?.show() + } - override fun cancel() { - dialogAgreementPrivacyChoose?.dismiss() - finish() - } - }) - dialogAgreementPrivacyChoose?.show() } + } } - private fun initWebView() { + private fun initWebView() { webView = findViewById(R.id.webView) pb_web = findViewById(R.id.pb_web) + but_skip = findViewById(R.id.but_skip) + but_register = findViewById(R.id.but_register) + but_skip.setOnClickListener { + val intent = Intent(this@SplashActivity, LoginActivity::class.java) + startActivity(intent) + finish() + } + but_register.setOnClickListener { + if (TextUtils.isEmpty(registerHost)) { + when { + BuildConfig.is_ym -> { + getYmRegister() + } - if (!BuildConfig.is_ym) { + BuildConfig.is_tz -> { + getTzRegister() + } - rlPb.visibility = View.INVISIBLE - } else { - webView.visibility = View.GONE + BuildConfig.is_yunti -> { + getYunTiRegister() + } + + else -> { + getBzyRegister() + } + } + } else { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) + } } } @SuppressLint("JavascriptInterface") private fun setWebView() { - initAgreementPrivacy() + rlPb.visibility = View.INVISIBLE + webView.visibility = View.VISIBLE + but_skip.visibility = View.VISIBLE // WebView设置 val webSettings = webView.settings // 可选,设置开启Chrome调试 @@ -336,16 +379,13 @@ class SplashActivity : BaseActivity() { @JavascriptInterface public fun getVerifyResult(verifyResult: String): Boolean { - com.cncat.vpn.common.log.Log.d("verifyResult==>${verifyResult}") +// com.cncat.vpn.common.log.Log.d("verifyResult==>${verifyResult}") captchaInfo = verifyResult launch { webView.setOnTouchListener { _, _ -> true } pb_web.visibility = View.VISIBLE } - - - doRegisterByEncryption() return true } @@ -361,7 +401,7 @@ class SplashActivity : BaseActivity() { private fun setLocalLanguage() { var defLan = "" - if (BuildConfig.is_tz) { + if (BuildConfig.is_tz && BuildConfig.productId != "182268") { defLan = "Chinese-HK" } val decodeString = MMKV.defaultMMKV().decodeString(BZYConstants.languageInfo, defLan) @@ -457,27 +497,30 @@ class SplashActivity : BaseActivity() { } } - private fun isNeedRegister() { + private fun isNeedRegister(isNeedRegister: Boolean) { if (!BuildConfig.is_free && BuildConfig.productId.isNotEmpty()) { //渠道包都自动注册登录,广州22222也是非自动注册 - rlPb.visibility = View.VISIBLE + if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { + rlPb.visibility = View.VISIBLE + but_skip.visibility = View.INVISIBLE splashAtyVM.checkLogin() } else { // doRegister() - if (!BuildConfig.is_ym) { - rlPb.visibility = View.INVISIBLE - webView.visibility = View.VISIBLE - setWebView() - } else { - webView.visibility = View.GONE + + if (isNeedRegister) { doRegisterByEncryption() + } else { + setWebView() } + } } else {//非渠道自由包 val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN) ll_action.visibility = View.VISIBLE rlPb.visibility = View.INVISIBLE + but_skip.visibility = View.INVISIBLE if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { + if (token != null && token.isNotEmpty()) { ll_action.visibility = View.GONE rlPb.visibility = View.VISIBLE @@ -1016,7 +1059,7 @@ class SplashActivity : BaseActivity() { } if (deniedAndNoLongerPromptPermissions.isNotEmpty()) { if (checkPermissions(mPermissions)) { - isNeedRegister() //TODO + isNeedRegister(true) //TODO return } val deniedAndNoLongerPromptPermissionsName = StringBuilder() @@ -1066,7 +1109,7 @@ class SplashActivity : BaseActivity() { Logger.i("${deniedAndNoLongerPromptPermissions.size}需要${deniedAndNoLongerPromptPermissionsName.toString()}权限,由于您设置了不再提示,需要手动开启权限!") } else { if (checkPermissions(mPermissions)) { - isNeedRegister() //TODO + isNeedRegister(true) //TODO } else { finish() } @@ -1079,7 +1122,7 @@ class SplashActivity : BaseActivity() { com.cncat.vpn.common.log.Log.d("onActivityResult requestCode==>${requestCode}") if (requestCode == PERMISSION_SETTING_REQUEST_CODE) { if (checkPermissions(mPermissions)) { - isNeedRegister() //TODO + isNeedRegister(true) //TODO } else { requestPermissions(deniedPermissions.toTypedArray(), PERMISSION_REQUEST_CODE) } @@ -1193,4 +1236,126 @@ class SplashActivity : BaseActivity() { } startActivity(intent) } + private fun getYmRegister() { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost==>${mmkvHost}") + splashAtyVM.getRegisterHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_REGISTER_HOST, str) + } +// mmkvHost = str + registerHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + + } + + }) + } + + private fun getTzRegister() { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost==>${mmkvHost}") + splashAtyVM.getTzRegisterHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_REGISTER_HOST, str) + } +// mmkvHost = str + registerHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + + } + + }) + } + + private fun getBzyRegister() { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost==>${mmkvHost}") + splashAtyVM.getBzyRegisterHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_REGISTER_HOST, str) + } +// mmkvHost = str + registerHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + + } + + }) + } + + private fun getYunTiRegister() { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost==>${mmkvHost}") + splashAtyVM.getYunTiRegisterHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_REGISTER_HOST, str) + } + registerHost = str + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(str))) + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost) + ) + ) + } + + } + + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt index cc8a2a2..0147963 100644 --- a/app/src/main/java/com/yingmao/clash/app/MainApplication.kt +++ b/app/src/main/java/com/yingmao/clash/app/MainApplication.kt @@ -15,10 +15,10 @@ import androidx.core.content.getSystemService import com.cncat.vpn.common.Global import com.cncat.vpn.common.compat.currentProcessName import com.cncat.vpn.common.log.Log -import com.fm.openinstall.OpenInstall import com.github.gzuliyujiang.oaid.DeviceID import com.github.gzuliyujiang.oaid.DeviceIdentifier import com.github.gzuliyujiang.oaid.IGetter + import com.jakewharton.processphoenix.ProcessPhoenix import com.orhanobut.logger.Logger import com.stripe.android.PaymentConfiguration @@ -93,8 +93,13 @@ class MainApplication : Application() { fun initUtil() { getApp()?.let { mainApplication -> + DeviceIdentifier.register(mApp); + val processName = mainApplication.currentProcessName + mainApplication.extractGeoFiles() + Log.d("Process $processName started") + mainApplication.updateNotificationChannels() /* * 错误日志上传捕获 * */ @@ -142,23 +147,13 @@ class MainApplication : Application() { override fun onCreate() { super.onCreate() mApp = this -// if (privacyPolicyAgreed) { - DeviceIdentifier.register(mApp); -// } - Global.init(this) - val processName = currentProcessName - extractGeoFiles() - Log.d("Process $processName started") -// if (processName == packageName) { -// Log.d("Remote.launch()") -// Remote.launch() -// } else { -// Log.d("sendServiceRecreated") -// sendServiceRecreated() -// } - val MMKVRootDir = MMKV.initialize(applicationContext) + Global.init(mApp) + val MMKVRootDir = MMKV.initialize(mApp) Logger.i("MMKV_ROOT_DIR:$MMKVRootDir") - updateNotificationChannels() +// if (privacyPolicyAgreed) { + +// } + } diff --git a/app/src/main/java/com/yingmao/clash/base/PublicViewMode.kt b/app/src/main/java/com/yingmao/clash/base/PublicViewMode.kt index b69c939..adc6adc 100644 --- a/app/src/main/java/com/yingmao/clash/base/PublicViewMode.kt +++ b/app/src/main/java/com/yingmao/clash/base/PublicViewMode.kt @@ -31,13 +31,20 @@ open class PublicViewMode : BaseViewMode() { NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") doAsyncNoNeedReturn(HttpReqType.GET_HOST) { try { //TODO bug 会引起崩溃 - var host = if (BuildConfig.is_ym) { - rt.getHost() + val host = when { + BuildConfig.is_ym -> { + rt.getHostGithub() + } - } else if (BuildConfig.is_tz) { - rt.getTzHostTZ() - } else { - rt.getBzyHostDef() + BuildConfig.is_tz -> { + rt.getTzHostGithub() + } + BuildConfig.is_yunti -> { + rt.getYunTiHost() + } + else -> { + rt.getBzyHostGithub() + } } // Log.e("data", "2:$host") host?.takeIf { it.isNotEmpty() }?.let { @@ -71,7 +78,9 @@ open class PublicViewMode : BaseViewMode() { BuildConfig.is_tz -> { rt.getTzHostGithub() } - + BuildConfig.is_yunti -> { + rt.getYunTiHostGithub() + } else -> { rt.getBzyHostGithub() } @@ -107,7 +116,9 @@ open class PublicViewMode : BaseViewMode() { BuildConfig.is_tz -> { rt.getTzHostAWS() } - + BuildConfig.is_yunti -> { + rt.getYunTiHostAWS() + } else -> { rt.getBzyHostAWS() } @@ -223,4 +234,70 @@ open class PublicViewMode : BaseViewMode() { } } } + + fun getYunTiKefuHost(callback: AsyncBodyCallback) { + val rt = + NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") + doAsyncNoNeedReturn(HttpReqType.GET_HOST) { + try { //TODO bug 会引起崩溃 + var host = rt.getYunTiKefuHost() + callback.suc(host) + } catch (e: Exception) { + e.printStackTrace() + callback.err() + } + } + } + fun getRegisterHost(callback: AsyncBodyCallback) { + val rt = + NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") + doAsyncNoNeedReturn(HttpReqType.GET_HOST) { + try { //TODO bug 会引起崩溃 + var host = rt.getYmRegister() + callback.suc(host) + } catch (e: Exception) { + e.printStackTrace() + callback.err() + } + } + } + fun getTzRegisterHost(callback: AsyncBodyCallback) { + val rt = + NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") + doAsyncNoNeedReturn(HttpReqType.GET_HOST) { + try { //TODO bug 会引起崩溃 + var host = rt.getTzRegister() + callback.suc(host) + } catch (e: Exception) { + e.printStackTrace() + callback.err() + } + } + } + fun getBzyRegisterHost(callback: AsyncBodyCallback) { + val rt = + NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") + doAsyncNoNeedReturn(HttpReqType.GET_HOST) { + try { //TODO bug 会引起崩溃 + var host = rt.getBzyRegister() + callback.suc(host) + } catch (e: Exception) { + e.printStackTrace() + callback.err() + } + } + } + fun getYunTiRegisterHost(callback: AsyncBodyCallback) { + val rt = + NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") + doAsyncNoNeedReturn(HttpReqType.GET_HOST) { + try { //TODO bug 会引起崩溃 + var host = rt.getYuntiRegister() + callback.suc(host) + } catch (e: Exception) { + e.printStackTrace() + callback.err() + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt index 253f546..7528c87 100644 --- a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt +++ b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt @@ -97,6 +97,7 @@ class BZYConstants { const val YMTGUrl = "https://t.me/shadowcat_vpn"; const val DefTGUrl = "https://t.me/bazhuayuvpn"; + const val YunTiTGUrl = "https://t.me/+0GFGw9JkM8EwMGRl"; const val TZTGUrl = "https://t.me/taizivpn"; const val PopularApplicationsUrl = "https://2828.im/" diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt index 4dc1c16..f605f88 100644 --- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt +++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt @@ -470,12 +470,20 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc clTelegraph.setOnClickListener { var uri = Uri.parse(BZYConstants.DefTGUrl) val intent = Intent(Intent.ACTION_VIEW) - if (BuildConfig.is_tz) { - uri = Uri.parse(BZYConstants.TZTGUrl) - } else { - if (BuildConfig.is_ym) { + when { + BuildConfig.is_ym -> { uri = Uri.parse(BZYConstants.YMTGUrl) } + + BuildConfig.is_tz -> { + uri = Uri.parse(BZYConstants.TZTGUrl) + } + BuildConfig.is_yunti -> { + uri = Uri.parse(BZYConstants.YunTiTGUrl) + } + else -> { + uri = Uri.parse(BZYConstants.DefTGUrl) + } } intent.setData(uri) startActivity(intent) diff --git a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt index 7180753..2ccc784 100644 --- a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt +++ b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt @@ -187,7 +187,13 @@ interface HttpApi { suspend fun getTzHostAWS(): String @GET("/ym-source/ym/main/hosttaizi.txt") suspend fun getTzHostGithub(): String - + //云梯 + @GET("/host_yunti.txt") + suspend fun getYunTiHost(): String + @GET("/host_yunti.txt") + suspend fun getYunTiHostAWS(): String + @GET("/ym-source/ym/main/host_yunti.txt") + suspend fun getYunTiHostGithub(): String //注册链接 @GET("/ymregister.txt") suspend fun getYmRegister(): String @@ -195,6 +201,8 @@ interface HttpApi { suspend fun getTzRegister(): String @GET("/bzyregister.txt") suspend fun getBzyRegister(): String + @GET("/yunti_register.txt") + suspend fun getYuntiRegister(): String //客服链接 @GET("/ymkefu.txt") suspend fun getYingMaoKefuHost(): String @@ -204,6 +212,9 @@ interface HttpApi { @GET("/bzy_kefu.txt") suspend fun getBzyKefuHost(): String + + @GET("/yt_kefu.txt") + suspend fun getYunTiKefuHost(): String // @Headers( // "User-Agent: Octopus_Android" // ) diff --git a/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt b/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt index df860b4..81a3a7c 100644 --- a/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt +++ b/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt @@ -96,45 +96,7 @@ class LoginAtyVM : PublicViewMode() { } } - fun getRegisterHost(callback: AsyncBodyCallback) { - val rt = - NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") - doAsyncNoNeedReturn(HttpReqType.GET_HOST) { - try { //TODO bug 会引起崩溃 - var host = rt.getYmRegister() - callback.suc(host) - } catch (e: Exception) { - e.printStackTrace() - callback.err() - } - } - } - fun getTzRegisterHost(callback: AsyncBodyCallback) { - val rt = - NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") - doAsyncNoNeedReturn(HttpReqType.GET_HOST) { - try { //TODO bug 会引起崩溃 - var host = rt.getTzRegister() - callback.suc(host) - } catch (e: Exception) { - e.printStackTrace() - callback.err() - } - } - } - fun getBzyRegisterHost(callback: AsyncBodyCallback) { - val rt = - NetService.instances.createFreeBaseUrl("https://yingmao.oss-cn-hongkong.aliyuncs.com/") - doAsyncNoNeedReturn(HttpReqType.GET_HOST) { - try { //TODO bug 会引起崩溃 - var host = rt.getBzyRegister() - callback.suc(host) - } catch (e: Exception) { - e.printStackTrace() - callback.err() - } - } - } + fun upgradeVersion() { val httpApi = NetService.instances.createHttpsEncodeStr(HttpApi::class.java) val phoneNumber = diff --git a/app/src/main/java/com/yingmao/clash/webview/BZYWebViewKeFu.kt b/app/src/main/java/com/yingmao/clash/webview/BZYWebViewKeFu.kt index b4a986e..b01a729 100644 --- a/app/src/main/java/com/yingmao/clash/webview/BZYWebViewKeFu.kt +++ b/app/src/main/java/com/yingmao/clash/webview/BZYWebViewKeFu.kt @@ -84,14 +84,21 @@ class BZYWebViewKeFu : BaseActivity() { //// Log.e("data", "==$newProgress") // } // } - if (BuildConfig.is_tz) { -// webView.loadUrl("file:///android_asset/TZKeFu.html") - getTzKefu() - } else { - if (BuildConfig.is_ym) { + + when { + BuildConfig.is_ym -> { ymKefu() - } else { -// webView.loadUrl("file:///android_asset/kefu.html") + } + + BuildConfig.is_tz -> { + getTzKefu() + } + + BuildConfig.is_yunti -> { + getYunTiKefu() + } + + else -> { getBzyKefu() } } @@ -148,7 +155,8 @@ class BZYWebViewKeFu : BaseActivity() { finish() } } - private fun getBzyKefu(){ + + private fun getBzyKefu() { val userName = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "") var enNmae = URLEncoder.encode(userName, "UTF-8") Log.d("enNmae==>${enNmae}") @@ -197,7 +205,8 @@ class BZYWebViewKeFu : BaseActivity() { finish() } } - private fun getTzKefu(){ + + private fun getTzKefu() { val userName = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "") var enNmae = URLEncoder.encode(userName, "UTF-8") Log.d("enNmae==>${enNmae}") @@ -246,4 +255,53 @@ class BZYWebViewKeFu : BaseActivity() { finish() } } + + private fun getYunTiKefu() { + val userName = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "") + var enNmae = URLEncoder.encode(userName, "UTF-8") + Log.d("enNmae==>${enNmae}") + if (TextUtils.isEmpty(kefuHost)) { + var mmkvHost = MMKV.defaultMMKV() + .decodeString(BZYConstants.MMKV_KEY_KEFU_HOST, "") +// com.cncat.vpn.common.log.Log.d("mmkvHost kf ==>${mmkvHost}") + webViewAtyVM.getYunTiKefuHost(object : AsyncBodyCallback { + override suspend fun suc(str: String) { +// com.cncat.vpn.common.log.Log.d("str==>${str}") + if (str != mmkvHost) { + MMKV.defaultMMKV() + .encode(BZYConstants.MMKV_KEY_KEFU_HOST, str) + } + kefuHost = str + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(str + "&app_account=${enNmae}") + ) + ) + finish() + } + + override fun err() { + if (!TextUtils.isEmpty(mmkvHost)) { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(mmkvHost + "&app_account=${enNmae}") + ) + ) + finish() + } + } + + }) + } else { + startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse(kefuHost + "&app_account=${enNmae}") + ) + ) + finish() + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_agreement_privacy_choose.xml b/app/src/main/res/layout/dialog_agreement_privacy_choose.xml index 68b271b..0cca4f4 100644 --- a/app/src/main/res/layout/dialog_agreement_privacy_choose.xml +++ b/app/src/main/res/layout/dialog_agreement_privacy_choose.xml @@ -48,6 +48,7 @@ diff --git a/app/src/main/res/layout/layout_splash_activity.xml b/app/src/main/res/layout/layout_splash_activity.xml index c3a5ba2..85d3ab0 100644 --- a/app/src/main/res/layout/layout_splash_activity.xml +++ b/app/src/main/res/layout/layout_splash_activity.xml @@ -1,38 +1,77 @@ + tools:context=".act.SplashActivity"> + + - + + + + + + + android:layout_centerInParent="true" + android:indeterminateTint="@color/blue_0136CB" + android:visibility="invisible" /> + + + + + + + + android:visibility="gone"> + android:layout_weight="1" + android:visibility="gone"> + android:textColor="@color/blue_0136CB" + android:textSize="15sp" /> diff --git a/app/src/main/res/mipmap-hdpi/img.png b/app/src/main/res/mipmap-hdpi/img.png new file mode 100644 index 0000000000000000000000000000000000000000..ef90ea4fd66b76d93a539fa7ba8bf7f0e00990ed GIT binary patch literal 5152 zcmV+*6yNKKP)WzFG6Et& zVA*AJnwg!Mo!FB)hnd|anSI~wJJZ|K-Ltza*8f%4aQpP_d(U@Ixaam3$0*%`s;czY zfFbW#h+A2fEl({CN0?u+AUAeihht0~x&zCIXh3g6Ztp{%QdoK#{Vi}D$Nbds#qJQZ z&t#Sua-+ZT$Wdti)illC!92Kq5W9rph>4j;QFHd8ZTiSOQ@c>Ma!_;c8Y6%emD4_! zq0FGpY?bDtJH+gRniVphntOtU{V8qOVeez_Y?oMY#Kb5p<5CXh_@P3>wP*(e=59)U z;F)3cw7+7PSa4Lt3XN_&CB!sQQ6vo(Bg#uuuBvG@Kh4W@#UCD@x4SU#-I}vP1 zhU(dfn@@ygNgyMrS<}(B4zgHBkAlQHg~8lR4?N z$X)2bC77VE4%S0pX7h~`3duV_L1K=e6UaJD!n7vw$*^0BF=^sWc}yHHMR!i>sCW@R zDX>v;k+jLtGNl`FWkx|_9V}ArQFiBneqth+3N>XEkvz51Ans=b8)2n8CwWWY5|IGo zYhc4(HtIv>WI_#0s1XL_dA0)ux`KkllpF!NcxK3P1v|H8j%#bbXOFpLxLE`#u&zL6p*Gq64~)I><2s(Yzj8lNRp79 zG`FJ|eq`w5h%OPcfOw{Y(juy`OggP1HbgdzVvlTAHcAeckuyy~<5r(RkHB~|G&P$oWg&?q ziQE|V*2aU4ijpGztbgBoSFZKnhO;S z_{4+mxW6v$uZaih*;qI&>1BYLJqnPv$y`*@u5?$38ORO<$G{ncAqg#=Zpp|z%Xm<5 zkVTaojpodx;}nV!BsR|Y>eyJ2i-tn}`dG+|Jpy*h(n@P|C-?`5DKs^yX@QM_SX(-y zk;EL1hZ@*K$cQnTLMS(E*(6{z1RGBl+h8S#>tX^HN8+4@+2op4rFWX@Q?B`Kn; zWVm>Q@z)|xS`{jcg2XHfpx5Sl#A_LHYK-`?gP{mQA)Det*jVA1_Jt=_1THQd3^!G!;$bKNk>er2jDo~+&?^i*!2@KIQCq}R z3@IK}FLD?5Qxa@CajHSPAF6Uj6}+pb{5*RE8wsN1&lM%)Y=(UzURJd2(?Nl%?Mfz{ z&7bBnCBI}5MLrs;4S1{IkW`tD;Y`eNF{o?f9LYtRIFv$(Fg<-3p_O-uTuZCU21={u z3}63l-{#64sJt=)tBK^wfFU1hS~-5>_{Xa@e}l?{)V>9xF?*?UEFKEDtJxGojsgXg zG|(wA>jsjH`Qd@c^{C2;2kIq-RS86wEVQ(=#7md|Jf+Xt4~B#qs|B9L62LNWxlE>2 z@b9Z#G<5X`{hKOEBsM`R4AZ7Z{L?fVUWCCpJ`wcPFwsC)zWg{4Gp~fvM(C3=N{T0< z9#R%!Yeo#1D3N@imwY-^5?vXU^M3!{mI+VnUNAmbwl?YB#d-JfzB0~RD)}oDdzO^U z=)dWcHv$cHd?G4}B%PSKSvGeJE()ozwN7rqo;`_AU6{dO&%9dtJ&6A?k+WZh^6 zAM?mWsEM$7*jLSj+?3dnxuS_!7VVL$rcvyoENoHru-1b+Z;kcpp+%L_65raoKUrS9 zb#m|jd%ItC@vPm8CzTaVFZ*_8&5AE7R?ckrern_L5gR7=uiUwz*;SK_g%qOR!BpI5Hz{W)-t>C7Rt9j$J;*t04 zE&hUOZmi$?W7OY}4Es_c9}Zg4Jxh0g^2|?Pj1Iagy|w#NOc-Zp)Stv?68Te6Aon7UFF z5cMTLMVji^uwRUZd8Wy?>izZOpQzouI1vf@>dF&LkmnNAXv7=oCYDbOawh2WxvOyQ zraq-_tp$TEkC@#LsZjq{g7G;v&PV-uXJqo&AVwkqPg`5kiJCPfANQ@CJIuF!nt#m{ z@2U^Ht3UFune1QpA+Fj5udbf>bg*`JBIJQ9#-n~A6>le&pGD|F4pWESm7!*uIf%JB z-p!mXrs^5MXzTy#V~G;VUs(nOB@&B2sBC^1zbC50OI)GZmYXxN>el1=CtZ+3YrcDc%S_^V5T zb!FZS(>6|ea!>K6$xw5su|DWR5$F?=F`N@XfaZ@ZH1SsTVZxM#sw&RdeG-5Rgk5~!-d1Gs3%Y;h2oP0(vkYIi$oxI5FTLn~Hei{`z1;Rn%3PN;0~w%qW;P zD4Z?UF+IXf(Xd&=CowlUP@o|2)xUUVb>l3j>PVgr?B5%$^r@zcxR>g_At5~xPD$b6ittiC#o(e1j6l*ON=H53$oi4L9(J@5 z7eY6P<$1a8yyWk$lyExJ8rd=L`%%5NEd1!;pMPtu2QqDkGy4yv+YavkdoC4RURg#L}7lY}1~SSpzCRf6@EhSa;EA z&v#=zE5>< zVLA#!nBS{&bdwlOyX0Gltbc!pUuD|(hzt3!c-()HKa^;AO3GQi2l-M^zx1sYBkuO> zC4MML)&Mh;q{+jPcGuAjVvdJANz&4&p1eC(hN}0#(+st!cOkDJ<2PtJ{@oU{PovWyp(fLbfBXdT2kLOJ0b002=Qx|7@f^< zAVz@~GMUUlC+y$9pLReFz%A55+S-aXolg)12qA$SeI!8?iDFrx1762d zB^Os{LxOg8`&QMqwzflu4jn#x7-P1ywBQ%Fzx?tG?Ut`{9-N6mEestD21`mx_T~eU zy1F_{iD~}&>n}*q|L?#5uBoYk9E~QQw|rkIG(aERR#sL*f}YUkK-+%&{`T8%_yu8T zwrkfex7&@L$z&4b8yXr)OG`P9V_6o9f)4fd^*eX&{NaZmAcsD+wYA%}ZQHbIQ+auL zDwTqgM`ke$`s=U1&YnH{^wUp2`|PvNJoC)|)N$5XXPt4z8IL~tC^Ul-FTecqNhh83 z@WT%;Sg_!dOD;L)m}AgD=kw1$9}2-l7~#w_&$#Zo>%RQ*%c7#9$&)AFd+)tHd-lBN zo_ofQ9sB2>f4=_u>$lx@+lmz{Fi5|C{Vu)qQVjUiQ%^ne$Ri(q_~9Ra{DF6`x#pTt zqeh*0;)(dZ_~MHneDJ}cLx*B6u!S0Q=digwwI z?z<1nZ@A%xi4!MInKEVY;FmDp;K74WKm9-6d+$B?)k6+aJ$fu%y7bjoUxh*^oNxm4!|KkNGY5VM=REe0I5~A^2sNIKWI#tFacqJn1MmQ`sypZjsZXW>@yGp=WDOM_V?d^hYfGP{dO>% zHER~uWy6LIcyYvt5jWm=9+@Hs&z?R0yMNzv z&pj8@V`9t-Av8w+S6+DqdSKya%$RZBdFLTK@Dzj*V|W)G;DPWxB$#*Jd8cpRzTj}t zMHj&}U=S=WQpnqHzkUDx_uqBbT_1h)k;mg%y?Qkw5bJ_I@EVIN(nLzzc@{Hg7`%Y> zfQlFw8X&;%3nu~3l`B`Gjf95z;95O;+%|ps|H6w9A*Y>o8oUk`e&dZd&<7fz4;pjl z&IK{U6~PcOhQ^{ri?AY~3YVTXZQ9hSQ?I=8O7O%iE|&`tj=9@vIfB*i=mMw!* zAP^7&$WL3hZiR*hF*7TrkSoG{k#N?mS%V2Kzx;9x1XU0iy?ghD1a1IT)~{cWgm(4S zSHoh%hYtlAOn?0G$IqKL4>2}#=1lZK#6uN~hIbJ>FbG~pV#F_^3&aq{Xd{x562AWW zYedo0Pd|;3(G$1m00UwcP(nBODt-qI8Z>?Sbm~V~Zc5C|iZ-mos1&Ne%InsxL#{){ zLl#1I#xEv*^UXIOfBf-SECx?N>O;t3rN@mM3+F-pg*(BX&K>7K@7xSOT~M#)tF6Two3f;t-T9;bVrC zm;u-g>w#5AM9~1FKy;xFQ1r}6Q$O7UAjHN%Z=n#K61xI~h!*S|cw`KSsDm6+p!07! z@Q7~QbT7dz{16>zoq@se6#K_v9T4J{Rvv}86(pwUVTOelbci}=n_6Gi%QgdeN`08N zjS*;1`Z^kPDE!iRrk#zqj5Y=BKxd?{(}sD9Lg(bCm?YnjPH>>q)hjHBvDMyxC7luV(S3dt?76YF$FM;tM+LNIG%SIz=U z2TSKpU+)UKL#z-7!;|eoM>rC&2<;v0FwaXRXdEpuJIoW9(}{80vEKA`%Zpusd0w@9 z#JUbTlX=Qc;n>+CbnIin(Gs)IVcgmuIm(T;-J{I6cA;5fM>mPdI_#5~8wTtiXog*G z8P?pk4{nB>`_!X!gP7g>JD$u8b0RUf)!cuKGbCMv@e25G9GBFQ(((Tb)@2r%BxC>p O0000zuvhy>ST*(^FUz8ZB8x&$7dX{H*( z^7lrZte?}pE-@_7LDt;MDITwDy1jT=WS^M&CE+*_ALV5AW9?UE=+^6#JWjv>{`qhp zAr-0AEQvPy5;lH7^$D>9kt^ClMmJM7RyPzVlWWf?WkE_ss1q?FuOmE00XM7VcGxN4 z8eDF4f8~^b3ndwDw5W?Q?A6CRw^rJ5tl?}JkG&4_c26%fwl43tyF#w;{vu01~|H8?+Cr?T-m*bUH;Hy-b_%(#zg!}NBmQt?i9&NwK+*~K@ zqAIG22R~@9n}z0kyZ>_M)$P&`0&D3Xzn{@~saej?SN_B|D)IqX@>L+uAd-nEKh$Mjs0JT~2!2)OfG*CrY zxq|;U`&rT8oT!Ja=54<3b3liY#QuwZw>tleO?ubeN)#p(cNxuN1fotvq9JupcGN06 WfeW%D>AFSLhp(PAV9usQ0000dRZS-V literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/yunti_logo.webp b/app/src/main/res/mipmap-mdpi/yunti_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..1f4cdb67403ae88cebd71cc93272d852b5c8ca39 GIT binary patch literal 380 zcmV-?0fYWhNk&F=0RRA3MM6+kP&goH0RRB72mqY{Dlh;r06vjInn|Ujq9G?Z3uv$s z31u`nh1K97PpRM&qb5NIP?>v89op~g53gsybN2kp~u&*@zh z0092|DiaG+)DusakTA6Ys8r=e-PEkuAVaqlPWdH4IrwAKd>MbRd< z=p}xV9)C@Km#~QLhYxT;ZlkyKw)i{&52>aF#g^`Rxrqzmqf1lSK>vh32`M@S=;f+Q z8|3?Bok8ND^~rIy|9vLQekCKyPc84Cje?+f?vpP<#`jmCxj&}eOn9)(bHPE(YPs;x z;Nc;rzm_fhYI}XLV4G&cXHk#H&mQ`lt6_Vwf@T&qM^5CHDb^%K0?#jeG{YTCO2Yr#%_|Dd`9#n*Ehq zr7w%05IDg^j*c#4ok9szwBKYk?zz7m-V+wT`(8>vx6LN|!7>c2@0I`n{`uO2{gJir zey&I^u>hIXX)^|W3eQVl7~^Eli`}mjNb>X}liNmS-1?h0)(WK)!KD^FKP_1Q#1(-( zKgGYc!WPGNI$U!55B7N~g_jgw%G6^8+Ad|Iqm@Qp!ayBMq}e54dy=r%7!<_3>`iP zM1ID!xzAQj#`=zvX8?Ghii>;Q@R7Mi+$V0wq;#}qavBAlhu3ei;Vz%9e*;cIuY0Vz zhHuwqs>JORGoSMR*&IbGh8eGi?W_Jt6ytz;jZ)#XhS@tJ36#b8DIIXgk6zI}>?SW{ zlG>Q(*j5z=C0R3ZAP_yLb>EOe5Y>L(35B}bR#S24FxrV@OzrW612Sq~ee_ZPe{n)- z{swG+<|NoxJE%1`{1x!xG0$v2%3xztEr!dafeJX0f^@;Zbj1M#`c<~O782u%-~43r z6Qh4&BENreiZLQ6c4#>`YUXR%b?9O%FkJei*k)czuF+Oc7^JBMEb~BHYD@M+HQ)O2s%;5na~}z-}c0T zIW*oqKwsJ@vO2?W%JvvxLgFM1|JDg-w4Gnk22Oi5fV`=uXNAUeb7#F*$j-0*`3sSC z(3Nh6hD?@#zlvR4py{`ksX;v4TJR&P@zeMV)MA1uwCuHHX7?*r>Ix9Y*KPve7aL+8 z&o!W&58X^=H$JVSsbM^M$bHT@@ef^tmu5{({7^FbL0B1?#ZQxs0iF%gPK)ho^?QHI zCNoo`*1rfpi|D>Hcbq~b-+~uo7ncOWth+G(+=fNBl{e}&KW}(5Z_^`2xZ$dLE0)zW kyu!U@ATnOe`s-W4^uhZA#i*0MC#!O+_XF^Dkwvfo0MdKjoB#j- literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index a59d7f6..62cedbd 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -4,6 +4,7 @@ 影猫 影猫加速器 太子 + 云梯加速器 file rule proxy @@ -353,4 +354,6 @@ Service Description\n Speed test Agree Disagree + Go to login + Email registration \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 02399cc..e5faa4d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -343,4 +343,7 @@ 線路測速 同意 不同意 + 前往登入 + 雲梯加速器 + 郵箱註冊 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8e4b81f..1ea0fb3 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -342,4 +342,7 @@ 線路測速 同意 不同意 + 前往登入 + 雲梯加速器 + 郵箱註冊 \ 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 bd488dd..2b0dcf5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -362,4 +362,8 @@ 线路测速 同意 不同意 + 前往登录 + + 云梯加速器 + 邮箱注册 \ No newline at end of file From 4a4cb4753c160eaa3950e990be286b25eaacfa50 Mon Sep 17 00:00:00 2001 From: cyh Date: Tue, 20 May 2025 16:32:28 +0800 Subject: [PATCH 3/6] fix --- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index e5faa4d..d1d3f40 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -343,7 +343,7 @@ 線路測速 同意 不同意 - 前往登入 + 直接登入 雲梯加速器 郵箱註冊 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1ea0fb3..c5e7f57 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -342,7 +342,7 @@ 線路測速 同意 不同意 - 前往登入 + 直接登入 雲梯加速器 郵箱註冊 \ 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 2b0dcf5..6e7e83e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -362,7 +362,7 @@ 线路测速 同意 不同意 - 前往登录 + 直接登录 云梯加速器 邮箱注册 From 064a6c4c3e0f8bdcb949103baf35800ac4d8452f Mon Sep 17 00:00:00 2001 From: cyh Date: Wed, 21 May 2025 10:26:47 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E7=95=8C=E9=9D=A2,=E4=BF=AE=E6=94=B9=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E6=8E=A5=E5=8F=A3=E4=BC=A0=E8=BE=93=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/SplashActivity.kt | 20 +++- .../com/yingmao/clash/net/http/HttpApi.kt | 93 ++++++++++++------- .../java/com/yingmao/clash/vm/SplashAtyVM.kt | 10 +- .../res/layout/layout_splash_activity.xml | 4 +- app/src/main/res/values-zh-rHK/strings.xml | 6 +- app/src/main/res/values-zh-rTW/strings.xml | 7 +- app/src/main/res/values/strings.xml | 2 +- 7 files changed, 94 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt index 642f1ed..5b1af30 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -71,8 +71,12 @@ import com.yingmao.clash.view.dialog.DialogAppVersion import com.yingmao.clash.view.dialog.DialogDoMainChoose import com.yingmao.clash.view.dialog.RxDialogSureCancel import com.yingmao.clash.vm.SplashAtyVM +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.async +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.io.File import java.util.Locale @@ -183,6 +187,9 @@ class SplashActivity : BaseActivity() { // val Sgtr= AESUtil.decrypt("6A9E6037E4E31FDFE8E09A79FAD64B5CE7AA2D6C0DF34000998651C877C8005AD68274B63FCB1FC35DAFAD278B3EF19B79E83738A3AD5DB70D9601E43050BE0E") // println("Sgtr==>$Sgtr") +// val Sgtr= AESUtil.Registerdecrypt("" +// , registerKey, registerIV2) +//com.cncat.vpn.common.log.Log.d("Sgtr==>$Sgtr") // OpenInstall.getWakeUp(intent, wakeUpAdapter) // OpenInstall.getInstall { appData, error -> // var appData = appData @@ -340,13 +347,20 @@ class SplashActivity : BaseActivity() { startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) } } + } + @SuppressLint("JavascriptInterface") private fun setWebView() { rlPb.visibility = View.INVISIBLE webView.visibility = View.VISIBLE - but_skip.visibility = View.VISIBLE + lifecycleScope.launch(Dispatchers.Main) { + delay(3000) // 延迟3秒 + com.cncat.vpn.common.log.Log.d("setWebView delay") + but_skip.visibility = View.VISIBLE + but_register.visibility = View.VISIBLE + } // WebView设置 val webSettings = webView.settings // 可选,设置开启Chrome调试 @@ -379,7 +393,7 @@ class SplashActivity : BaseActivity() { @JavascriptInterface public fun getVerifyResult(verifyResult: String): Boolean { -// com.cncat.vpn.common.log.Log.d("verifyResult==>${verifyResult}") + com.cncat.vpn.common.log.Log.d("verifyResult==>${verifyResult}") captchaInfo = verifyResult launch { @@ -503,6 +517,7 @@ class SplashActivity : BaseActivity() { if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { rlPb.visibility = View.VISIBLE but_skip.visibility = View.INVISIBLE + but_register.visibility = View.INVISIBLE splashAtyVM.checkLogin() } else { // doRegister() @@ -519,6 +534,7 @@ class SplashActivity : BaseActivity() { ll_action.visibility = View.VISIBLE rlPb.visibility = View.INVISIBLE but_skip.visibility = View.INVISIBLE + but_register.visibility = View.INVISIBLE if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { if (token != null && token.isNotEmpty()) { diff --git a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt index 2ccc784..36a3b81 100644 --- a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt +++ b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt @@ -54,11 +54,12 @@ interface HttpApi { ) @GET("/netbarcloud/open/startImg") suspend fun splashBg(): StartingBeans + @Headers( "User-Agent: Octopus_Android" ) @POST("/netbarcloud/vpn/phLogin.do") - fun login2(@QueryMap params: Map): Call + fun login2(@QueryMap params: Map): Call //检查登录 : http://10.10.23.115:8020/netbarcloud/api/userinfo @Headers( @@ -87,7 +88,12 @@ interface HttpApi { "User-Agent: Octopus_Android" ) @POST("/netbarcloud/vpn/appRegister2") - suspend fun encryptionRegister(@QueryMap params: Map): RegisterRsp + suspend fun encryptionRegister( + + @Body requestBody: RequestBody, + ): RegisterRsp + + //显示赠送时长 : @Headers( @@ -147,7 +153,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): String //心跳 http://10.10.23.115:8020/netbarcloud/api/heartbeat @@ -160,7 +166,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): String // @GET("/darkSuperman/lazy/blob/master/fire.json") @@ -169,40 +175,56 @@ interface HttpApi { //影猫 @GET("/host_ym.txt") suspend fun getHost(): String + @GET("/host_ym.txt") suspend fun getHostAWS(): String + @GET("/ym-source/ym/main/host_ym.txt") suspend fun getHostGithub(): String + //八爪鱼 @GET("/hostdef.txt") suspend fun getBzyHostDef(): String + @GET("/hostdef.txt") suspend fun getBzyHostAWS(): String + @GET("/ym-source/ym/main/hostdef.txt") suspend fun getBzyHostGithub(): String + //太子 @GET("/hosttaizi.txt") suspend fun getTzHostTZ(): String + @GET("/hosttaizi.txt") suspend fun getTzHostAWS(): String + @GET("/ym-source/ym/main/hosttaizi.txt") suspend fun getTzHostGithub(): String + //云梯 @GET("/host_yunti.txt") suspend fun getYunTiHost(): String + @GET("/host_yunti.txt") suspend fun getYunTiHostAWS(): String + @GET("/ym-source/ym/main/host_yunti.txt") suspend fun getYunTiHostGithub(): String + //注册链接 @GET("/ymregister.txt") suspend fun getYmRegister(): String + @GET("/taiziregister.txt") suspend fun getTzRegister(): String + @GET("/bzyregister.txt") suspend fun getBzyRegister(): String + @GET("/yunti_register.txt") suspend fun getYuntiRegister(): String + //客服链接 @GET("/ymkefu.txt") suspend fun getYingMaoKefuHost(): String @@ -256,9 +278,10 @@ interface HttpApi { ) @POST("/netbarcloud/upload/uploadRequestLogs") suspend fun uploadRequestLogs( - @Body param: RequestBody, @Header("token") string: String = MMKV.defaultMMKV().decodeString( + @Body param: RequestBody, + @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalRsp @@ -269,7 +292,7 @@ interface HttpApi { suspend fun getDomain( @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): String //http://10.10.23.115:8020/netbarcloud/vpn/getPointCardSurplus.do @@ -279,7 +302,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalRsp //http://10.10.23.115:8020/netbarcloud/vpn/phRechargeInfo.do @@ -296,7 +319,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): RechargeInfoRsp //http://10.10.23.115:8020/netbarcloud/vpn/phPay.do @@ -308,7 +331,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): PayRsp @@ -317,7 +340,7 @@ interface HttpApi { @QueryMap params: HashMap, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): PayRsp //http://10.10.23.115:8020/netbarcloud/vpn/appAliPay.do @@ -329,7 +352,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalRsp //汇旺财二维码支付 @@ -341,7 +364,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): QRPayRsp //汇旺财二维码支付结果 @@ -353,7 +376,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): QRPayStatusRsp @@ -366,7 +389,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): WXPayRsp //http://10.10.23.115:8020/netbarcloud/vpn/pcPayStatus.do @@ -378,7 +401,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalRsp //http://10.10.23.115:8020/netbarcloud/vpn/phOrderList.do @@ -390,7 +413,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): ExpensesRecordRsp //http://10.10.23.115:8020/netbarcloud/vpn/pointCardSurplusRecharge.do @@ -402,7 +425,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalMessageRsp //http://10.10.23.115:8020/netbarcloud/vpn/appPcPointCardPay.do @@ -414,7 +437,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalMessageRsp @Headers( @@ -425,7 +448,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): BiLaiNormalRsp @Headers( @@ -436,7 +459,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): BiLaiNormalRsp @Headers( @@ -447,7 +470,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): PhDownloadUrlRsp @Headers( @@ -458,7 +481,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): BiLaiPayStatusRsp @@ -470,7 +493,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): SubscriptionRsp //网页支付统一订单查询 @@ -482,7 +505,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): NormalMessageRsp @Headers( @@ -493,7 +516,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): AppVersionCheckRsp @Headers( @@ -501,7 +524,7 @@ interface HttpApi { ) @GET("/netbarcloud/vpn/upgradeVersion") suspend fun upgradeVersion( - @QueryMap params: Map + @QueryMap params: Map, ): AppVersionCheckRsp //忘记密码 @@ -522,7 +545,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): SendSmsRsp //会员签到 @@ -534,7 +557,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): VipSignRsp //会员签到 @@ -546,7 +569,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): GetActivityRsp //获取阿里云上传数据 @@ -558,7 +581,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): UploadParamData @Headers( @@ -570,7 +593,7 @@ interface HttpApi { @Body requestBody: RequestBody, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): PayUploadParamData @Headers( @@ -581,7 +604,7 @@ interface HttpApi { @QueryMap params: Map, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): AppStartupStatus @Headers( @@ -593,7 +616,7 @@ interface HttpApi { @Body requestBody: RequestBody, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): AppStopStatus @Headers( @@ -605,6 +628,6 @@ interface HttpApi { @Body requestBody: RequestBody, @Header("token") string: String = MMKV.defaultMMKV().decodeString( BZYConstants.MMKV_KEY_TOKEN - ).toString() + ).toString(), ): AppStopStatus } \ No newline at end of file diff --git a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt index bc6ec8d..e14cab3 100644 --- a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt +++ b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt @@ -2,6 +2,7 @@ package com.yingmao.clash.vm import android.text.TextUtils import android.util.Log +import com.google.gson.Gson import com.orhanobut.logger.Logger import com.tencent.mmkv.MMKV @@ -20,6 +21,9 @@ import com.yingmao.clash.net.http.NetService import com.yingmao.clash.util.AESUtil import kotlinx.coroutines.Job +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody class SplashAtyVM : PublicViewMode() { @@ -82,8 +86,12 @@ class SplashAtyVM : PublicViewMode() { fun registerByEncryption(params: Map) { Log.e("data", "register ....") val httpApi = NetService.instances.createHttps(HttpApi::class.java) + + val gson = Gson() + val jsonString = gson.toJson(params) + val requestBody: RequestBody = jsonString.toRequestBody("application/json; charset=utf-8".toMediaType()) doAsync(HttpReqType.REGISTER) { - httpApi.encryptionRegister(params) + httpApi.encryptionRegister(requestBody) } } diff --git a/app/src/main/res/layout/layout_splash_activity.xml b/app/src/main/res/layout/layout_splash_activity.xml index 85d3ab0..d842bda 100644 --- a/app/src/main/res/layout/layout_splash_activity.xml +++ b/app/src/main/res/layout/layout_splash_activity.xml @@ -55,7 +55,7 @@ android:layout_weight="1" android:background="@drawable/login_btn_bg_selector" android:text="@string/skip" - android:visibility="visible"> + android:visibility="invisible"> diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 33c2be7..1896975 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -338,15 +338,15 @@ 每天 熱門應用 熱門應用導航 - "建議重啓 " - "重啓 " + "建議重啓" + "重啓" 線路測速 同意 不同意 直接登入 雲梯加速器 - 郵箱註冊 + 手動注册 充值會員 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 93a9bf0..b4fcc26 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -337,15 +337,14 @@ 每天 熱門應用 熱門應用導航 - "建議重啓 " - "重啓 " + "建議重啓" + "重啓" 線路測速 同意 不同意 直接登入 雲梯加速器 - 郵箱註冊 - + 手動注册 充值會員 \ 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 4cf520d..a36634c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -366,7 +366,7 @@ 直接登录 云梯加速器 - 邮箱注册 + 手动注册 充值会员 \ No newline at end of file From 737330c20f01cba90312e858cbbcf571a29f54c0 Mon Sep 17 00:00:00 2001 From: cyh Date: Wed, 21 May 2025 15:37:34 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix=20=E8=87=AA=E7=94=B1=E5=8C=85=E4=B8=8D?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=9B=BE=E5=BD=A2=E9=AA=8C=E8=AF=81=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yingmao/clash/act/LoginActivity.kt | 49 +++++++------ .../com/yingmao/clash/act/SplashActivity.kt | 70 ++++++++++--------- 2 files changed, 63 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt index e4ce76f..9ef4b42 100644 --- a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt @@ -502,29 +502,32 @@ class LoginActivity : BaseActivity(), View.OnClickListener { } R.id.tv_register -> { - val intent = Intent(applicationContext, SplashActivity::class.java) - startActivity(intent) -// if (TextUtils.isEmpty(registerHost)) { -// when { -// BuildConfig.is_ym -> { -// getYmRegister() -// } -// -// BuildConfig.is_tz -> { -// getTzRegister() -// } -// -// BuildConfig.is_yunti -> { -// getYunTiRegister() -// } -// -// else -> { -// getBzyRegister() -// } -// } -// } else { -// startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) -// } + if (!BuildConfig.is_free && BuildConfig.productId.isNotEmpty()) { + val intent = Intent(applicationContext, SplashActivity::class.java) + startActivity(intent) + } else { + if (TextUtils.isEmpty(registerHost)) { + when { + BuildConfig.is_ym -> { + getYmRegister() + } + + BuildConfig.is_tz -> { + getTzRegister() + } + + BuildConfig.is_yunti -> { + getYunTiRegister() + } + + else -> { + getBzyRegister() + } + } + } else { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) + } + } } R.id.tv_kefu -> { diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt index 5b1af30..35852c7 100644 --- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt +++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt @@ -91,13 +91,14 @@ class SplashActivity : BaseActivity() { private val Captcha_REQUEST_CODE = 3333 private lateinit var rlPb: View private lateinit var ll_action: View - private lateinit var but_skip: Button - private lateinit var but_register: Button + private var but_skip: Button? = null + private var but_register: Button? = null private lateinit var rlMain: RelativeLayout private lateinit var splashAtyVM: SplashAtyVM private var registerHost = "" + companion object { public var registerKey = "" public var registerIV2 = "" @@ -315,36 +316,38 @@ class SplashActivity : BaseActivity() { } private fun initWebView() { - webView = findViewById(R.id.webView) - pb_web = findViewById(R.id.pb_web) - but_skip = findViewById(R.id.but_skip) - but_register = findViewById(R.id.but_register) - but_skip.setOnClickListener { - val intent = Intent(this@SplashActivity, LoginActivity::class.java) - startActivity(intent) - finish() - } - but_register.setOnClickListener { - if (TextUtils.isEmpty(registerHost)) { - when { - BuildConfig.is_ym -> { - getYmRegister() - } + if (!BuildConfig.is_free && BuildConfig.productId.isNotEmpty()) { + webView = findViewById(R.id.webView) + pb_web = findViewById(R.id.pb_web) + but_skip = findViewById(R.id.but_skip) + but_register = findViewById(R.id.but_register) + but_skip?.setOnClickListener { + val intent = Intent(this@SplashActivity, LoginActivity::class.java) + startActivity(intent) + finish() + } + but_register?.setOnClickListener { + if (TextUtils.isEmpty(registerHost)) { + when { + BuildConfig.is_ym -> { + getYmRegister() + } - BuildConfig.is_tz -> { - getTzRegister() - } + BuildConfig.is_tz -> { + getTzRegister() + } - BuildConfig.is_yunti -> { - getYunTiRegister() - } + BuildConfig.is_yunti -> { + getYunTiRegister() + } - else -> { - getBzyRegister() + else -> { + getBzyRegister() + } } + } else { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) } - } else { - startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(registerHost))) } } @@ -358,8 +361,8 @@ class SplashActivity : BaseActivity() { lifecycleScope.launch(Dispatchers.Main) { delay(3000) // 延迟3秒 com.cncat.vpn.common.log.Log.d("setWebView delay") - but_skip.visibility = View.VISIBLE - but_register.visibility = View.VISIBLE + but_skip?.visibility = View.VISIBLE + but_register?.visibility = View.VISIBLE } // WebView设置 val webSettings = webView.settings @@ -516,8 +519,8 @@ class SplashActivity : BaseActivity() { if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { rlPb.visibility = View.VISIBLE - but_skip.visibility = View.INVISIBLE - but_register.visibility = View.INVISIBLE + but_skip?.visibility = View.INVISIBLE + but_register?.visibility = View.INVISIBLE splashAtyVM.checkLogin() } else { // doRegister() @@ -533,8 +536,8 @@ class SplashActivity : BaseActivity() { val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN) ll_action.visibility = View.VISIBLE rlPb.visibility = View.INVISIBLE - but_skip.visibility = View.INVISIBLE - but_register.visibility = View.INVISIBLE + but_skip?.visibility = View.INVISIBLE + but_register?.visibility = View.INVISIBLE if (MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_IS_REGISTER, false)) { if (token != null && token.isNotEmpty()) { @@ -1252,6 +1255,7 @@ class SplashActivity : BaseActivity() { } startActivity(intent) } + private fun getYmRegister() { var mmkvHost = MMKV.defaultMMKV() .decodeString(BZYConstants.MMKV_KEY_REGISTER_HOST, "") From 59fa21ed146704152070562dde0a55f57c438454 Mon Sep 17 00:00:00 2001 From: cyh Date: Thu, 22 May 2025 17:02:25 +0800 Subject: [PATCH 6/6] =?UTF-8?q?html=20=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/agreement_taizi_hk.html | 126 ++++++++++++++++++++ app/src/main/assets/captcha.html | 109 +++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 app/src/main/assets/agreement_taizi_hk.html create mode 100644 app/src/main/assets/captcha.html diff --git a/app/src/main/assets/agreement_taizi_hk.html b/app/src/main/assets/agreement_taizi_hk.html new file mode 100644 index 0000000..f3666c9 --- /dev/null +++ b/app/src/main/assets/agreement_taizi_hk.html @@ -0,0 +1,126 @@ + + + + +

服務條款

+
+

爲維護雙方利益,根據相關法律、法規的規定,雙方在平等、自願、公平、誠信的基礎上,加速器科技(以下簡稱“加速器”)旗下產品加速器客户端(以下簡稱“加速器”)就用户購買跨境互聯網虛擬專用網絡服務(以下簡稱“服務”)的相關事宜達成如下協議,請您務必審慎閲讀、充分理解各條款內容,特彆是免除或者限製責任的條款、法律適用和爭議解決條款,您應重點閲讀。如您對協議有任何疑問,可嚮我方平枱客服咨詢,協議如下:

+ +

a) Our goal is to provide quality service to all customers. Please read these terms of service carefully before you access the site or the service.
+

+

b) These Terms of Service (“the Terms”) govern your use of the 太子 and the associated website domains (the “Site”) and related service (the “Services”), which are owned and operated by the 太子 Team (“太子,” “our”, “we” or “us”). The Terms constitute a legally binding agreement (the “Agreement”) between you and the 太子 加速器 Team.

+

+ 太子 Service +

+

a) You understand that we are providing you with a virtual private network (or "加速器") service, which includes, but is not limited to, the use of servers, transport, routers, IP addresses and other equipment and protocols to transmit information over our network (the "System"). You agree to abide by the Terms with respect to your use of the Service.

+

+ Usage Policy +

+

a) BY USING 太子 加速器 SERVICE (the "Service") YOU AGREE:

+

a) NOT to use the system for sending spam, port scanning, scanning for open proxies or open relays, sending opt-in email, unsolicited email or any type or version of email sent in large quantities even if the email is ultimately sent off of another server.

+

b) NOT to launch any pop-ups from our service.

+

c) NOT to attack in any way shape or form any other computer or network while on our service.

+

d) NOT to use the service for things that could hurt our network or other people.

+

b) It is the user responsibility to know and comprehend any and all relevant laws related to any jurisdiction or venue that concerns you and your actions. 太子 加速器 is not liable in any way or form for actions done by its users including a criminal liability and a civil liability for harm executed or not executed beyond any money paid to 太子 加速器 for its services by a concrete individual.

+

c) Violations of this Usage Policy or the Terms may result in termination of your account, without any refund of amounts previously paid for the Service. Additionally, you may be held responsible for any and all damages incurred to 太子 加速器, including any amounts charged by any outside entity due to said violation(s), including attorney’s fees and costs without limitation.

+

d) 太子 加速器 enables you to download software, software updates or patches, or other utilities and tools onto your mobile phones or Internet-enabled device. 太子 加速器 ("the Software") grants to you a nonexclusive, limited license to use the Software solely for the purpose stated by 太子 加速器 at the time the Software is made available to you and in accordance with these Terms. Modifying, distributing to unauthorized parties, reverse engineering, or otherwise using the Software in any way not expressly authorized by 太子 加速器, is strictly prohibited.

+

+ Disclaimers +

+

a) We strive to prevent interruptions to the Site and the Service. However, these are provided on an “as is” and “as available” basis, and we do not warrant, either expressly or by implication, the accuracy of any materials or information provided through the Site or Service, or their suitability for any particular purpose.

+

b) Actual service coverage, speeds, locations and quality may vary. The Service will attempt to be available at all times except for limited periods for maintenance and repair. However the Service may be subject to unavailability for a variety of factors beyond our control including emergencies, third party service failures, transmission, equipment or network problems or limitations, interference, signal strength, and may be interrupted, refused, limited or curtailed.

+

c) We do not make any warranty that the Service will meet your requirements, or that it will be uninterrupted, timely, secure, or error free, or that defects, if any, will be corrected. You acknowledge that you access the Site and the Service at your own discretion and risk.

+

d) We are not responsible for data, messages or pages lost, not delivered, delayed or misdirected because of interruptions or performance issues with the Service or communications services or networks (e.g., T-1 lines or the Internet). We may impose usage or Service limits, suspend Service, or block certain kinds of usage in our sole discretion to protect users or the Service. Network speed is an estimate and is no indication of the speed at which your or the Service sends or receives data. Actual network speed will vary based on configuration, compression, network congestion and other factors. The accuracy and timeliness of data received is not guaranteed; delays or omissions may occur.

+

e) We do not log any user activity (sites visited, DNS lookups, emails etc.) We only log access attempts to our servers for the purposes of troubleshooting and improving the Services. We do not get involved in any form of censorship. We do not give your personal info to any third parties.

+ +

+ 第一條 服務範圍 +

+

1.1 加速器嚮申請主體(以下簡稱“用户”)提供服務,用户按照本協議約定的條款接受服務。

+ +

+ 第二條 賬户注冊及用户資料 +

+

2.1 用户下載加速器客户端後,首次使用手機號和驗證碼登録即爲注冊;

+

2.2 用户在使用加速器提供的服務時,應使用真實、準確的手機號進行注冊或登録,不得冒用他人手機號,若因冒用他人手機號而產生瞭糾紛或損失,由客户自行承擔;

+

2.3 加速器對用户資料依法保密,但爲建立與用户溝通渠道,改善服務工作,加速器可以使用本協議涉及的用户資料;

+

2.4 用户應妥善保管手機號和驗證碼,因用户原因造成的用户驗證碼遺失或被他人穫取造成的責任、損失,加速器不予承擔。

+ +

+ 第三條 業務使用 +

+

3.1 用户確認開始使用/注冊程序使用我方平枱服務前,應當具備中華人民共和國法律規定的與您行爲相適應的民事行爲能力。若用户不具備前述與用户行爲相適應的民事行爲能力,則應穫得監護人的知情同意,用户及用户的監護人應依照法律規定承擔因此而導緻的相應的責任。如果用户是未成年人,請在用户的監護人同意和指導下訪問和/或使用我方服務;

+

3.2 用户使用服務時,應遵守中華人民共和國的法律、法規、規章等相關規定;

+

3.3 加速器提供的服務僅限成功注冊并繳費的用户使用,若因用户將服務提供給第三方使用等而產生的責任及損失,由用户自行承擔;

+

3.4 官網公布的方式,爲下載、注冊、登録、使用我方服務的唯一合法途徑,您通過其他任何方式穫取的我方服務均爲非法取得,我方概不承認其效力,一經發現,我方有權立即做齣刪除、取消、暫停、封號等處理,任何因此導緻的一切不利後果均由用户自行承擔。我方保留嚮相關責任主體追究法律責任的權利。

+ +

+ 第四條 費用標準和費用交納 +

+

4.1 服務的計費周期爲:用户首次登録時係統默認贈送 24 小時免費體驗,如需續期,則按官網及客户端展示的租期費用執行,具體租期分爲 1 個月、6 個月和 1 年,支付方式可選擇微信、支付寶等;

+

4.2 如有政策調整,自調整時間起按新標準執行。

+

4.3 租期服務期限以用户自行選擇并支付相應費用的期限爲準,租期服務到期後,加速器將停止繼續嚮用户提供相關服務;

+ +

+ 第五條 服務質量與用户服務 +

+

5.1 加速器會在官網等公布相關事宜的服務項目、服務時限、服務範圍、使用規則、交費規定等內容。

+

5.2 加速器負責嚮用户提供加速器客户端的下載、安裝、注冊、登録、使用等方面的咨詢服務;

+

5.3 因加速器原因造成通信障礙,且不能修複的,加速器免收故障期間的服務費,按天計算(另有約定的除外)。加速器不賠償因故障造成的其他損失。故障時間的計算,以加速器接到用户申告或加速器查齣障礙的時間起至恢複使用爲止。

+ +

+ 第六條 協議中止和解除 +

+

6.1 本協議有效期與用户購買的服務時長一緻。

+

6.2 用户有下列情形之一的,加速器可以終止服務并不承擔責任,已收取的費用不做退迴:

+

(1)用户違反本協議約定,我方依據違約條款終止本協議的;

+

(2)用户轉借賬號、盜用他人賬號、發布違禁內容和信息、騙取他人財物、采取不正當手段謀利等行爲,我方依據我方平枱規則對您的賬號予以查封的;

+

(3)除上述情形外,因用户多次違反我方平枱規則相關規定且情節嚴重,我方依據我方平枱規則對您的賬户予以查封的;

+

(4)用户在我方平枱有侵犯他人合法權益或其他嚴重違法違約行爲的;

+

(5)其它根據相關法律法規我方應當終止服務的情況。

+ +

+ 第七條 不可抗力及免責 +

+

7.1 由於不可抗力,如戰爭、電力故障,罷工,暴亂、自然灾害等,鑒於互聯網的特殊性,不可抗力還包括黑客攻擊、運營商網絡通訊中斷及其他非因加速器過錯產生的係統故障等導緻本協議不能履行的,加速器均無需承擔違約責任。

+

7.2 如政府、司法行政機關等相關管理部門提齣要求,暫停或終止提供相應服務,加速器不承擔任何責任。

+ +

+ 第八條 爭議解決 +

+

8.1 所有因本協議引起的或與本協議有關的爭議,本着互讓互利的原則,通過協商解決。協商不成的,雙方也可請求有管轄權的人民法院對所爭議的事項做齣裁決。

+ +

+ 第九條 用户服務協議變更 +

+

9.1 加速器更新用户服務協議、隱私權政策及相關平枱規則(統稱“服務協議”),屆時協議更新會通過官網提示、短信推送或客户端公告等方式通知和提醒用户注意。 服務協議變更後,若用户繼續使用加速器服務,即錶示用户同意接受加速器更新後的服務協議。若用户不同意變更後的服務協議,請用户停止使用加速器服務。

+ +

+ 第十條 附則 +

+

10.1 本協議自訂立、生效、解釋、修訂、補充、終止、執行與爭議解決均適用中華人民共和國法律;如法律無相關規定的,參照商業慣例及/或行業慣例;

+

10.2 加速器保留因技術進步或國傢政策變動等原因對服務做齣調整的權利,但調整時應提前告知用户并提供相應解決方案;

+

10.3 加速器可以采用電話、互聯網等渠道進行業務公告或業務通知;

+

10.4 用户下載并注冊加速器客户端時即錶示已默認同意本服務協議,此服務協議自用户注冊之日起生效;

+

10.5 本協議任一條款被視爲廢止、無效或不可執行,該條應視爲可分的且并不影響本協議其餘條款的有效性及可執行性。


+ + + diff --git a/app/src/main/assets/captcha.html b/app/src/main/assets/captcha.html new file mode 100644 index 0000000..b15faa8 --- /dev/null +++ b/app/src/main/assets/captcha.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + +
+
快速注册
+
+
+
+
+ +
滑动完成注册
+
+ + + + + + \ No newline at end of file