Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
cyh 2025-04-14 14:45:52 +08:00
commit c0b7d7e9d0
20 changed files with 914 additions and 226 deletions

View File

@ -82,6 +82,9 @@ class ActivityActivity : BaseActivity() {
override fun onMyItemChildClickListener(itemBean: Activity_) { override fun onMyItemChildClickListener(itemBean: Activity_) {
if (itemBean.redirectLink.contains("BindAccount")) { if (itemBean.redirectLink.contains("BindAccount")) {
showBindAccDialog(itemBean) showBindAccDialog(itemBean)
}else if(itemBean.redirectLink.contains("weekcharge")){
val intent = Intent(CommonUtils.getApp(), MemberRechargeActivity::class.java)
startActivity(intent)
}else { }else {
showActDialog(itemBean) showActDialog(itemBean)
} }

View File

@ -1,8 +1,10 @@
package com.yingmao.clash.act package com.yingmao.clash.act
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.text.Spannable import android.text.Spannable
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
@ -15,7 +17,9 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.* import android.widget.*
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.yingmao.clash.view.dialog.RxDialogShapeLoading import com.yingmao.clash.view.dialog.RxDialogShapeLoading
import com.yingmao.clash.net.http.entity.LoginRsp import com.yingmao.clash.net.http.entity.LoginRsp
@ -28,18 +32,23 @@ import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.entity.CheckLoginRsp import com.yingmao.clash.entity.CheckLoginRsp
import com.yingmao.clash.listener.AsyncBodyCallback import com.yingmao.clash.listener.AsyncBodyCallback
import com.yingmao.clash.listener.AsyncCallback import com.yingmao.clash.listener.AsyncCallback
import com.yingmao.clash.listener.DownLoadListener
import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpReqType
import com.yingmao.clash.net.http.HttpStatus import com.yingmao.clash.net.http.HttpStatus
import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
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.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.dialog.DialogAppVersion
import com.yingmao.clash.view.dialog.DialogDoMainChoose import com.yingmao.clash.view.dialog.DialogDoMainChoose
import com.yingmao.clash.vm.LoginAtyVM import com.yingmao.clash.vm.LoginAtyVM
import com.yingmao.clash.vm.SplashAtyVM import com.yingmao.clash.vm.SplashAtyVM
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File
class LoginActivity : BaseActivity(), View.OnClickListener { class LoginActivity : BaseActivity(), View.OnClickListener {
private lateinit var loginViewMode: LoginAtyVM private lateinit var loginViewMode: LoginAtyVM
@ -73,6 +82,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener {
splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java) splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java)
observe(this, loginViewMode) observe(this, loginViewMode)
initViews() initViews()
loginViewMode.upgradeVersion()
} }
override fun httpLoading(httpStatus: HttpStatus.Loading) { override fun httpLoading(httpStatus: HttpStatus.Loading) {
@ -151,6 +161,23 @@ class LoginActivity : BaseActivity(), View.OnClickListener {
) )
} }
} }
}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) {
avcr.data?.let { md ->
if (md.isForce) { //强制更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, true)
}
} else if (md.isUpgrade) { //更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, false)
}
}
}
}
}
} }
} }
@ -694,5 +721,78 @@ class LoginActivity : BaseActivity(), View.OnClickListener {
passwordEt.transformationMethod = PasswordTransformationMethodBigDot() passwordEt.transformationMethod = PasswordTransformationMethodBigDot()
} }
} }
private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) {
if (TextUtils.isEmpty(url)) {
RxToast.error(resources.getString(R.string.downloadEmpty))
return
}
var notice = illustrate
if (TextUtils.isEmpty(illustrate)) {
notice = resources.getString(R.string.NewVersion)
}
var isDownloaded = false;
var isFinish = false
var downFilePath = ""
val dialog = DialogAppVersion(this,
notice,
url,
isForce,
object : DialogAppVersion.OnClickListener {
override fun ok(tv_down: TextView, pb_down: ProgressBar) {
if (isFinish) {
installApk(downFilePath)
return
}
if (isDownloaded) {
RxToast.info(resources.getString(R.string.downloading))
return
}
isDownloaded = true
splashAtyVM.downLoadFile(url, object : DownLoadListener {
@SuppressLint("SetTextI18n")
override fun loading(progress: Int) {
lifecycleScope.async {
pb_down.progress = progress
tv_down.text = resources.getString(R.string.download) + "$progress%"
}
}
override fun finish(path: String) {
com.cncat.vpn.common.log.Log.d("down finish path==>$path")
isFinish = true
downFilePath = path
installApk(path)
}
override fun error(msg: String) {
com.cncat.vpn.common.log.Log.d("down error msg==>$msg")
}
})
}
override fun cancel() {
}
})
dialog.show()
}
fun installApk(filePath: String) {
val file = File(filePath)
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(this, "${applicationContext.packageName}.fileprovider", file)
} else {
Uri.fromFile(file)
}
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/vnd.android.package-archive")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
startActivity(intent)
}
} }

View File

