diff --git a/app/src/main/java/com/yingmao/clash/act/ActivityActivity.kt b/app/src/main/java/com/yingmao/clash/act/ActivityActivity.kt
index a742333..fa81a93 100644
--- a/app/src/main/java/com/yingmao/clash/act/ActivityActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/ActivityActivity.kt
@@ -82,7 +82,10 @@ class ActivityActivity : BaseActivity() {
override fun onMyItemChildClickListener(itemBean: Activity_) {
if (itemBean.redirectLink.contains("BindAccount")) {
showBindAccDialog(itemBean)
- } else {
+ }else if(itemBean.redirectLink.contains("weekcharge")){
+ val intent = Intent(CommonUtils.getApp(), MemberRechargeActivity::class.java)
+ startActivity(intent)
+ }else {
showActDialog(itemBean)
}
}
diff --git a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt
index 1acda68..f3f55d0 100644
--- a/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/LoginActivity.kt
@@ -1,8 +1,10 @@
package com.yingmao.clash.act
+import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
+import android.os.Build
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableStringBuilder
@@ -15,7 +17,9 @@ import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.*
+import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
import com.yingmao.clash.view.dialog.RxDialogShapeLoading
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.listener.AsyncBodyCallback
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.HttpStatus
+import com.yingmao.clash.net.http.entity.AppVersionCheckRsp
import com.yingmao.clash.util.AESUtil
import com.yingmao.clash.util.CommonUtils
import com.yingmao.clash.util.Utils
import com.yingmao.clash.view.PasswordTransformationMethodBigDot
import com.yingmao.clash.view.RxToast
+import com.yingmao.clash.view.dialog.DialogAppVersion
import com.yingmao.clash.view.dialog.DialogDoMainChoose
import com.yingmao.clash.vm.LoginAtyVM
import com.yingmao.clash.vm.SplashAtyVM
import kotlinx.coroutines.MainScope
+import kotlinx.coroutines.async
import kotlinx.coroutines.launch
+import java.io.File
class LoginActivity : BaseActivity(), View.OnClickListener {
private lateinit var loginViewMode: LoginAtyVM
@@ -73,6 +82,7 @@ class LoginActivity : BaseActivity(), View.OnClickListener {
splashAtyVM = ViewModelProvider(this).get(SplashAtyVM::class.java)
observe(this, loginViewMode)
initViews()
+ loginViewMode.upgradeVersion()
}
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()
}
}
+ 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)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/act/MemberRechargeActivity.kt b/app/src/main/java/com/yingmao/clash/act/MemberRechargeActivity.kt
index 9c57d23..b1349d6 100644
--- a/app/src/main/java/com/yingmao/clash/act/MemberRechargeActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/MemberRechargeActivity.kt
@@ -29,6 +29,7 @@ import com.stripe.android.confirmAlipayPayment
import com.stripe.android.model.ConfirmPaymentIntentParams
import com.stripe.android.model.StripeIntent
import com.tencent.mmkv.MMKV
+import com.yingmao.clash.BuildConfig
import com.yingmao.clash.R
import com.yingmao.clash.base.BaseActivity
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 -> {
Logger.d("支付成功更新有效期")
val checkLoginRsp = httpStatus.rsp
@@ -557,6 +577,8 @@ class MemberRechargeActivity: BaseActivity() {
findViewById(R.id.llStripePay).visibility= View.VISIBLE
findViewById(R.id.tvStripePay).visibility= View.VISIBLE
findViewById(R.id.ivStripeAlipay).visibility= View.VISIBLE
+ val stripeWechatPay=findViewById(R.id.ivStripeWechatPay)
+ stripeWechatPay.visibility= View.VISIBLE
findViewById(R.id.ivStripeAlipay).setOnClickListener {
if(selectedGradeID!=0){
if(!PayUtils.isAlipayInstalled(this@MemberRechargeActivity)){
@@ -572,6 +594,15 @@ class MemberRechargeActivity: BaseActivity() {
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(R.id.ivBack).setOnClickListener {
diff --git a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
index 93ccf98..9ffd86a 100644
--- a/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/SplashActivity.kt
@@ -1,6 +1,7 @@
package com.yingmao.clash.act
import android.Manifest
+import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
@@ -9,14 +10,18 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
+import android.text.TextUtils
import android.util.Log
import android.view.View
import android.view.WindowManager
+import android.widget.ProgressBar
import android.widget.RelativeLayout
+import android.widget.TextView
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
+import androidx.core.content.FileProvider
import androidx.lifecycle.ViewModelProvider
import com.afollestad.materialdialogs.MaterialDialog
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.remote.IClashManager
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.util.AESUtil
import com.yingmao.clash.util.Utils
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.DialogDoMainChoose
import com.yingmao.clash.view.dialog.RxDialogSureCancel
import com.yingmao.clash.vm.SplashAtyVM
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch
+import java.io.File
import java.util.Locale
-
-
+import androidx.lifecycle.lifecycleScope
+import kotlinx.coroutines.async
class SplashActivity : BaseActivity() {
private val deniedPermissions = hashSetOf()
@@ -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 -> {}
}
@@ -902,10 +937,8 @@ class SplashActivity : BaseActivity() {
}
private fun toMainPage() {
- val intent = Intent(this, UIMainActivity::class.java)
-
- startActivity(intent)
- finish()
+ //监测版本是否需要更新
+ splashAtyVM.appCheck()
}
private fun toLoginPage() {
@@ -922,4 +955,81 @@ class SplashActivity : BaseActivity() {
config.locale = locale
resources.updateConfiguration(config, metrics)
}
+ private fun showUpdateDialog(url: String, illustrate: String, isForce: Boolean) {
+ if (TextUtils.isEmpty(url)) {
+ RxToast.error(resources.getString(R.string.downloadEmpty))
+ 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)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/act/UIMainActivity.kt b/app/src/main/java/com/yingmao/clash/act/UIMainActivity.kt
index 8e4cd84..11df747 100644
--- a/app/src/main/java/com/yingmao/clash/act/UIMainActivity.kt
+++ b/app/src/main/java/com/yingmao/clash/act/UIMainActivity.kt
@@ -126,7 +126,6 @@ class UIMainActivity : BaseActivity() {
observe(this, mainAtyVM)
mainAtyVM.startHeartBeat()
MMKV.defaultMMKV().encode(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false)
- mainAtyVM.appCheck()
mainAtyVM.getAirNodes()
val isGlobal = MMKV.defaultMMKV().decodeBool(BZYConstants.MMKV_KEY_GLOBAL_MODEL, false)
newMainActGlo = isGlobal
@@ -190,25 +189,6 @@ class UIMainActivity : BaseActivity() {
override fun httpSuccess(httpStatus: HttpStatus.Success) {
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 -> {
val data = httpStatus.rsp as SubscriptionRsp
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) {
payResultLoading = RxDialogShapeLoading(this)
payResultLoading!!.setMessage(msg)
diff --git a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt
index 694473c..0fbf6d2 100644
--- a/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt
+++ b/app/src/main/java/com/yingmao/clash/conf/BZYConstants.kt
@@ -96,7 +96,7 @@ class BZYConstants {
const val YMTGUrl = "https://t.me/shadowcat_vpn";
const val DefTGUrl = "https://t.me/bazhuayuvpn";
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 KeFuUrl = "https://www.cannmaxllc.com"
diff --git a/app/src/main/java/com/yingmao/clash/fragment/recharge/RechargeViewModel.kt b/app/src/main/java/com/yingmao/clash/fragment/recharge/RechargeViewModel.kt
index d63ffa2..8e5c2e8 100644
--- a/app/src/main/java/com/yingmao/clash/fragment/recharge/RechargeViewModel.kt
+++ b/app/src/main/java/com/yingmao/clash/fragment/recharge/RechargeViewModel.kt
@@ -270,4 +270,22 @@ class RechargeViewModel : PublicViewMode() {
val requestBody: RequestBody = jsonString.toRequestBody("application/json; charset=utf-8".toMediaType())
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) }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt
index b008eda..ab8b63e 100644
--- a/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt
+++ b/app/src/main/java/com/yingmao/clash/fragment/setting/SettingFragment.kt
@@ -114,6 +114,7 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
private lateinit var clSubApplicationProxy:ConstraintLayout
private lateinit var clApplicationLanguage:ConstraintLayout
private lateinit var clTelegraph:ConstraintLayout
+ private lateinit var clFire:ConstraintLayout
private lateinit var tvExitLog:TextView
@@ -211,6 +212,7 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
clTelegraph=view.findViewById(R.id.clTelegraph)
tvExitLog=view.findViewById(R.id.tvExitLog)
tvVersion=view.findViewById(R.id.tvVersion)
+ clFire=view.findViewById(R.id.clFire)
setExpireDate()
@@ -430,6 +432,12 @@ class SettingFragment: BaseFragment(), CoroutineScope by CoroutineScope(Dispatch
intent.setData(uri)
startActivity(intent)
}
+ clFire.setOnClickListener {
+ val uri = Uri.parse(BZYConstants.PopularApplicationsUrl)
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setData(uri)
+ startActivity(intent)
+ }
tvExitLog.setOnClickListener {
cleanUserInfo()
diff --git a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
index dd1f05d..7180753 100644
--- a/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
+++ b/app/src/main/java/com/yingmao/clash/net/http/HttpApi.kt
@@ -485,6 +485,14 @@ interface HttpApi {
).toString()
): AppVersionCheckRsp
+ @Headers(
+ "User-Agent: Octopus_Android"
+ )
+ @GET("/netbarcloud/vpn/upgradeVersion")
+ suspend fun upgradeVersion(
+ @QueryMap params: Map
+ ): AppVersionCheckRsp
+
//忘记密码
@Headers(
"User-Agent: Octopus_Android"
diff --git a/app/src/main/java/com/yingmao/clash/net/http/HttpReqType.kt b/app/src/main/java/com/yingmao/clash/net/http/HttpReqType.kt
index 0e7aac7..f07aefd 100644
--- a/app/src/main/java/com/yingmao/clash/net/http/HttpReqType.kt
+++ b/app/src/main/java/com/yingmao/clash/net/http/HttpReqType.kt
@@ -52,5 +52,7 @@ enum class HttpReqType(type: Int) {
AppStartupStatus(48),
AppUpStatus(49),
AppStopStatus(50),
- SplashBg(51)
+ SplashBg(51),
+ GETAPPVERION(52),
+ StripeWeChat(53)
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt b/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt
index 72d3fbf..df860b4 100644
--- a/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt
+++ b/app/src/main/java/com/yingmao/clash/vm/LoginAtyVM.kt
@@ -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)
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
index f3e2d33..bc6ec8d 100644
--- a/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
+++ b/app/src/main/java/com/yingmao/clash/vm/SplashAtyVM.kt
@@ -13,6 +13,7 @@ import com.yingmao.clash.base.PublicViewMode
import com.yingmao.clash.conf.BZYConstants
import com.yingmao.clash.entity.CheckLoginRsp
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.HttpReqType
import com.yingmao.clash.net.http.NetService
@@ -100,4 +101,24 @@ class SplashAtyVM : PublicViewMode() {
val httpApi = NetService.instances.createHttps(HttpApi::class.java)
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)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/setting_fire_line.xml b/app/src/main/res/drawable/setting_fire_line.xml
new file mode 100644
index 0000000..8965e52
--- /dev/null
+++ b/app/src/main/res/drawable/setting_fire_line.xml
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/backup_payment_dialog.xml b/app/src/main/res/layout/backup_payment_dialog.xml
index ba243ce..cada82b 100644
--- a/app/src/main/res/layout/backup_payment_dialog.xml
+++ b/app/src/main/res/layout/backup_payment_dialog.xml
@@ -56,6 +56,15 @@
app:srcCompat="@drawable/alipay"
android:visibility="gone"
/>
+
diff --git a/app/src/main/res/layout/dialog_app_version_layout.xml b/app/src/main/res/layout/dialog_app_version_layout.xml
index d1ddac1..057b756 100644
--- a/app/src/main/res/layout/dialog_app_version_layout.xml
+++ b/app/src/main/res/layout/dialog_app_version_layout.xml
@@ -3,132 +3,151 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/activity_bingding_bg"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="10dp"
- android:paddingRight="10dp">
+ android:paddingRight="10dp"
+ android:background="@color/translate"
+ >
-
-
-
-
+
-
-
+ android:layout_marginTop="15dp"
+ android:layout_marginBottom="10dp">
-
-
-
-
+ android:orientation="vertical">
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ android:orientation="horizontal">
+
+
+
+
+
-
-
+
+
+
diff --git a/app/src/main/res/layout/setting_fragment_layout.xml b/app/src/main/res/layout/setting_fragment_layout.xml
index 6bc135e..d08fb8e 100644
--- a/app/src/main/res/layout/setting_fragment_layout.xml
+++ b/app/src/main/res/layout/setting_fragment_layout.xml
@@ -558,7 +558,7 @@
android:layout_marginTop="12dp"
>
+ app:layout_constraintTop_toTopOf="@+id/llFire" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 786247d..af14a81 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -346,4 +346,6 @@ Service Description\n
CYN
$元
每天
+ Popular applications
+ Popular Application Navigation
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 110ba33..cb5a0f9 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -336,4 +336,6 @@
CYN
$元
每天
+ 熱門應用
+ 熱門應用導航
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 1e3c800..8f63e53 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -335,4 +335,6 @@
CYN
$元
每天
+ 熱門應用
+ 熱門應用導航
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cdea562..9d02e36 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -354,4 +354,6 @@
CYN
$元
每天
+ 热门应用
+ 热门应用导航
\ No newline at end of file