添加验证码和隐私政策弹窗(太子指定渠道)
This commit is contained in:
parent
b908465db1
commit
0b6a9433c7
|
|
@ -10,7 +10,7 @@
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.touchscreen"
|
android:name="android.hardware.touchscreen"
|
||||||
android:required="false" /> <!-- <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" /> -->
|
android:required="false" /> <!-- <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" /> -->
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
|
||||||
|
|
@ -43,6 +43,7 @@
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.Octopus"
|
android:theme="@style/Theme.Octopus"
|
||||||
tools:ignore="GoogleAppIndexingWarning"
|
tools:ignore="GoogleAppIndexingWarning"
|
||||||
|
android:usesCleartextTraffic="true"
|
||||||
tools:targetApi="N">
|
tools:targetApi="N">
|
||||||
<activity
|
<activity
|
||||||
android:name=".act.InstallApplicationActivity"
|
android:name=".act.InstallApplicationActivity"
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,16 @@
|
||||||
package com.yingmao.clash.act
|
package com.yingmao.clash.act
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Intent
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
|
import android.net.Uri
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Html
|
import android.text.Html
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.webkit.WebChromeClient
|
import android.webkit.WebChromeClient
|
||||||
|
import android.webkit.WebResourceRequest
|
||||||
import android.webkit.WebSettings
|
import android.webkit.WebSettings
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import android.webkit.WebViewClient
|
import android.webkit.WebViewClient
|
||||||
|
|
@ -41,30 +44,43 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
settings.javaScriptEnabled = true
|
settings.javaScriptEnabled = true
|
||||||
settings.domStorageEnabled = true
|
settings.domStorageEnabled = true
|
||||||
// settings.setAppCacheMaxSize((1024 * 1024 * 4).toLong())
|
// settings.setAppCacheMaxSize((1024 * 1024 * 4).toLong())
|
||||||
val appCachePath = applicationContext.cacheDir.absolutePath
|
// val appCachePath = applicationContext.cacheDir.absolutePath
|
||||||
// settings.setAppCachePath(appCachePath)
|
// settings.setAppCachePath(appCachePath)
|
||||||
settings.allowFileAccess = true
|
settings.allowFileAccess = true
|
||||||
// settings.setAppCacheEnabled(true)
|
// settings.setAppCacheEnabled(true)
|
||||||
|
settings.cacheMode = WebSettings.LOAD_NO_CACHE
|
||||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
|
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
|
||||||
settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
|
settings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
|
||||||
}
|
}
|
||||||
webView.webViewClient = object : WebViewClient() {
|
// webView.webViewClient = object : WebViewClient() {
|
||||||
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
|
// override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
|
||||||
Logger.d("访问的url地址:$url")
|
// Logger.d("访问的url地址:$url")
|
||||||
return true
|
// return true
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
webView.webChromeClient = object : WebChromeClient() {
|
webView.webChromeClient = object : WebChromeClient() {
|
||||||
override fun onProgressChanged(view: WebView?, newProgress: Int) {
|
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(){
|
fun loadAgreeHtml(){
|
||||||
if (BuildConfig.is_ym){
|
if (BuildConfig.is_ym){
|
||||||
webView.loadUrl("file:android_asset/agreement.html")
|
webView.loadUrl("file:android_asset/agreement.html")
|
||||||
}else if (BuildConfig.is_tz){
|
}else if (BuildConfig.is_tz){
|
||||||
webView.loadUrl("file:android_asset/agreement_taizi_hk.html")
|
webView.loadUrl("https://www.taiziapp.com/agreement.html")
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
webView.loadUrl("file:android_asset/agreement_bzy.html")
|
webView.loadUrl("file:android_asset/agreement_bzy.html")
|
||||||
|
|
@ -75,7 +91,7 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
if (BuildConfig.is_ym){
|
if (BuildConfig.is_ym){
|
||||||
webView.loadUrl("file:android_asset/privacy.html")
|
webView.loadUrl("file:android_asset/privacy.html")
|
||||||
} else if (BuildConfig.is_tz){
|
} else if (BuildConfig.is_tz){
|
||||||
webView.loadUrl("file:android_asset/privacy_hk.html")
|
webView.loadUrl("https://www.taiziapp.com/privacy.html")
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
webView.loadUrl("file:android_asset/privacy_bzy.html")
|
webView.loadUrl("file:android_asset/privacy_bzy.html")
|
||||||
|
|
@ -95,7 +111,7 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
if (language.equals("en")) {
|
if (language.equals("en")) {
|
||||||
webView.loadUrl("file:android_asset/agreement_en.html")
|
webView.loadUrl("file:android_asset/agreement_en.html")
|
||||||
} else if (language.equals("zh") && country.equals("HK")) {
|
} else if (language.equals("zh") && country.equals("HK")) {
|
||||||
webView.loadUrl("file:android_asset/agreement_hk.html")
|
loadAgreeHtml()
|
||||||
} else {
|
} else {
|
||||||
loadAgreeHtml()
|
loadAgreeHtml()
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +122,7 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
"Chinese-HK" -> {
|
"Chinese-HK" -> {
|
||||||
webView.loadUrl("file:android_asset/agreement_hk.html")
|
loadAgreeHtml()
|
||||||
}
|
}
|
||||||
|
|
||||||
"English" -> {
|
"English" -> {
|
||||||
|
|
@ -125,7 +141,7 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
if (language.equals("en")) {
|
if (language.equals("en")) {
|
||||||
webView.loadUrl("file:android_asset/privacy_en.html")
|
webView.loadUrl("file:android_asset/privacy_en.html")
|
||||||
} else if (language.equals("zh") && country.equals("HK")) {
|
} else if (language.equals("zh") && country.equals("HK")) {
|
||||||
webView.loadUrl("file:android_asset/privacy_hk.html")
|
loadPriHtml()
|
||||||
} else {
|
} else {
|
||||||
loadPriHtml()
|
loadPriHtml()
|
||||||
}
|
}
|
||||||
|
|
@ -136,7 +152,7 @@ class AgreementAndPrivacyActivity : BaseActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
"Chinese-HK" -> {
|
"Chinese-HK" -> {
|
||||||
webView.loadUrl("file:android_asset/privacy_hk.html")
|
loadPriHtml()
|
||||||
}
|
}
|
||||||
|
|
||||||
"English" -> {
|
"English" -> {
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import com.yingmao.clash.net.http.HttpStatus
|
||||||
import com.yingmao.clash.net.http.entity.RegisterRsp
|
import com.yingmao.clash.net.http.entity.RegisterRsp
|
||||||
import com.yingmao.clash.util.AESUtil
|
import com.yingmao.clash.util.AESUtil
|
||||||
import com.yingmao.clash.util.CommonUtils
|
import com.yingmao.clash.util.CommonUtils
|
||||||
import com.yingmao.clash.util.Utils
|
|
||||||
import com.yingmao.clash.view.PasswordTransformationMethodBigDot
|
import com.yingmao.clash.view.PasswordTransformationMethodBigDot
|
||||||
import com.yingmao.clash.view.RxToast
|
import com.yingmao.clash.view.RxToast
|
||||||
import com.yingmao.clash.view.SlidingVerification
|
import com.yingmao.clash.view.SlidingVerification
|
||||||
|
|
@ -146,7 +145,7 @@ class RegisterActivity : BaseActivity(), View.OnClickListener {
|
||||||
req_json.addProperty("password", password)
|
req_json.addProperty("password", password)
|
||||||
req_json.addProperty("checkPassword", password)
|
req_json.addProperty("checkPassword", password)
|
||||||
req_json.addProperty("invitationCode", BuildConfig.productId)
|
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("from", "5")
|
||||||
var data = AESUtil.byteArrayToHexStr(
|
var data = AESUtil.byteArrayToHexStr(
|
||||||
AESUtil.encrypt(req_json.toString())
|
AESUtil.encrypt(req_json.toString())
|
||||||
|
|
@ -187,14 +186,14 @@ class RegisterActivity : BaseActivity(), View.OnClickListener {
|
||||||
Log.d("it.progress==>${it.progress}")
|
Log.d("it.progress==>${it.progress}")
|
||||||
if (it.progress >= it.max) {
|
if (it.progress >= it.max) {
|
||||||
it.isEnabled = false
|
it.isEnabled = false
|
||||||
verificationSv.progress=it.max
|
verificationSv.progress = it.max
|
||||||
verificationTipTv.text = getString(R.string.verification_success)
|
verificationTipTv.text = getString(R.string.verification_success)
|
||||||
verificationTipTv.setTextColor(R.color.black)
|
verificationTipTv.setTextColor(R.color.black)
|
||||||
verificationSv.setProgressDrawableTiled(getDrawable(R.drawable.login_btn_bg_selector))
|
verificationSv.setProgressDrawableTiled(getDrawable(R.drawable.login_btn_bg_selector))
|
||||||
|
|
||||||
if (!checkInput()) {
|
if (!checkInput()) {
|
||||||
|
|
||||||
}else {
|
} else {
|
||||||
|
|
||||||
}
|
}
|
||||||
} else it.progress = 0
|
} else it.progress = 0
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ package com.yingmao.clash.act
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
|
|
@ -10,10 +11,17 @@ import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
|
import android.text.SpannableString
|
||||||
|
import android.text.TextPaint
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.text.style.ClickableSpan
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.WindowManager
|
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.ProgressBar
|
||||||
import android.widget.RelativeLayout
|
import android.widget.RelativeLayout
|
||||||
import android.widget.TextView
|
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.AESUtil
|
||||||
import com.yingmao.clash.util.Utils
|
import com.yingmao.clash.util.Utils
|
||||||
import com.yingmao.clash.view.RxToast
|
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.DialogAppVersion
|
||||||
import com.yingmao.clash.view.dialog.DialogDoMainChoose
|
import com.yingmao.clash.view.dialog.DialogDoMainChoose
|
||||||
import com.yingmao.clash.view.dialog.RxDialogSureCancel
|
import com.yingmao.clash.view.dialog.RxDialogSureCancel
|
||||||
|
|
@ -73,14 +82,21 @@ class SplashActivity : BaseActivity() {
|
||||||
private val mPermissions = hashSetOf<String>()
|
private val mPermissions = hashSetOf<String>()
|
||||||
private val PERMISSION_REQUEST_CODE: Int = 1
|
private val PERMISSION_REQUEST_CODE: Int = 1
|
||||||
private val PERMISSION_SETTING_REQUEST_CODE = 2
|
private val PERMISSION_SETTING_REQUEST_CODE = 2
|
||||||
|
private val Captcha_REQUEST_CODE = 3333
|
||||||
private lateinit var rlPb: View
|
private lateinit var rlPb: View
|
||||||
private lateinit var ll_action: 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 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 = ""
|
private var initErrMsg = ""
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
|
@ -89,13 +105,13 @@ class SplashActivity : BaseActivity() {
|
||||||
|
|
||||||
setLocalLanguage()
|
setLocalLanguage()
|
||||||
initErrMsg = resources.getString(R.string.splashErrorTips)
|
initErrMsg = resources.getString(R.string.splashErrorTips)
|
||||||
username = Utils.getUniqueID(this)
|
|
||||||
// var username2 = Utils.getUniqueID2(this);
|
// var username2 = Utils.getUniqueID2(this);
|
||||||
// com.cncat.vpn.common.log.Log.d("username==>" + username + ", username2==>" + username2)
|
// com.cncat.vpn.common.log.Log.d("username==>" + username + ", username2==>" + username2)
|
||||||
splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java)
|
splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java)
|
||||||
observe(this, splashAtyVM)
|
observe(this, splashAtyVM)
|
||||||
setContentView(R.layout.layout_splash_activity)
|
setContentView(R.layout.layout_splash_activity)
|
||||||
rlMain=findViewById(R.id.rlMain)
|
rlMain = findViewById(R.id.rlMain)
|
||||||
|
|
||||||
rlPb = findViewById(R.id.rl_pb)
|
rlPb = findViewById(R.id.rl_pb)
|
||||||
ll_action = findViewById(R.id.ll_action)
|
ll_action = findViewById(R.id.ll_action)
|
||||||
|
|
@ -107,8 +123,14 @@ class SplashActivity : BaseActivity() {
|
||||||
serStore.isBZY = true
|
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.READ_PHONE_STATE)
|
||||||
// mPermissions.add(Manifest.permission.INTERNET)
|
// mPermissions.add(Manifest.permission.INTERNET)
|
||||||
// mPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE)
|
// mPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE)
|
||||||
|
|
@ -179,8 +201,7 @@ class SplashActivity : BaseActivity() {
|
||||||
// "ym encrypt:" +
|
// "ym encrypt:" +
|
||||||
// AESUtil.byteArrayToHexStr(
|
// AESUtil.byteArrayToHexStr(
|
||||||
// AESUtil.encrypt(
|
// 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"
|
// val Sgtr= AESUtil.decrypt("73CC9D719D4B46616F7FB72DBFABFA88B716D1AF0F8B8A42929F9EE5D198EB059A7934DD0074D1810CD56B5312FD5FDACC25EED6C6B2351DB11A3BF78E3010A417CDE40EEFF768849AEF25773AF541C01464DB7C9B0B7C30D36EEA414EA86F9923AAF325C15BB75170C148C4F257AA2D6A32BFB582D498B13B38E49BB8DF1663")
|
||||||
// ,registerKey,registerIV2)
|
|
||||||
// println("Sgtr==>$Sgtr")
|
// println("Sgtr==>$Sgtr")
|
||||||
|
|
||||||
|
|
||||||
// OpenInstall.getWakeUp(intent, wakeUpAdapter)
|
// OpenInstall.getWakeUp(intent, wakeUpAdapter)
|
||||||
// OpenInstall.getInstall { appData, error ->
|
// OpenInstall.getInstall { appData, error ->
|
||||||
// var appData = appData
|
// var appData = appData
|
||||||
|
|
@ -281,6 +261,104 @@ class SplashActivity : BaseActivity() {
|
||||||
// 此处要调用,否则App在后台运行时,会无法获取
|
// 此处要调用,否则App在后台运行时,会无法获取
|
||||||
// OpenInstall.getWakeUp(intent, wakeUpAdapter)
|
// 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() {
|
private fun setLocalLanguage() {
|
||||||
var defLan = ""
|
var defLan = ""
|
||||||
if (BuildConfig.is_tz) {
|
if (BuildConfig.is_tz) {
|
||||||
|
|
@ -386,7 +464,14 @@ class SplashActivity : BaseActivity() {
|
||||||
splashAtyVM.checkLogin()
|
splashAtyVM.checkLogin()
|
||||||
} else {
|
} else {
|
||||||
// doRegister()
|
// doRegister()
|
||||||
doRegisterByEncryption()
|
if (!BuildConfig.is_ym) {
|
||||||
|
rlPb.visibility = View.INVISIBLE
|
||||||
|
webView.visibility = View.VISIBLE
|
||||||
|
setWebView()
|
||||||
|
} else {
|
||||||
|
webView.visibility = View.GONE
|
||||||
|
doRegisterByEncryption()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {//非渠道自由包
|
} else {//非渠道自由包
|
||||||
val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN)
|
val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_TOKEN)
|
||||||
|
|
@ -424,7 +509,7 @@ class SplashActivity : BaseActivity() {
|
||||||
"password" to BZYConstants.defaultPassword,
|
"password" to BZYConstants.defaultPassword,
|
||||||
"checkPassword" to BZYConstants.defaultPassword,
|
"checkPassword" to BZYConstants.defaultPassword,
|
||||||
"id" to BuildConfig.productId,
|
"id" to BuildConfig.productId,
|
||||||
"clientIp" to Utils.getIPAddress(),
|
"clientIp" to "127.0.0.1",
|
||||||
"from" to "5",
|
"from" to "5",
|
||||||
)
|
)
|
||||||
splashAtyVM.register(params)
|
splashAtyVM.register(params)
|
||||||
|
|
@ -432,14 +517,16 @@ class SplashActivity : BaseActivity() {
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun doRegisterByEncryption() {
|
fun doRegisterByEncryption() {
|
||||||
|
|
||||||
var req_json = JsonObject()
|
var req_json = JsonObject()
|
||||||
req_json.addProperty("password", BZYConstants.defaultPassword)
|
req_json.addProperty("password", BZYConstants.defaultPassword)
|
||||||
req_json.addProperty("checkPassword", BZYConstants.defaultPassword)
|
req_json.addProperty("checkPassword", BZYConstants.defaultPassword)
|
||||||
req_json.addProperty("invitationCode", BuildConfig.productId)
|
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("from", "5")
|
||||||
req_json.addProperty("androidDevice", username)
|
req_json.addProperty("androidDevice", username)
|
||||||
|
if (captchaInfo.isNotEmpty()) {
|
||||||
|
req_json.addProperty("captchaVerifyParam", captchaInfo)
|
||||||
|
}
|
||||||
if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) {
|
if (registerKey.isNotEmpty() && registerIV2.isNotEmpty()) {
|
||||||
val data = AESUtil.byteArrayToHexStr(
|
val data = AESUtil.byteArrayToHexStr(
|
||||||
AESUtil.RegisterEncrypt(req_json.toString(), registerKey, registerIV2)
|
AESUtil.RegisterEncrypt(req_json.toString(), registerKey, registerIV2)
|
||||||
|
|
@ -543,6 +630,7 @@ class SplashActivity : BaseActivity() {
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
override fun httpSuccess(httpStatus: HttpStatus.Success) {
|
override fun httpSuccess(httpStatus: HttpStatus.Success) {
|
||||||
when (httpStatus.reqType) {
|
when (httpStatus.reqType) {
|
||||||
HttpReqType.REGISTER -> {
|
HttpReqType.REGISTER -> {
|
||||||
|
|
@ -602,6 +690,12 @@ class SplashActivity : BaseActivity() {
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
finish()
|
finish()
|
||||||
// graphicVerificationDialog()
|
// graphicVerificationDialog()
|
||||||
|
} else if (code == "403") {
|
||||||
|
pb_web.visibility = View.INVISIBLE
|
||||||
|
message?.let {
|
||||||
|
RxToast.error(it)
|
||||||
|
}
|
||||||
|
webView.setOnTouchListener { _, _ -> false }
|
||||||
} else {
|
} else {
|
||||||
MaterialDialog(this@SplashActivity).show {
|
MaterialDialog(this@SplashActivity).show {
|
||||||
message(text = initErrMsg)
|
message(text = initErrMsg)
|
||||||
|
|
@ -676,19 +770,23 @@ class SplashActivity : BaseActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
HttpReqType.SplashBg->{
|
|
||||||
|
HttpReqType.SplashBg -> {
|
||||||
val startingBeans = httpStatus.rsp as StartingBeans
|
val startingBeans = httpStatus.rsp as StartingBeans
|
||||||
startingBeans.data
|
startingBeans.data
|
||||||
if(startingBeans.data!=null){
|
if (startingBeans.data != null) {
|
||||||
if(startingBeans.data!!.exist){
|
if (startingBeans.data!!.exist) {
|
||||||
Log.d("SplashActivityStarting","startingBeans.data!!.img::"+ startingBeans.data!!.img)
|
Log.d(
|
||||||
|
"SplashActivityStarting",
|
||||||
|
"startingBeans.data!!.img::" + startingBeans.data!!.img
|
||||||
|
)
|
||||||
startingBeans.data!!.img.let {
|
startingBeans.data!!.img.let {
|
||||||
Glide.with(this).asBitmap()
|
Glide.with(this).asBitmap()
|
||||||
.load(startingBeans.data!!.img)
|
.load(startingBeans.data!!.img)
|
||||||
.into(object :SimpleTarget<Bitmap>(){
|
.into(object : SimpleTarget<Bitmap>() {
|
||||||
override fun onResourceReady(
|
override fun onResourceReady(
|
||||||
resource: Bitmap,
|
resource: Bitmap,
|
||||||
transition: Transition<in Bitmap>?
|
transition: Transition<in Bitmap>?,
|
||||||
) {
|
) {
|
||||||
val bitmapDrawable = BitmapDrawable(resource)
|
val bitmapDrawable = BitmapDrawable(resource)
|
||||||
rlMain.setBackgroundDrawable(bitmapDrawable)
|
rlMain.setBackgroundDrawable(bitmapDrawable)
|
||||||
|
|
@ -701,7 +799,8 @@ class SplashActivity : BaseActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
HttpReqType.App_VERION_CHECK->{
|
|
||||||
|
HttpReqType.App_VERION_CHECK -> {
|
||||||
(httpStatus.rsp as AppVersionCheckRsp).let { avcr ->
|
(httpStatus.rsp as AppVersionCheckRsp).let { avcr ->
|
||||||
com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr")
|
com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr")
|
||||||
if (avcr.code == 200) {
|
if (avcr.code == 200) {
|
||||||
|
|
@ -714,13 +813,13 @@ class SplashActivity : BaseActivity() {
|
||||||
if (!TextUtils.isEmpty(md.versionPath)) {
|
if (!TextUtils.isEmpty(md.versionPath)) {
|
||||||
showUpdateDialog(md.versionPath!!, md.illustrate!!, false)
|
showUpdateDialog(md.versionPath!!, md.illustrate!!, false)
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
|
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
|
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
finish()
|
finish()
|
||||||
|
|
@ -737,14 +836,14 @@ class SplashActivity : BaseActivity() {
|
||||||
when (httpStatus.reqType) {
|
when (httpStatus.reqType) {
|
||||||
HttpReqType.REGISTER -> {
|
HttpReqType.REGISTER -> {
|
||||||
rlPb.visibility = View.GONE
|
rlPb.visibility = View.GONE
|
||||||
|
pb_web.visibility = View.INVISIBLE
|
||||||
com.cncat.vpn.common.log.Log.d("httpFailure HttpReqType.REGISTER")
|
com.cncat.vpn.common.log.Log.d("httpFailure HttpReqType.REGISTER")
|
||||||
try {
|
try {
|
||||||
RxToast.error("检测到网络异常,请尝试切换其他地址.")
|
RxToast.error("检测到网络异常,请尝试切换其他地址.")
|
||||||
if (dialogDoMainChoose==null) {
|
if (dialogDoMainChoose == null) {
|
||||||
dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity)
|
dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity)
|
||||||
}
|
}
|
||||||
if (dialogDoMainChoose?.isShowing==false){
|
if (dialogDoMainChoose?.isShowing == false) {
|
||||||
dialogDoMainChoose?.setOnTryButtonListener(object :
|
dialogDoMainChoose?.setOnTryButtonListener(object :
|
||||||
DialogDoMainChoose.OnTryButtonListener {
|
DialogDoMainChoose.OnTryButtonListener {
|
||||||
override fun tryButton() {
|
override fun tryButton() {
|
||||||
|
|
@ -757,7 +856,7 @@ class SplashActivity : BaseActivity() {
|
||||||
override fun cancel() {
|
override fun cancel() {
|
||||||
com.cncat.vpn.common.log.Log.d("tryButton REGISTER cancel")
|
com.cncat.vpn.common.log.Log.d("tryButton REGISTER cancel")
|
||||||
dialogDoMainChoose?.dismiss()
|
dialogDoMainChoose?.dismiss()
|
||||||
dialogDoMainChoose=null
|
dialogDoMainChoose = null
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
dialogDoMainChoose?.setOnListItemListener(object :
|
dialogDoMainChoose?.setOnListItemListener(object :
|
||||||
|
|
@ -817,15 +916,18 @@ class SplashActivity : BaseActivity() {
|
||||||
SplashHelper(splashAtyVM).getHostWithFallback { success ->
|
SplashHelper(splashAtyVM).getHostWithFallback { success ->
|
||||||
MainScope().launch {
|
MainScope().launch {
|
||||||
if (success) {
|
if (success) {
|
||||||
if (dialogDoMainChoose==null) {
|
if (dialogDoMainChoose == null) {
|
||||||
dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity)
|
dialogDoMainChoose = DialogDoMainChoose(this@SplashActivity)
|
||||||
}
|
}
|
||||||
if (dialogDoMainChoose?.isShowing==false){
|
if (dialogDoMainChoose?.isShowing == false) {
|
||||||
dialogDoMainChoose?.setOnTryButtonListener(object :
|
dialogDoMainChoose?.setOnTryButtonListener(object :
|
||||||
DialogDoMainChoose.OnTryButtonListener {
|
DialogDoMainChoose.OnTryButtonListener {
|
||||||
override fun tryButton() {
|
override fun tryButton() {
|
||||||
var currentHost = MMKV.defaultMMKV()
|
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}")
|
// com.cncat.vpn.common.log.Log.d("tryButton CHECK_LOGIN currentHost==>${currentHost}")
|
||||||
splashAtyVM.checkLogin()
|
splashAtyVM.checkLogin()
|
||||||
}
|
}
|
||||||
|
|
@ -974,13 +1076,23 @@ class SplashActivity : BaseActivity() {
|
||||||
@RequiresApi(Build.VERSION_CODES.M)
|
@RequiresApi(Build.VERSION_CODES.M)
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
com.cncat.vpn.common.log.Log.d("onActivityResult requestCode==>${requestCode}")
|
||||||
if (requestCode == PERMISSION_SETTING_REQUEST_CODE) {
|
if (requestCode == PERMISSION_SETTING_REQUEST_CODE) {
|
||||||
if (checkPermissions(mPermissions)) {
|
if (checkPermissions(mPermissions)) {
|
||||||
isNeedRegister() //TODO
|
isNeedRegister() //TODO
|
||||||
} else {
|
} else {
|
||||||
requestPermissions(deniedPermissions.toTypedArray(), PERMISSION_REQUEST_CODE)
|
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() {
|
private fun toMainPage() {
|
||||||
|
|
@ -1002,6 +1114,7 @@ class SplashActivity : BaseActivity() {
|
||||||
config.locale = locale
|
config.locale = locale
|
||||||
resources.updateConfiguration(config, metrics)
|
resources.updateConfiguration(config, metrics)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) {
|
private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) {
|
||||||
if (TextUtils.isEmpty(url)) {
|
if (TextUtils.isEmpty(url)) {
|
||||||
RxToast.error(resources.getString(R.string.downloadEmpty))
|
RxToast.error(resources.getString(R.string.downloadEmpty))
|
||||||
|
|
@ -1061,6 +1174,7 @@ class SplashActivity : BaseActivity() {
|
||||||
})
|
})
|
||||||
dialog.show()
|
dialog.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun installApk(filePath: String) {
|
fun installApk(filePath: String) {
|
||||||
val file = File(filePath)
|
val file = File(filePath)
|
||||||
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ class MainApplication : Application() {
|
||||||
userBean = bean
|
userBean = bean
|
||||||
}
|
}
|
||||||
|
|
||||||
fun restartApp(activity: Activity,listener:OnRestartButtonListener) {
|
fun restartApp(activity: Activity, listener: OnRestartButtonListener) {
|
||||||
|
|
||||||
var dialogDoMainChoose = DialogSureRestartChoose(activity)
|
var dialogDoMainChoose = DialogSureRestartChoose(activity)
|
||||||
if (!dialogDoMainChoose.isShowing) {
|
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 enterButton()
|
||||||
fun cancelButton()
|
fun cancelButton()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context?) {
|
override fun attachBaseContext(base: Context?) {
|
||||||
super.attachBaseContext(base)
|
super.attachBaseContext(base)
|
||||||
}
|
}
|
||||||
|
|
@ -121,37 +159,7 @@ class MainApplication : Application() {
|
||||||
val MMKVRootDir = MMKV.initialize(applicationContext)
|
val MMKVRootDir = MMKV.initialize(applicationContext)
|
||||||
Logger.i("MMKV_ROOT_DIR:$MMKVRootDir")
|
Logger.i("MMKV_ROOT_DIR:$MMKVRootDir")
|
||||||
updateNotificationChannels()
|
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) {
|
fun updateActivity(language: String, locale: Locale) {
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ class BZYConstants {
|
||||||
const val REQUEST_CODE_PAY_WEB_Stripe = 1001
|
const val REQUEST_CODE_PAY_WEB_Stripe = 1001
|
||||||
const val REQUEST_CODE_PAY_WEB_BiLai = 1002
|
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"
|
const val MMKV_KEY_IS_PERFECT = "isPerfect"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,9 @@ class HomeFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatcher
|
||||||
llLine = view.findViewById(R.id.llLine)
|
llLine = view.findViewById(R.id.llLine)
|
||||||
clActivity = view.findViewById(R.id.clActivity)
|
clActivity = view.findViewById(R.id.clActivity)
|
||||||
clMember = view.findViewById(R.id.clMember)
|
clMember = view.findViewById(R.id.clMember)
|
||||||
|
if (BuildConfig.productId=="182268"&&BuildConfig.is_tz){
|
||||||
|
clActivity.visibility=View.INVISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
llLine.setOnClickListener {
|
llLine.setOnClickListener {
|
||||||
if (checkExpire()) {
|
if (checkExpire()) {
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,11 @@ class SettingFragment : BaseFragment(), CoroutineScope by CoroutineScope(Dispatc
|
||||||
tvVersion = view.findViewById(R.id.tvVersion)
|
tvVersion = view.findViewById(R.id.tvVersion)
|
||||||
clFire = view.findViewById(R.id.clFire)
|
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()
|
setExpireDate()
|
||||||
|
|
||||||
if (checkExpire()) {
|
if (checkExpire()) {
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ class NetService private constructor() : INetService {
|
||||||
// "https://api.gaogaoshousoft.cc:18001"
|
// "https://api.gaogaoshousoft.cc:18001"
|
||||||
// "https://api.yingmaox.cc:8700"
|
// "https://api.yingmaox.cc:8700"
|
||||||
// "https://113.108.210.50:21002"
|
// "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, BuildConfig.service_url)!!
|
||||||
// MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, "https://app.bazhuayujiasu.cc:18001")
|
// MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_CURRENT_HOST, "https://app.bazhuayujiasu.cc:18001")
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -254,32 +254,7 @@ object Utils {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getIPAddress(): String {
|
|
||||||
try {
|
|
||||||
val en: Enumeration<NetworkInterface> = NetworkInterface.getNetworkInterfaces()
|
|
||||||
while (en.hasMoreElements()) {
|
|
||||||
val intf: NetworkInterface = en.nextElement()
|
|
||||||
val enumIpAddr: Enumeration<InetAddress> = 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 {
|
public fun isAppInstalled(context: Context, packageName: String): Boolean {
|
||||||
return try {
|
return try {
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
|
||||||
|
>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/activity_bg"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintWidth_percent="0.8"
|
||||||
|
tools:ignore="MissingConstraints">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_title"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="用户协议与隐私政策说明"
|
||||||
|
android:textColor="@color/blue_4072FE"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/rg_pay_type"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="15dp"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/dialog_agreement_info"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
</TextView>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_margin="15dp"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/but_cancel"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/activity_close_bg"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:textSize="12sp"
|
||||||
|
|
||||||
|
android:layout_marginStart="@dimen/dp_15"
|
||||||
|
android:layout_marginEnd="@dimen/dp_15"
|
||||||
|
android:paddingBottom="5dp"
|
||||||
|
android:text="@string/disagree">
|
||||||
|
</TextView>
|
||||||
|
<TextView
|
||||||
|
|
||||||
|
android:id="@+id/but_agree"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/activity_jump_bg"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/agree"
|
||||||
|
android:paddingTop="5dp"
|
||||||
|
android:paddingBottom="5dp">
|
||||||
|
</TextView>
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
@ -12,6 +12,25 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|
||||||
>
|
>
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<WebView
|
||||||
|
android:id="@+id/webView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="invisible"
|
||||||
|
android:background="@color/main_bg"
|
||||||
|
/>
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/pb_web"
|
||||||
|
android:visibility="invisible"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminateTint="@color/blue_0136CB" />
|
||||||
|
</RelativeLayout>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
android:id="@+id/ll_action"
|
android:id="@+id/ll_action"
|
||||||
|
|
|
||||||
|
|
@ -351,4 +351,6 @@ Service Description\n
|
||||||
<string name="sure_restart">Suggest restarting</string>
|
<string name="sure_restart">Suggest restarting</string>
|
||||||
<string name="restart">Restart</string>
|
<string name="restart">Restart</string>
|
||||||
<string name="node_item_test">Speed test</string>
|
<string name="node_item_test">Speed test</string>
|
||||||
|
<string name="agree">Agree</string>
|
||||||
|
<string name="disagree">Disagree</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
@ -341,4 +341,6 @@
|
||||||
<string name="sure_restart">"建議重啓 "</string>
|
<string name="sure_restart">"建議重啓 "</string>
|
||||||
<string name="restart">"重啓 "</string>
|
<string name="restart">"重啓 "</string>
|
||||||
<string name="node_item_test">線路測速</string>
|
<string name="node_item_test">線路測速</string>
|
||||||
|
<string name="agree">同意</string>
|
||||||
|
<string name="disagree">不同意</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
@ -340,4 +340,6 @@
|
||||||
<string name="sure_restart">"建議重啓 "</string>
|
<string name="sure_restart">"建議重啓 "</string>
|
||||||
<string name="restart">"重啓 "</string>
|
<string name="restart">"重啓 "</string>
|
||||||
<string name="node_item_test">線路測速</string>
|
<string name="node_item_test">線路測速</string>
|
||||||
|
<string name="agree">同意</string>
|
||||||
|
<string name="disagree">不同意</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
@ -131,6 +131,7 @@
|
||||||
<string name="CheckLoginFailure">检查登录失败</string>
|
<string name="CheckLoginFailure">检查登录失败</string>
|
||||||
<string name="LoginException">登录异常</string>
|
<string name="LoginException">登录异常</string>
|
||||||
<string name="AgreeAgreement">同意《隐私协议》和《用户协议》</string>
|
<string name="AgreeAgreement">同意《隐私协议》和《用户协议》</string>
|
||||||
|
<string name="AgreeAgreement2">请您充分阅读并理解《隐私政策》和《用户协议》我们非常重视您的隐私和个人信息,在您使用过程中,我们会收集部分个人信息。例如,会申请设备信息等。您可以点击《用户协议》和《隐私政策》查看详细内容。您可以选择“同意”继续使用我们的服务,或者选择“不同意”退出。</string>
|
||||||
<string name="ReadAgreement">请仔细阅读并同意《隐私协议》和《用户协议》</string>
|
<string name="ReadAgreement">请仔细阅读并同意《隐私协议》和《用户协议》</string>
|
||||||
<string name="loginTips">小提示:自动注册初始密码为 123456,手动注册请忽略</string>
|
<string name="loginTips">小提示:自动注册初始密码为 123456,手动注册请忽略</string>
|
||||||
<string name="LoginTips2">小提示2:华为鸿蒙系统由于鉴定机制的问题,将App误报为诈骗软件,请忽略正常放心使用,有任何问题联系客服及售后</string>
|
<string name="LoginTips2">小提示2:华为鸿蒙系统由于鉴定机制的问题,将App误报为诈骗软件,请忽略正常放心使用,有任何问题联系客服及售后</string>
|
||||||
|
|
@ -359,4 +360,6 @@
|
||||||
<string name="sure_restart">建议重启</string>
|
<string name="sure_restart">建议重启</string>
|
||||||
<string name="restart">重启</string>
|
<string name="restart">重启</string>
|
||||||
<string name="node_item_test">线路测速</string>
|
<string name="node_item_test">线路测速</string>
|
||||||
|
<string name="agree">同意</string>
|
||||||
|
<string name="disagree">不同意</string>
|
||||||
</resources>
|
</resources>
|
||||||
Loading…
Reference in New Issue