@ -29,6 +29,7 @@ import com.stripe.android.confirmAlipayPayment
import com.stripe.android.model.ConfirmPaymentIntentParams import com.stripe.android.model.ConfirmPaymentIntentParams
import com.stripe.android.model.StripeIntent import com.stripe.android.model.StripeIntent
import com.tencent.mmkv.MMKV import com.tencent.mmkv.MMKV
import com.yingmao.clash.BuildConfig
import com.yingmao.clash.R import com.yingmao.clash.R
import com.yingmao.clash.base.BaseActivity import com.yingmao.clash.base.BaseActivity
import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.BZYConstants
@ -302,6 +303,25 @@ class MemberRechargeActivity: BaseActivity() {
} }
} }
} }
HttpReqType.StripeWeChat ->{
(httpStatus.rsp as PayUploadParamData).let {
if(it.data!=null){
paymentIntentClientSecret= it.data.clientSecret.toString()
val serviceUrl = MMKV.defaultMMKV().decodeString(
BZYConstants.MMKV_KEY_CURRENT_HOST,
BuildConfig.service_url
)!!
val payUrl=serviceUrl+"/78zccgy0nsgknh9n4/iiii.html?s=${it.data.clientSecret.toString()}"
val uri = Uri.parse(payUrl)
val intent = Intent(Intent.ACTION_VIEW)
intent.setData(uri)
startActivity(intent)
}else{
hideLoading()
RxToast.info(getString(R.string.NoPaymentReceipt))
}
}
}
HttpReqType.CHECK_LOGIN -> { HttpReqType.CHECK_LOGIN -> {
Logger.d("支付成功更新有效期") Logger.d("支付成功更新有效期")
val checkLoginRsp = httpStatus.rsp val checkLoginRsp = httpStatus.rsp
@ -557,6 +577,8 @@ class MemberRechargeActivity: BaseActivity() {
findViewById<LinearLayout>(R.id.llStripePay).visibility= View.VISIBLE findViewById<LinearLayout>(R.id.llStripePay).visibility= View.VISIBLE
findViewById<TextView>(R.id.tvStripePay).visibility= View.VISIBLE findViewById<TextView>(R.id.tvStripePay).visibility= View.VISIBLE
findViewById<AppCompatImageView>(R.id.ivStripeAlipay).visibility= View.VISIBLE findViewById<AppCompatImageView>(R.id.ivStripeAlipay).visibility= View.VISIBLE
val stripeWechatPay=findViewById<AppCompatImageView>(R.id.ivStripeWechatPay)
stripeWechatPay.visibility= View.VISIBLE
findViewById<AppCompatImageView>(R.id.ivStripeAlipay).setOnClickListener { findViewById<AppCompatImageView>(R.id.ivStripeAlipay).setOnClickListener {
if(selectedGradeID!=0){ if(selectedGradeID!=0){
if(!PayUtils.isAlipayInstalled(this@MemberRechargeActivity)){ if(!PayUtils.isAlipayInstalled(this@MemberRechargeActivity)){
@ -572,6 +594,15 @@ class MemberRechargeActivity: BaseActivity() {
RxToast.info(getString(R.string.NoPaymentReceipt)) RxToast.info(getString(R.string.NoPaymentReceipt))
} }
} }
stripeWechatPay.setOnClickListener {
if(selectedGradeID!=0){
viewModel.getWeChatPayClientSecret(selectedGradeID)
dismiss()
}else{
dismiss()
RxToast.info(getString(R.string.NoPaymentReceipt))
}
}
} }
} }
getCustomView().findViewById<AppCompatImageView>(R.id.ivBack).setOnClickListener { getCustomView().findViewById<AppCompatImageView>(R.id.ivBack).setOnClickListener {

View File

@ -1,6 +1,7 @@
package com.yingmao.clash.act package com.yingmao.clash.act
import android.Manifest import android.Manifest
import android.annotation.SuppressLint
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
@ -9,14 +10,18 @@ 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.TextUtils
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.widget.ProgressBar
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView import com.afollestad.materialdialogs.customview.customView
@ -45,19 +50,23 @@ import com.yingmao.clash.net.http.entity.RegisterRsp
import com.cncat.vpn.service.ClashManager import com.cncat.vpn.service.ClashManager
import com.cncat.vpn.service.remote.IClashManager import com.cncat.vpn.service.remote.IClashManager
import com.cncat.vpn.service.remote.wrap import com.cncat.vpn.service.remote.wrap
import com.yingmao.clash.listener.DownLoadListener
import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
import com.yingmao.clash.net.http.entity.StartingBeans 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.DialogAppVersion
import com.yingmao.clash.view.dialog.DialogBandChoose import com.yingmao.clash.view.dialog.DialogBandChoose
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
import com.yingmao.clash.vm.SplashAtyVM import com.yingmao.clash.vm.SplashAtyVM
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.io.File
import java.util.Locale import java.util.Locale
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.async
class SplashActivity : BaseActivity() { class SplashActivity : BaseActivity() {
private val deniedPermissions = hashSetOf<String>() private val deniedPermissions = hashSetOf<String>()
@ -661,6 +670,32 @@ class SplashActivity : BaseActivity() {
} }
} }
HttpReqType.App_VERION_CHECK->{
(httpStatus.rsp as AppVersionCheckRsp).let { avcr ->
com.cncat.vpn.common.log.Log.i("App_VERION_CHECK ==>$avcr")
if (avcr.code == 200) {
avcr.data?.let { md ->
if (md.isForce) { //强制更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, true)
}
} else if (md.isUpgrade) { //更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, false)
}
}else{
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
startActivity(intent)
finish()
}
}
}else{
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
startActivity(intent)
finish()
}
}
}
else -> {} else -> {}
} }
@ -902,10 +937,8 @@ class SplashActivity : BaseActivity() {
} }
private fun toMainPage() { private fun toMainPage() {
val intent = Intent(this, UIMainActivity::class.java) //监测版本是否需要更新
splashAtyVM.appCheck()
startActivity(intent)
finish()
} }
private fun toLoginPage() { private fun toLoginPage() {
@ -922,4 +955,81 @@ 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) {
if (TextUtils.isEmpty(url)) {
RxToast.error(resources.getString(R.string.downloadEmpty))
return
}
var notice = illustrate
if (TextUtils.isEmpty(illustrate)) {
notice = resources.getString(R.string.NewVersion)
}
var isDownloaded = false;
var isFinish = false
var downFilePath = ""
val dialog = DialogAppVersion(this,
notice,
url,
isForce,
object : DialogAppVersion.OnClickListener {
override fun ok(tv_down: TextView, pb_down: ProgressBar) {
if (isFinish) {
installApk(downFilePath)
return
}
if (isDownloaded) {
RxToast.info(resources.getString(R.string.downloading))
return
}
isDownloaded = true
splashAtyVM.downLoadFile(url, object : DownLoadListener {
@SuppressLint("SetTextI18n")
override fun loading(progress: Int) {
lifecycleScope.async {
pb_down.progress = progress
tv_down.text = resources.getString(R.string.download) + "$progress%"
}
}
override fun finish(path: String) {
com.cncat.vpn.common.log.Log.d("down finish path==>$path")
isFinish = true
downFilePath = path
installApk(path)
}
override fun error(msg: String) {
com.cncat.vpn.common.log.Log.d("down error msg==>$msg")
}
})
}
override fun cancel() {
val intent = Intent(this@SplashActivity, UIMainActivity::class.java)
startActivity(intent)
finish()
}
})
dialog.show()
}
fun installApk(filePath: String) {
val file = File(filePath)
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(this, "${applicationContext.packageName}.fileprovider", file)
} else {
Uri.fromFile(file)
}
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/vnd.android.package-archive")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
startActivity(intent)
}
} }

