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