From 7e386d02a67b2c7b15233d5ef58392b9e6c28ff5 Mon Sep 17 00:00:00 2001 From: cyh Date: Tue, 20 May 2025 16:32:01 +0800 Subject: [PATCH] =?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 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 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