View File

@ -126,7 +126,6 @@ class UIMainActivity : BaseActivity() {
observe(this, mainAtyVM) observe(this, mainAtyVM)
mainAtyVM.startHeartBeat() mainAtyVM.startHeartBeat()
MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false) MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false)
mainAtyVM.appCheck()
mainAtyVM.getAirNodes() mainAtyVM.getAirNodes()
val isGlobal = MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false) val isGlobal = MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false)
newMainActGlo = isGlobal newMainActGlo = isGlobal
@ -190,25 +189,6 @@ class UIMainActivity : BaseActivity() {
override fun httpSuccess(httpStatus: HttpStatus.Success) { override fun httpSuccess(httpStatus: HttpStatus.Success) {
when (httpStatus.reqType) { when (httpStatus.reqType) {
HttpReqType.App_VERION_CHECK -> {
(httpStatus.rsp as AppVersionCheckRsp).let { avcr ->
Log.i("App_VERION_CHECK ==>$avcr")
if (avcr.code == 200) {
avcr.data?.let { md ->
if (md.isForce) { //强制更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, true);
}
} else if (md.isUpgrade) { //更新
if (!TextUtils.isEmpty(md.versionPath)) {
showUpdateDialog(md.versionPath!!, md.illustrate!!, false);
}
}
}
}
}
}
HttpReqType.GET_AIRNODES -> { HttpReqType.GET_AIRNODES -> {
val data = httpStatus.rsp as SubscriptionRsp val data = httpStatus.rsp as SubscriptionRsp
if (data.code != "1000") { if (data.code != "1000") {
@ -341,83 +321,6 @@ class UIMainActivity : BaseActivity() {
} }
} }
} }
private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) {
if (TextUtils.isEmpty(url)) {
RxToast.error(resources.getString(R.string.downloadEmpty))
return
}
var notice = illustrate
if (TextUtils.isEmpty(illustrate)) {
notice = resources.getString(R.string.NewVersion)
}
var isDownloaded = false;
var isFinish = false
var downFilePath = ""
val dialog = DialogAppVersion(this@UIMainActivity,
notice,
url,
isForce,
object : DialogAppVersion.OnClickListener {
override fun ok(tv_down: TextView, pb_down: ProgressBar) {
if (isFinish) {
installApk(downFilePath)
return
}
if (isDownloaded) {
RxToast.info(resources.getString(R.string.downloading))
return
}
isDownloaded = true
mainAtyVM.downLoadFile(url, object : DownLoadListener {
@SuppressLint("SetTextI18n")
override fun loading(progress: Int) {
lifecycleScope.async {
pb_down.progress = progress
tv_down.text = resources.getString(R.string.download) + "$progress%"
}
}
override fun finish(path: String) {
Log.d("down finish path==>$path")
isFinish = true
downFilePath = path
installApk(path)
}
override fun error(msg: String) {
Log.d("down error msg==>$msg")
}
})
}
override fun cancel() {
}
})
dialog.show()
}
fun installApk(filePath: String) {
val file = File(filePath)
val uri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(this, "${applicationContext.packageName}.fileprovider", file)
} else {
Uri.fromFile(file)
}
val intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "application/vnd.android.package-archive")
flags = Intent.FLAG_ACTIVITY_NEW_TASK
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
}
startActivity(intent)
}
private fun showLoadingDialog(msg: String) { private fun showLoadingDialog(msg: String) {
payResultLoading = RxDialogShapeLoading(this) payResultLoading = RxDialogShapeLoading(this)
payResultLoading!!.setMessage(msg) payResultLoading!!.setMessage(msg)

View File

@ -96,7 +96,7 @@ class BZYConstants {
const val YMTGUrl = "https://t.me/shadowcat_vpn"; const val YMTGUrl = "https://t.me/shadowcat_vpn";
const val DefTGUrl = "https://t.me/bazhuayuvpn"; const val DefTGUrl = "https://t.me/bazhuayuvpn";
const val TZTGUrl = "https://t.me/taizivpn"; const val TZTGUrl = "https://t.me/taizivpn";
const val PopularApplicationsUrl = "https://2828.im/"
// const val GoSeaShareUrl = "https://219.139.81.40:8080/page/register.html?userId=" // const val GoSeaShareUrl = "https://219.139.81.40:8080/page/register.html?userId="
// const val KeFuUrl = "https://www.cannmaxllc.com" // const val KeFuUrl = "https://www.cannmaxllc.com"

View File

@ -270,4 +270,22 @@ class RechargeViewModel : PublicViewMode() {
val requestBody: RequestBody = jsonString.toRequestBody("application/json; charset=utf-8".toMediaType()) val requestBody: RequestBody = jsonString.toRequestBody("application/json; charset=utf-8".toMediaType())
doAsync(HttpReqType.StripeType) { httpApi.getPayClientSecret(paramsToken,requestBody) } doAsync(HttpReqType.StripeType) { httpApi.getPayClientSecret(paramsToken,requestBody) }
} }
fun getWeChatPayClientSecret(productID:Int){
val httpApi = NetService.instances.createHttps(HttpApi::class.java)
val phToken = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_PH_TOKEN, "")!!
val username =
MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")!!
val paramsToken = hashMapOf(
"phoneNumber" to username,
"phToken" to phToken,
)
val params = hashMapOf(
"id" to productID
)
val gson = Gson()
val jsonString = gson.toJson(params)
val requestBody: RequestBody = jsonString.toRequestBody("application/json; charset=utf-8".toMediaType())
doAsync(HttpReqType.StripeWeChat) { httpApi.getPayClientSecret(paramsToken,requestBody) }
}
} }

