Commit ec813f69 authored by shiyl's avatar shiyl

Merge branch 'dev' into dev_7.2

parents 64941f42 684d0bbf
......@@ -37,7 +37,7 @@ android {
buildConfigField "boolean", "ENV_DEBUG", "true"
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".debug.fileprovider" + '\"')
manifestPlaceholders = [
app_name : "B端测试",
app_name : "商家版测试",
file_provider: rootProject.ext.android.applicationId + ".debug.fileprovider",
]
}
......@@ -45,7 +45,7 @@ android {
buildConfigField "boolean", "ENV_DEBUG", "false"
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".fileprovider" + '\"')
manifestPlaceholders = [
app_name : "B端",
app_name : "生活圈商家版",
file_provider: rootProject.ext.android.applicationId + ".fileprovider",
]
}
......
......@@ -5,5 +5,5 @@ package com.yidian.common.constant
*/
object ResultCode {
const val SUCCESS = 0 // 成功
const val INVALID = 104000 // token失效
const val INVALID = 1104000 // token失效
}
......@@ -6,27 +6,49 @@ package com.yidian.shenghuoquan.newscontent.bean
* description: 生活号企业认证数据集
*/
class LifeAccountMerchantAuthData {
var merchantType: Int = 0
var isBusinessLicenseUpload: Boolean = false
var businessLicenseObjectKey: String? = null
var registrationName: String? = null
var registrationCode: String? = null
var authRecordId: Long? = null
var lifeAccountId: Long? = null
var isRecoverAuthProcess: Boolean = false // 是否为恢复认证流程
var merchantType: Int = 0
var isBusinessLicenseUpload: Boolean = false
var businessLicenseObjectKey: String? = null
var registrationName: String? = null
var registrationCode: String? = null
var authRecordId: Long = -1
var isAuthInfoModify: Boolean = false // 认证信息是否修改
// 营业执照相关信息
var type: String? = null
var addr: String? = null
var pers: String? = null
var scope: String? = null
var time: String? = null
var regi: String? = null
var organizer: String? = null
var date: String? = null
var comp: String? = null
var num: String? = null
var form: String? = null
var funding: String? = null
var date_issue: String? = null
}
\ No newline at end of file
// 营业执照相关信息
var type: String? = null
var addr: String? = null
var pers: String? = null
var scope: String? = null
var time: String? = null
var regi: String? = null
var organizer: String? = null
var date: String? = null
var comp: String? = null
var num: String? = null
var form: String? = null
var funding: String? = null
var dateIssue: String? = null
fun clearData() {
merchantType = 0
isBusinessLicenseUpload = false
businessLicenseObjectKey = null
registrationName = null
registrationCode = null
authRecordId = -1
isAuthInfoModify = false
type = null
addr = null
pers = null
scope = null
time = null
regi = null
organizer = null
date = null
comp = null
num = null
form = null
funding = null
dateIssue = null
}
}
......@@ -6,28 +6,55 @@ package com.yidian.shenghuoquan.newscontent.bean
* description: 生活号个人认证数据集
*/
class LifeAccountPersonalAuthData {
var realName: String? = null
var idCardNum: String? = null
var phoneNum: String? = null // 法人手机号
var occupation: String? = null
var idCardPortraitFaceObjectKey: String? = null
var idCardNationalEmblemFaceObjectKey: String? = null
var idCardPortraitFaceBucket: String? = null
var idCardNationalEmblemFaceBucket: String? = null
var isIDCardPortraitFaceUpload: Boolean = false
var isIDCardNationalEmblemFaceUpload: Boolean = false
var idCardPortraitFaceCompleteness: Int = -1
var idCardNationalEmblemFaceCompleteness: Int = -1
var liveDetectBizToken: String? = null
var liveDetectObjectKey: String? = null
var liveDetectBucket: String? = null
var isFaceAuthPass: Boolean = false
var realName: String? = null
var idCardNum: String? = null
var phoneNum: String? = null // 法人手机号
var occupation: String? = null
var idCardPortraitFaceObjectKey: String? = null
var idCardNationalEmblemFaceObjectKey: String? = null
var idCardPortraitFaceBucket: String? = null
var idCardNationalEmblemFaceBucket: String? = null
var isIDCardPortraitFaceUpload: Boolean = false
var isIDCardNationalEmblemFaceUpload: Boolean = false
var idCardPortraitFaceCompleteness: Int = -1
var idCardNationalEmblemFaceCompleteness: Int = -1
var liveDetectBizToken: String? = null
var liveDetectObjectKey: String? = null
var liveDetectBucket: String? = null
var isFaceAuthPass: Boolean = false
var isAgreePrivacyAgreement: Boolean = false // 是否同意用户协议和隐私政策
// 身份证相关信息
var gender: String? = null
var address: String? = null
var nationality: String? = null
var validDateStart: String? = null
var validDateEnd: String? = null
var issuedBy: String? = null
// 身份证相关信息
var gender: String? = null
var address: String? = null
var nationality: String? = null
var validDateStart: String? = null
var validDateEnd: String? = null
var issuedBy: String? = null
fun clearData() {
realName = null
idCardNum = null
phoneNum = null
occupation = null
idCardPortraitFaceObjectKey = null
idCardNationalEmblemFaceObjectKey = null
idCardPortraitFaceBucket = null
idCardNationalEmblemFaceBucket = null
isIDCardPortraitFaceUpload = false
isIDCardNationalEmblemFaceUpload = false
idCardPortraitFaceCompleteness = -1
idCardNationalEmblemFaceCompleteness = -1
liveDetectBizToken = null
liveDetectObjectKey = null
liveDetectBucket = null
isFaceAuthPass = false
isAgreePrivacyAgreement = false
gender = null
address = null
nationality = null
validDateStart = null
validDateEnd = null
issuedBy = null
}
}
......@@ -35,6 +35,7 @@ object Constant {
const val TYPE_LIFE_ACCOUNT_ENTERPRISE = 2 // 企业生活号
// 生活号Tag
const val LIFE_ACCOUNT_TAG_ENTERPRISE_AUTH = 0 // 企业认证
const val LIFE_ACCOUNT_TAG_COMMON_ENTERPRISE_AUTH = 1 // 普通企业认证
const val LIFE_ACCOUNT_TAG_INDIVIDUAL_BUSINESS_AUTH = 2 // 个体工商户认证
const val LIFE_ACCOUNT_TAG_PERSONAL_AUTH = 3 // 个人认证
......@@ -94,4 +95,7 @@ object Constant {
// 各输入场景最大长度显示
const val MAX_LENGTH_LIFE_ACCOUNT_NAME = 24 // 生活号名称
// 服务端返回的业务错误码
const val ERROR_CODE_PERSONAL_AUTH_INFO_DUPLICATE = 2103010 // 身份证号已认证并且认证手机号不是当前手机号
}
......@@ -124,7 +124,7 @@ class ApiService {
}
override fun onFailer(result: HttpResult<Any>?) {
apiCallback.authPersonCheckFailure(result?.reason)
apiCallback.authPersonCheckFailure(result?.code, result?.reason)
}
})
}
......
......@@ -6,6 +6,6 @@ package com.yidian.shenghuoquan.newscontent.http.callback
* description: API /merchant/auth/personal_check
*/
interface IAuthPersonalCheckCallback {
fun authPersonCheckSuccess()
fun authPersonCheckFailure(message: String?)
}
\ No newline at end of file
fun authPersonCheckSuccess()
fun authPersonCheckFailure(code: Int?, message: String?)
}
......@@ -13,7 +13,8 @@ class LifeAccountItemBean(var response: Response) {
val life_account_status: Int,
val life_account_type: Int,
val role_type: Int,
val tag: Tag
val tag: Tag,
val enterprise_auth_record_id: Int
) : Serializable
data class Tag(
......
......@@ -69,27 +69,25 @@ class FlashActivity : BaseActivity<ActivityFlashBinding>(), IGetLifeAccountListC
}
else -> {
// 关联多个生活号
StorageUtil.getLifeAccountId().apply {
if (isNotEmpty()) {
// 如果本地有上次操作的生活号则遍历生活号列表进入对应生活号的管理中心
result?.forEach {
if (it.life_account_id == this) {
XPageManager.push(
XRouterPathConstants.MERCHANT_CENTER,
hashMapOf(
Pair(MerchantCenterActivity.EXTRA_LIFE_ACCOUNT_INFO, it),
Pair(MerchantCenterActivity.EXTRA_IS_MULTI, result.size > 1)
)
StorageUtil.getLifeAccountId()?.apply {
// 如果本地有上次操作的生活号则遍历生活号列表进入对应生活号的管理中心
result?.forEach {
if (it.life_account_id == this) {
XPageManager.push(
XRouterPathConstants.MERCHANT_CENTER,
hashMapOf(
Pair(MerchantCenterActivity.EXTRA_LIFE_ACCOUNT_INFO, it),
Pair(MerchantCenterActivity.EXTRA_IS_MULTI, result.size > 1)
)
}
)
}
} else {
// 进入生活号选择页面
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_IDENTITY,
hashMapOf(Pair(LifeAccountIdentityActivity.EXTRA_LIFE_ACCOUNT_LIST, result))
)
}
} ?: let {
// 进入生活号选择页面
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_IDENTITY,
hashMapOf(Pair(LifeAccountIdentityActivity.EXTRA_LIFE_ACCOUNT_LIST, result))
)
}
}
}
......
......@@ -18,6 +18,7 @@ import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCall
import com.yidian.shenghuoquan.newscontent.http.httpbean.IMobileLoginCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.LifeAccountItemBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.MobileLoginBean
import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountAuthDataManager
import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountIdentityActivity
import com.yidian.shenghuoquan.newscontent.ui.center.MerchantCenterActivity
import com.yidian.shenghuoquan.newscontent.utils.CountDownTimerUtils
......@@ -158,7 +159,10 @@ class LoginLifeCircleActivity : BaseActivity<ActivityLoginBinding>(), IGetLifeAc
// 登录状态
Hawk.put(HawkConfig.LoginStatus, false)
// 生活号id
Hawk.delete(HawkConfig.LifeAccountId)
StorageUtil.deleteLifeAccountId()
// 清除内存中的认证数据
LifeAccountAuthDataManager.personalAuthData.clearData()
LifeAccountAuthDataManager.merchantAuthData.clearData()
}
override fun onDestroy() {
......
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.core.view.isVisible
import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthAuthenticationCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthMerchantCheckCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IUserLogoutCallBack
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthAuthenticationBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthMerchantCheckBean
import com.yidian.xpage.XPageManager
......@@ -20,8 +20,8 @@ import com.yidian.xpage.XPageManager
* date: 5/20/21 6:26 PM
* description: 生活号认证
*/
class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
View.OnClickListener, IAuthAuthenticationCallback, IAuthMerchantCheckCallback {
class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(), View.OnClickListener, IAuthAuthenticationCallback,
IAuthMerchantCheckCallback, IUserLogoutCallBack {
companion object {
// 从哪个页面跳转
......@@ -64,6 +64,8 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
if (fromTag == FROM_AUTH) {
// 如果由商户基本信息跳转至此页面 则此页面可返回
viewBind.bvTopBar.setBackVisibility(true)
// 退出登录按钮隐藏
viewBind.btnLogout.isVisible = false
}
}
}
......@@ -72,6 +74,7 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
viewBind.tvJoinStrategy.setOnClickListener(this)
viewBind.viewPersonalAuth.setOnClickListener(this)
viewBind.viewEnterpriseAuth.setOnClickListener(this)
viewBind.btnLogout.setOnClickListener(this)
}
override fun onClick(v: View?) {
......@@ -87,6 +90,10 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
// 请求企业认证信息 用于回显已填入的信息
ApiService.authMerchantCheck(this, hashMapOf())
}
R.id.btn_logout -> {
// 退出登录
ApiService.userLogout(this)
}
}
}
......@@ -117,4 +124,9 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
override fun authMerchantCheckFailure(message: String?) {
}
override fun userLogoutSuccess() {
// 退出登录成功 跳转登录页面
XPageManager.push(XRouterPathConstants.LOGIN_LIFE_CIRCLE, null)
}
}
......@@ -105,7 +105,7 @@ object LifeAccountAuthDataManager {
merchantAuthData.num = data.num
merchantAuthData.form = data.form
merchantAuthData.funding = data.funding
merchantAuthData.date_issue = data.date_issue
merchantAuthData.dateIssue = data.date_issue
}
/**
......@@ -129,7 +129,7 @@ object LifeAccountAuthDataManager {
merchantAuthData.num = data.num
merchantAuthData.form = data.form
merchantAuthData.funding = data.funding
merchantAuthData.date_issue = data.issue_date
merchantAuthData.dateIssue = data.issue_date
merchantAuthData.businessLicenseObjectKey = data.entterprise_image
merchantAuthData.pers = data.pers
personalAuthData.realName = data.legal_person
......@@ -153,7 +153,7 @@ object LifeAccountAuthDataManager {
* 生成营业执照上传接口请求体
*/
fun generateAuthBusinessLicenseCommitRequest(
lifeAccountId: String?
lifeAccountId: String?, recordId: Long?
): HashMap<String, String?> {
val requestMap = HashMap<String, String?>()
requestMap["code"] = merchantAuthData.registrationCode
......@@ -170,13 +170,12 @@ object LifeAccountAuthDataManager {
requestMap["num"] = merchantAuthData.num
requestMap["form"] = merchantAuthData.form
requestMap["funding"] = merchantAuthData.funding
requestMap["issue_date"] = merchantAuthData.date_issue
requestMap["issue_date"] = merchantAuthData.dateIssue
requestMap["entterprise_image"] = merchantAuthData.businessLicenseObjectKey
requestMap["data_from"] = Constant.DATA_FROM_B.toString()
requestMap["data_type"] = merchantAuthData.merchantType.toString()
lifeAccountId?.let {
requestMap["life_account_id"] = it
}
lifeAccountId?.let { requestMap["life_account_id"] = it }
recordId?.let { requestMap["enterprise_auth_record_id"] = it.toString() }
return requestMap
}
......
......@@ -12,6 +12,7 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.core.view.isVisible
import com.bumptech.glide.Glide
......@@ -254,6 +255,7 @@ class LifeAccountBusinessLicenseAuthFragment :
viewBinding.ivBusinessLicense.setImageDrawable(null)
// 清除错误提示
viewBinding.tvUploadErrorTips.isVisible = false
activity?.let { viewBinding.viewBusinessLicenseUploadDivider.setBackgroundColor(ContextCompat.getColor(it, R.color.color_FFF2F2F2)) }
viewBinding.ivClear.isVisible = false
// 清除OCR或用户输入内容
viewBinding.evRegistrationName.clearEditContent()
......@@ -261,9 +263,10 @@ class LifeAccountBusinessLicenseAuthFragment :
// 设置上传区域可点击
viewBinding.clBusinessLicenseUpload.isEnabled = true
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = false
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
LifeAccountAuthDataManager.merchantAuthData.registrationCode = ""
LifeAccountAuthDataManager.merchantAuthData.registrationName = null
LifeAccountAuthDataManager.merchantAuthData.registrationCode = null
// 标识修改
LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify = true
}
override fun onTaskStart() {
......@@ -301,7 +304,7 @@ class LifeAccountBusinessLicenseAuthFragment :
// 此时营业执照已上传并OCR识别完成 删除本地临时存储文件
File(commonPath + Constant.FILE_PATH_BUSINESS_LICENSE).delete()
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountEnterpriseAuthActivity).checkNextCondition() }
}
override fun businessLicenseOCRFailure(message: String?) {
......@@ -309,9 +312,12 @@ class LifeAccountBusinessLicenseAuthFragment :
viewBinding.tvUploadErrorTips.isVisible = true
viewBinding.tvUploadErrorTips.text =
resources.getString(R.string.check_business_license_distinct)
activity?.let { viewBinding.viewBusinessLicenseUploadDivider.setBackgroundColor(ContextCompat.getColor(it, R.color.color_FFFF3A3A)) }
}
override fun onTextClear(from: LifeAccountAuthBusinessInfoEditView) {
// 标识修改
LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify = true
if (from == viewBinding.evRegistrationName) {
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
} else {
......@@ -323,8 +329,15 @@ class LifeAccountBusinessLicenseAuthFragment :
override fun onTextChange(from: LifeAccountAuthBusinessInfoEditView, text: String) {
if (from == viewBinding.evRegistrationName) {
// 标识修改
if (text != LifeAccountAuthDataManager.merchantAuthData.registrationName) {
LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify = true
}
LifeAccountAuthDataManager.merchantAuthData.registrationName = text
} else {
if (text != LifeAccountAuthDataManager.merchantAuthData.registrationCode) {
LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify = true
}
LifeAccountAuthDataManager.merchantAuthData.registrationCode = text
}
// 检查下一步条件
......
......@@ -70,8 +70,9 @@ class LifeAccountCreateActivity : BaseActivity<ActivityLifeAccountCreateBinding>
checkAccount(s.toString())
}
})
// 设置输入过滤规则
viewBind.etAccount.filters = arrayOf(InputFilterUtil.getLengthFilter(Constant.MAX_LENGTH_LIFE_ACCOUNT_NAME, this))
// 生活号名称长度限制24个字符 禁止输入Emoji
viewBind.etAccount.filters =
arrayOf(InputFilterUtil.getLengthFilter(Constant.MAX_LENGTH_LIFE_ACCOUNT_NAME, this), InputFilterUtil.getEmojiFilter())
viewBind.btnCreateAccount.setOnClickListener {
createLifeAccount()
}
......
......@@ -3,8 +3,6 @@ package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import com.orhanobut.hawk.Hawk
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
......@@ -61,13 +59,13 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
private var curFragment: Fragment? = null
/**
* 个人生活号id 企业升级
* 生活号id 个人认证升级企业认证、企业认证审核驳回修改
*/
private val personalLifeAccountId by lazy {
private val lifeAccountId by lazy {
intent.getSerializableExtra(XRouterPathConstants.ParamsKey)?.let {
(it as HashMap<*, *>)[EXTRA_LIFE_ACCOUNT_ID]?.let { id ->
id as String
} ?: Hawk.get(HawkConfig.LifeAccountId, null)
}
}
}
......@@ -136,12 +134,14 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER
&& LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement
&& LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_INDIVIDUAL_BUSINESS
&& LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass
) {
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER
&& LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement
&& LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_COMMON_ENTERPRISE
&& LifeAccountAuthDataManager.personalAuthData.isIDCardPortraitFaceUpload
&& LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload
......@@ -212,6 +212,25 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
curFragment = targetFragment
}
/**
* 清理认证数据
* 避免在修改认证时出现数据异常
*/
private fun clearLifeAccountAuthData() {
LifeAccountAuthDataManager.merchantAuthData.merchantType = 0
LifeAccountAuthDataManager.merchantAuthData.authRecordId = -1
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = false
LifeAccountAuthDataManager.merchantAuthData.registrationName = null
LifeAccountAuthDataManager.merchantAuthData.registrationCode = null
LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement = false
LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass = false
LifeAccountAuthDataManager.personalAuthData.isIDCardPortraitFaceUpload = false
LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload = false
LifeAccountAuthDataManager.personalAuthData.realName = null
LifeAccountAuthDataManager.personalAuthData.idCardNum = null
LifeAccountAuthDataManager.personalAuthData.phoneNum = null
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.sv_merchant_type -> {
......@@ -229,25 +248,29 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_QUALIFICATION) {
// personalLifeAccountId不为null则是由个人生活号升级为企业生活号情况
// personalLifeAccountId为null则是直接进行企业认证情况
// 402接口 直接企业认证生活号id和审核id均不传 个人认证升级只传生活号id 认证修改只传审核id
ApiService.authBusinessLicenseCommit(
this,
LifeAccountAuthDataManager.generateAuthBusinessLicenseCommitRequest(
personalLifeAccountId
if (isAuthModify) null else lifeAccountId,
LifeAccountAuthDataManager.merchantAuthData.authRecordId
)
)
} else if (viewBind.pvAuthProcess.curProcess == LifeAccountAuthProcessView.PROCESS_ENTERPRISE_MANAGER) {
// 406接口 直接企业认证和认证修改不传生活号id 个人认证升级传生活号id
if (LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_INDIVIDUAL_BUSINESS) {
ApiService.authIndividualBusinessComplete(
this,
LifeAccountAuthDataManager.generateAuthIndividualBusinessCompleteRequest(
personalLifeAccountId
if (isAuthModify) null else lifeAccountId
)
)
} else if (LifeAccountAuthDataManager.merchantAuthData.merchantType == Constant.TYPE_COMMON_ENTERPRISE) {
// 403接口 直接企业认证和认证修改不传生活号id 个人认证升级传生活号id
ApiService.authEnterpriseLegalIdentityCommit(
this,
LifeAccountAuthDataManager.generateAuthEnterpriseLegalIdentityCommitRequest(
personalLifeAccountId
if (isAuthModify) null else lifeAccountId
)
)
}
......@@ -279,19 +302,41 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
override fun authBusinessLicenseCommitSuccess(result: AuthBusinessLicenseCommitBean.Response?) {
// 营业执照提交成功
LifeAccountAuthDataManager.merchantAuthData.authRecordId = result?.enterprise_auth_record_id
result?.enterprise_auth_record_id?.let { LifeAccountAuthDataManager.merchantAuthData.authRecordId = it }
viewBind.pvAuthProcess.setProcess(++viewBind.pvAuthProcess.curProcess)
viewBind.svMerchantType.enableSelect(false)
// 向身份信息fragment传参
val fragment = fragmentList[viewBind.pvAuthProcess.curProcess]
val bundle = Bundle()
bundle.putInt(
Constant.TYPE_AUTH,
LifeAccountAuthDataManager.merchantAuthData.merchantType
)
bundle.putSerializable(LifeAccountIDCardAuthFragment.EXTRA_AUTH_DATA, authData)
fragment.arguments = bundle
switchFragment(fragment)
if (LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify) {
// 认证信息修改 清空第二步回显数据
LifeAccountAuthDataManager.merchantAuthData.isAuthInfoModify = false
LifeAccountAuthDataManager.personalAuthData.isIDCardPortraitFaceUpload = false
LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload = false
LifeAccountAuthDataManager.personalAuthData.realName = null
LifeAccountAuthDataManager.personalAuthData.idCardNum = null
LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass = false
LifeAccountAuthDataManager.personalAuthData.phoneNum = null
fragmentList.removeAt(viewBind.pvAuthProcess.curProcess)
val fragment = LifeAccountIDCardAuthFragment()
fragmentList.add(viewBind.pvAuthProcess.curProcess, fragment)
val bundle = Bundle()
bundle.putInt(
Constant.TYPE_AUTH,
LifeAccountAuthDataManager.merchantAuthData.merchantType
)
fragment.arguments = bundle
} else {
// 向身份信息fragment传参用于回显
val fragment = fragmentList[viewBind.pvAuthProcess.curProcess]
val bundle = Bundle()
bundle.putInt(
Constant.TYPE_AUTH,
LifeAccountAuthDataManager.merchantAuthData.merchantType
)
bundle.putSerializable(LifeAccountIDCardAuthFragment.EXTRA_AUTH_DATA, authData)
fragment.arguments = bundle
}
switchFragment(fragmentList[viewBind.pvAuthProcess.curProcess])
// 检查下一步条件
checkNextCondition()
}
override fun authBusinessLicenseCommitFailure(message: String?) {
......@@ -301,6 +346,8 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
override fun authEnterpriseLegalIdentityCommitSuccess(result: AuthEnterpriseLegalIdentityCommitBean.Response?) {
// 本地保存生活号id
StorageUtil.putLifeAccountId(result?.life_account_id)
// 清空认证数据
clearLifeAccountAuthData()
// 普通企业法人身份信息提交成功
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE,
......@@ -323,6 +370,8 @@ class LifeAccountEnterpriseAuthActivity : BaseActivity<ActivityLifeAccountEnterp
override fun authIndividualBusinessCompleteSuccess(result: AuthIndividualBusinessCompleteBean.Response?) {
// 本地保存生活号id
StorageUtil.putLifeAccountId(result?.life_account_id)
// 清空认证数据
clearLifeAccountAuthData()
// 个体工商户认证完成
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE,
......
......@@ -6,7 +6,10 @@ import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountEnterpriseAuthCompleteBinding
import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.LifeAccountItemBean
import com.yidian.shenghuoquan.newscontent.ui.center.MerchantCenterActivity
import com.yidian.xpage.XPageManager
/**
......@@ -15,7 +18,7 @@ import com.yidian.xpage.XPageManager
* description: 生活号企业认证提交成功页面
*/
class LifeAccountEnterpriseAuthCompleteActivity :
BaseActivity<ActivityLifeAccountEnterpriseAuthCompleteBinding>(), View.OnClickListener {
BaseActivity<ActivityLifeAccountEnterpriseAuthCompleteBinding>(), View.OnClickListener, IGetLifeAccountListCallback {
companion object {
const val REGISTRATION_NAME = "registrationName"
......@@ -55,6 +58,10 @@ class LifeAccountEnterpriseAuthCompleteActivity :
private fun initView() {
// 此页面不可返回
viewBind.bvTopBar.setBackVisibility(false)
// 认证修改和正常认证显示不同入口文案
viewBind.tvCreateLifeAccount.text = if (params?.get(EXTRA_IS_AUTH_MODIFY)
?.let { it as Boolean } == true
) resources.getText(R.string.enter_life_account) else resources.getText(R.string.create_life_account)
}
private fun initListener() {
......@@ -74,7 +81,12 @@ class LifeAccountEnterpriseAuthCompleteActivity :
override fun onClick(v: View?) {
if (v?.id == R.id.tv_create_life_account) {
// 跳转创建生活号页面
if (params?.get(EXTRA_IS_AUTH_MODIFY)?.let { it as Boolean } == true) {
// 认证修改 请求生活号列表 跳转商户管理中心
ApiService.getLifeAccountList(this)
return
}
// 正常认证 跳转创建生活号页面
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_CREATE,
hashMapOf(
......@@ -90,4 +102,25 @@ class LifeAccountEnterpriseAuthCompleteActivity :
override fun onBackPressed() {
// 禁止back event
}
override fun getLifeAccountListSuccess(result: ArrayList<LifeAccountItemBean.Response>?) {
// 生活号列表请求成功
val curLifeAccountId = params?.get(EXTRA_LIFE_ACCOUNT_ID)
result?.forEach {
if (it.life_account_id == curLifeAccountId) {
XPageManager.push(
XRouterPathConstants.MERCHANT_CENTER,
hashMapOf(
Pair(MerchantCenterActivity.EXTRA_IS_MULTI, result.size > 1),
Pair(MerchantCenterActivity.EXTRA_LIFE_ACCOUNT_INFO, it)
)
)
XPageManager.pop(null)
}
}
}
override fun getLifeAccountListFailure(message: String?) {
}
}
......@@ -11,6 +11,7 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.megvii.demo.activity.IDCardDetectActivity
import com.megvii.demo.utils.Configuration
......@@ -25,6 +26,7 @@ import com.yidian.common.http.HttpResult
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.BottomSelectAdapter
import com.yidian.shenghuoquan.newscontent.bean.BottomSelectBean
import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.FragmentLifeAccountIdCardAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
......@@ -34,6 +36,7 @@ import com.yidian.shenghuoquan.newscontent.http.callback.IAuthLiveIdentityCallba
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthPersonalCheckCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
import com.yidian.shenghuoquan.newscontent.ui.dialog.BottomSelectDialog
import com.yidian.shenghuoquan.newscontent.ui.dialog.HintDialog
import com.yidian.shenghuoquan.newscontent.utils.BitmapUtil
import com.yidian.shenghuoquan.newscontent.utils.FileUtil
import com.yidian.shenghuoquan.newscontent.utils.InputFilterUtil
......@@ -41,6 +44,7 @@ import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthIdentityInfoEditView
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthImageView
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountFaceAuthView
import com.yidian.shenghuoquan.newscontent.widget.PrivacyAgreementView
import com.yidian.utils.ToastUtil
import java.io.File
......@@ -55,7 +59,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
IAuthLiveIdentityCallback, LifeAccountAuthImageView.OnLifeAccountAuthImageViewCallback,
LifeAccountAuthIdentityInfoEditView.OnLifeAccountAuthIdentityInfoEditViewCallback,
IAuthIndividualBusinessIdentityCommitCallback, IAuthEnterpriseLiveIdentityCallback,
LifeAccountFaceAuthView.OnLifeAccountFaceAuthCallback {
LifeAccountFaceAuthView.OnLifeAccountFaceAuthCallback, PrivacyAgreementView.OnPrivacyAgreementCallback {
companion object {
// 身份证采集页面回传数据
......@@ -155,6 +159,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
viewBinding.evIdCardNumber.setOnLifeAccountAuthIdentityInfoEditViewCallback(this)
viewBinding.evMobile.setOnLifeAccountAuthIdentityInfoEditViewCallback(this)
viewBinding.avFaceAuth.setOnLifeAccountFaceAuthCallback(this)
viewBinding.avPrivacyAgreement.setOnPrivacyAgreementCallback(this)
}
private fun initData() {
......@@ -492,9 +497,9 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
// 检查下一步条件
if (authType == Constant.TYPE_AUTH_PERSONAL) {
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountPersonalAuthActivity).checkNextCondition() }
} else {
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountEnterpriseAuthActivity).checkNextCondition() }
}
}
......@@ -518,9 +523,9 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
// 检查下一步条件
if (authType == Constant.TYPE_AUTH_PERSONAL) {
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountPersonalAuthActivity).checkNextCondition() }
} else {
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountEnterpriseAuthActivity).checkNextCondition() }
}
}
......@@ -563,7 +568,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
if (authType == Constant.TYPE_AUTH_PERSONAL) {
ApiService.authLiveIdentity(this)
// 检查下一步条件
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountPersonalAuthActivity).checkNextCondition() }
} else {
ApiService.authEnterpriseLiveIdentity(
this,
......@@ -575,7 +580,7 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
)
)
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
activity?.let { (it as LifeAccountEnterpriseAuthActivity).checkNextCondition() }
}
}
}
......@@ -682,8 +687,21 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
)
}
override fun authPersonCheckFailure(message: String?) {
// 展示错误提示
override fun authPersonCheckFailure(code: Int?, message: String?) {
if (code == Constant.ERROR_CODE_PERSONAL_AUTH_INFO_DUPLICATE) {
// 身份证号已认证并且认证手机号不是当前手机号 弹窗提示
activity?.let {
HintDialog(
it, message.toString(),
arrayListOf(
HintOptionBean(resources.getString(R.string.change)),
HintOptionBean(resources.getString(R.string.login_again))
), it as LifeAccountPersonalAuthActivity
).setRightBtnColor(ContextCompat.getColor(it, R.color.color_FF1852F1)).show()
}
return
}
// 展示输入框下错误提示
when (message) {
Constant.ERROR_MESSAGE_REAL_NAME -> {
viewBinding.evRealName.showErrorTips(
......@@ -818,7 +836,19 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
}
override fun authIndividualBusinessIdentityCommitFailure(message: String?) {
// 展示输入框下错误提示
when (message) {
Constant.ERROR_MESSAGE_REAL_NAME -> {
viewBinding.evRealName.showErrorTips(
resources.getText(R.string.id_card_name_error_tips) as String
)
viewBinding.evRealName.highLightEditContent()
}
Constant.ERROR_MESSAGE_ID_CARD_NUMBER -> {
viewBinding.evIdCardNumber.showErrorTips(resources.getText(R.string.id_card_number_error_tips) as String)
viewBinding.evIdCardNumber.highLightEditContent()
}
}
}
override fun authEnterpriseLiveIdentitySuccess() {
......@@ -847,4 +877,14 @@ class LifeAccountIDCardAuthFragment : BaseFragment<FragmentLifeAccountIdCardAuth
&& LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload
}
override fun onCheckPrivacyAgreement(isCheck: Boolean) {
LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement = isCheck
// 检查下一步条件
if (authType == Constant.TYPE_AUTH_PERSONAL) {
(activity as LifeAccountPersonalAuthActivity).checkNextCondition()
} else {
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
}
}
......@@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.View
import android.widget.CompoundButton
import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig
import com.yidian.common.XEventConfig
import com.yidian.common.XRouterPathConstants
......@@ -13,9 +12,10 @@ import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountPersonalAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthPersonalCompleteCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IUserLogoutCallBack
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthAuthenticationBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthPersonalCompleteBean
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.shenghuoquan.newscontent.ui.dialog.HintDialog
import com.yidian.shenghuoquan.newscontent.utils.StorageUtil
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
......@@ -29,8 +29,8 @@ import org.greenrobot.eventbus.ThreadMode
* description: 生活号个人认证
*/
class LifeAccountPersonalAuthActivity :
BaseActivity<ActivityLifeAccountPersonalAuthBinding>(),
View.OnClickListener, CompoundButton.OnCheckedChangeListener, IAuthPersonalCompleteCallback {
BaseActivity<ActivityLifeAccountPersonalAuthBinding>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener,
IAuthPersonalCompleteCallback, HintDialog.OnHintOptionCallback, IUserLogoutCallBack {
companion object {
// 认证数据
......@@ -41,7 +41,7 @@ class LifeAccountPersonalAuthActivity :
/**
* 当前fragment
*/
private val fragment by lazy { LifeAccountIDCardAuthFragment() }
private lateinit var curFragment: LifeAccountIDCardAuthFragment
/**
* 认证数据 还原认证流程用
......@@ -87,28 +87,26 @@ class LifeAccountPersonalAuthActivity :
private fun initListener() {
viewBind.svOccupation.setOnClickListener(this)
viewBind.cbProtocol.setOnCheckedChangeListener(this)
viewBind.btnNext.setOnClickListener(this)
viewBind.tvPrivacyCertification.setOnClickListener(this)
viewBind.tvUserAgreement.setOnClickListener(this)
}
private fun initData() {
// 如果有已存在的认证流程则还原进度
authData?.let { LifeAccountAuthDataManager.generatePersonalAuthData(it) }
authData?.occupation?.let { viewBind.svOccupation.setContentResult(it) }
curFragment = LifeAccountIDCardAuthFragment()
val bundle = Bundle()
bundle.putSerializable(LifeAccountIDCardAuthFragment.EXTRA_AUTH_DATA, authData)
fragment.arguments = bundle
curFragment.arguments = bundle
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, fragment).commit()
.add(R.id.fragment_container, curFragment).commit()
}
/**
* 检查是否可以进行下一步
*/
fun checkNextCondition() {
if (viewBind.cbProtocol.isChecked
if (LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement
&& !LifeAccountAuthDataManager.personalAuthData.occupation.isNullOrEmpty()
&& LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass
) {
......@@ -127,6 +125,21 @@ class LifeAccountPersonalAuthActivity :
viewBind.svOccupation.enableSelect(false)
}
/**
* 清空认证数据
* 避免在升级企业认证时出现数据异常
*/
private fun clearLifeAccountAuthData() {
LifeAccountAuthDataManager.personalAuthData.isAgreePrivacyAgreement = false
LifeAccountAuthDataManager.personalAuthData.occupation = null
LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass = false
LifeAccountAuthDataManager.personalAuthData.realName = null
LifeAccountAuthDataManager.personalAuthData.idCardNum = null
LifeAccountAuthDataManager.personalAuthData.occupation = null
LifeAccountAuthDataManager.personalAuthData.isIDCardPortraitFaceUpload = false
LifeAccountAuthDataManager.personalAuthData.isIDCardNationalEmblemFaceUpload = false
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.sv_occupation -> {
......@@ -136,19 +149,6 @@ class LifeAccountPersonalAuthActivity :
// 个人认证 完成认证
ApiService.authComplete(this, lifeAccountId?.let { hashMapOf(Pair(EXTRA_LIFE_ACCOUNT_ID, it)) } ?: hashMapOf())
}
R.id.tv_privacy_certification -> {
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolUrlKey] = AppConfig.privacyPolicyStatement
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
R.id.tv_user_agreement -> {
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolUrlKey] = AppConfig.userProtocol
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
}
}
......@@ -160,6 +160,8 @@ class LifeAccountPersonalAuthActivity :
override fun authPersonalCompleteSuccess(result: AuthPersonalCompleteBean.Response?) {
// 本地保存生活号id
StorageUtil.putLifeAccountId(result?.life_account_id)
// 清空认证数据
clearLifeAccountAuthData()
// 跳转个人认证成功页
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_PERSONAL_AUTH_COMPLETE,
......@@ -197,4 +199,25 @@ class LifeAccountPersonalAuthActivity :
}
}
override fun onLeftOption() {
// 更换认证信息
// 清空认证数据
clearLifeAccountAuthData()
// 清空职业标签回显
viewBind.svOccupation.clearContentResult()
// 清空身份信息页 直接替换fragment
val targetFragment = LifeAccountIDCardAuthFragment()
supportFragmentManager.beginTransaction().remove(curFragment).add(R.id.fragment_container, targetFragment).commit()
curFragment = targetFragment
}
override fun onRightOption() {
// 重新登录
ApiService.userLogout(this)
}
override fun userLogoutSuccess() {
XPageManager.push(XRouterPathConstants.LOGIN_LIFE_CIRCLE, null)
}
}
......@@ -52,8 +52,11 @@ class LifeAccountModifyNameActivity : BaseActivity<ActivityLifeAccountModifyName
private fun initView() {
// 默认保存按钮不可用
viewBind.bvTopBar.setActionEnable(false)
// 生活号名称长度限制24个字符
viewBind.evLifeAccountName.setInputFilters(InputFilterUtil.getLengthFilter(Constant.MAX_LENGTH_LIFE_ACCOUNT_NAME, this))
// 生活号名称长度限制24个字符 禁止输入Emoji
viewBind.evLifeAccountName.setInputFilters(
InputFilterUtil.getLengthFilter(Constant.MAX_LENGTH_LIFE_ACCOUNT_NAME, this),
InputFilterUtil.getEmojiFilter()
)
}
private fun initListener() {
......
......@@ -16,10 +16,7 @@ import com.yidian.shenghuoquan.newscontent.bean.HintOptionBean
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.ActivityMerchantCenterBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthMerchantCheckCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IGetConfigListCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountInfoByIdCallback
import com.yidian.shenghuoquan.newscontent.http.callback.IGetLifeAccountListCallback
import com.yidian.shenghuoquan.newscontent.http.callback.*
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthMerchantCheckBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.GetConfigListBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.GetLifeAccountInfoByIdBean
......@@ -28,6 +25,7 @@ import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountAuthActivity
import com.yidian.shenghuoquan.newscontent.ui.auth.LifeAccountEnterpriseAuthActivity
import com.yidian.shenghuoquan.newscontent.ui.dialog.HintDialog
import com.yidian.shenghuoquan.newscontent.ui.dialog.MerchantCenterBottomHintDialog
import com.yidian.shenghuoquan.newscontent.utils.StorageUtil
import com.yidian.shenghuoquan.newscontent.widget.CommonTopBarView
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountLabelView
import com.yidian.shenghuoquan.newscontent.widget.MerchantAssetView
......@@ -47,7 +45,8 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
IGetConfigListCallback, MerchantSwitchDialog.OnMerchantSwitchCallback,
LifeAccountLabelView.OnLifeAccountLabelCallback, IGetLifeAccountInfoByIdCallback,
MerchantCenterBottomHintDialog.OnMerchantCenterBottomHintCallback, IAuthMerchantCheckCallback,
MerchantServiceFunctionAdapter.OnItemClickListener, CommonTopBarView.OnCommonTopBarActionCallback, OnRefreshListener {
MerchantServiceFunctionAdapter.OnItemClickListener, CommonTopBarView.OnCommonTopBarActionCallback, OnRefreshListener,
IUserLogoutCallBack {
companion object {
// 传递的生活号信息
......@@ -73,6 +72,10 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
* 功能-页面表
*/
private val functionPageMap by lazy { HashMap<Int, String?>() }
/**
* 当前生活号状态下功能集
*/
private val functionPermissionList by lazy { ArrayList<Int>() }
override fun createViewBinding(): ActivityMerchantCenterBinding {
......@@ -147,9 +150,9 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
viewBind.lvLifeAccountLabel.setLifeAccountData(data)
// 展示底部浮窗
showMerchantCenterBottomHint(data)
// 生成当前生活号状态下的功能集
// 生活号状态变更 生成当前生活号状态下的功能集
generateFunctionPermissionMap(curConfigData)
// 过滤商户服务数据
// 生活号状态变更 过滤商户服务数据
filterMerchantServiceData(curConfigData)
}
......@@ -159,17 +162,14 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
* @param data 当前生活号数据
*/
private fun showMerchantCenterBottomHint(data: LifeAccountItemBean.Response) {
if (data.life_account_type == Constant.TYPE_LIFE_ACCOUNT_PERSONAL
&& data.life_account_auth_status == Constant.STATUS_AUTH_NOT
&& data.enterprise_audit_status == 0
) {
if (data.life_account_auth_status == Constant.STATUS_AUTH_NOT && data.enterprise_auth_record_id == 0) {
// 当前是个人未认证生活号 提示认证升级
MerchantCenterBottomHintDialog(
this,
MerchantCenterBottomHintDialog.TYPE_AUTH_UPGRADE, this
).show()
}
if (data.enterprise_audit_status == Constant.STATUS_AUDIT_REJECT) {
if (data.enterprise_audit_status == Constant.STATUS_AUDIT_REJECT && data.role_type != Constant.TYPE_ROLE_ORDINARY) {
// 当前企业认证驳回 提示修改
MerchantCenterBottomHintDialog(
this,
......@@ -208,7 +208,19 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
private fun generateFunctionPermissionMap(data: List<GetConfigListBean.Item>) {
if (data.isEmpty()) return
functionPermissionList.clear()
when (curLifeAccount.tag.tag_key) {
when (getCurLifeAccountLabel()) {
Constant.LIFE_ACCOUNT_TAG_ENTERPRISE_AUTH -> {
// 企业认证
// 所有服务都可用
functionPermissionList.add(data[0].functions[0].function_id)
functionPermissionList.add(data[0].functions[1].function_id)
functionPermissionList.add(data[1].functions[0].function_id)
functionPermissionList.add(data[1].functions[1].function_id)
functionPermissionList.add(data[2].functions[0].function_id)
functionPermissionList.add(data[2].functions[1].function_id)
functionPermissionList.add(data[2].functions[2].function_id)
functionPermissionList.add(data[2].functions[3].function_id)
}
Constant.LIFE_ACCOUNT_TAG_COMMON_ENTERPRISE_AUTH -> {
// 普通企业认证
// 所有服务都可用
......@@ -267,7 +279,7 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
/**
* 过滤商户服务数据
* 目前处理个人认证下不展示管理服务
* 目前处理个人认证状态下和企业员工角色下不展示管理服务
*/
private fun filterMerchantServiceData(data: List<GetConfigListBean.Item>) {
val result = ArrayList<GetConfigListBean.Item>(data.size)
......@@ -277,7 +289,7 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
val group = next()
if (group.group_id == Constant.MERCHANT_SERVICE_GROUP_MANAGEMENT) {
// 个人认证或企业员工不展示管理服务
if (curLifeAccount.tag.tag_key == Constant.LIFE_ACCOUNT_TAG_PERSONAL_AUTH || curLifeAccount.role_type == Constant.TYPE_ROLE_ORDINARY) {
if (getCurLifeAccountLabel() == Constant.LIFE_ACCOUNT_TAG_PERSONAL_AUTH || curLifeAccount.role_type == Constant.TYPE_ROLE_ORDINARY) {
continue
}
}
......@@ -288,6 +300,26 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
(viewBind.rvServiceGroup.adapter as MerchantServiceGroupAdapter).updateData(result)
}
/**
* 获取当前生活号标签
* 目前不支持区分个体工商户和普通企业
*/
private fun getCurLifeAccountLabel(): Int {
when (curLifeAccount.enterprise_audit_status) {
Constant.STATUS_AUDIT_UNDER -> return Constant.LIFE_ACCOUNT_TAG_AUDIT_UNDER // 审核中
Constant.STATUS_AUDIT_REJECT -> return Constant.LIFE_ACCOUNT_TAG_AUTH_REJECT // 认证驳回
}
when (curLifeAccount.life_account_auth_status) {
Constant.STATUS_AUTH_FINISH -> {
when (curLifeAccount.life_account_type) {
Constant.TYPE_LIFE_ACCOUNT_PERSONAL -> return Constant.LIFE_ACCOUNT_TAG_PERSONAL_AUTH // 个人已认证
Constant.TYPE_LIFE_ACCOUNT_ENTERPRISE -> return Constant.TYPE_LIFE_ACCOUNT_ENTERPRISE // 企业已认证
}
}
}
return Constant.LIFE_ACCOUNT_TAG_NOT_AUTH // 个人未认证
}
override fun getConfigListSuccess(result: GetConfigListBean.Response?) {
result?.let {
// 备份配置数据
......@@ -485,6 +517,23 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
override fun getLifeAccountListSuccess(result: ArrayList<LifeAccountItemBean.Response>?) {
// 刷新成功
refreshLayout.finishRefresh(true)
if (result?.size == 0) {
// 如果当前无生活号则退出登录
ToastUtil.showToast(this@MerchantCenterActivity, resources.getString(R.string.no_life_account))
ApiService.userLogout(this@MerchantCenterActivity)
return
}
if (result?.contains(curLifeAccount) == false) {
// 当前选择的生活号已不存在则切换第一个生活号 目前为企业员工被解除关系会触发
curLifeAccount = result[0]
// 更新本地存储的生活号id
StorageUtil.putLifeAccountId(result[0].life_account_id)
// 刷新数据
refreshMerchantCenterData(result[0])
// 切换主体入口是否展示判断
viewBind.bvTopBar.setActionVisibility(result.size > 1)
return
}
result?.forEach {
if (curLifeAccount.life_account_id == it.life_account_id) {
curLifeAccount = it
......@@ -504,4 +553,8 @@ class MerchantCenterActivity : BaseActivity<ActivityMerchantCenterBinding>(),
}
})
}
override fun userLogoutSuccess() {
XPageManager.push(XRouterPathConstants.LOGIN_LIFE_CIRCLE, null)
}
}
......@@ -93,12 +93,15 @@ class MerchantInfoActivity : BaseActivity<ActivityMerchantInfoBinding>(), Mercha
if (lifeAccountInfo?.audit_status == Constant.STATUS_AUDIT_REJECT) {
// 认证驳回
viewBind.ivLifeAccountAuth.fillContent(resources.getString(R.string.auth_reject))
viewBind.ivLifeAccountAuth.showAuthEntry(MerchantInfoView.LifeAccountAuthStatus.MODIFY_AUTH)
if (lifeAccountInfo?.role_type != Constant.TYPE_ROLE_ORDINARY) {
// 企业员工不允许修改认证信息
viewBind.ivLifeAccountAuth.showAuthEntry(MerchantInfoView.LifeAccountAuthStatus.MODIFY_AUTH)
}
return
}
// 认证状态
if (lifeAccountInfo?.life_account_auth_status == Constant.STATUS_AUTH_NOT && lifeAccountInfo?.enterprise_auth_record_id == null) {
// 个人未认证生活号 无企业审核记录id
if (lifeAccountInfo?.life_account_auth_status == Constant.STATUS_AUTH_NOT && lifeAccountInfo?.enterprise_auth_record_id == 0) {
// 个人未认证生活号 企业审核记录id为0
viewBind.ivLifeAccountAuth.fillContent(resources.getString(R.string.not_auth))
viewBind.ivLifeAccountAuth.showAuthEntry(MerchantInfoView.LifeAccountAuthStatus.NOT_AUTH)
return
......
......@@ -131,7 +131,7 @@ class KS3Core private constructor(val context: Context) : AuthListener {
result?.objectId + getObjectKeySuffix(type),
File(path)
)
request.cannedAcl = CannedAccessControlList.PublicRead
request.cannedAcl = CannedAccessControlList.Private
client.putObject(
request,
KS3CorePutObjectResponseHandler(
......@@ -162,7 +162,7 @@ class KS3Core private constructor(val context: Context) : AuthListener {
)
// 执行金山云上传
val request = PutObjectRequest(result?.bucket, result?.objectId, File(path))
request.cannedAcl = CannedAccessControlList.PublicRead
request.cannedAcl = CannedAccessControlList.Private
client.putObject(
request,
KS3CorePutObjectResponseHandler(result?.bucket, result?.objectId, listener)
......@@ -189,7 +189,7 @@ class KS3Core private constructor(val context: Context) : AuthListener {
)
// 执行金山云上传
val request = PutObjectRequest(result?.bucket, result?.objectId, file)
request.cannedAcl = CannedAccessControlList.PublicRead
request.cannedAcl = CannedAccessControlList.Private
client.putObject(
request,
KS3CorePutObjectResponseHandler(result?.bucket, result?.objectId, listener)
......@@ -226,7 +226,7 @@ class KS3Core private constructor(val context: Context) : AuthListener {
result?.objectId + getObjectKeySuffix(type),
file
)
request.cannedAcl = CannedAccessControlList.PublicRead
request.cannedAcl = CannedAccessControlList.Private
client.putObject(
request,
KS3CorePutObjectResponseHandler(
......@@ -368,4 +368,4 @@ class KS3Core private constructor(val context: Context) : AuthListener {
}
}
}
\ No newline at end of file
}
......@@ -20,7 +20,14 @@ object StorageUtil {
/**
* 获取生活号id
*/
fun getLifeAccountId(): String {
return Hawk.get(HawkConfig.LifeAccountId, "")
fun getLifeAccountId(): String? {
return Hawk.get(HawkConfig.LifeAccountId, null)
}
/**
* 删除生活号id
*/
fun deleteLifeAccountId() {
Hawk.delete(HawkConfig.LifeAccountId)
}
}
......@@ -8,6 +8,7 @@ import android.text.TextUtils
import android.text.TextWatcher
import android.util.AttributeSet
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.yidian.nightmode.widget.YdConstraintLayout
import com.yidian.shenghuoquan.newscontent.R
......@@ -22,7 +23,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : YdConstraintLayout(context, attrs, defStyle), View.OnClickListener, TextWatcher {
) : YdConstraintLayout(context, attrs, defStyle), View.OnClickListener, TextWatcher, View.OnFocusChangeListener {
private val viewBinding: ViewLifeAccountAuthBusinessInfoEditBinding =
ViewLifeAccountAuthBusinessInfoEditBinding.bind(
......@@ -50,6 +51,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
typedArray.recycle()
viewBinding.ivClear.setOnClickListener(this)
viewBinding.etContent.addTextChangedListener(this)
viewBinding.etContent.onFocusChangeListener = this
}
/**
......@@ -58,6 +60,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
fun showErrorTips(tips: String) {
viewBinding.tvErrorTips.isVisible = true
viewBinding.tvErrorTips.text = tips
viewBinding.viewDivider.setBackgroundColor(ContextCompat.getColor(context, R.color.color_FFFF3A3A))
highLightEditContent()
}
......@@ -67,6 +70,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
private fun dismissErrorTips() {
viewBinding.tvErrorTips.isVisible = false
viewBinding.tvErrorTips.text = ""
viewBinding.viewDivider.setBackgroundColor(ContextCompat.getColor(context, R.color.color_333333))
cancelHighLightEditContent()
}
......@@ -77,7 +81,6 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
viewBinding.etContent.setText("")
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
callback?.onTextClear(this)
}
......@@ -105,7 +108,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
*/
fun highLightEditContent() {
isInputError = true
viewBinding.etContent.setTextColor(Color.parseColor("#FFFF3A3A"))
viewBinding.etContent.setTextColor(ContextCompat.getColor(context, R.color.color_FFFF3A3A))
}
/**
......@@ -113,7 +116,7 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
*/
private fun cancelHighLightEditContent() {
isInputError = false
viewBinding.etContent.setTextColor(Color.parseColor("#FF333333"))
viewBinding.etContent.setTextColor(ContextCompat.getColor(context, R.color.color_333333))
}
/**
......@@ -144,7 +147,16 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
callback?.onTextChange(this, s.toString())
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
}
override fun onFocusChange(v: View?, hasFocus: Boolean) {
if (hasFocus) {
// 获得焦点
viewBinding.viewDivider.setBackgroundColor(ContextCompat.getColor(context, R.color.color_333333))
} else {
// 失去焦点
viewBinding.viewDivider.setBackgroundColor(ContextCompat.getColor(context, R.color.color_FFF2F2F2))
}
}
......
......@@ -13,62 +13,69 @@ import com.yidian.shenghuoquan.newscontent.databinding.ViewLifeAccountAuthSelect
* description: 生活号认证 职业标签/商户类型选择
*/
class LifeAccountAuthSelectView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : YdConstraintLayout(context, attrs, defStyle), View.OnClickListener {
private val viewBinding = ViewLifeAccountAuthSelectBinding.bind(
View.inflate(
getContext(),
R.layout.view_life_account_auth_select,
this
)
private val viewBinding = ViewLifeAccountAuthSelectBinding.bind(
View.inflate(
getContext(),
R.layout.view_life_account_auth_select,
this
)
)
init {
val typeArray =
getContext().obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthSelectView)
viewBinding.tvName.text =
typeArray.getString(R.styleable.LifeAccountAuthSelectView_LifeAccountAuthSelectView_name_text)
viewBinding.tvContent.hint =
typeArray.getString(R.styleable.LifeAccountAuthSelectView_LifeAccountAuthSelectView_content_hint_text)
typeArray.recycle()
}
init {
val typeArray =
getContext().obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthSelectView)
viewBinding.tvName.text =
typeArray.getString(R.styleable.LifeAccountAuthSelectView_LifeAccountAuthSelectView_name_text)
viewBinding.tvContent.hint =
typeArray.getString(R.styleable.LifeAccountAuthSelectView_LifeAccountAuthSelectView_content_hint_text)
typeArray.recycle()
}
/**
* 回显选择的内容
*/
fun setContentResult(text: String) {
viewBinding.tvContent.text = text
}
/**
* 回显选择的内容
*/
fun setContentResult(text: String) {
viewBinding.tvContent.text = text
}
/**
* 获取当前选择的内容
*/
fun getCurSelectItem(): String {
return viewBinding.tvContent.text.toString()
}
/**
* 获取当前选择的内容
*/
fun getContentResult(): String {
return viewBinding.tvContent.text.toString()
}
/**
* 设置是否能选择 即是否可以弹出选择弹窗
* @param enable true为可选择 false为不可选择
*/
fun enableSelect(enable: Boolean) {
isEnabled = enable
viewBinding.ivSelect.visibility = if (enable) View.VISIBLE else View.GONE
}
/**
* 设置是否能选择 即是否可以弹出选择弹窗
* @param enable true为可选择 false为不可选择
*/
fun enableSelect(enable: Boolean) {
isEnabled = enable
viewBinding.ivSelect.visibility = if (enable) View.VISIBLE else View.GONE
}
/**
* 清空当前选择的内容
*/
fun clearContentResult() {
viewBinding.tvContent.text = ""
}
override fun onClick(v: View?) {
override fun onClick(v: View?) {
}
}
interface OnLifeAccountAuthSelectViewCallback {
/**
* 点击选择功能
*/
fun onLifeAccountAuthSelect()
}
interface OnLifeAccountAuthSelectViewCallback {
/**
* 点击选择功能
*/
fun onLifeAccountAuthSelect()
}
}
\ No newline at end of file
}
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.CompoundButton
import androidx.constraintlayout.widget.ConstraintLayout
import com.yidian.common.AppConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ViewPrivacyAgreementBinding
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.xpage.XPageManager
/**
* author: yinjiacheng
* date: 6/24/21 3:32 AM
* description: 用户协议、隐私政策
*/
class PrivacyAgreementView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : ConstraintLayout(context, attrs, defStyle), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val viewBinding: ViewPrivacyAgreementBinding =
ViewPrivacyAgreementBinding.bind(
View.inflate(
getContext(),
R.layout.view_privacy_agreement,
this
)
)
private var callback: OnPrivacyAgreementCallback? = null
init {
viewBinding.tvPrivacyPolicy.setOnClickListener(this)
viewBinding.tvUserAgreement.setOnClickListener(this)
viewBinding.cbAgree.setOnCheckedChangeListener(this)
}
override fun onClick(v: View?) {
val id = v?.id
if (id == R.id.tv_privacy_policy) {
// 隐私政策
XPageManager.push(XRouterPathConstants.PROTOCOL, hashMapOf(Pair(ProtocolActivity.ProtocolUrlKey, AppConfig.privacyPolicyStatement)))
} else if (id == R.id.tv_user_agreement) {
// 用户协议
XPageManager.push(XRouterPathConstants.PROTOCOL, hashMapOf(Pair(ProtocolActivity.ProtocolUrlKey, AppConfig.userProtocol)))
}
}
/**
* 获取当前是否选中
*/
fun getCheckState(): Boolean {
return viewBinding.cbAgree.isChecked
}
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
if (buttonView?.isPressed == false) return
callback?.onCheckPrivacyAgreement(isChecked)
}
fun setOnPrivacyAgreementCallback(callback: OnPrivacyAgreementCallback) {
this.callback = callback
}
interface OnPrivacyAgreementCallback {
/**
* 选择用户协议和隐私政策
*/
fun onCheckPrivacyAgreement(isCheck: Boolean)
}
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="@dimen/dp1"
android:color="@color/color_FFDDDDDD" />
<corners android:radius="@dimen/dp21" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/color_FF1852F1" />
<size
android:width="@dimen/dp2"
android:height="@dimen/dp19" />
</shape>
\ No newline at end of file
......@@ -4,7 +4,7 @@
android:id="@+id/clRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/launcher_bg"
android:background="@drawable/icon_launcher_bg"
android:fitsSystemWindows="true"
tools:context=".ui.FlashActivity">
......
......@@ -79,4 +79,17 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/view_enterprise_auth" />
<Button
android:id="@+id/btn_logout"
android:layout_width="115dp"
android:layout_height="35dp"
android:layout_marginBottom="78dp"
android:background="@drawable/shape_bg_btn_logout"
android:text="@string/logout"
android:textColor="@color/color_FF969798"
android:textSize="15sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</com.yidian.nightmode.widget.YdConstraintLayout>
\ No newline at end of file
......@@ -38,7 +38,8 @@
<com.yidian.nightmode.widget.YdScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="25dp"
android:layout_marginBottom="16dp"
android:fillViewport="true"
app:layout_constraintBottom_toTopOf="@id/btn_next"
app:layout_constraintTop_toBottomOf="@id/sv_merchant_type">
......
......@@ -24,54 +24,9 @@
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="19dp"
app:layout_constraintBottom_toTopOf="@id/ll_protocol"
app:layout_constraintTop_toBottomOf="@id/sv_occupation" />
<com.yidian.nightmode.widget.YdLinearLayout
android:id="@+id/ll_protocol"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="19dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@id/btn_next"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.yidian.nightmode.widget.YdCheckedBox
android:id="@+id/cb_protocol"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginEnd="2dp"
android:button="@drawable/selector_protocol_check"
android:clickable="true"
android:focusable="true" />
<com.yidian.nightmode.widget.YdTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/agree"
android:textColor="#FF999999"
android:textSize="13sp" />
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/tv_privacy_certification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/privacy_certification"
android:textColor="#FF1852F1"
android:textSize="13sp" />
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/tv_user_agreement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user_agreement"
android:textColor="#FF1852F1"
android:textSize="13sp" />
</com.yidian.nightmode.widget.YdLinearLayout>
app:layout_constraintTop_toBottomOf="@id/sv_occupation" />
<com.yidian.nightmode.widget.YdButton
android:id="@+id/btn_next"
......
......@@ -54,7 +54,7 @@
android:id="@+id/iv_person_auth_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp20"
android:layout_marginTop="@dimen/dp15"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/cl_create_success" />
......@@ -63,7 +63,7 @@
android:id="@+id/tv_enter_merchant_center"
android:layout_width="@dimen/dp115"
android:layout_height="@dimen/dp35"
android:layout_marginTop="@dimen/dp31"
android:layout_marginTop="@dimen/dp26"
android:background="@drawable/shape_bg_enter_merchant_center_btn"
android:gravity="center"
android:text="@string/to_experience"
......@@ -73,11 +73,22 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/iv_person_auth_info" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp14"
android:paddingStart="@dimen/dp29"
android:paddingEnd="@dimen/dp29"
android:text="@string/personal_authentication_tips"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBottom_toTopOf="@id/tv_upgrade_enterprise_auth" />
<TextView
android:id="@+id/tv_upgrade_enterprise_auth"
android:layout_width="@dimen/dp302"
android:layout_height="@dimen/dp42"
android:layout_marginBottom="@dimen/dp33"
android:layout_marginBottom="@dimen/dp28"
android:background="@drawable/account_btn_gradient_bg"
android:gravity="center"
android:text="@string/turn_on_enterprise_certification"
......@@ -87,15 +98,4 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp19"
android:paddingStart="@dimen/dp29"
android:paddingEnd="@dimen/dp29"
android:text="@string/personal_authentication_tips"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp12"
app:layout_constraintBottom_toTopOf="@id/tv_upgrade_enterprise_auth" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -97,4 +97,14 @@
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/ev_id_card_number" />
<com.yidian.shenghuoquan.newscontent.widget.PrivacyAgreementView
android:id="@+id/av_privacy_agreement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/av_face_auth"
app:layout_constraintVertical_bias="1" />
</com.yidian.nightmode.widget.YdConstraintLayout>
\ No newline at end of file
......@@ -24,7 +24,9 @@
android:includeFontPadding="false"
android:textColor="#FF333333"
android:textColorHint="#FFC2C2C2"
android:textCursorDrawable="@drawable/shape_bg_input_cursor"
android:textSize="15sp"
android:textStyle="bold"
app:layout_constraintTop_toBottomOf="@id/tv_content" />
<com.yidian.nightmode.widget.YdImageView
......
......@@ -28,9 +28,11 @@
android:singleLine="true"
android:textColor="#FF333333"
android:textColorHint="#FFC2C2C2"
android:textCursorDrawable="@drawable/shape_bg_input_cursor"
android:textSize="15sp"
app:layout_constraintStart_toEndOf="@id/tv_content"
android:textStyle="bold"
app:layout_constraintEnd_toStartOf="@id/iv_clear"
app:layout_constraintStart_toEndOf="@id/tv_content"
app:layout_constraintTop_toTopOf="parent" />
<com.yidian.nightmode.widget.YdImageView
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/cb_agree"
android:layout_width="@dimen/dp27"
android:layout_height="@dimen/dp27"
android:button="@drawable/selector_protocol_check"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_agree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp2"
android:text="@string/agree"
android:textColor="@color/color_999999"
android:textSize="@dimen/sp13"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/cb_agree"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_privacy_policy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/privacy_policy"
android:textColor="@color/color_FF1852F1"
android:textSize="@dimen/sp13"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_agree"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_user_agreement"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user_agreement"
android:textColor="@color/color_FF1852F1"
android:textSize="@dimen/sp13"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_privacy_policy"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -62,4 +62,6 @@
<color name="color_FF6BB81F">#FF6BB81F</color>
<color name="color_66000000">#66000000</color>
<color name="color_FFEAAF35">#FFEAAF35</color>
<color name="color_FFDDDDDD">#FFDDDDDD</color>
<color name="color_FF969798">#FF969798</color>
</resources>
\ No newline at end of file
......@@ -26,7 +26,6 @@
<string name="protocol_hint_title">温馨提示</string>
<string name="protocol_hint_content_one">需同意</string>
<string name="privacy_policy">&#160;隐私政策&#160;</string>
<string name="protocol_hint_content_two">后才能继续为提供您服务。</string>
<string name="agree_access">同意并进入</string>
<string name="disagree">不同意</string>
......@@ -50,7 +49,7 @@
<string name="enter_life_account">进入生活号</string>
<string name="create_account">确认创建</string>
<string name="account_create_tips">同企业下生活号名称不可复用</string>
<string name="account_create_desc">生活号作为企业服务管理载体,请正确使用生活号权益,新申请生活号默认当前申请人作为默认管理员,申请成功 后可在销售APP内进行更改</string>
<string name="account_create_desc">生活号作为企业服务管理载体,请正确使用生活号权益,新申请生活号默认当前申请人作为默认管理员,申请成功后可在销售APP内进行更改</string>
<string name="life_account_name_overrun_error_tips">名称超限,最多24个字符</string>
<string name="account_manager">管理员</string>
<string name="account_name">生活号名称</string>
......@@ -103,7 +102,7 @@
<string name="face_auth_fail">验证未通过</string>
<string name="face_auth_error_tips">人脸识别失败,请重新识别</string>
<string name="agree">我同意</string>
<string name="privacy_certification">《隐私认证</string>
<string name="privacy_policy">《隐私政策</string>
<string name="user_agreement">《用户协议》</string>
<string name="auth_finish">完成认证</string>
<string name="enterprise_qualification">企业资质</string>
......@@ -111,7 +110,7 @@
<string name="platform_audit">平台审核</string>
<string name="merchant_type">商户类型</string>
<string name="business_license">营业执照</string>
<string name="business_license_description">1、请确保证件内容文字清晰可见,证件本身无缺陷,否则会审核失败 2、仅支持中国大陆工商局或市场监督管理局登记的个体商户,请提供有效期内的营业执照</string>
<string name="business_license_description">1、请确保证件内容文字清晰可见,证件本身无缺陷,否则会审核失败\n2、仅支持中国大陆工商局或市场监督管理局登记的个体商户,请提供有效期内的营业执照</string>
<string name="upload_business_license">上传营业执照</string>
<string name="check_business_license_distinct">请核对营业执照是否拍摄清晰</string>
<string name="business_license_registration_name">注册名称</string>
......@@ -174,5 +173,9 @@
<string name="goto_upgrade">去升级</string>
<string name="goto_modify">去修改</string>
<string name="input_legal_person_phone_number">请输入法人手机号</string>
<string name="change">更换</string>
<string name="login_again">重新登录</string>
<string name="no_life_account">当前无生活号,请重新登录</string>
<string name="logout">退出登录</string>
</resources>
\ No newline at end of file
<resources>
<!-- Base application theme. -->
<style name="FlashTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowIsTranslucent" >false</item>
<item name="android:windowFullscreen" >false</item>
<item name="android:windowBackground" >@mipmap/launcher_bg</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowFullscreen">false</item>
<item name="android:windowBackground">@drawable/icon_launcher_bg</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
......@@ -119,6 +119,7 @@
<style name="protocol_checkboxBg" parent="@android:style/Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/protocol_checkbox_bg</item>
</style>
<style name="merchant_center_bottom_hint_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
......@@ -126,6 +127,7 @@
<item name="android:windowIsFloating">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
<style name="merchant_switch_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
......
......@@ -39,7 +39,7 @@ android {
buildConfigField("String", "API_URL", rootProject.ext.buildParams.debug.API_URL)
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".debug.fileprovider" + '\"')
manifestPlaceholders = [
app_name : "B端测试",
app_name : "商家版测试",
file_provider: rootProject.ext.android.applicationId + ".debug.fileprovider",
]
//不混淆
......@@ -53,7 +53,7 @@ android {
buildConfigField("String", "API_URL", rootProject.ext.buildParams.release.API_URL)
buildConfigField("String", "PROVIDER_NAME", '\"' + rootProject.ext.android.applicationId + ".fileprovider" + '\"')
manifestPlaceholders = [
app_name : "B端",
app_name : "生活圈商家版",
file_provider: rootProject.ext.android.applicationId + ".fileprovider",
]
//混淆
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment