优化修改bug
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
2289
.idea/caches/deviceStreaming.xml
generated
Normal file
2289
.idea/caches/deviceStreaming.xml
generated
Normal file
File diff suppressed because it is too large
Load Diff
13
.idea/deviceManager.xml
generated
Normal file
13
.idea/deviceManager.xml
generated
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DeviceTable">
|
||||
<option name="columnSorters">
|
||||
<list>
|
||||
<ColumnSorterState>
|
||||
<option name="column" value="Name" />
|
||||
<option name="order" value="ASCENDING" />
|
||||
</ColumnSorterState>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
||||
@@ -53,6 +53,9 @@
|
||||
<activity
|
||||
android:name=".ui.act.login.AgreementActivity"
|
||||
android:theme="@style/Theme.CkCollar_app.NoActionBar"></activity>
|
||||
<activity
|
||||
android:name=".ui.act.setting.SettingWebViewActivity"
|
||||
android:theme="@style/Theme.CkCollar_app.NoActionBar"></activity>
|
||||
<activity
|
||||
android:name=".ui.act.home.MainActivity"
|
||||
android:launchMode="singleTask"
|
||||
|
||||
@@ -34,4 +34,9 @@ object Config : TileSourceFactory() {
|
||||
override fun getTileURLString(pMapTileIndex: Long) =
|
||||
("$baseUrl&X=${MapTileIndex.getX(pMapTileIndex)}&Y=${MapTileIndex.getY(pMapTileIndex)}&L=${MapTileIndex.getZoom(pMapTileIndex)}")
|
||||
}
|
||||
|
||||
//隐私政策
|
||||
var PRIVACY_POLICY = "http://f.chongdunpet.com/privacy_policy.html#a6";
|
||||
//三方SDK
|
||||
var THIRD_PARTY_SDK = "http://h.chongdunpet.com/third_party_sdk.html";
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.ck.ckcollar.app.ui.act.balance
|
||||
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import com.alipay.sdk.app.EnvUtils
|
||||
import com.alipay.sdk.app.PayTask
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.databinding.ActivityRechargeBinding
|
||||
@@ -23,7 +25,7 @@ import kotlinx.coroutines.withContext
|
||||
|
||||
class RechargeActivity : CKBaseActivity() {
|
||||
lateinit var binding: ActivityRechargeBinding
|
||||
var payType = "1"
|
||||
var payType = "0"
|
||||
var model : RechargeModel? = null
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityRechargeBinding.inflate(layoutInflater)
|
||||
@@ -87,7 +89,10 @@ class RechargeActivity : CKBaseActivity() {
|
||||
|
||||
fun aliPay(){
|
||||
GlobalScope.launch(Dispatchers.IO){
|
||||
|
||||
// [支付宝沙箱测试] 仅 Debug 包启用,Release 包继续使用正式环境。
|
||||
if (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) {
|
||||
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)
|
||||
}
|
||||
val alipay = PayTask(this@RechargeActivity)
|
||||
val result = alipay.payV2(model?.orderStr, true)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class WithDrawActivity : CKLHBaseActionBarActivity() {
|
||||
lateinit var binding: ActivityWithdrawBinding
|
||||
var model : BalanceModle? = null
|
||||
|
||||
var payType = "1"
|
||||
var payType = "0"
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityWithdrawBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
@@ -52,6 +52,7 @@ import com.ck.ckcollar.app.ui.popview.CKCollarTypePopView
|
||||
import com.ck.ckcollar.app.ui.popview.CKPowerAlertView
|
||||
import com.ck.ckcollar.app.utils.CKUtils
|
||||
import com.ck.ckcollar.app.utils.Const
|
||||
import com.ck.ckcollar.app.utils.LubanCompressUtil
|
||||
import com.ck.ckcollar.app.utils.networkone.ICallback
|
||||
import com.ck.ckcollar.app.utils.networkone.TTHttpClient
|
||||
import com.ck.ckcollar.app.utils.networkone.model.TTRequestData
|
||||
@@ -81,6 +82,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
private enum class CameraAction { SCAN, TAKE_PHOTO }
|
||||
|
||||
private var pendingCameraAction: CameraAction? = null
|
||||
private var imageUploadInProgress = false
|
||||
private var permissionTopDialog: AlertDialog? = null
|
||||
private val cameraSettingsLauncher = registerForActivityResult(
|
||||
ActivityResultContracts.StartActivityForResult()
|
||||
@@ -794,8 +796,26 @@ class HomeFragment : CKBaseFragment() {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
|
||||
if (requestCode == 55 && resultCode == RESULT_OK) {
|
||||
var path = PreferencesUtils.getString(activity!!, Const.IMAGE_PATH, "")
|
||||
uploadImage(path!!)
|
||||
val path = PreferencesUtils.getString(activity!!, Const.IMAGE_PATH, "")
|
||||
if (!path.isNullOrBlank()) {
|
||||
imageUploadInProgress = true
|
||||
LubanCompressUtil.getCompressFile(
|
||||
requireContext(),
|
||||
File(path),
|
||||
object : LubanCompressUtil.CompressCallback {
|
||||
override fun success(file: File) {
|
||||
if (!isAdded) return
|
||||
uploadImage(file.absolutePath)
|
||||
}
|
||||
|
||||
override fun fail(failMsg: String) {
|
||||
if (!isAdded) return
|
||||
imageUploadInProgress = false
|
||||
toast(failMsg)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -809,6 +829,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
TTHttpClient.postFile(activity as TTBaseActivity, "上传照片s", param, object : ICallback {
|
||||
override fun onSuccess(data: String) {
|
||||
if (!CKApp.app.isUserLoggedIn) {
|
||||
imageUploadInProgress = false
|
||||
hiddenProgeassDialog()
|
||||
return
|
||||
}
|
||||
@@ -819,6 +840,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
}
|
||||
|
||||
override fun onFailed(code: String, msg: String) {
|
||||
imageUploadInProgress = false
|
||||
hiddenProgeassDialog()
|
||||
toast(msg)
|
||||
}
|
||||
@@ -832,6 +854,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
add(TTRequestData("imageUrl", imageUrl))
|
||||
}, object : ICallback {
|
||||
override fun onSuccess(data: String) {
|
||||
imageUploadInProgress = false
|
||||
hiddenProgeassDialog()
|
||||
if (!CKApp.app.isUserLoggedIn) return
|
||||
|
||||
@@ -851,6 +874,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
}
|
||||
|
||||
override fun onFailed(code: String, msg: String) {
|
||||
imageUploadInProgress = false
|
||||
hiddenProgeassDialog()
|
||||
toast(msg)
|
||||
}
|
||||
@@ -911,7 +935,7 @@ class HomeFragment : CKBaseFragment() {
|
||||
super.onResume()
|
||||
if (CKApp.app.isUserLoggedIn && loadedLoginToken != CKApp.app.token) {
|
||||
initData()
|
||||
} else if (CKApp.app.isUserLoggedIn && shouldRefreshPetListOnResume) {
|
||||
} else if (CKApp.app.isUserLoggedIn && shouldRefreshPetListOnResume && !imageUploadInProgress) {
|
||||
getPetList()
|
||||
}
|
||||
shouldRefreshPetListOnResume = false
|
||||
|
||||
@@ -12,10 +12,12 @@ import android.text.style.ClickableSpan
|
||||
import android.view.View
|
||||
import com.ck.ckcollar.app.CKApp
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.config.Config
|
||||
import com.ck.ckcollar.app.databinding.ActivityLoginBinding
|
||||
import com.ck.ckcollar.app.model.LoginModel
|
||||
import com.ck.ckcollar.app.model.UserInfoModel
|
||||
import com.ck.ckcollar.app.ui.act.home.MainActivity
|
||||
import com.ck.ckcollar.app.ui.act.setting.SettingWebViewActivity
|
||||
import com.ck.ckcollar.app.ui.base.CKBaseActivity
|
||||
import com.ck.ckcollar.app.utils.Const
|
||||
import com.ck.ckcollar.app.utils.networkone.ICallback
|
||||
@@ -124,8 +126,11 @@ class LoginActivity : CKBaseActivity() {
|
||||
var clickableSpan2 = object : ClickableSpan() {
|
||||
override fun onClick(v: View) {
|
||||
toActivity(
|
||||
AgreementActivity::class.java,
|
||||
DataCollection().apply { add(Data("title", "隐私政策")) })
|
||||
SettingWebViewActivity::class.java,
|
||||
DataCollection().apply {
|
||||
add(Data("url", Config.PRIVACY_POLICY))
|
||||
add(Data("title", getString(R.string.privacy_agreement)))
|
||||
})
|
||||
}
|
||||
|
||||
override fun updateDrawState(ds: TextPaint) {
|
||||
@@ -146,7 +151,6 @@ class LoginActivity : CKBaseActivity() {
|
||||
binding.btnCheck.setOnClickListener {
|
||||
isCheck = !isCheck
|
||||
setCheckUI()
|
||||
PreferencesUtils.putBoolean(this@LoginActivity, Const.AGREEMENT_CHECK, isCheck)
|
||||
}
|
||||
|
||||
binding.btnSendCode.setOnClickListener {
|
||||
@@ -154,6 +158,10 @@ class LoginActivity : CKBaseActivity() {
|
||||
sendCode()
|
||||
}
|
||||
binding.btnWX.setOnClickListener {
|
||||
if (!isCheck) {
|
||||
toast(getString(R.string.alert_agreement))
|
||||
return@setOnClickListener
|
||||
}
|
||||
val req = SendAuth.Req()
|
||||
req.scope = "snsapi_userinfo" // 只能填 snsapi_userinfo
|
||||
req.state = "wechat_sdk_demo_test"
|
||||
@@ -303,7 +311,9 @@ class LoginActivity : CKBaseActivity() {
|
||||
|
||||
binding.editLoginName.setText(PreferencesUtils.getString(this, Const.LOGIN_NAME, ""))
|
||||
|
||||
isCheck = PreferencesUtils.getBolean(this, Const.AGREEMENT_CHECK, false) as Boolean
|
||||
// Agreement consent is intentionally session-local: users must confirm it on every login.
|
||||
isCheck = false
|
||||
setCheckUI()
|
||||
|
||||
}
|
||||
|
||||
@@ -319,6 +329,12 @@ class LoginActivity : CKBaseActivity() {
|
||||
}
|
||||
|
||||
fun wxLogin(code : String){
|
||||
|
||||
if (!isCheck) {
|
||||
toast(getString(R.string.alert_agreement))
|
||||
return
|
||||
}
|
||||
|
||||
showProgeassDialog(getString(R.string.login))
|
||||
TTHttpClient.postJson(this,"微信登录", TTRequestParam().apply { add(TTRequestData("code",code)) },object : ICallback{
|
||||
override fun onSuccess(data: String) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.ck.ckcollar.app.ui.act.member
|
||||
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.res.ColorStateList
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
@@ -8,6 +9,7 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import com.alipay.sdk.app.EnvUtils
|
||||
import com.alipay.sdk.app.PayTask
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.databinding.ActivityMemberBinding
|
||||
@@ -38,7 +40,7 @@ class OpenMemberActivity : CKLHBaseActionBarActivity() {
|
||||
var data = listOf<MemberPriceModel>()
|
||||
var pos = -1
|
||||
var isAuto = false
|
||||
var payType = "1"
|
||||
var payType = "0"
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityOpenMemberBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
@@ -220,7 +222,10 @@ class OpenMemberActivity : CKLHBaseActionBarActivity() {
|
||||
|
||||
fun aliPay(orderStr : String){
|
||||
GlobalScope.launch(Dispatchers.IO){
|
||||
|
||||
// [支付宝沙箱测试] 仅 Debug 包启用,Release 包继续使用正式环境。
|
||||
if (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) {
|
||||
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)
|
||||
}
|
||||
val alipay = PayTask(this@OpenMemberActivity)
|
||||
val result = alipay.payV2(orderStr, true)
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.ck.ckcollar.app.ui.act.order
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
@@ -8,6 +9,7 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.alipay.sdk.app.EnvUtils
|
||||
import com.alipay.sdk.app.PayTask
|
||||
import com.bumptech.glide.Glide
|
||||
import com.ck.ckcollar.app.CKApp
|
||||
@@ -55,7 +57,7 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
var memberModel: UserInfoModel? = null
|
||||
|
||||
var payType = "1"
|
||||
var payType = "0"
|
||||
|
||||
var selectBalance = false
|
||||
var selectPoints = false
|
||||
@@ -83,9 +85,6 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
binding.btnAli.setOnClickListener(payClick)
|
||||
binding.btnWX.setOnClickListener(payClick)
|
||||
binding.btnBalance.setOnClickListener(payClick)
|
||||
binding.btnPoints.setOnClickListener(payClick)
|
||||
|
||||
|
||||
binding.btnBalance.setOnClickListener {
|
||||
|
||||
@@ -102,6 +101,11 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
}
|
||||
}
|
||||
binding.btnPoints.setOnClickListener {
|
||||
if ((memberModel?.points ?: 0.0) <= 0.0) {
|
||||
toast(getString(R.string.points_over))
|
||||
return@setOnClickListener
|
||||
}
|
||||
|
||||
selectPoints = !selectPoints
|
||||
if (selectPoints){
|
||||
binding.image4.setImageResource(R.mipmap.image_address_check_select)
|
||||
@@ -113,8 +117,7 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
binding.btnBuyNow.setOnClickListener {
|
||||
|
||||
|
||||
if (selectBalance){
|
||||
if (selectBalance && !canPointsCoverPayAmount()){
|
||||
getPayPassword()
|
||||
}else{
|
||||
order("")
|
||||
@@ -171,7 +174,7 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
|
||||
if (TextUtils.isEmpty(payType) && memberModel?.balance == 0.0){
|
||||
if (!selectPoints || "1".equals(confirmOrderModel?.isPoint)){
|
||||
if (!selectPoints || "1".equals(confirmOrderModel?.isPoint.toString())){
|
||||
toast(getString(R.string.balance_over))
|
||||
return
|
||||
}
|
||||
@@ -207,10 +210,7 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
var showBalance = BigDecimal.valueOf(model.payAmount).setScale(2, RoundingMode.HALF_UP)
|
||||
if (selectPoints){
|
||||
memberModel?.intoAmounts?.let { intoAmounts ->
|
||||
val pointsDeduction = BigDecimal.valueOf(memberModel!!.points)
|
||||
.multiply(BigDecimal(intoAmounts))
|
||||
.setScale(2, RoundingMode.HALF_UP)
|
||||
calculatePointsDeduction()?.let { pointsDeduction ->
|
||||
showBalance = showBalance.subtract(pointsDeduction)
|
||||
.max(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP))
|
||||
}
|
||||
@@ -234,6 +234,11 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
|
||||
var payType = payType
|
||||
if(selectBalance){
|
||||
if (TextUtils.isEmpty(payType) && memberModel?.balance == 0.0){
|
||||
toast(getString(R.string.balance_over))
|
||||
return
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(payType)){
|
||||
payType = "2"
|
||||
}else{
|
||||
@@ -241,6 +246,11 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
}
|
||||
}
|
||||
if(selectPoints){
|
||||
if (TextUtils.isEmpty(payType) && memberModel?.points == 0.0){
|
||||
toast(getString(R.string.points_over))
|
||||
return
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(payType)){
|
||||
payType = "3"
|
||||
}else{
|
||||
@@ -304,9 +314,28 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
})
|
||||
}
|
||||
|
||||
fun aliPay(orderStr: String) {
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
private fun canPointsCoverPayAmount(): Boolean {
|
||||
if (!selectPoints) return false
|
||||
val pointsDeduction = calculatePointsDeduction() ?: return false
|
||||
val payAmount = BigDecimal.valueOf(model.payAmount).setScale(2, RoundingMode.HALF_UP)
|
||||
return pointsDeduction >= payAmount
|
||||
}
|
||||
|
||||
private fun calculatePointsDeduction(): BigDecimal? {
|
||||
val member = memberModel ?: return null
|
||||
val intoAmounts = member.intoAmounts?.toBigDecimalOrNull() ?: return null
|
||||
return BigDecimal.valueOf(member.points)
|
||||
.multiply(intoAmounts)
|
||||
.setScale(2, RoundingMode.HALF_UP)
|
||||
}
|
||||
|
||||
fun aliPay(orderStr: String) {
|
||||
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
// [支付宝沙箱测试] 仅 Debug 包启用,Release 包继续使用正式环境。
|
||||
if (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) {
|
||||
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)
|
||||
}
|
||||
val alipay = PayTask(this@PayOrderActivity)
|
||||
val result = alipay.payV2(orderStr, true)
|
||||
|
||||
@@ -347,7 +376,7 @@ class PayOrderActivity : CKBaseActivity() {
|
||||
}
|
||||
|
||||
override fun getResult(data: DataCollection, resultCode: Int) {
|
||||
if (resultCode == 10001){
|
||||
if (resultCode == 10001){
|
||||
showPayBottomView()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,8 +342,8 @@ class AddPetActivity : CKBaseActivity() {
|
||||
data?.data?.let(::handleSelectedImage)
|
||||
?: toast(getString(R.string.read_photo_failed))
|
||||
}else if (requestCode == 555 && resultCode == RESULT_OK) {
|
||||
var path = PreferencesUtils.getString(this@AddPetActivity, Const.IMAGE_PATH,"")
|
||||
uploadImage(path!!)
|
||||
val path = PreferencesUtils.getString(this@AddPetActivity, Const.IMAGE_PATH, "")
|
||||
compressAndUploadImage(path.orEmpty())
|
||||
}
|
||||
binding.textPhotoNum.setText((this.data.size - 1 ).toString() + "/3")
|
||||
}
|
||||
@@ -389,6 +389,29 @@ class AddPetActivity : CKBaseActivity() {
|
||||
)
|
||||
}
|
||||
|
||||
private fun compressAndUploadImage(path: String) {
|
||||
if (path.isBlank()) {
|
||||
toast(getString(R.string.read_photo_failed))
|
||||
return
|
||||
}
|
||||
|
||||
LubanCompressUtil.getCompressFile(
|
||||
this,
|
||||
File(path),
|
||||
object : LubanCompressUtil.CompressCallback {
|
||||
override fun success(file: File) {
|
||||
if (isFinishing || isDestroyed) return
|
||||
uploadImage(file.absolutePath)
|
||||
}
|
||||
|
||||
override fun fail(failMsg: String) {
|
||||
if (isFinishing || isDestroyed) return
|
||||
toast(failMsg)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private fun copySelectedImageToCache(uri: Uri): String? {
|
||||
val extension = contentResolver.getType(uri)
|
||||
?.let(MimeTypeMap.getSingleton()::getExtensionFromMimeType)
|
||||
|
||||
@@ -5,94 +5,66 @@ import android.os.Bundle
|
||||
import android.view.View
|
||||
import com.ck.ckcollar.app.CKApp
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.config.Config
|
||||
import com.ck.ckcollar.app.databinding.ActivitySettingBinding
|
||||
import com.ck.ckcollar.app.ui.act.home.MainActivity
|
||||
import com.ck.ckcollar.app.ui.act.login.AgreementActivity
|
||||
import com.ck.ckcollar.app.ui.act.login.LoginActivity
|
||||
import com.ck.ckcollar.app.ui.act.home.MainActivity
|
||||
import com.ck.ckcollar.app.ui.base.CKBaseActivity
|
||||
import com.ck.ckcollar.app.ui.dialog.CKAlertDialog
|
||||
import com.tt.kit.model.Data
|
||||
import com.tt.kit.model.DataCollection
|
||||
|
||||
class SettingActivity : CKBaseActivity(), View.OnClickListener {
|
||||
lateinit var binding: ActivitySettingBinding
|
||||
private lateinit var binding: ActivitySettingBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivitySettingBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setStatusBarColor(resources.getColor(R.color.white))
|
||||
setActionBarColor(resources.getColor(R.color.white))
|
||||
|
||||
setStatusBarColor(getColor(R.color.white))
|
||||
setActionBarColor(getColor(R.color.white))
|
||||
setTitleText(getString(R.string.setting))
|
||||
}
|
||||
|
||||
override fun initView() {
|
||||
binding.btnLogout.visibility = if (CKApp.app.isUserLoggedIn) View.VISIBLE else View.GONE
|
||||
|
||||
binding.contentLoginPassword.setOnClickListener(this)
|
||||
binding.contentPaymentPassword.setOnClickListener(this)
|
||||
binding.contentAboutUs.setOnClickListener(this)
|
||||
binding.contentUserAgreement.setOnClickListener(this)
|
||||
binding.contentPrivacyAgreement.setOnClickListener(this)
|
||||
binding.contentShippingAddress.setOnClickListener(this)
|
||||
binding.contentCancellation.setOnClickListener(this)
|
||||
binding.btnLogout.setOnClickListener(this)
|
||||
listOf(binding.contentLoginPassword, binding.contentPaymentPassword, binding.contentAboutUs,
|
||||
binding.contentUserAgreement, binding.contentPrivacyAgreement, binding.contentShippingAddress,
|
||||
binding.contentCancellation, binding.btnLogout).forEach { it.setOnClickListener(this) }
|
||||
}
|
||||
override fun initData() {
|
||||
|
||||
}
|
||||
override fun initData() = Unit
|
||||
|
||||
override fun onClick(v: View?) {
|
||||
|
||||
when (v?.id){
|
||||
R.id.contentLoginPassword->{
|
||||
if (!requireLogin()) return
|
||||
toActivity(PasswordManagerActivity::class.java, DataCollection())
|
||||
}
|
||||
R.id.contentPaymentPassword->{
|
||||
if (!requireLogin()) return
|
||||
toActivity(PayPasswordManagerActivity::class.java, DataCollection())
|
||||
|
||||
}
|
||||
R.id.contentAboutUs->{
|
||||
toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title","关于我们")) })
|
||||
}
|
||||
R.id.contentUserAgreement->{
|
||||
toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title","用户协议")) })
|
||||
}
|
||||
R.id.contentPrivacyAgreement->{
|
||||
toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title","隐私协议")) })
|
||||
}
|
||||
R.id.contentShippingAddress->{
|
||||
if (!requireLogin()) return
|
||||
toActivity(AddressActivity::class.java, DataCollection().apply { add(Data("flag","1"))
|
||||
})
|
||||
}
|
||||
R.id.contentCancellation->{
|
||||
if (!requireLogin()) return
|
||||
toActivity(AccountCancellationActivity::class.java, DataCollection())
|
||||
}
|
||||
R.id.btnLogout->{
|
||||
CKAlertDialog(this@SettingActivity,getString(R.string.logout),getString(R.string.logout_alert),object : CKAlertDialog.AlertClickListener{
|
||||
override fun onBack(isConfirm: Boolean) {
|
||||
if (isConfirm){
|
||||
CKApp.app.clearLoginState()
|
||||
startActivity(
|
||||
Intent(this@SettingActivity, MainActivity::class.java).apply {
|
||||
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||
putExtra(MainActivity.EXTRA_SHOW_HOME, true)
|
||||
}
|
||||
)
|
||||
finish()
|
||||
}
|
||||
when (v?.id) {
|
||||
R.id.contentLoginPassword -> if (requireLogin()) toActivity(PasswordManagerActivity::class.java, DataCollection())
|
||||
R.id.contentPaymentPassword -> if (requireLogin()) toActivity(PayPasswordManagerActivity::class.java, DataCollection())
|
||||
R.id.contentAboutUs -> toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title", getString(R.string.about_us))) })
|
||||
R.id.contentUserAgreement -> toActivity(AgreementActivity::class.java, DataCollection().apply { add(Data("title", getString(R.string.user_agreement))) })
|
||||
R.id.contentPrivacyAgreement -> toActivity(SettingWebViewActivity::class.java, pageParams(Config.PRIVACY_POLICY, getString(R.string.privacy_agreement)))
|
||||
R.id.contentShippingAddress -> if (requireLogin()) toActivity(AddressActivity::class.java, DataCollection().apply { add(Data("flag", "1")) })
|
||||
R.id.contentCancellation -> if (requireLogin()) toActivity(AccountCancellationActivity::class.java, DataCollection())
|
||||
R.id.btnLogout -> CKAlertDialog(this, getString(R.string.logout), getString(R.string.logout_alert), object : CKAlertDialog.AlertClickListener {
|
||||
override fun onBack(isConfirm: Boolean) {
|
||||
if (isConfirm) {
|
||||
CKApp.app.clearLoginState()
|
||||
startActivity(Intent(this@SettingActivity, MainActivity::class.java).apply {
|
||||
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||
putExtra(MainActivity.EXTRA_SHOW_HOME, true)
|
||||
})
|
||||
finish()
|
||||
}
|
||||
}).show()
|
||||
|
||||
}
|
||||
}
|
||||
}).show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun pageParams(url: String, title: String) = DataCollection().apply {
|
||||
add(Data("url", url))
|
||||
add(Data("title", title))
|
||||
}
|
||||
|
||||
private fun requireLogin(): Boolean {
|
||||
if (CKApp.app.isUserLoggedIn) return true
|
||||
toActivity(LoginActivity::class.java, DataCollection())
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package com.ck.ckcollar.app.ui.act.setting
|
||||
|
||||
import android.os.Bundle
|
||||
import android.webkit.WebSettings
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
import android.net.Uri
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.databinding.ActivitySettingWebViewBinding
|
||||
import com.ck.ckcollar.app.ui.base.CKBaseActivity
|
||||
|
||||
/** Displays a setting document supplied by the caller. */
|
||||
class SettingWebViewActivity : CKBaseActivity() {
|
||||
private lateinit var binding: ActivitySettingWebViewBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivitySettingWebViewBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
super.onCreate(savedInstanceState)
|
||||
setActionBarColor(getColor(R.color.white))
|
||||
setStatusBarColor(getColor(R.color.white))
|
||||
}
|
||||
|
||||
override fun initView() {
|
||||
binding.webView.settings.apply {
|
||||
javaScriptEnabled = true; domStorageEnabled = true
|
||||
useWideViewPort = true; loadWithOverviewMode = true
|
||||
setSupportZoom(true); builtInZoomControls = true; displayZoomControls = false
|
||||
layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS
|
||||
}
|
||||
binding.webView.apply {
|
||||
isFocusableInTouchMode = true
|
||||
requestFocus()
|
||||
webViewClient = object : WebViewClient() {
|
||||
override fun onPageFinished(view: WebView?, url: String?) {
|
||||
super.onPageFinished(view, url)
|
||||
// Do this after the page's anchor/default restoration has run.
|
||||
view?.post {
|
||||
view.scrollTo(0, 0)
|
||||
view.evaluateJavascript("window.scrollTo(0, 0);", null)
|
||||
}
|
||||
view?.postDelayed({ view.scrollTo(0, 0) }, 300)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun initData() {
|
||||
val params = getReceiveParam()
|
||||
setTitleText(params.get("title")?.stringValue?.toString().orEmpty())
|
||||
val url = params.get("url")?.stringValue?.toString().orEmpty()
|
||||
if (url.isNotEmpty()) {
|
||||
// Fragment anchors (for example #a6 in the privacy URL) override the
|
||||
// initial position, while this screen always starts at the document top.
|
||||
val topUrl = runCatching { Uri.parse(url).buildUpon().fragment(null).build().toString() }
|
||||
.getOrDefault(url)
|
||||
binding.webView.loadUrl(topUrl)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
binding.webView.apply { stopLoading(); destroy() }
|
||||
super.onDestroy()
|
||||
}
|
||||
}
|
||||
@@ -65,7 +65,7 @@ class OrderActivity : CKBaseActivity() {
|
||||
|
||||
var memberModel: UserInfoModel? = null
|
||||
|
||||
var payType = "1"
|
||||
var payType = "0"
|
||||
|
||||
var selectBalance = false
|
||||
var selectPoints = false
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.ck.ckcollar.app.ui.dialog.CKEditNameDialog
|
||||
import com.ck.ckcollar.app.ui.dialog.CKEditPhoneDialog
|
||||
import com.ck.ckcollar.app.ui.dialog.CKPhotoDialog
|
||||
import com.ck.ckcollar.app.utils.Const
|
||||
import com.ck.ckcollar.app.utils.IDCardValidate
|
||||
import com.ck.ckcollar.app.utils.networkone.ICallback
|
||||
import com.ck.ckcollar.app.utils.networkone.TTHttpClient
|
||||
import com.ck.ckcollar.app.utils.networkone.model.TTRequestData
|
||||
@@ -86,7 +87,7 @@ class UserInfoActivity: CKBaseActivity() {
|
||||
binding.textPhone.setOnClickListener {
|
||||
CKEditPhoneDialog(
|
||||
this@UserInfoActivity,
|
||||
getString(R.string.bind_phone),
|
||||
getString(R.string.modify_phone_number),
|
||||
object : CKEditPhoneDialog.AlertClickListener {
|
||||
override fun onBack(text: String) {
|
||||
binding.textPhone.text = text
|
||||
@@ -99,7 +100,12 @@ class UserInfoActivity: CKBaseActivity() {
|
||||
binding.textIdCard.setOnClickListener {
|
||||
CKEditDialog(this@UserInfoActivity,getString(R.string.id_card),binding.textIdCard.text.toString(),object : CKEditDialog.AlertClickListener{
|
||||
override fun onBack(text: String) {
|
||||
binding.textIdCard.text = text
|
||||
val idCard = text.trim().uppercase()
|
||||
if (!IDCardValidate.validateEffective(idCard)) {
|
||||
toast("请输入正确的身份证号码")
|
||||
return
|
||||
}
|
||||
binding.textIdCard.text = idCard
|
||||
save()
|
||||
}
|
||||
}).show()
|
||||
|
||||
@@ -4,9 +4,27 @@ import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.os.Message
|
||||
import android.app.AlertDialog
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.GradientDrawable
|
||||
import android.text.SpannableString
|
||||
import android.text.Spanned
|
||||
import android.text.method.LinkMovementMethod
|
||||
import android.text.style.ClickableSpan
|
||||
import android.view.View
|
||||
import android.view.Gravity
|
||||
import android.view.ViewGroup
|
||||
import android.view.WindowManager
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import android.widget.ScrollView
|
||||
import com.ck.ckcollar.app.CKApp
|
||||
import com.ck.ckcollar.app.R
|
||||
import com.ck.ckcollar.app.databinding.ActivityIndexBinding
|
||||
import com.ck.ckcollar.app.ui.act.home.MainActivity
|
||||
import com.ck.ckcollar.app.ui.act.login.AgreementActivity
|
||||
import com.ck.ckcollar.app.ui.act.setting.SettingWebViewActivity
|
||||
import com.ck.ckcollar.app.config.Config
|
||||
import com.ck.ckcollar.app.ui.base.CKBaseActivity
|
||||
import com.ck.ckcollar.app.utils.Const
|
||||
import com.cyclone.shadowsocks.utils.PreferencesUtils
|
||||
@@ -23,19 +41,89 @@ class IndexActivity : CKBaseActivity() {
|
||||
}
|
||||
var handler = object : Handler(Looper.getMainLooper()){
|
||||
override fun handleMessage(msg: Message) {
|
||||
if (!CKApp.app.isUserLoggedIn){
|
||||
var isFirst = PreferencesUtils.getBolean(this@IndexActivity, Const.FIRST,true) as Boolean
|
||||
if (isFirst){
|
||||
toActivity(WelcomeActivity::class.java, DataCollection())
|
||||
}else{
|
||||
toActivity(MainActivity::class.java, DataCollection())
|
||||
}
|
||||
}else{
|
||||
toActivity(MainActivity::class.java, DataCollection())
|
||||
}
|
||||
continueAfterAgreement()
|
||||
}
|
||||
}
|
||||
|
||||
private fun continueAfterAgreement() {
|
||||
val agreed = PreferencesUtils.getBolean(this, Const.AGREEMENT_CHECK, false) as Boolean
|
||||
if (!agreed) {
|
||||
showUserNotice()
|
||||
return
|
||||
}
|
||||
val isFirst = PreferencesUtils.getBolean(this, Const.FIRST, true) as Boolean
|
||||
toActivity(if (isFirst) WelcomeActivity::class.java else MainActivity::class.java, DataCollection())
|
||||
finish()
|
||||
}
|
||||
|
||||
finish()
|
||||
private fun showUserNotice() {
|
||||
fun dp(value: Int) = (value * resources.displayMetrics.density).toInt()
|
||||
val title = TextView(this).apply {
|
||||
text = "用户须知"
|
||||
setTextColor(Color.rgb(35, 39, 55))
|
||||
textSize = 20f
|
||||
gravity = Gravity.CENTER
|
||||
setTypeface(typeface, android.graphics.Typeface.BOLD)
|
||||
}
|
||||
val content = TextView(this).apply {
|
||||
setTextColor(Color.rgb(95, 99, 115))
|
||||
textSize = 14f
|
||||
setLineSpacing(0f, 1.35f)
|
||||
movementMethod = LinkMovementMethod.getInstance()
|
||||
val text = "感谢您使用宠盾!我们非常重视您的个人信息和隐私保护。请阅读并同意《用户协议》和《隐私协议》后继续使用。\n\n1. 为提供宠物管理、设备连接、消息通知和 AI 识别等服务,我们可能会收集必要的账号、设备及使用信息。\n\n2. 在您使用拍照、扫码、地图定位、蓝牙或相册等功能时,我们会在获得授权后申请相应权限;您可以随时在系统设置中关闭权限,但可能无法使用对应功能。\n\n3. 我们会采取合理的安全措施保护您的信息,不会将信息用于协议约定以外的用途,也不会向无关方出售或出租您的信息。\n\n4. 为保障服务稳定运行,部分功能可能由第三方服务提供商协助完成,我们会要求其按照法律法规和隐私政策保护您的信息。\n\n5. 当协议内容或服务发生重要变化时,我们会通过弹窗或其他适当方式提醒您。您可以通过应用内相关入口再次查看完整协议。"
|
||||
val spannable = SpannableString(text)
|
||||
val userStart = text.indexOf("《用户协议》")
|
||||
val privacyStart = text.indexOf("《隐私协议》")
|
||||
spannable.setSpan(object : ClickableSpan() {
|
||||
override fun onClick(widget: View) = toActivity(AgreementActivity::class.java, DataCollection().apply { add(com.tt.kit.model.Data("title", getString(R.string.user_agreement))) })
|
||||
}, userStart, userStart + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
spannable.setSpan(object : ClickableSpan() {
|
||||
override fun onClick(widget: View) = toActivity(SettingWebViewActivity::class.java, DataCollection().apply {
|
||||
add(com.tt.kit.model.Data("url", Config.PRIVACY_POLICY)); add(com.tt.kit.model.Data("title", getString(R.string.privacy_agreement)))
|
||||
})
|
||||
}, privacyStart, privacyStart + 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
|
||||
setText(spannable)
|
||||
}
|
||||
val contentScroll = ScrollView(this).apply {
|
||||
isFillViewport = true
|
||||
isVerticalScrollBarEnabled = false
|
||||
addView(content, ViewGroup.LayoutParams(-1, -2))
|
||||
}
|
||||
lateinit var dialog: AlertDialog
|
||||
val buttons = LinearLayout(this).apply {
|
||||
orientation = LinearLayout.HORIZONTAL
|
||||
gravity = Gravity.CENTER
|
||||
}
|
||||
fun action(text: String, backgroundColor: Int, textColor: Int, onClick: () -> Unit) = TextView(this).apply {
|
||||
this.text = text; gravity = Gravity.CENTER; setTextColor(textColor); textSize = 15f
|
||||
setTypeface(typeface, android.graphics.Typeface.BOLD); setPadding(0, dp(13), 0, dp(13))
|
||||
background = GradientDrawable().apply { setColor(backgroundColor); cornerRadius = dp(10).toFloat() }
|
||||
setOnClickListener { onClick() }
|
||||
}
|
||||
val rejectButton = action("不同意", Color.rgb(245, 246, 250), Color.rgb(35, 39, 55), {
|
||||
dialog.dismiss(); finishAndRemoveTask()
|
||||
})
|
||||
val agreeButton = action("同意", getColor2(R.attr.buttonColor), Color.WHITE) {
|
||||
PreferencesUtils.putBoolean(this@IndexActivity, Const.AGREEMENT_CHECK, true)
|
||||
dialog.dismiss(); continueAfterAgreement()
|
||||
}
|
||||
buttons.addView(rejectButton, LinearLayout.LayoutParams(0, dp(52), 1f).apply { marginEnd = dp(7) })
|
||||
buttons.addView(agreeButton, LinearLayout.LayoutParams(0, dp(52), 1f).apply { marginStart = dp(7) })
|
||||
val panel = LinearLayout(this).apply {
|
||||
orientation = LinearLayout.VERTICAL
|
||||
setPadding(dp(24), dp(25), dp(24), dp(24))
|
||||
addView(title, LinearLayout.LayoutParams(-1, dp(40)))
|
||||
addView(contentScroll, LinearLayout.LayoutParams(-1, dp(390)).apply { topMargin = dp(12); bottomMargin = dp(20) })
|
||||
addView(buttons, LinearLayout.LayoutParams(-1, dp(52)))
|
||||
background = GradientDrawable().apply { setColor(Color.WHITE); cornerRadius = dp(22).toFloat() }
|
||||
}
|
||||
dialog = AlertDialog.Builder(this).setView(panel).setCancelable(false).create()
|
||||
dialog.show()
|
||||
dialog.window?.apply {
|
||||
setBackgroundDrawableResource(android.R.color.transparent)
|
||||
setDimAmount(0.55f)
|
||||
setGravity(Gravity.CENTER)
|
||||
setLayout((resources.displayMetrics.widthPixels * 0.82f).toInt(), WindowManager.LayoutParams.WRAP_CONTENT)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.ck.ckcollar.app.ui.dialog
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.ColorStateList
|
||||
import android.text.TextUtils
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -33,8 +34,15 @@ class CKEditPhoneDialog(
|
||||
dialogAlertBinding.title.text = title
|
||||
}
|
||||
dialogAlertBinding.btnSendCode.setOnClickListener { sendCode() }
|
||||
dialogAlertBinding.btnSendCode.setTextColor(
|
||||
ColorStateList(
|
||||
arrayOf(intArrayOf(-android.R.attr.state_enabled), intArrayOf()),
|
||||
intArrayOf(mContext.getColor(R.color.textSecondColor), mContext.getColor(R.color.appStyle))
|
||||
)
|
||||
)
|
||||
dialogAlertBinding.cancelButton.setOnClickListener(object : View.OnClickListener {
|
||||
override fun onClick(v: View?) {
|
||||
dialogAlertBinding.btnSendCode.stopCountDown()
|
||||
cancel()
|
||||
}
|
||||
})
|
||||
@@ -72,7 +80,7 @@ class CKEditPhoneDialog(
|
||||
add(TTRequestData("smsCode",dialogAlertBinding.textCode.text.toString()))
|
||||
},object : ICallback{
|
||||
override fun onSuccess(data: String) {
|
||||
mContext.toast(mContext.getString(R.string.send_success))
|
||||
mContext.toast(mContext.getString(R.string.edit_success))
|
||||
cancel()
|
||||
}
|
||||
|
||||
@@ -94,7 +102,8 @@ class CKEditPhoneDialog(
|
||||
add(TTRequestData("scene","changePhone"))
|
||||
},object : ICallback{
|
||||
override fun onSuccess(data: String) {
|
||||
mContext.toast(mContext.getString(R.string.edit_success))
|
||||
mContext.toast(mContext.getString(R.string.verification_code_sent))
|
||||
dialogAlertBinding.btnSendCode.startCountDown()
|
||||
alertClickListener.onBack(dialogAlertBinding.textPhone.text.toString())
|
||||
|
||||
}
|
||||
@@ -108,4 +117,4 @@ class CKEditPhoneDialog(
|
||||
interface AlertClickListener {
|
||||
fun onBack(text : String)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
package com.ck.ckcollar.app.utils
|
||||
|
||||
import java.time.DateTimeException
|
||||
import java.time.LocalDate
|
||||
import java.time.format.DateTimeFormatter
|
||||
import java.time.format.ResolverStyle
|
||||
|
||||
/** 校验中国大陆地区的 15 位和 18 位居民身份证号码。 */
|
||||
object IDCardValidate {
|
||||
private val weights = intArrayOf(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2)
|
||||
private val verifyCodes = charArrayOf('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2')
|
||||
private val areaCodes = setOf(
|
||||
"11", "12", "13", "14", "15",
|
||||
"21", "22", "23",
|
||||
"31", "32", "33", "34", "35", "36", "37",
|
||||
"41", "42", "43", "44", "45", "46",
|
||||
"50", "51", "52", "53", "54",
|
||||
"61", "62", "63", "64", "65",
|
||||
"71", "81", "82", "91"
|
||||
)
|
||||
private val birthDateFormatter = DateTimeFormatter
|
||||
.ofPattern("uuuuMMdd")
|
||||
.withResolverStyle(ResolverStyle.STRICT)
|
||||
private val earliestBirthDate = LocalDate.of(1900, 1, 1)
|
||||
|
||||
@JvmStatic
|
||||
fun validate_effective(idcardNumber: String?): Boolean = validateEffective(idcardNumber)
|
||||
|
||||
/**
|
||||
* 为兼容 Water 项目而保留,第二个参数不会影响校验结果。
|
||||
*/
|
||||
@JvmStatic
|
||||
@Suppress("UNUSED_PARAMETER")
|
||||
fun validate_effective(idcardNumber: String?, isreturn_AutoCard: Boolean): Boolean =
|
||||
validateEffective(idcardNumber)
|
||||
|
||||
@JvmStatic
|
||||
fun validateEffective(idCardNumber: String?): Boolean {
|
||||
val source = idCardNumber?.trim()?.uppercase() ?: return false
|
||||
val cardNumber = when (source.length) {
|
||||
OLD_CARD_NUMBER_LENGTH -> convertToNewCardNumber(source) ?: return false
|
||||
NEW_CARD_NUMBER_LENGTH -> source
|
||||
else -> return false
|
||||
}
|
||||
|
||||
if (!cardNumber.take(17).all(Char::isDigit)) return false
|
||||
if (cardNumber.last() != 'X' && !cardNumber.last().isDigit()) return false
|
||||
if (cardNumber.substring(0, 2) !in areaCodes) return false
|
||||
if (!hasValidBirthDate(cardNumber.substring(6, 14))) return false
|
||||
return cardNumber.last() == calculateVerifyCode(cardNumber)
|
||||
}
|
||||
|
||||
private fun convertToNewCardNumber(oldCardNumber: String): String? {
|
||||
if (!oldCardNumber.all(Char::isDigit)) return null
|
||||
val firstSeventeen = buildString(17) {
|
||||
append(oldCardNumber, 0, 6)
|
||||
append("19")
|
||||
append(oldCardNumber, 6, oldCardNumber.length)
|
||||
}
|
||||
return firstSeventeen + calculateVerifyCode(firstSeventeen)
|
||||
}
|
||||
|
||||
private fun hasValidBirthDate(value: String): Boolean {
|
||||
val birthDate = try {
|
||||
LocalDate.parse(value, birthDateFormatter)
|
||||
} catch (_: DateTimeException) {
|
||||
return false
|
||||
}
|
||||
return birthDate.isAfter(earliestBirthDate) && birthDate.isBefore(LocalDate.now())
|
||||
}
|
||||
|
||||
private fun calculateVerifyCode(cardNumber: CharSequence): Char {
|
||||
val sum = weights.indices.sumOf { index ->
|
||||
(cardNumber[index] - '0') * weights[index]
|
||||
}
|
||||
return verifyCodes[sum % 11]
|
||||
}
|
||||
|
||||
private const val NEW_CARD_NUMBER_LENGTH = 18
|
||||
private const val OLD_CARD_NUMBER_LENGTH = 15
|
||||
}
|
||||
@@ -102,7 +102,7 @@
|
||||
android:text="@string/no_reason_text"
|
||||
android:background="@drawable/bg_cz_button"
|
||||
android:paddingHorizontal="5dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
android:visibility="gone"/>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
|
||||
@@ -49,38 +49,6 @@
|
||||
android:layout_marginBottom="10dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnWX"
|
||||
@@ -91,7 +59,7 @@
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -113,10 +81,46 @@
|
||||
android:id="@+id/image2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp">
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_narmal"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnBalance"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -295,7 +295,6 @@
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -317,7 +316,7 @@
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
android:src="@mipmap/image_address_check_narmal"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -264,7 +264,6 @@
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -286,7 +285,7 @@
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
android:src="@mipmap/image_address_check_narmal"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
@@ -56,38 +56,6 @@
|
||||
android:layout_marginBottom="10dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnWX"
|
||||
@@ -97,8 +65,7 @@
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -120,11 +87,48 @@
|
||||
android:id="@+id/image2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_gray_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_narmal"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKButton
|
||||
android:id="@+id/btnRecharge"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -107,40 +107,6 @@
|
||||
android:layout_marginBottom="20dp"
|
||||
android:textSize="16sp"></com.ck.ckcollar.app.widget.CKTextView>
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_white_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnWX"
|
||||
android:layout_width="match_parent"
|
||||
@@ -150,7 +116,7 @@
|
||||
android:background="@drawable/bg_view_white_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp"
|
||||
android:visibility="gone"
|
||||
android:visibility="visible"
|
||||
>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
@@ -172,10 +138,44 @@
|
||||
android:id="@+id/image2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_select"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKLinearLayout
|
||||
android:id="@+id/btnAli"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="50dp"
|
||||
android:orientation="horizontal"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:background="@drawable/bg_view_white_radius_12_stroke_1"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_marginTop="10dp">
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_ali"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKTextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/textColor"
|
||||
android:text="@string/alipay"
|
||||
android:paddingLeft="8dp"
|
||||
></com.ck.ckcollar.app.widget.CKTextView>
|
||||
<com.ck.ckcollar.app.widget.CKImageView
|
||||
android:id="@+id/image1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@mipmap/image_address_check_narmal"
|
||||
></com.ck.ckcollar.app.widget.CKImageView>
|
||||
</com.ck.ckcollar.app.widget.CKLinearLayout>
|
||||
|
||||
|
||||
<com.ck.ckcollar.app.widget.CKButton
|
||||
android:id="@+id/btnApply"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="50dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:text="提示"
|
||||
android:textColor="@color/textColor"
|
||||
@@ -24,7 +24,7 @@
|
||||
android:paddingLeft="10dp"
|
||||
android:paddingRight="10dp"
|
||||
android:layout_marginHorizontal="30dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginTop="20dp"
|
||||
android:hint="@string/input_phone"
|
||||
android:textColor="@color/textColor"
|
||||
android:textColorHint="@color/textSecondColor"
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
<string name="cancel_cussess">取消成功</string>
|
||||
<string name="receive_cussess">收货成功</string>
|
||||
<string name="bound_success">绑定成功</string>
|
||||
<string name="modify_phone_number">修改手机号</string>
|
||||
|
||||
<string name="next">下一步</string>
|
||||
<string name="into">立即体验</string>
|
||||
@@ -44,7 +45,7 @@
|
||||
<string name="go_to_main">进入平台(%sS)</string>
|
||||
|
||||
|
||||
<string name="time">(%s) 秒</string>
|
||||
<string name="time">(%s) 秒后重发</string>
|
||||
<string name="send_code">发送验证码</string>
|
||||
<string name="login">登录</string>
|
||||
<string name="register">注册</string>
|
||||
@@ -505,6 +506,7 @@
|
||||
<string name="input_addres_details">输入详细地址</string>
|
||||
<string name="input_tag">选择标签</string>
|
||||
<string name="input_phone_alert">输入正确手机号</string>
|
||||
<string name="verification_code_sent">验证码已发送</string>
|
||||
|
||||
<string name="register_success">注册成功</string>
|
||||
<string name="lost_success">找回成功</string>
|
||||
|
||||
Reference in New Issue
Block a user