View File

@ -114,6 +114,7 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
private lateinit var clSubApplicationProxy:ConstraintLayout private lateinit var clSubApplicationProxy:ConstraintLayout
private lateinit var clApplicationLanguage:ConstraintLayout private lateinit var clApplicationLanguage:ConstraintLayout
private lateinit var clTelegraph:ConstraintLayout private lateinit var clTelegraph:ConstraintLayout
private lateinit var clFire:ConstraintLayout
private lateinit var tvExitLog:TextView private lateinit var tvExitLog:TextView
@ -211,6 +212,7 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
clTelegraph=view.findViewById(R.id.clTelegraph) clTelegraph=view.findViewById(R.id.clTelegraph)
tvExitLog=view.findViewById(R.id.tvExitLog) tvExitLog=view.findViewById(R.id.tvExitLog)
tvVersion=view.findViewById(R.id.tvVersion) tvVersion=view.findViewById(R.id.tvVersion)
clFire=view.findViewById(R.id.clFire)
setExpireDate() setExpireDate()
@ -430,6 +432,12 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
intent.setData(uri) intent.setData(uri)
startActivity(intent) startActivity(intent)
} }
clFire.setOnClickListener {
val uri = Uri.parse(BZYConstants.PopularApplicationsUrl)
val intent = Intent(Intent.ACTION_VIEW)
intent.setData(uri)
startActivity(intent)
}
tvExitLog.setOnClickListener { tvExitLog.setOnClickListener {
cleanUserInfo() cleanUserInfo()

View File

@ -485,6 +485,14 @@ interface HttpApi {
).toString() ).toString()
): AppVersionCheckRsp ): AppVersionCheckRsp
@Headers(
"User-Agent: Octopus_Android"
)
@GET("/netbarcloud/vpn/upgradeVersion")
suspend fun upgradeVersion(
@QueryMap params: Map<String, String>
): AppVersionCheckRsp
//忘记密码 //忘记密码
@Headers( @Headers(
"User-Agent: Octopus_Android" "User-Agent: Octopus_Android"

View File

@ -52,5 +52,7 @@ enum class HttpReqType(type: Int) {
AppStartupStatus(48), AppStartupStatus(48),
AppUpStatus(49), AppUpStatus(49),
AppStopStatus(50), AppStopStatus(50),
SplashBg(51) SplashBg(51),
GETAPPVERION(52),
StripeWeChat(53)
} }

View File

@ -135,6 +135,19 @@ class LoginAtyVM : PublicViewMode() {
} }
} }
} }
fun upgradeVersion() {
val httpApi = NetService.instances.createHttpsEncodeStr(HttpApi::class.java)
val phoneNumber =
MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")!!
val params = mutableMapOf(
"phoneNumber" to phoneNumber,
"versionNo" to BuildConfig.VERSION_CODE.toString(),
"versionType" to "1", //android写死
"invitationCode" to BuildConfig.productId,
)
Log.d("appCheck==>$params")
doAsync(HttpReqType.GETAPPVERION) {
httpApi.upgradeVersion(params)
}
}
} }

View File

@ -13,6 +13,7 @@ import com.yingmao.clash.base.PublicViewMode
import com.yingmao.clash.conf.BZYConstants import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.entity.CheckLoginRsp import com.yingmao.clash.entity.CheckLoginRsp
import com.yingmao.clash.listener.AsyncCallback import com.yingmao.clash.listener.AsyncCallback
import com.yingmao.clash.listener.DownLoadListener
import com.yingmao.clash.net.http.HttpApi import com.yingmao.clash.net.http.HttpApi
import com.yingmao.clash.net.http.HttpReqType import com.yingmao.clash.net.http.HttpReqType
import com.yingmao.clash.net.http.NetService import com.yingmao.clash.net.http.NetService
@ -100,4 +101,24 @@ class SplashAtyVM : PublicViewMode() {
val httpApi = NetService.instances.createHttps(HttpApi::class.java) val httpApi = NetService.instances.createHttps(HttpApi::class.java)
doAsync(HttpReqType.SplashBg) { httpApi.splashBg() } doAsync(HttpReqType.SplashBg) { httpApi.splashBg() }
} }
fun appCheck() {
val httpApi = NetService.instances.createHttpsEncodeStr(HttpApi::class.java)
val token = MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_PH_TOKEN, "")!!
val phoneNumber =
MMKV.defaultMMKV().decodeString(BZYConstants.MMKV_KEY_REMEMBER_USERNAME, "")!!
val params = mutableMapOf(
"phToken" to token,
"phoneNumber" to phoneNumber,
"versionNo" to BuildConfig.VERSION_CODE.toString(),
"versionType" to "1", //android写死
"invitationCode" to BuildConfig.productId,
)
com.cncat.vpn.common.log.Log.d("appCheck==>$params")
doAsync(HttpReqType.App_VERION_CHECK) {
httpApi.appUpgrade(params)
}
}
fun downLoadFile(url: String, downLoadListener: DownLoadListener) {
NetService.instances.downloadFile(url, downLoadListener)
}
} }

View File

@ -0,0 +1,299 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp"
android:height="32dp"
android:viewportWidth="130"
android:viewportHeight="130">
<path
android:fillColor="#fff"
android:pathData="M0,64.88a64.28,63.83 0,1 0,128.56 0a64.28,63.83 0,1 0,-128.56 0z" />
<path
android:fillColor="#5275e3"
android:pathData="M69.25,74.77l-0.21,0.31c-0.29,0.42 -0.59,0.84 -0.88,1.27l0,0.06 -0.8,1.22v0.06h-0.07l-1,1.33 0,0c-0.35,0.41 -0.69,0.82 -1,1.24l-1,1.4 -0.9,1.2c-0.08,0.13 -0.15,0.27 -0.23,0.39l-0.56,0.74 -0.72,0.88c-0.12,0.2 -0.25,0.4 -0.38,0.6l-0.45,0.47a0.14,0.14 0,0 0,-0.07 0.15l-0.69,1.17c-0.14,0.21 -0.27,0.43 -0.4,0.65l0,0.09 -0.08,0 -0.65,1.27 -0.15,0.34c-0.68,1.46 -1.35,2.92 -2,4.37l-0.08,0.39c-0.31,1.5 -0.62,3 -0.94,4.49l0,0.54v1c0,0.17 0,0.34 0,0.5l0.9,4.25 2.12,4.66a41.21,41.21 0,0 1,-5.53 -1.71,15.78 15.78,0 0,1 -9.35,-11.45c-0.16,-0.93 -0.33,-1.85 -0.5,-2.78s0,-2 -0.07,-3l-0.31,-1.24 -0.9,1.21 -0.44,1.11L41.04,94.49l-0.3,1c-0.16,0.82 -0.33,1.64 -0.5,2.46l-0.09,0.46 -0.07,0.44L40.02,103.49l0.42,2.51 0.15,0.65 0.21,0.68 0.23,0.53c0.29,0.63 0.59,1.26 0.89,1.89 0.14,0.25 0.29,0.5 0.44,0.75s0.22,0.36 0.32,0.54l0.19,0.27 0.16,0.24a0.07,0.07 0,0 1,0.09 0.09l0.94,1c2,1.41 4,2.84 6.05,4.21a14.29,14.29 0,0 0,2 1,19.69 19.69,0 0,1 -2.3,0.06c-11.92,-1 -20.55,-7.11 -23.09,-16.22l-0.72,-3.8c0,-0.65 -0.11,-1.29 -0.16,-1.94v-3.32c0,-0.49 0.08,-1 0.13,-1.47s0.11,-0.78 0.16,-1.18l0.12,-0.63 0.22,-0.56 3.76,-9c0.09,-0.16 0.19,-0.32 0.28,-0.49s0.2,-0.38 0.29,-0.57L31.59,76.49q2.58,-7 5.17,-14l0,-0.43 0.06,-5.47c0.07,-0.37 0.13,-0.74 0.2,-1.11a4.28,4.28 0,0 0,0.34 1.1c1.13,1.76 -1.52,4.83 2,5.75 -1.32,2.54 0.51,2.87 2.14,2.5 2,-0.47 0.57,-2.41 0.85,-3.63 0.33,-1.46 -0.19,-3.11 -0.35,-4.67l1.32,4.46c0.07,2.81 0.07,5.62 0.23,8.43 0.14,2.28 0.74,4.69 3.3,5.14 4.22,0.76 5.74,-2.59 7.38,-5.53a0.18,0.18 0,0 0,0 -0.16l0.26,-0.62h0l0.31,-0.69 0.15,-0.62L55.37,65.49l0.12,-0.62 0.32,-2.79c-0.08,-1.42 -0.17,-2.83 -0.25,-4.25l-0.07,-0.59L55.15,52.49a31.48,31.48 0,0 1,1 5.69c0,4.93 1.08,8.28 7.2,6.86a11.26,11.26 0,0 1,5.29 0c1.34,0.37 3.49,-1.16 4,1.36a4.12,4.12 0,0 1,-0.25 1.46c0.28,-0.56 0.6,-1.11 0.84,-1.7 0.35,-0.89 0.61,-1.82 1,-2.7 0.28,-0.67 0.68,-1.37 0.85,0.06v0.39c-0.27,0.67 -0.53,1.35 -0.8,2l-0.12,0.37 -1.73,3 -0.15,0.42 -0.39,0.66a0.12,0.12 0,0 1,-0.14 0.14l-0.69,1.17a0.11,0.11 0,0 1,-0.12 0.12l-0.39,0.68c0,0.09 0,0.14 -0.15,0.13 -0.21,0.4 -0.43,0.8 -0.64,1.21a0.09,0.09 0,0 1,0 0.14ZM37.71,63l-0.12,0.18 0.19,0.08s0.07,-0.08 0.07,-0.09A2.09,2.09 0,0 0,37.71 63Z" />
<path
android:fillColor="#54ace2"
android:pathData="M75.07,63.58c-0.17,-1.43 -0.57,-0.73 -0.85,-0.06 -0.37,0.88 -0.63,1.81 -1,2.7 -0.24,0.59 -0.56,1.14 -0.84,1.7A4.12,4.12 0,0 0,72.65 66.49c-0.56,-2.52 -2.71,-1 -4,-1.36a11.26,11.26 0,0 0,-5.29 0c-6.12,1.42 -7.22,-1.93 -7.2,-6.86 -0.21,-0.63 -0.32,-0.9 -0.43,-0.93l-0.19,0C54.71,47.49 47.65,39.88 45.99,30.32 44.13,19.66 49.58,5.49 58.37,0.16a2.16,2.16 0,0 1,0.63 -0.16c0,0.2 0.08,0.45 0,0.58 -9.14,13.91 -3.4,25.44 5.89,36.4 0.87,1 1.82,2 2.73,3 -0.23,-1.25 -0.4,-2.52 -0.69,-3.76a45.78,45.78 0,0 1,-0.42 -17.34A9.42,9.42 0,0 1,66.92 17.49a7.24,7.24 0,0 1,0.25 0.79C69.16,30.49 77.54,38.64 85.71,47c3.85,4 5.58,9 6,14.55l-0.56,0c0.73,4.94 -2.71,3.54 -5.14,3.16 -3.14,-0.5 -6.58,1.63 -9.44,-1.07ZM67.81,40.22l-0.08,-0.1s-0.08,0.06 -0.08,0.09 0,0.06 0.07,0.09Z" />
<path
android:fillColor="#5275e3"
android:pathData="M76.51,63.62c2.86,2.7 6.3,0.57 9.44,1.07 2.43,0.38 5.87,1.78 5.14,-3.16l0.56,0 0,0.4 0,3.22 0.06,0.09 -0.06,0.09c0,0.57 0,1.15 0,1.72 -0.33,2.11 -0.68,4.22 -1,6.34 -0.15,1.09 -0.59,3 -0.28,3.16 1.69,0.73 3.17,-0.31 4.08,-1.6A54.65,54.65 0,0 0,97.62 69.49l0.39,-1 0.56,-1.92 1,-3.59 0.5,0.42 0.17,1.15q0.23,8.17 0.46,16.36l-0.08,1.37c-0.16,1.12 -0.31,2.23 -0.47,3.34 -2.46,16.33 -10.68,27.79 -27.44,32 -0.33,0.09 -0.67,0.14 -1,0.21a8.06,8.06 0,0 1,0.89 -1c5.42,-4.18 9.75,-9.2 12.25,-15.64a0.11,0.11 0,0 0,0.06 -0.12c0.09,-0.22 0.18,-0.44 0.26,-0.65 0.3,-1.38 0.59,-2.76 0.88,-4.14l0.16,-1.15c-0.09,-1.31 -0.17,-2.61 -0.26,-3.92l-0.75,0.7v0.07h-0.07L84.71,92.49l-0.26,0.42c-0.09,0.19 -0.19,0.38 -0.29,0.57s0,0.29 -0.08,0.43l-0.42,0.72 -0.72,1.1 -0.44,0.57a0.14,0.14 0,0 1,-0.08 0.17l-0.38,0.5c-0.44,0.55 -0.87,1.1 -1.3,1.66l-0.85,1A21.32,21.32 0,0 1,69.57 106.49c-4.28,1.27 -3.51,-2.09 -3.39,-4.21 0.54,-9.87 7.15,-17.52 10,-26.54 0.28,-1.45 0.55,-2.9 0.83,-4.36l0.1,-0.86L77.11,68.16l-0.11,-1.09L76.71,64.21Z" />
<path
android:fillColor="#54ace2"
android:pathData="M43.36,61.06l-1.32,-4.46c0.16,1.56 0.68,3.21 0.35,4.67 -0.28,1.22 1.18,3.16 -0.85,3.63 -1.63,0.37 -3.46,0 -2.14,-2.5 -3.53,-0.92 -0.88,-4 -2,-5.75a4.28,4.28 0,0 1,-0.34 -1.1c-0.07,0.37 -0.13,0.74 -0.2,1.11 -1.2,-4.5 -3.71,-7.62 -8.7,-8.12 -0.15,0 -0.28,-0.16 -0.42,-0.25 0.15,-0.14 0.28,-0.38 0.44,-0.4 5.49,-0.48 10.37,0.4 13.14,5.89 -0.06,0.14 -0.13,0.27 -0.19,0.4l0.34,0 0,0.09c0,0.48 0,1 0,1.42 0,0 0.19,0.1 0.3,0.15l0,-1.09Z" />
<path
android:fillColor="#5275e3"
android:pathData="M100.71,80.89q-0.24,-8.18 -0.46,-16.36A66.36,66.36 0,0 1,100.71 80.89Z" />
<path
android:fillColor="#5275e3"
android:pathData="M100.12,63.38l-0.5,-0.42 -1,3.59 0.75,-3.43c0.14,-0.64 0.27,-1.27 0.41,-1.9Z" />
<path
android:fillColor="#5275e3"
android:pathData="M85.24,91.96l0.75,-0.7c0.09,1.31 0.17,2.61 0.26,3.92C85.53,94.22 87.41,92.49 85.24,91.96Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M56.95,94.05c0.68,-1.45 1.35,-2.91 2,-4.37C58.3,91.14 57.63,92.6 56.95,94.05Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M55.56,57.83c0.08,1.42 0.17,2.83 0.25,4.25C55.71,60.66 55.64,59.25 55.56,57.83Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M86.09,96.33c-0.29,1.38 -0.58,2.76 -0.88,4.14C85.51,99.09 85.8,97.71 86.09,96.33Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M77.05,71.41c-0.28,1.46 -0.55,2.91 -0.83,4.36Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M25.96,97.87l0.72,3.8Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M55.93,98.93c0.32,-1.5 0.63,-3 0.94,-4.49C56.56,95.94 56.25,97.43 55.93,98.93Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M56.86,105.21l-0.9,-4.25Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M25.8,92.61v0Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M72.43,69.38l1.73,-3C73.58,67.37 73.01,68.38 72.43,69.38Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M100.2,85.6c0.16,-1.11 0.31,-2.22 0.47,-3.34C100.51,83.38 100.36,84.49 100.2,85.6Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M76.71,64.21l0.37,2.86Z" />
<path
android:fillColor="#5275e3"
android:pathData="M42.32,90.94l0.9,-1.21 0.31,1.24Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M43.6,93.93c0.17,0.93 0.34,1.85 0.5,2.78C43.94,95.78 43.77,94.85 43.6,93.93Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M40.44,106.01 L40.02,103.49Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M77.15,68.16v0Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M41.04,94.49l0.84,-2.45Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M31.59,76.49l-0.83,2.23Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M40.24,97.95c0.17,-0.82 0.34,-1.64 0.5,-2.46C40.58,96.31 40.41,97.13 40.24,97.95Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M74.28,65.99c0.27,-0.67 0.53,-1.35 0.8,-2C74.81,64.64 74.55,65.32 74.28,65.99Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M16.99,191.95c-0.88,-1.89 -1.77,-3.79 -2.65,-5.69C15.22,188.16 16.11,190.06 16.99,191.95Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M65.25,80.31c0.34,-0.42 0.68,-0.83 1,-1.24C65.93,79.49 65.59,79.89 65.25,80.31Z" />
<path
android:fillColor="#54ace2"
android:pathData="M41.71,54.7l0,1.09c-0.11,0 -0.29,-0.1 -0.3,-0.15 0,-0.47 0,-0.94 0,-1.42C41.55,54.38 41.63,54.54 41.71,54.7Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M68.16,76.35c0.29,-0.43 0.59,-0.85 0.88,-1.27C68.71,75.49 68.45,75.92 68.16,76.35Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M66.3,79.03l1,-1.33Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M63.38,82.91l0.9,-1.2Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M91.71,65.17l0,-3.22Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M23.4,200.66l-2.8,-3Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M59.13,89.34l0.65,-1.27Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M67.32,77.63l0.8,-1.22Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M69.76,73.91c0.21,-0.41 0.43,-0.81 0.64,-1.21C70.19,73.1 69.97,73.49 69.76,73.91Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M71.06,71.77 L71.71,70.6Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M55.92,100.49v-1C55.92,99.8 55.92,100.13 55.92,100.49Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M79.92,99.63l0.85,-1Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M62.59,84.04l0.56,-0.74Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M26.09,89.96c-0.05,0.4 -0.11,0.79 -0.16,1.18C25.98,90.75 26.04,90.36 26.09,89.96Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M98.01,68.49l-0.39,1Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M91.71,67.07c0,-0.57 0,-1.15 0,-1.72C91.71,65.92 91.71,66.49 91.71,67.07Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M13.65,184.68l-0.63,-2.06Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M61.49,85.49c0.13,-0.2 0.26,-0.4 0.38,-0.6Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M83.71,94.67l0.42,-0.72Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M59.88,87.96c0.13,-0.22 0.26,-0.44 0.4,-0.65C60.14,87.49 60.01,87.74 59.88,87.96Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M70.55,72.57l0.39,-0.68Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M69.25,74.77l0.48,-0.72Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M71.89,70.49l0.39,-0.66Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M82.53,96.34l0.44,-0.57Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M84.19,93.49c0.1,-0.19 0.2,-0.38 0.29,-0.57Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M30.47,79.31c-0.09,0.17 -0.19,0.33 -0.28,0.49C30.28,79.64 30.38,79.49 30.47,79.31Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M26.43,88.77l-0.22,0.56Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M84.71,92.49l0.43,-0.49Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M54.98,67.01l-0.15,0.62Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M40.08,98.85l0.07,-0.44Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M55.49,64.87l-0.12,0.62Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M19.29,195.84l-1,-1.61Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M82.07,97.01l0.38,-0.5Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M54.52,68.32h0Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M54.3,68.94a0.18,0.18 0,0 1,0 0.16s0,-0.11 0,-0.16Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M36.79,62.13l0,0.43Z" />
<path
android:fillColor="#54ace2"
android:pathData="M41.46,54.13l-0.34,0c0.06,-0.13 0.13,-0.26 0.19,-0.4Z" />
<path
android:fillColor="#5275e3"
android:pathData="M60.97,86.14a0.14,0.14 0,0 1,0.07 -0.15C61.06,86.07 61.04,86.12 60.97,86.14Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M84.95,101.12a0.11,0.11 0,0 1,-0.06 0.12l-0.05,-0.09Z" />
<path
android:fillColor="#fc4d02"
android:pathData="M20.31,197.37l-0.47,-0.72Z" />
<path
android:fillColor="#5275e3"
android:pathData="M37.71,63a2.09,2.09 0,0 1,0.14 0.17s0,0.09 -0.07,0.09l-0.19,-0.08Z" />
<path
android:fillColor="#f3f3f2"
android:pathData="M67.81,40.22l-0.09,0.08s-0.07,-0.06 -0.07,-0.09 0,-0.06 0.08,-0.09Z" />
<path
android:fillColor="#54ace2"
android:pathData="M42.39,58.15" />
<path
android:fillColor="#54ace2"
android:pathData="M35.71,55.78" />
</vector>

View File

@ -56,6 +56,15 @@
app:srcCompat="@drawable/alipay" app:srcCompat="@drawable/alipay"
android:visibility="gone" android:visibility="gone"
/> />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/ivStripeWechatPay"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/press_effect"
android:padding="5dp"
android:visibility="gone"
android:layout_marginStart="20dp"
app:srcCompat="@drawable/wechat" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -3,12 +3,24 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/activity_bingding_bg"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="10dp"> android:paddingRight="10dp"
android:background="@color/translate"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:background="@drawable/activity_bingding_bg"
android:layout_marginStart="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"
android:layout_marginTop="@dimen/dp_10"
>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -37,6 +49,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_10" android:layout_marginTop="@dimen/dp_10"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:autoLink="web" android:autoLink="web"
android:gravity="left" android:gravity="left"
android:textColor="#4072FE" android:textColor="#4072FE"
@ -47,6 +62,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:autoLink="web" android:autoLink="web"
android:gravity="left" android:gravity="left"
android:textColor="#4072FE" android:textColor="#4072FE"
@ -129,6 +146,8 @@
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -558,7 +558,7 @@
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
> >
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clInitializationRepair" android:id="@+id/clFire"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
@ -572,16 +572,16 @@
> >
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aiInitializationRepair" android:id="@+id/aiFire"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="11dp" android:layout_marginStart="11dp"
android:src="@drawable/ic_init" android:src="@drawable/setting_fire_line"
app:layout_constraintBottom_toBottomOf="@+id/llInitializationRepair" app:layout_constraintBottom_toBottomOf="@+id/llFire"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/llInitializationRepair" /> app:layout_constraintTop_toTopOf="@+id/llFire" />
<LinearLayout <LinearLayout
android:id="@+id/llInitializationRepair" android:id="@+id/llFire"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
@ -589,34 +589,35 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/aiInitializationRepair" app:layout_constraintStart_toEndOf="@+id/aiFire"
android:layout_marginTop="25dp" android:layout_marginTop="25dp"
android:layout_marginBottom="25dp" android:layout_marginBottom="25dp"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
> >
<TextView <TextView
android:id="@+id/tvInit" android:id="@+id/tvFire"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/InitializationRepair" android:text="@string/PopularApplications"
android:textColor="@color/gray_828282" android:textColor="@color/gray_828282"
android:textSize="14sp" android:textSize="14sp"
android:textStyle="bold" android:textStyle="bold"
/> />
<TextView <TextView
android:id="@+id/tvInitStr" android:id="@+id/tvFireStr"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/InitializationRepairStr" android:text="@string/PopularApplicationsStr"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/gray_828282" android:textColor="@color/gray_828282"
android:layout_marginTop="10dp" android:layout_marginTop="5dp"
android:textSize="12sp" android:textSize="12sp"
/> />
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clTelegraph" android:id="@+id/clTelegraph"
android:layout_width="0dp" android:layout_width="0dp"
@ -944,6 +945,9 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -952,7 +956,6 @@
android:layout_marginStart="13dp" android:layout_marginStart="13dp"
android:layout_marginEnd="13dp" android:layout_marginEnd="13dp"
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:layout_marginBottom="80dp"
> >
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clApplicationLanguage" android:id="@+id/clApplicationLanguage"
@ -1014,7 +1017,77 @@
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clInitializationRepair"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/setting_model_bg"
android:elevation="10dp"
android:layout_marginBottom="5dp"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:outlineSpotShadowColor="@color/blue_CCDAFF"
>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aiInitializationRepair"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:src="@drawable/ic_init"
app:layout_constraintBottom_toBottomOf="@+id/llInitializationRepair"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/llInitializationRepair" />
<LinearLayout
android:id="@+id/llInitializationRepair"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginEnd="11dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/aiInitializationRepair"
android:layout_marginTop="25dp"
android:layout_marginBottom="25dp"
android:layout_marginStart="12dp"
>
<TextView
android:id="@+id/tvInit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/InitializationRepair"
android:textColor="@color/gray_828282"
android:textSize="14sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tvInitStr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/InitializationRepairStr"
android:textColor="@color/gray_828282"
android:layout_marginTop="10dp"
android:textSize="12sp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal"
android:layout_marginStart="13dp"
android:layout_marginEnd="13dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="90dp"
>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clExit" android:id="@+id/clExit"
android:layout_width="0dp" android:layout_width="0dp"
@ -1076,6 +1149,69 @@
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clTemp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/setting_model_bg"
android:layout_marginBottom="5dp"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:visibility="invisible"
android:outlineSpotShadowColor="@color/blue_CCDAFF"
>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aiTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:src="@mipmap/ic_setting_exit"
app:layout_constraintBottom_toBottomOf="@+id/clTemp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/clTemp"
/>
<LinearLayout
android:id="@+id/llTemp"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginEnd="11dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="18dp"
android:layout_marginBottom="18dp"
app:layout_constraintStart_toEndOf="@+id/aiTemp"
android:layout_marginStart="12dp"
>
<TextView
android:id="@+id/tvTemp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/exit"
android:textColor="@color/gray_828282"
android:textSize="14sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/tvTempStr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/exitTxt"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/gray_828282"
android:layout_marginTop="5dp"
android:textSize="12sp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout> </LinearLayout>

View File

@ -346,4 +346,6 @@ Service Description\n
<string name="laPay">CYN</string> <string name="laPay">CYN</string>
<string name="Yuan">$元</string> <string name="Yuan">$元</string>
<string name="everyDay">每天</string> <string name="everyDay">每天</string>
<string name="PopularApplications">Popular applications</string>
<string name="PopularApplicationsStr">Popular Application Navigation</string>
</resources> </resources>

View File

@ -336,4 +336,6 @@
<string name="laPay">CYN</string> <string name="laPay">CYN</string>
<string name="Yuan">$元</string> <string name="Yuan">$元</string>
<string name="everyDay">每天</string> <string name="everyDay">每天</string>
<string name="PopularApplications">熱門應用</string>
<string name="PopularApplicationsStr">熱門應用導航</string>
</resources> </resources>

View File

@ -335,4 +335,6 @@
<string name="laPay">CYN</string> <string name="laPay">CYN</string>
<string name="Yuan">$元</string> <string name="Yuan">$元</string>
<string name="everyDay">每天</string> <string name="everyDay">每天</string>
<string name="PopularApplications">熱門應用</string>
<string name="PopularApplicationsStr">熱門應用導航</string>
</resources> </resources>

View File

@ -354,4 +354,6 @@
<string name="laPay">CYN</string> <string name="laPay">CYN</string>
<string name="Yuan">$元</string> <string name="Yuan">$元</string>
<string name="everyDay">每天</string> <string name="everyDay">每天</string>
<string name="PopularApplications">热门应用</string>
<string name="PopularApplicationsStr">热门应用导航</string>
</resources> </resources>