Commit 7a19c715 authored by zhenghongbin's avatar zhenghongbin

add Merge branch 'dev' of https://git.yidian-inc.com:8021/bp/ShenghuoquanBusiness into dev

* 'dev' of https://git.yidian-inc.com:8021/bp/ShenghuoquanBusiness:
  update 工程目录整理
  update 个人认证、企业认证完成页面
  add 个人、企业认证前检查
  update 企业认证fragment切换
  update 参数调整
  update 企业认证流程
  add 企业认证相关接口 个人认证身份信息校验错误提示
  update 身份证OCR接口 人脸验证成功后锁定输入状态
  update 个人认证完成接口
  fix 登录接口Response
  update 个人认证流程
  update 个人认证流程
  add 新增数字校验布局
  update 职业标签UI
  add 个人认证流程相关接口

# Conflicts:
#	CommonLib/Common/src/main/java/com/yidian/common/http/URLs.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/http/CommonService.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/ui/LifeAccountEnterpriseCertificationActivity.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/ui/auth/LifeAccountBusinessLicenseAuthFragment.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/ui/auth/LifeAccountIDCardAuthFragment.kt
#	Components/newscontent/src/main/java/com/yidian/shenghuoquan/newscontent/ui/idcard/IDCardTestActivity.kt
parents ee6be16c 0befb4dc
......@@ -21,8 +21,8 @@ class XRouterPathConstants {
const val LIFE_ACCOUNT_ENTERPRISE_CERTIFICATION = "/lifeAccountEnterpriseCertification"
const val LIFE_ACCOUNT_PERSONAL_AUTH = "/lifeAccountPersonalAuth"
const val LIFE_ACCOUNT_CREATE = "/createLiveAccountActivity"
const val PERSONAL_AUTHENTICATION = "/PersonalAuthenticationActivity"
const val ENTERPRISE_CERTIFICATION = "/EnterpriseCertificationActivity"
const val LIFE_ACCOUNT_PERSONAL_AUTH_COMPLETE = "/lifeAccountPersonalAuthComplete"
const val LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE = "/lifeAccountEnterpriseAuthComplete"
const val LIFE_ACCOUNT_ENTERPRISE_AUTH = "/lifeAccountEnterpriseAuth"
const val LIFE_NUMBER = "/lifeNumberActivity"
}
......
......@@ -7,7 +7,8 @@ class URLs {
val BASE_URL: String
private const val BASE_URL_DEBUG = "http://bp-dev.go2yd.com"
private const val BASE_URL_PRO = "http://bp-test.go2yd.com"
private const val BASE_URL_PRO = "http://bp-dev.go2yd.com"
init {
BASE_URL = if (BuildConfig.ENV_DEBUG){
......@@ -33,5 +34,15 @@ class URLs {
const val mobileLogin = "/user/user/login"
const val accountList = "/merchant/auth/account_list"
const val createLifeAccount = "/merchant/enterprise/create_life"
const val authPersonalCheck = "/merchant/auth/personal_check"
const val authLiveIdentity = "/merchant/auth/live_identity"
const val authComplete = "/merchant/auth/complete"
const val authAuthentication = "/merchant/auth/authentication"
const val authMerchantCheck = "/merchant/enterprise/ent_check"
const val authBusinessLicenseCommit = "/merchant/enterprise/ent_commit"
const val authEnterpriseLegalIdentityCommit = "/merchant/enterprise/legal_commit"
const val authIndividualBusinessIdentityCommit = "/merchant/enterprise/ent_personal"
const val authEnterpriseLiveIdentity = "/merchant/enterprise/live_identity"
const val authEnterpriseComplete = "/merchant/enterprise/complete"
}
}
\ No newline at end of file
......@@ -44,16 +44,13 @@
android:name=".ui.idcard.IDCardTestActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.TempListActivity"
android:name=".ui.auth.LifeAccountEnterpriseAuthCompleteActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.EnterpriseCertificationActivity"
android:name=".ui.auth.LifeAccountPersonalAuthCompleteActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.PersonalAuthenticationActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.LifeNumberActivity"
android:name=".ui.auth.LifeNumberActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.idcard.IDCardResultActivity"
......@@ -76,24 +73,27 @@
android:theme="@style/Transparent" />
<activity
android:name=".ui.LifeAccountIdentityActivity"
android:name=".ui.auth.LifeAccountIdentityActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.auth.LifeAccountAuthActivity"
android:theme="@style/Transparent" />
<activity android:name=".ui.LifeAccountEnterpriseCertificationActivity"
<activity
android:name=".ui.LifeAccountEnterpriseCertificationActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.LiveAccountCreateActivity"
android:name=".ui.auth.LiveAccountCreateActivity"
android:theme="@style/Transparent"
android:windowSoftInputMode="stateHidden|adjustResize"/>
android:windowSoftInputMode="stateHidden|adjustResize" />
<activity android:name=".ui.auth.LifeAccountPersonalAuthActivity"
<activity
android:name=".ui.auth.LifeAccountPersonalAuthActivity"
android:theme="@style/Transparent" />
<activity android:name=".ui.auth.LifeAccountEnterpriseAuthActivity"
<activity
android:name=".ui.auth.LifeAccountEnterpriseAuthActivity"
android:theme="@style/Transparent" />
</application>
......
......@@ -7,9 +7,11 @@ import com.yidian.common.XRouterPathConstants.Companion.GALLERY
import com.yidian.common.XRouterPathConstants.Companion.ID_CARD_TEST
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_AUTH
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_ENTERPRISE_AUTH
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_ENTERPRISE_CERTIFICATION
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_IDENTITY
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_PERSONAL_AUTH
import com.yidian.common.XRouterPathConstants.Companion.LIFE_ACCOUNT_PERSONAL_AUTH_COMPLETE
import com.yidian.common.XRouterPathConstants.Companion.LOGIN_LIFE_CIRCLE
import com.yidian.common.XRouterPathConstants.Companion.NEWS_CONTENT
import com.yidian.common.XRouterPathConstants.Companion.NEWS_MAIN
......@@ -150,6 +152,30 @@ class NewsContentApplication : YdBaseApplication() {
}
}),
XPageNode(LIFE_ACCOUNT_PERSONAL_AUTH_COMPLETE, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, LifeAccountPersonalAuthCompleteActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}),
XPageNode(LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
if (params != null) {
intent.putExtra(XRouterPathConstants.ParamsKey, params as HashMap)
}
intent.setClass(context, LifeAccountEnterpriseAuthCompleteActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
}
}),
XPageNode(NEWS_CONTENT, XPageNodePageType.NATIVE, object : XPageHandler {
override fun handler(params: Map<String, Any?>?) {
val intent = Intent()
......
package com.yidian.shenghuoquan.newscontent.bean
/**
* author: yinjiacheng
* date: 6/4/21 5:26 PM
* description: 生活号企业认证数据集
*/
class LifeAccountMerchantAuthData {
var merchantType: Int = 0
var isBusinessLicenseUpload: Boolean = false
var businessLicenseObjectKey: String = ""
var registrationName: String = ""
var registrationCode: String = ""
// 营业执照相关信息
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
......@@ -8,8 +8,25 @@ package com.yidian.shenghuoquan.newscontent.bean
class LifeAccountPersonalAuthData {
var realName: String = ""
var idCardNum: String = ""
var phoneNum: String = ""
var occupation: String = ""
var idCardPortraitFaceObjectKey: String = ""
var idCardNationalEmblemFaceObjectKey: String = ""
var idCardPortraitFaceBucket: String = ""
var idCardNationalEmblemFaceBucket: String = ""
var isIDCardPortraitFaceUpload: Boolean = false
var isIDCardNationalEmblemFaceUpload: Boolean = false
var idCardPortraitFaceCompleteness: Int = -1
var idCardNationalEmblemFaceCompleteness: Int = -1
var liveDetectBizToken: String = ""
var liveDetectObjectKey: String = ""
var isFaceAuthPass: Boolean = false
// 身份证相关信息
var gender: String = ""
var address: String? = null
var nationality: String? = null
var validDateStart: String? = null
var validDateEnd: String? = null
var issuedBy: String? = null
}
......@@ -9,9 +9,17 @@ object Constant {
const val LIFE_ACCOUNT_AUTH_TAG = "LifeAccountAuth"
// 认证类型
const val TYPE_AUTH = "auth_type"
const val TYPE_AUTH_PERSONAL = 0 // 个人
const val TYPE_AUTH_INDIVIDUAL_BUSINESS = 1 // 个体工商户
const val TYPE_AUTH_COMMON_ENTERPRISE = 2 // 普通企业
// 商户类型
const val ITEM_INDIVIDUAL_BUSINESSES = "个体工商户"
const val ITEM_COMMON_ENTERPRISE = "普通企业"
const val TYPE_INDIVIDUAL_BUSINESS = 1
const val TYPE_COMMON_ENTERPRISE = 2
// 身份证、营业执照上传方式
const val ITEM_TAKE_PHOTO = "拍照"
......@@ -40,4 +48,13 @@ object Constant {
const val TYPE_STILL = "still" // 静默活体
const val TYPE_FLASH = "flash" // 炫彩活体,通过打光进行活体验证,炫彩活体相较于静默活体安全性更高,但通过率会略有降低
const val TYPE_RAW_IMAGE = "raw_image" // 不进行活体验证,仅使用上传的图片进行后续的比对
// 服务端error message
const val ERROR_MESSAGE_ID_CARD_NUMBER = "身份证号码有误"
const val ERROR_MESSAGE_REAL_NAME = "姓名缺失"
// 数据来源
const val DATA_FROM_C = 1 // C端
const val DATA_FROM_B = 2 // B端
const val DATA_FROM_OP = 3 // OP后台
}
\ No newline at end of file
......@@ -59,4 +59,38 @@ interface CommonService {
@Headers("Content-Type: application/json")
@POST(URLs.createLifeAccount)
fun createLifeAccount(@QueryMap commonParams: Map<String, String>, @Body requestParams: Map<String, String?>) :Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.authPersonalCheck)
fun authPersonalCheck(@QueryMap commonParams: Map<String, String>, @Body requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@GET(URLs.authLiveIdentity)
fun authLiveIdentity(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.authComplete)
fun authComplete(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String?>): Observable<HttpResult<Any?>>
@GET(URLs.authAuthentication)
fun authAuthentication(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.authMerchantCheck)
fun authMerchantCheck(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.authBusinessLicenseCommit)
fun authBusinessLicenseCommit(@QueryMap commonParams: Map<String, String>, @Body requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.authEnterpriseLegalIdentityCommit)
fun authEnterpriseLegalIdentityCommit(@QueryMap commonParams: Map<String, String>, @Body requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.authIndividualBusinessIdentityCommit)
fun authIndividualBusinessIdentityCommit(@QueryMap commonParams: Map<String, String>, @Body requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@GET(URLs.authEnterpriseLiveIdentity)
fun authEnterpriseLiveIdentity(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
@GET(URLs.authEnterpriseComplete)
fun authEnterpriseComplete(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String?>) : Observable<HttpResult<Any?>>
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthAuthenticationBean
/**
* author: yinjiacheng
* date: 6/1/21 8:13 PM
* description: API /merchant/auth/authentication
*/
interface IAuthAuthenticationCallback {
fun authAuthenticationSuccess(result: AuthAuthenticationBean.Response?)
fun authAuthenticationFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthBusinessLicenseCommitBean
/**
* author: yinjiacheng
* date: 6/3/21 7:25 PM
* description: API /merchant/enterprise/ent_commit
*/
interface IAuthBusinessLicenseCommitCallback {
fun authBusinessLicenseCommitSuccess(result: AuthBusinessLicenseCommitBean.Response?)
fun authBusinessLicenseCommitFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/1/21 7:43 PM
* description: API /merchant/auth/complete
*/
interface IAuthCompleteCallback {
fun authCompleteSuccess()
fun authCompleteFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthEnterpriseCompleteBean
/**
* author: yinjiacheng
* date: 6/3/21 9:12 PM
* description: API /merchant/enterprise/complete
*/
interface IAuthEnterpriseCompleteCallback {
fun authEnterpriseCompleteSuccess(result: AuthEnterpriseCompleteBean.Response?)
fun authEnterpriseCompleteFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/3/21 8:38 PM
* description: API /merchant/enterprise/ent_commit
*/
interface IAuthEnterpriseLegalIdentityCommitCallback {
fun authEnterpriseLegalIdentityCommitSuccess()
fun authEnterpriseLegalIdentityCommitFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/3/21 9:06 PM
* description: API /merchant/enterprise/live_identity
*/
interface IAuthEnterpriseLiveIdentityCallback {
fun authEnterpriseLiveIdentitySuccess()
fun authEnterpriseLiveIdentityFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/3/21 8:55 PM
* description: API /merchant/enterprise/ent_personal
*/
interface IAuthIndividualBusinessIdentityCommitCallback {
fun authIndividualBusinessIdentityCommitSuccess()
fun authIndividualBusinessIdentityCommitFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/1/21 7:52 PM
* description: API /merchant/auth/live_identity
*/
interface IAuthLiveIdentityCallback {
fun authLiveIdentitySuccess()
fun authLiveIdentityFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthMerchantCheckBean
/**
* author: yinjiacheng
* date: 6/3/21 6:21 PM
* description: API /merchant/enterprise/ent_check
*/
interface IAuthMerchantCheckCallback {
fun authMerchantCheckSuccess(result: AuthMerchantCheckBean.Response?)
fun authMerchantCheckFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.callback
/**
* author: yinjiacheng
* date: 6/1/21 5:50 PM
* description: API /merchant/auth/personal_check
*/
interface IAuthPersonalCheckCallback {
fun authPersonCheckSuccess()
fun authPersonCheckFailure(message: String?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/1/21 7:54 PM
* description: API /merchant/auth/authentication
*/
class AuthAuthenticationBean(val response: Response) {
data class Response(
val audit_status: Int,
val back_id_card: String,
val create_time: String,
val front_id_card: String,
val full_name: String,
val id_card: String,
val live_identity_status: Int,
val occupation: String
)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 6:23 PM
* description: API /merchant/enterprise/ent_commit
*/
class AuthBusinessLicenseCommitBean {
data class Request(
val user_id: Long,
val code: String,
val name: String,
val type: String?,
val addr: String?,
val pers: String?,
val scope: String?,
val time: String?,
val regi: String?,
val organizer: String?,
val date: String?,
val comp: String?,
val num: String?,
val form: String?,
val funding: String?,
val issue_date: String?,
val entterprise_image: String,
val data_from: Int,
val data_type: Int,
val life_account_id: Long?,
val proxy_user_name: String?,
val mobile: String?,
val is_agent: Int?
)
data class Response(val data: Int)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/1/21 7:40 PM
* description: API /merchant/auth/complete
*/
class AuthCompleteBean(val request: Request) {
data class Request(val mobile: String)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 9:08 PM
* description: API /merchant/enterprise/complete
*/
class AuthEnterpriseCompleteBean {
data class Request(val code: String)
data class Response(
val enterprise_auth_record_id: Long,
val code: String,
val name: String,
val legal_person: String,
val legal_id_card: String,
val data_type: Int,
val audit_status: Int
)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 7:37 PM
* description: API /merchant/enterprise/ent_commit
*/
class AuthEnterpriseLegalIdentityCommitBean() {
data class Request(
val record_id: Long,
val front_img: String,
val bak_img: String,
val front_completeness: Int,
val bak_completeness: Int,
val idcard_number: String,
val gender: String?,
val name: String,
val address: String?,
val nationality: String?,
val valid_date_start: String?,
val valid_date_end: String?,
val issued_by: String?,
val life_account_id: Long?,
val proxy_user_name: String?,
val mobile: String,
val is_agent: String?
)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 9:05 PM
* description: API /merchant/enterprise/live_identity
*/
class AuthEnterpriseLiveIdentityBean {
data class Request(val code: String, val idcard_number: String)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 8:41 PM
* description: API /merchant/enterprise/ent_personal
*/
class AuthIndividualBusinessIdentityCommitBean {
data class Request(
val code: String,
val data_type: Int,
val front_img: String,
val bak_img: String,
val front_completeness: Int,
val bak_completeness: Int,
val idcard_number: String,
val gender: String?,
val name: String,
val address: String?,
val nationality: String?,
val valid_date_start: String?,
val valid_date_end: String?,
val issued_by: String?,
val proxy_user_name: String?,
val phone: String?,
val is_agent: Int?
)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/3/21 6:05 PM
* description: API /merchant/enterprise/ent_check
*/
class AuthMerchantCheckBean {
data class Request(
val user_id: Long,
val life_account_id: Long?,
val mobile: String?,
val is_agent: Int?
)
data class Response(val enterprise_auth_record_id: Int)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
/**
* author: yinjiacheng
* date: 6/1/21 5:46 PM
* description: API /merchant/auth/personal_check
*/
class AuthPersonalCheckBean(val request: Request) {
data class Request(
val front_img: String,
val bak_img: String,
val front_completeness: Int,
val bak_completeness: Int,
val id_card: String,
val gender: String,
val name: String,
val occupation: String,
val address: String?,
val nationality: String?,
val valid_date_start: String?,
val valid_date_end: String?,
val issued_by: String?
)
}
\ No newline at end of file
......@@ -6,7 +6,7 @@ package com.yidian.shenghuoquan.newscontent.http.httpbean
* description: 营业执照OCR
*/
class BusinessLicenseOCRBean {
data class Request(val business_image_objectid: String?)
data class Request(val business_image_objectid: String, val business_image_bucket: String)
data class Response(
val addr: String,
......
......@@ -7,8 +7,9 @@ package com.yidian.shenghuoquan.newscontent.http.httpbean
*/
class GetIDCardOCRBean(val request: Request, val response: Response) {
data class Request(
val posit_image_objectid: String?,
val back_image_objectid: String?
val posit_image_objectid: String,
val back_image_objectid: String,
val bucket: String
)
data class Response(
......@@ -19,7 +20,9 @@ class GetIDCardOCRBean(val request: Request, val response: Response) {
data class Back(
val issued_by: String,
val valid_date_end: String,
val valid_date_start: String
val valid_date_start: String,
val completeness: Int,
val legality: Legality
)
data class Posit(
......
......@@ -9,7 +9,7 @@ class MobileLoginBean(var request: Request, var response: Response) {
val avatar: String,
val city_id: String,
val city_name: String,
val gender: Int,
val gender: String,
val gender_text: String,
val mobile: String,
val nick_name: String,
......
package com.yidian.shenghuoquan.newscontent.ui
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.ENTERPRISE_CERTIFICATION
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityEnterpriseCertificationBinding
import com.yidian.xpage.XPageManager
import kotlinx.android.synthetic.main.top_bar.view.*
/**
* Author: houzhenpu
* Date: 2021/5/26 10:44 AM
* Describe: activity_enterprise_certification 企业认证成功页面
*/
class EnterpriseCertificationActivity : BaseActivity<ActivityEnterpriseCertificationBinding>() {
override fun createViewBinding(): ActivityEnterpriseCertificationBinding {
return ActivityEnterpriseCertificationBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return ENTERPRISE_CERTIFICATION
}
private var companyName = "北京一点网聚科技有限公司"
private var creditCode = "WD1212312223331"
private var realName = "兰花花"
private var idNumber = "120803********0660"
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
viewBind.root.title.text = resources.getString(R.string.enterprise_certification)
initListener()
initData()
}
private fun initListener() {
viewBind.createLifeNumber.setOnClickListener {
val params = hashMapOf(Pair(LiveAccountCreateActivity.ENTERPRISE_CODE,creditCode))
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_CREATE,params)
}
viewBind.root.back.setOnClickListener {
finish()
}
}
private fun initData() {
// TODO: 2021/5/31 认证信息数据传递赋值
showData()
}
@SuppressLint("SetTextI18n")
private fun showData() {
viewBind.companyName.text = companyName
viewBind.creditCode.text = creditCode
viewBind.operatorInformation.text = "$realName $idNumber"
}
}
\ No newline at end of file
......@@ -115,8 +115,10 @@ class LifeAccountEnterpriseCertificationActivity :
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
if (bucket == null || objectKey == null) return
val requestParams = HashMap<String, String?>()
requestParams["business_image_objectid"] = objectKey
requestParams["business_image_bucket"] = bucket
ApiService.businessLicenseOCR(object : IBusinessLicenseOCRCallback {
override fun businessLicenseOCRSuccess(result: BusinessLicenseOCRBean.Response?) {
Log.d(TAG, "name: ${result?.name}, code: ${result?.code}")
......
package com.yidian.shenghuoquan.newscontent.ui
import android.content.Intent
import android.os.Bundle
import com.yidian.common.XRouterPathConstants
import com.yidian.common.XRouterPathConstants.Companion.PERSONAL_AUTHENTICATION
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityPersonalAuthenticationBinding
import com.yidian.utils.ToastUtil
import com.yidian.xpage.XPageManager
import kotlinx.android.synthetic.main.top_bar.view.*
/**
* Author: houzhenpu
* Date: 2021/5/26 15:44 PM
* Describe: activity_enterprise_certification 个人认证成功页面 activity_personal_authentication
*/
class PersonalAuthenticationActivity : BaseActivity<ActivityPersonalAuthenticationBinding>() {
companion object{
const val OCCUPATION = "occupation"
const val REAL_NAME = "real_name"
const val ID_NUMBER = "id_number"
}
override fun createViewBinding(): ActivityPersonalAuthenticationBinding {
return ActivityPersonalAuthenticationBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return PERSONAL_AUTHENTICATION
}
private var occupation = "兽医"
private var realName = "兰花花"
private var phoneNumber = "18210128848"
private var idNumber = "103834712904123949123419"
override fun init(savedInstanceState: Bundle?) {
viewBind.root.title.text = resources.getString(R.string.personal_authentication)
initListener()
initData()
}
private fun initData() {
occupation = intent.getStringExtra(OCCUPATION)?:""
realName = intent.getStringExtra(REAL_NAME)?:""
idNumber = intent.getStringExtra(ID_NUMBER)?:""
showData()
}
private fun showData() {
viewBind.occupationLabelValue.text = occupation
viewBind.actualNameValue.text = realName
viewBind.phoneNumberValue.text = phoneNumber
viewBind.idNumberValue.text = idNumber
}
private fun initListener() {
viewBind.root.back.setOnClickListener {
finish()
}
viewBind.information.setOnClickListener {
ToastUtil.showToast(this, "去体验页面跳转跳转")
// TODO: 2021/5/27 去体验页面跳转
}
viewBind.turnOnEnterpriseCertification.setOnClickListener {
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH,null)
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
import android.content.Intent
import android.os.Bundle
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.databinding.ActivityTempListBinding
import com.yidian.shenghuoquan.newscontent.ui.alive.AliveTestActivity
import com.yidian.shenghuoquan.newscontent.ui.idcard.IDCardTestActivity
/**
* Author: sym
* Date: 2021/5/24 3:44 PM
* Describe:
*/
class TempListActivity : BaseActivity<ActivityTempListBinding>() {
override fun createViewBinding(): ActivityTempListBinding {
return ActivityTempListBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return ""
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBind.btActionCard.setOnClickListener {
startActivity(Intent(this@TempListActivity, IDCardTestActivity::class.java))
}
viewBind.btActionYy.setOnClickListener {
startActivity(Intent(this@TempListActivity, AliveTestActivity::class.java))
}
viewBind.btBusinessLicense.setOnClickListener {
startActivity(Intent(this@TempListActivity, LifeAccountEnterpriseCertificationActivity::class.java))
}
viewBind.btCreateAccount.setOnClickListener {
startActivity(Intent(this@TempListActivity, LiveAccountCreateActivity::class.java))
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.util.Log
import android.view.View
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
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.httpbean.AuthAuthenticationBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthMerchantCheckBean
import com.yidian.xpage.XPageManager
/**
......@@ -14,7 +23,7 @@ import com.yidian.xpage.XPageManager
* description: 生活号认证
*/
class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
View.OnClickListener {
View.OnClickListener, IAuthAuthenticationCallback, IAuthMerchantCheckCallback {
override fun createViewBinding(): ActivityLifeAccountAuthBinding {
return ActivityLifeAccountAuthBinding.inflate(layoutInflater)
}
......@@ -27,7 +36,6 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
super.init(savedInstanceState)
initView()
initListener()
// TODO: 5/29/21 请求104接口 检测个人认证状态
}
private fun initView() {
......@@ -61,17 +69,53 @@ class LifeAccountAuthActivity : BaseActivity<ActivityLifeAccountAuthBinding>(),
// TODO: 5/26/21 入驻攻略
}
R.id.view_personal_auth -> {
viewBind.viewPersonalAuth.isSelected = true
viewBind.viewEnterpriseAuth.isSelected = false
// 跳转个人认证页
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_PERSONAL_AUTH, null)
// 请求个人认证信息 用于回显已填入的信息
ApiService.authAuthentication(this)
}
R.id.view_enterprise_auth -> {
viewBind.viewPersonalAuth.isSelected = false
viewBind.viewEnterpriseAuth.isSelected = true
// 跳转企业认证页
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH, null)
// 请求企业认证信息 用于回显已填入的信息
val params = HashMap<String, String?>(1)
params["user_id"] = Hawk.get(HawkConfig.UserId, "")
ApiService.authMerchantCheck(this, params)
}
}
}
override fun authAuthenticationSuccess(result: AuthAuthenticationBean.Response?) {
// TODO: 6/6/21 带参跳转
viewBind.viewPersonalAuth.isSelected = true
viewBind.viewEnterpriseAuth.isSelected = false
// 跳转个人认证页
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_PERSONAL_AUTH, null)
}
override fun authAuthenticationFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth authentication failure, message: $message"
)
// Test
viewBind.viewPersonalAuth.isSelected = true
viewBind.viewEnterpriseAuth.isSelected = false
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_PERSONAL_AUTH, null)
}
override fun authMerchantCheckSuccess(result: AuthMerchantCheckBean.Response?) {
// TODO: 6/6/21 带参跳转
viewBind.viewPersonalAuth.isSelected = false
viewBind.viewEnterpriseAuth.isSelected = true
// 跳转企业认证页
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH, null)
}
override fun authMerchantCheckFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth merchant check failure, message: $message"
)
// Test
viewBind.viewPersonalAuth.isSelected = false
viewBind.viewEnterpriseAuth.isSelected = true
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH, null)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import com.yidian.shenghuoquan.newscontent.bean.LifeAccountMerchantAuthData
import com.yidian.shenghuoquan.newscontent.bean.LifeAccountPersonalAuthData
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
/**
* author: yinjiacheng
......@@ -8,5 +11,155 @@ import com.yidian.shenghuoquan.newscontent.bean.LifeAccountPersonalAuthData
* description: 生活号认证数据管理
*/
object LifeAccountAuthDataManager {
val personalAuthData by lazy { LifeAccountPersonalAuthData() }
val merchantAuthData by lazy { LifeAccountMerchantAuthData() }
/**
* 将身份证OCR结果填入
*/
fun generatePersonalAuthData(data: GetIDCardOCRBean.Response) {
personalAuthData.idCardPortraitFaceCompleteness = data.posit.completeness
personalAuthData.idCardNationalEmblemFaceCompleteness = data.posit.completeness
personalAuthData.idCardNum = data.posit.idcard_number
personalAuthData.gender = data.posit.gender
personalAuthData.realName = data.posit.name
personalAuthData.address = data.posit.address
personalAuthData.nationality = data.posit.nationality
personalAuthData.validDateStart = data.back.valid_date_start
personalAuthData.validDateEnd = data.back.valid_date_end
personalAuthData.issuedBy = data.back.issued_by
}
/**
* 生成身份信息校验接口请求体
*/
fun generateAuthPersonalCheckRequest(): HashMap<String, String?> {
val requestMap = HashMap<String, String?>()
requestMap["front_img"] = personalAuthData.idCardPortraitFaceObjectKey
requestMap["bak_img"] = personalAuthData.idCardNationalEmblemFaceObjectKey
requestMap["front_completeness"] = personalAuthData.idCardPortraitFaceCompleteness.toString()
requestMap["bak_completeness"] = personalAuthData.idCardNationalEmblemFaceCompleteness.toString()
requestMap["id_card"] = personalAuthData.idCardNum
requestMap["gender"] = personalAuthData.gender
requestMap["name"] = personalAuthData.realName
requestMap["occupation"] = personalAuthData.occupation
requestMap["address"] = personalAuthData.address
requestMap["nationality"] = personalAuthData.nationality
requestMap["valid_date_start"] = personalAuthData.validDateStart
requestMap["valid_date_end"] = personalAuthData.validDateEnd
requestMap["issued_by"] = personalAuthData.issuedBy
return requestMap
}
/**
* 将营业执照OCR结果填入
*/
fun generateMerchantAuthData(data: BusinessLicenseOCRBean.Response) {
merchantAuthData.registrationName = data.name
merchantAuthData.registrationCode = data.code
merchantAuthData.type = data.type
merchantAuthData.addr = data.addr
merchantAuthData.pers = data.pers
merchantAuthData.scope = data.scope
merchantAuthData.time = data.time
merchantAuthData.regi = data.regi
merchantAuthData.organizer = data.organizer
merchantAuthData.date = data.date
merchantAuthData.comp = data.comp
merchantAuthData.num = data.num
merchantAuthData.form = data.form
merchantAuthData.funding = data.funding
merchantAuthData.date_issue = data.date_issue
}
/**
* 生成营业执照上传接口请求体
*/
fun generateAuthBusinessLicenseCommitRequest(
userId: Long,
dataType: Int,
lifeAccountId: Long?
): HashMap<String, String?> {
val requestMap = HashMap<String, String?>()
requestMap["user_id"] = userId.toString()
requestMap["code"] = merchantAuthData.registrationCode
requestMap["name"] = merchantAuthData.registrationName
requestMap["type"] = merchantAuthData.type
requestMap["addr"] = merchantAuthData.addr
requestMap["pers"] = merchantAuthData.pers
requestMap["scope"] = merchantAuthData.scope
requestMap["time"] = merchantAuthData.time
requestMap["regi"] = merchantAuthData.regi
requestMap["organizer"] = merchantAuthData.organizer
requestMap["date"] = merchantAuthData.date
requestMap["comp"] = merchantAuthData.comp
requestMap["num"] = merchantAuthData.num
requestMap["form"] = merchantAuthData.form
requestMap["funding"] = merchantAuthData.funding
requestMap["issue_date"] = merchantAuthData.date_issue
requestMap["entterprise_image"] = merchantAuthData.businessLicenseObjectKey
requestMap["data_from"] = Constant.DATA_FROM_B.toString()
requestMap["data_type"] = dataType.toString()
requestMap["life_account_id"] = lifeAccountId.toString()
requestMap["proxy_user_name"] = null
requestMap["mobile"] = null
requestMap["is_agent"] = null
return requestMap
}
/**
* 生成个体工商户身份上传接口请求体
*/
fun generateAuthIndividualBusinessIdentityCommitRequest(
dataType: Int
): HashMap<String, String?> {
val requestMap = HashMap<String, String?>()
requestMap["code"] = merchantAuthData.registrationCode
requestMap["data_type"] = dataType.toString()
requestMap["front_img"] = personalAuthData.idCardPortraitFaceObjectKey
requestMap["bak_img"] = personalAuthData.idCardNationalEmblemFaceObjectKey
requestMap["front_completeness"] = personalAuthData.idCardPortraitFaceCompleteness.toString()
requestMap["bak_completeness"] = personalAuthData.idCardNationalEmblemFaceCompleteness.toString()
requestMap["idcard_number"] = personalAuthData.idCardNum
requestMap["gender"] = personalAuthData.gender
requestMap["name"] = personalAuthData.realName
requestMap["address"] = personalAuthData.address
requestMap["nationality"] = personalAuthData.nationality
requestMap["valid_date_start"] = personalAuthData.validDateStart
requestMap["valid_date_end"] = personalAuthData.validDateEnd
requestMap["issued_by"] = personalAuthData.issuedBy
requestMap["proxy_user_name"] = null
requestMap["phone"] = null
requestMap["is_agent"] = null
return requestMap
}
/**
* 生成普通企业法人身份信息上传接口请求体
*/
fun generateAuthEnterpriseLegalIdentityCommitRequest(
authRecordId: Long,
lifeAccountId: Long?
): HashMap<String, String?> {
val requestMap = HashMap<String, String?>()
requestMap["record_id"] = authRecordId.toString()
requestMap["front_img"] = personalAuthData.idCardPortraitFaceObjectKey
requestMap["bak_img"] = personalAuthData.idCardNationalEmblemFaceObjectKey
requestMap["front_completeness"] = personalAuthData.idCardPortraitFaceCompleteness.toString()
requestMap["bak_completeness"] = personalAuthData.idCardNationalEmblemFaceCompleteness.toString()
requestMap["idcard_number"] = personalAuthData.idCardNum
requestMap["gender"] = personalAuthData.gender
requestMap["name"] = personalAuthData.realName
requestMap["address"] = personalAuthData.address
requestMap["nationality"] = personalAuthData.nationality
requestMap["valid_date_start"] = personalAuthData.validDateStart
requestMap["valid_date_end"] = personalAuthData.validDateEnd
requestMap["issued_by"] = personalAuthData.issuedBy
requestMap["life_account_id"] = lifeAccountId.toString()
requestMap["proxy_user_name"] = null
requestMap["mobile"] = personalAuthData.phoneNum
requestMap["is_agent"] = null
return requestMap
}
}
\ No newline at end of file
......@@ -11,6 +11,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.FileProvider
import androidx.core.view.isVisible
import com.yidian.common.base.BaseFragment
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.BottomSelectAdapter
......@@ -24,6 +25,7 @@ import com.yidian.shenghuoquan.newscontent.ui.dialog.BottomSelectDialog
import com.yidian.shenghuoquan.newscontent.utils.BitmapUtil
import com.yidian.shenghuoquan.newscontent.utils.FileUtil
import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthBusinessInfoEditView
import java.io.File
/**
......@@ -34,7 +36,8 @@ import java.io.File
class LifeAccountBusinessLicenseAuthFragment :
BaseFragment<FragmentLifeAccountBusinessLicenseAuthBinding>(), View.OnClickListener,
BottomSelectAdapter.OnItemClickListener<BottomSelectBean>, KS3Core.OnKS3TaskListener,
IBusinessLicenseOCRCallback {
IBusinessLicenseOCRCallback,
LifeAccountAuthBusinessInfoEditView.OnLifeAccountAuthBusinessInfoEditViewCallback {
/**
* sdcard/Android/data/package/cache
......@@ -67,6 +70,8 @@ class LifeAccountBusinessLicenseAuthFragment :
private fun initListener() {
viewBinding.clBusinessLicenseUpload.setOnClickListener(this)
viewBinding.ivClear.setOnClickListener(this)
viewBinding.evRegistrationName.setOnLifeAccountAuthBusinessInfoEditViewCallback(this)
viewBinding.evRegistrationCode.setOnLifeAccountAuthBusinessInfoEditViewCallback(this)
}
override fun onClick(v: View?) {
......@@ -87,13 +92,18 @@ class LifeAccountBusinessLicenseAuthFragment :
R.id.iv_clear -> {
// 清除已上传的营业执照
viewBinding.ivBusinessLicense.setImageDrawable(null)
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = false
// 清除OCR或用户输入内容
viewBinding.evRegistrationName.clearEditContent()
viewBinding.evRegistrationCode.clearEditContent()
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
LifeAccountAuthDataManager.merchantAuthData.registrationCode = ""
// 设置上传区域可点击
viewBinding.clBusinessLicenseUpload.isEnabled = true
// 隐藏清除按钮
viewBinding.ivClear.visibility = View.GONE
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
}
}
......@@ -179,12 +189,35 @@ class LifeAccountBusinessLicenseAuthFragment :
/**
* 执行营业执照OCR
*/
private fun startBusinessLicenseOCR(objectKey: String?) {
private fun startBusinessLicenseOCR(objectKey: String?, bucket: String?) {
if (objectKey == null || bucket == null) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"business license objectKey or bucket is null, ocr suspend!"
)
return
}
val requestParams = HashMap<String, String?>()
requestParams["business_image_objectid"] = objectKey
requestParams["business_image_bucket"] = bucket
ApiService.businessLicenseOCR(this, requestParams)
}
/**
* 清除已输入的营业执照相关信息
* 用户更换商户类型操作
*/
fun clearBusinessLicenseInfo() {
// 清除已上传的营业执照
viewBinding.ivBusinessLicense.setImageDrawable(null)
viewBinding.ivClear.isVisible = false
// 清除OCR或用户输入内容
viewBinding.evRegistrationName.clearEditContent()
viewBinding.evRegistrationCode.clearEditContent()
// 设置上传区域可点击
viewBinding.clBusinessLicenseUpload.isEnabled = true
}
override fun onTaskStart() {
}
......@@ -202,8 +235,10 @@ class LifeAccountBusinessLicenseAuthFragment :
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
LifeAccountAuthDataManager.merchantAuthData.isBusinessLicenseUpload = true
objectKey?.let { LifeAccountAuthDataManager.merchantAuthData.businessLicenseObjectKey = it }
// 执行营业执照OCR
startBusinessLicenseOCR(objectKey)
startBusinessLicenseOCR(objectKey, bucket)
}
override fun onTaskFailure(statesCode: Int, message: String?) {
......@@ -211,11 +246,14 @@ class LifeAccountBusinessLicenseAuthFragment :
}
override fun businessLicenseOCRSuccess(result: BusinessLicenseOCRBean.Response?) {
result?.let { LifeAccountAuthDataManager.generateMerchantAuthData(it) }
// 回显OCR结果
viewBinding.evRegistrationName.fillEditContent(result?.name)
viewBinding.evRegistrationCode.fillEditContent(result?.code)
// 此时营业执照已上传并OCR识别完成 删除本地临时存储文件
File(commonPath + Constant.FILE_PATH_BUSINESS_LICENSE).delete()
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
override fun businessLicenseOCRFailure(message: String?) {
......@@ -224,4 +262,22 @@ class LifeAccountBusinessLicenseAuthFragment :
"request business license ocr failure, message: $message"
)
}
override fun onTextClear(from: LifeAccountAuthBusinessInfoEditView) {
if (from == viewBinding.evRegistrationName) {
LifeAccountAuthDataManager.merchantAuthData.registrationName = ""
} else {
LifeAccountAuthDataManager.merchantAuthData.registrationCode = ""
}
// 检查下一步条件
(activity as LifeAccountEnterpriseAuthActivity).checkNextCondition()
}
override fun onTextChange(from: LifeAccountAuthBusinessInfoEditView, text: String) {
if (from == viewBinding.evRegistrationName) {
LifeAccountAuthDataManager.merchantAuthData.registrationName = text
} else {
LifeAccountAuthDataManager.merchantAuthData.registrationCode = text
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
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.databinding.ActivityLifeAccountEnterpriseAuthCompleteBinding
import com.yidian.shenghuoquan.newscontent.utils.SensitiveInfoUtil
import com.yidian.xpage.XPageManager
/**
* Author: houzhenpu
* Date: 2021/5/26 10:44 AM
* Describe: activity_life_account_enterprise_auth_complete 企业认证成功页面
*/
class LifeAccountEnterpriseAuthCompleteActivity :
BaseActivity<ActivityLifeAccountEnterpriseAuthCompleteBinding>() {
companion object {
const val REGISTRATION_NAME = "registrationName"
const val REGISTRATION_CODE = "registrationCode"
const val ID_CARD_NAME = "idCardName"
const val ID_CARD_NUM = "idCardNum"
}
/**
* 跳转参数
*/
private val params by lazy { intent.getSerializableExtra(XRouterPathConstants.ParamsKey) as HashMap<*, *> }
override fun createViewBinding(): ActivityLifeAccountEnterpriseAuthCompleteBinding {
return ActivityLifeAccountEnterpriseAuthCompleteBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH_COMPLETE
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
initView()
initListener()
initData()
}
private fun initView() {
viewBind.viewCommonHeader.tvTitle.text = resources.getString(R.string.enterprise_auth)
viewBind.viewCommonHeader.ivBack.isVisible = false
}
private fun initListener() {
viewBind.createLifeAccount.setOnClickListener {
XPageManager.push(
XRouterPathConstants.LIFE_ACCOUNT_CREATE,
hashMapOf(
Pair(
LiveAccountCreateActivity.ENTERPRISE_CODE,
params[REGISTRATION_CODE]
)
)
)
}
}
private fun initData() {
viewBind.companyName.text = params[REGISTRATION_NAME] as String
viewBind.creditCode.text = params[REGISTRATION_CODE] as String
viewBind.operatorInformation.text =
"${params[ID_CARD_NAME]} ${SensitiveInfoUtil.idCardNumEncrypt(params[ID_CARD_NUM] as String)}"
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.CompoundButton
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
import com.yidian.shenghuoquan.newscontent.constant.Constant
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountPersonalAuthBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.callback.IAuthCompleteCallback
import com.yidian.xpage.XPageManager
/**
......@@ -14,7 +21,7 @@ import com.yidian.xpage.XPageManager
* description: 生活号个人认证
*/
class LifeAccountPersonalAuthActivity : BaseActivity<ActivityLifeAccountPersonalAuthBinding>(),
View.OnClickListener {
View.OnClickListener, CompoundButton.OnCheckedChangeListener, IAuthCompleteCallback {
override fun createViewBinding(): ActivityLifeAccountPersonalAuthBinding {
return ActivityLifeAccountPersonalAuthBinding.inflate(layoutInflater)
......@@ -38,19 +45,60 @@ class LifeAccountPersonalAuthActivity : BaseActivity<ActivityLifeAccountPersonal
private fun initListener() {
viewBind.viewCommonHeader.ivBack.setOnClickListener(this)
viewBind.ivProfessionalLabelChoose.setOnClickListener(this)
viewBind.svOccupation.setOnClickListener(this)
viewBind.cbProtocol.setOnCheckedChangeListener(this)
viewBind.btnNext.setOnClickListener(this)
}
/**
* 检查是否可以进行下一步
*/
fun checkNextCondition() {
if (viewBind.cbProtocol.isChecked
&& LifeAccountAuthDataManager.personalAuthData.occupation.isNotEmpty()
&& LifeAccountAuthDataManager.personalAuthData.isFaceAuthPass
) {
viewBind.btnNext.alpha = 1f
viewBind.btnNext.isEnabled = true
} else {
viewBind.btnNext.alpha = 0.32f
viewBind.btnNext.isEnabled = false
}
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.iv_back -> XPageManager.pop(null)
R.id.iv_professional_label_choose -> {
// TODO: 5/27/21 跳转职业标签选择
R.id.sv_occupation -> {
// TODO: 5/27/21 跳转职业标签选择 选择完成后进行下一步检查
LifeAccountAuthDataManager.personalAuthData.occupation = "工程师"
viewBind.svOccupation.setContentResult("工程师")
}
R.id.btn_next -> {
// TODO: 5/27/21 执行认证逻辑
// 个人认证 完成认证
val requestParams = HashMap<String, String?>()
requestParams["mobile"] = Hawk.get(HawkConfig.Mobile, "")
ApiService.authComplete(
this,
requestParams
)
}
}
}
override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) {
if (buttonView?.isPressed == false) return
checkNextCondition()
}
override fun authCompleteSuccess() {
// TODO: 6/3/21 跳转个人认证成功页
}
override fun authCompleteFailure(message: String?) {
Log.e(
Constant.LIFE_ACCOUNT_AUTH_TAG,
"request auth complete failure: message: $message"
)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
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.databinding.ActivityLifeAccountPersonalAuthCompleteBinding
import com.yidian.xpage.XPageManager
/**
* Author: houzhenpu
* Date: 2021/5/26 15:44 PM
* Describe: 个人认证成功页面 activity_life_account_personal_auth_complete
*/
class LifeAccountPersonalAuthCompleteActivity :
BaseActivity<ActivityLifeAccountPersonalAuthCompleteBinding>() {
companion object {
const val OCCUPATION = "occupation"
const val REAL_NAME = "realName"
const val ID_CARD_NUM = "idCardNum"
const val PHONE_NUM = "phoneNum"
}
/**
* 跳转参数
*/
private val params by lazy { intent.getSerializableExtra(XRouterPathConstants.ParamsKey) as HashMap<*, *> }
override fun createViewBinding(): ActivityLifeAccountPersonalAuthCompleteBinding {
return ActivityLifeAccountPersonalAuthCompleteBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return XRouterPathConstants.LIFE_ACCOUNT_PERSONAL_AUTH_COMPLETE
}
override fun init(savedInstanceState: Bundle?) {
initView()
initListener()
initData()
}
private fun initView() {
viewBind.viewCommonHeader.tvTitle.text =
resources.getString(R.string.personal_auth)
viewBind.viewCommonHeader.ivBack.isVisible = false
}
private fun initData() {
viewBind.occupationLabelValue.text = params[OCCUPATION] as String
viewBind.actualNameValue.text = params[REAL_NAME] as String
viewBind.idNumberValue.text = params[ID_CARD_NUM] as String
viewBind.phoneNumberValue.text = params[PHONE_NUM] as String
}
private fun initListener() {
viewBind.enterLifeAccount.setOnClickListener {
// TODO: 2021/5/27 跳转生活号管理首页
}
viewBind.upgradeEnterpriseAuth.setOnClickListener {
XPageManager.push(XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_AUTH, null)
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.os.Bundle
import android.util.Log
......
package com.yidian.shenghuoquan.newscontent.ui
package com.yidian.shenghuoquan.newscontent.ui.auth
import android.annotation.SuppressLint
import android.os.Bundle
......
......@@ -2,7 +2,6 @@ package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
......@@ -24,7 +23,6 @@ import com.yidian.common.XRouterPathConstants
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.shenghuoquan.newscontent.ui.TempListActivity
import com.yidian.xpage.XPageManager
......@@ -98,8 +96,7 @@ class ProtocolDialog(private val activity: Activity, themeResId: Int, private va
Hawk.put(HawkConfig.ProtocolIsAgree, true)
dismiss()
Handler().postDelayed({
// XPageManager.push(XRouterPathConstants.NEWS_MAIN, paramsMap)
activity.startActivity(Intent(this.activity, TempListActivity::class.java))
XPageManager.push(XRouterPathConstants.NEWS_MAIN, paramsMap)
activity.finish()
}, 1000)
}
......
......@@ -40,6 +40,8 @@ class IDCardTestActivity : BaseActivity<ActivityIdcardBinding>() {
private var idCardBack: Bitmap? = null
private lateinit var idCardFrontObjectKey: String
private lateinit var idCardBackObjectKey: String
private lateinit var idCardFrontBucket: String
private lateinit var idCardBackBucket: String
override fun createViewBinding(): ActivityIdcardBinding {
return ActivityIdcardBinding.inflate(layoutInflater)
......@@ -98,6 +100,9 @@ class IDCardTestActivity : BaseActivity<ActivityIdcardBinding>() {
if (objectKey != null) {
idCardFrontObjectKey = objectKey
}
if (bucket != null) {
idCardFrontBucket = bucket
}
KS3Core.INSTANCE.uploadObject(backFile, object : KS3Core.OnKS3TaskListener {
override fun onTaskStart() {
......@@ -119,9 +124,13 @@ class IDCardTestActivity : BaseActivity<ActivityIdcardBinding>() {
if (objectKey != null) {
idCardBackObjectKey = objectKey
}
if (bucket != null) {
idCardBackBucket = bucket
}
val requestParams = HashMap<String, String?>()
requestParams["posit_image_objectid"] = idCardFrontObjectKey
requestParams["back_image_objectid"] = idCardBackObjectKey
requestParams["bucket"] = idCardFrontBucket
ApiService.getIDCardOCR(object : IGetIDCardOCRCallback {
override fun getIDCardOCRSuccess(result: GetIDCardOCRBean.Response?) {
Log.d(KS3Core.TAG, "name: ${result?.posit?.name}, id num: ${result?.posit?.idcard_number}")
......
......@@ -19,6 +19,10 @@ object FileUtil {
*/
fun generateFileFromUri(context: Context?, uri: Uri?, path: String) {
if (uri != null) {
val file = File(path)
if (file.exists()) file.delete()
file.parentFile?.mkdirs()
file.createNewFile()
context?.contentResolver?.openInputStream(uri)?.copyTo(FileOutputStream(path))
}
}
......
package com.yidian.shenghuoquan.newscontent.utils
/**
* author: yinjiacheng
* date: 6/6/21 2:23 PM
* description: 敏感信息脱敏操作
*/
object SensitiveInfoUtil {
/**
* 身份证号码出生日期脱敏
*/
fun idCardNumEncrypt(content: String): String {
val rule = "(\\d{6})\\d{8}(\\d{4})"
return content.replace(rule.toRegex(), "$1********$2")
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.graphics.Color
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.util.AttributeSet
import android.view.View
import androidx.core.view.isVisible
import com.yidian.nightmode.widget.YdConstraintLayout
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ViewLifeAccountAuthBusinessInfoEditBinding
......@@ -30,6 +32,13 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
)
)
private var callback: OnLifeAccountAuthBusinessInfoEditViewCallback? = null
/**
* 是否输入错误标识位
*/
private var isInputError = false
init {
val typedArray =
context.obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthBusinessInfoEditView)
......@@ -46,18 +55,28 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
* 展示错误提示
*/
fun showErrorTips(tips: String) {
viewBinding.tvErrorTips.visibility = View.VISIBLE
viewBinding.tvErrorTips.isVisible = true
viewBinding.tvErrorTips.text = tips
}
/**
* 隐藏错误提示
*/
private fun dismissErrorTips() {
viewBinding.tvErrorTips.isVisible = false
viewBinding.tvErrorTips.text = ""
}
/**
* 清除输入的文字
*/
fun clearEditContent() {
viewBinding.etContent.setText("")
if (viewBinding.tvErrorTips.visibility == View.VISIBLE) {
viewBinding.tvErrorTips.visibility = View.GONE
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
callback?.onTextClear(this)
}
/**
......@@ -70,6 +89,30 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
}
}
/**
* 禁止修改
*/
fun disableModify() {
viewBinding.ivClear.isVisible = false
isEnabled = false
}
/**
* 高亮显示输入文本
*/
fun highLightEditContent() {
isInputError = true
viewBinding.etContent.setTextColor(Color.parseColor("#FFFF3A3A"))
}
/**
* 取消高亮显示输入文本
*/
private fun cancelHighLightEditContent() {
isInputError = false
viewBinding.etContent.setTextColor(Color.parseColor("#FF333333"))
}
override fun onClick(v: View?) {
if (v?.id == R.id.iv_clear) {
// 清除输入框中的内容
......@@ -87,6 +130,27 @@ class LifeAccountAuthBusinessInfoEditView @JvmOverloads constructor(
override fun afterTextChanged(s: Editable?) {
// 处理一键清除按钮
viewBinding.ivClear.visibility = if (TextUtils.isEmpty(s)) View.GONE else View.VISIBLE
viewBinding.ivClear.isVisible = !TextUtils.isEmpty(s)
callback?.onTextChange(this, s.toString())
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
}
fun setOnLifeAccountAuthBusinessInfoEditViewCallback(callback: OnLifeAccountAuthBusinessInfoEditViewCallback) {
this.callback = callback
}
interface OnLifeAccountAuthBusinessInfoEditViewCallback {
/**
* 清除内容
*/
fun onTextClear(from: LifeAccountAuthBusinessInfoEditView)
/**
* 内容修改
*/
fun onTextChange(from: LifeAccountAuthBusinessInfoEditView, text: String)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.graphics.Color
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
......@@ -30,6 +31,13 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
)
)
private var callback: OnLifeAccountAuthIdentityInfoEditViewCallback? = null
/**
* 是否输入错误标识位
*/
private var isInputError = false
init {
val typedArray =
context.obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthIdentityInfoEditView)
......@@ -42,6 +50,13 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
viewBinding.etContent.addTextChangedListener(this)
}
/**
* 设置标题
*/
fun setTitleContent(content: String) {
viewBinding.tvContent.text = content
}
/**
* 展示错误提示
*/
......@@ -50,14 +65,24 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
viewBinding.tvErrorTips.text = tips
}
/**
* 隐藏错误提示
*/
private fun dismissErrorTips() {
viewBinding.tvErrorTips.visibility = View.GONE
viewBinding.tvErrorTips.text = ""
}
/**
* 清除输入的文字
*/
fun clearEditContent() {
viewBinding.etContent.setText("")
if (viewBinding.tvErrorTips.visibility == View.VISIBLE) {
viewBinding.tvErrorTips.visibility = View.GONE
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
callback?.onTextClear(this)
}
/**
......@@ -70,6 +95,30 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
}
}
/**
* 禁止修改
*/
fun disableModify() {
viewBinding.ivClear.visibility = View.GONE
isEnabled = false
}
/**
* 高亮显示输入文本
*/
fun highLightEditContent() {
isInputError = true
viewBinding.etContent.setTextColor(Color.parseColor("#FFFF3A3A"))
}
/**
* 取消高亮显示输入文本
*/
fun cancelHighLightEditContent() {
isInputError = false
viewBinding.etContent.setTextColor(Color.parseColor("#FF333333"))
}
override fun onClick(v: View?) {
if (v?.id == R.id.iv_clear) {
// 清除输入框中的内容
......@@ -88,5 +137,26 @@ class LifeAccountAuthIdentityInfoEditView @JvmOverloads constructor(
override fun afterTextChanged(s: Editable?) {
// 处理一键清除按钮
viewBinding.ivClear.visibility = if (TextUtils.isEmpty(s)) View.GONE else View.VISIBLE
callback?.onTextChange(this, s.toString())
if (isInputError) {
dismissErrorTips()
cancelHighLightEditContent()
}
}
fun setOnLifeAccountAuthIdentityInfoEditViewCallback(callback: OnLifeAccountAuthIdentityInfoEditViewCallback) {
this.callback = callback
}
interface OnLifeAccountAuthIdentityInfoEditViewCallback {
/**
* 清除内容
*/
fun onTextClear(from: LifeAccountAuthIdentityInfoEditView)
/**
* 内容修改
*/
fun onTextChange(from: LifeAccountAuthIdentityInfoEditView, text: String)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.graphics.Bitmap
import android.util.AttributeSet
import android.view.View
import androidx.core.view.isVisible
import com.yidian.nightmode.widget.YdConstraintLayout
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ViewLifeAccountAuthImageBinding
/**
* author: yinjiacheng
* date: 6/2/21 6:09 PM
* description: 生活号认证 身份证上传
*/
class LifeAccountAuthImageView @JvmOverloads constructor(
context: Context,
val attrs: AttributeSet? = null,
defStyle: Int = 0
) : YdConstraintLayout(context, attrs, defStyle), View.OnClickListener {
private val viewBinding = ViewLifeAccountAuthImageBinding.bind(
View.inflate(
getContext(),
R.layout.view_life_account_auth_image,
this
)
)
private var callback: OnLifeAccountAuthImageViewCallback? = null
init {
val typeArray =
getContext().obtainStyledAttributes(attrs, R.styleable.LifeAccountAuthImageView)
viewBinding.ivPlaceHolder.setImageResource(
typeArray.getResourceId(
R.styleable.LifeAccountAuthImageView_LifeAccountAuthImageView_place_holder_image,
-1
)
)
typeArray.recycle()
viewBinding.ivClear.setOnClickListener(this)
}
/**
* 填充图片
* @param resId 图片资源id
*/
fun addImage(resId: Int) {
viewBinding.ivContent.setImageResource(resId)
isEnabled = false
viewBinding.ivClear.isVisible = true
}
/**
* 填充图片
* @param bitmap 图片bitmap
*/
fun addImage(bitmap: Bitmap?) {
viewBinding.ivContent.setImageBitmap(bitmap)
isEnabled = false
viewBinding.ivClear.isVisible = true
}
/**
* 清除图片
*/
fun clearImage() {
viewBinding.ivContent.setImageDrawable(null)
isEnabled = true
viewBinding.ivClear.isVisible = false
callback?.onImageClear(this)
}
/**
* 禁止修改
*/
fun disableModify() {
viewBinding.ivClear.isVisible = false
isEnabled = false
}
override fun onClick(v: View?) {
if (v?.id == R.id.iv_clear) {
// 清除填充的图片
clearImage()
}
}
fun setOnLifeAccountAuthImageViewCallback(callback: OnLifeAccountAuthImageViewCallback) {
this.callback = callback
}
interface OnLifeAccountAuthImageViewCallback {
/**
* 清除图片
*/
fun onImageClear(from: LifeAccountAuthImageView)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import android.widget.TextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.utils.ToastUtil
/**
* author : lidawei
* date : 2021/6/1
* description :
*/
class NumberCheckView @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet?=null,
defStyle: Int=0
) : LinearLayout(context, attributeSet, defStyle) {
private var onNumberMatch: (() -> Unit)? = null
private var onTextChange: ((Boolean, String) -> Unit)? = null
private var tvStart:TextView
private var etCheck:NumberWithBorderEditText
private var tvEnd:TextView
private var originalNumber = ""
private var start = ""
private var end = ""
init {
LayoutInflater.from(context).inflate(R.layout.layout_number_check,this,true)
tvStart = findViewById(R.id.tv_start)
tvEnd = findViewById(R.id.tv_end)
etCheck = findViewById(R.id.et_check)
etCheck.setOnTextChangeListener {
if (originalNumber.isEmpty()) return@setOnTextChangeListener
val numberC = "$start$it$end"
if (numberC == originalNumber){
onNumberMatch?.invoke()
}
onTextChange?.invoke(numberC == originalNumber,numberC)
}
}
fun setOriginalNumber(number:String){
originalNumber = number
//简单校验
if (originalNumber.length != 11) {
ToastUtil.showToast(context,"手机号异常")
return
}
start = originalNumber.substring(0,3)
end = originalNumber.substring(11-4)
tvStart.text = start
tvEnd.text = end
}
/**
* 号码输入时监听
*/
fun setOnTextChangListener(onTextChange:(/*输入结果是否正确*/Boolean,String)->Unit){
this.onTextChange =onTextChange
}
/**
* 号码完全匹配监听
*/
fun setOnNumberMatchListener(onNumberMatch:()->Unit){
this.onNumberMatch =onNumberMatch
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.RectF
import android.text.InputFilter
import android.text.InputType
import android.text.Spanned
import android.util.AttributeSet
import android.view.Gravity
import androidx.appcompat.widget.AppCompatEditText
import com.yidian.common.utils.YdUiUtils
import com.yidian.shenghuoquan.newscontent.R
import java.util.regex.Pattern
/**
* author : lidawei
* date : 2021/6/1
* description :
*/
@Suppress("DEPRECATION")
class NumberWithBorderEditText @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyle: Int = 0
) : AppCompatEditText(context, attributeSet, defStyle) {
private var onTextChange: ((String) -> Unit)? = null
//输入的数字个数
private val inputCount = 4
//间距
private val gap = YdUiUtils.dip2px(4, context)
private var borderPaint: Paint
private var textPaint: Paint
private val textSizeReal = 16
private var borderStroke =3f
private val selectedBorderColor = context.resources.getColor(R.color.edit_text_border_blue)
private val normalBorderColor = context.resources.getColor(R.color.edit_text_border_gray)
private val textColor = context.resources.getColor(R.color.gray_333)
private val borderWidth = YdUiUtils.dip2px(24, context)
private val borderList by lazy { ArrayList<RectF>() }
private val numberList by lazy { ArrayList<Triple<String,Float,Float>>() }
private var content:String?=null
private var startX = 0f
private var startY = 0f
init {
isLongClickable = false
setTextIsSelectable(false)
isCursorVisible = false
background = null
inputType = InputType.TYPE_CLASS_PHONE or InputType.TYPE_NUMBER_VARIATION_NORMAL
gravity = Gravity.START or Gravity.CENTER_VERTICAL
textSize = textSizeReal.toFloat()
borderPaint = Paint()
borderPaint.isAntiAlias = true
borderPaint.strokeWidth = borderStroke
borderPaint.style = Paint.Style.STROKE
textPaint = Paint()
textPaint.isAntiAlias = true
textPaint.textSize = YdUiUtils.dip2px(textSizeReal,context).toFloat()
textPaint.color = textColor
textPaint.style = Paint.Style.FILL
content = ""
repeat(inputCount) {
borderList.add(RectF())
}
filters = arrayOf(InputFilter.LengthFilter(inputCount),NumberFilter())
}
fun getContentText():String{
return content?:""
}
fun setOnTextChangeListener(onTextChange:(String)->Unit){
this.onTextChange = onTextChange
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
// 强制设置宽度为wrap_content
val heightMode = MeasureSpec.getMode(heightMeasureSpec)
var heightSize = MeasureSpec.getSize(heightMeasureSpec)
val widthReal:Int = (borderWidth * inputCount + (inputCount - 1) + gap +borderStroke * inputCount*2).toInt()
if (heightMode == MeasureSpec.AT_MOST || heightSize < borderWidth) {
heightSize = (borderWidth+borderStroke*2).toInt()
}
calculatePerBorderPosition(heightSize)
setMeasuredDimension(widthReal, heightSize)
}
override fun onTextChanged(
text: CharSequence?,
start: Int,
lengthBefore: Int,
lengthAfter: Int
) {
if (content == null || text==null) return
if (text.length>inputCount){
setText(content)
setSelection(content?.length?:0)
inputType = InputType.TYPE_CLASS_PHONE
return
}
content = text.toString()
numberList.clear()
//计算每个文字的绘制的宽高
calculatePerBorderPosition(height)
calculatePerNumPosition(content?:"")
onTextChange?.invoke(content?:"")
}
private fun calculatePerBorderPosition(height: Int) {
//让输入框在居中位置
startY = ((height - borderWidth) / 2).toFloat()
startX = borderStroke/2
//初始化输入框
borderList.forEach {
it.set(startX, startY, (startX + borderWidth), startY + borderWidth)
startX += borderWidth + gap
}
}
private fun calculatePerNumPosition(content: String) {
var startX = 0f
content.forEach{c ->
val measureText = textPaint.measureText(c.toString())
val textStartX = startX+(borderWidth-measureText)/2
numberList.add(Triple(c.toString(),textStartX,baseline.toFloat()))
startX += borderWidth +gap
}
}
override fun onDraw(canvas: Canvas?) {
borderList.forEachIndexed { index, rectF ->
if (index<content?.length?:0){
borderPaint.color = selectedBorderColor
}else{
borderPaint.color = normalBorderColor
}
canvas?.drawRect(rectF,borderPaint)
}
numberList.forEach {
canvas?.drawText(it.first,it.second,it.third,textPaint)
}
}
class NumberFilter : InputFilter {
override fun filter(
source: CharSequence?,
start: Int,
end: Int,
dest: Spanned?,
dstart: Int,
dend: Int
): CharSequence {
if (source.isNullOrEmpty()) return ""
if (Pattern.matches("[0-9]*",source)) return source
return ""
}
}
}
\ No newline at end of file
......@@ -2,147 +2,152 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:fitsSystemWindows="true"
android:background="@color/white"
android:fitsSystemWindows="true"
android:gravity="center_horizontal"
android:orientation="vertical">
<include layout="@layout/top_bar" />
<include
android:id="@+id/view_common_header"
layout="@layout/layout_common_header"
android:layout_width="match_parent"
android:layout_height="42dp"
android:layout_marginTop="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="38dp"
android:drawableStart="@mipmap/success_icon"
android:drawablePadding="6dp"
android:gravity="center"
android:text="@string/submitted_successfully"
android:drawablePadding="6dp"
android:drawableStart="@mipmap/success_icon"
android:textColor="#FFF26E3D"
android:textSize="24sp" />
<TextView
android:layout_width="240dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:gravity="center"
android:text="@string/mobile_phone_number_notification_information"
android:textSize="16sp"
android:textColor="#FF999999"
android:layout_marginTop="4dp"
android:gravity="center" />
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="25dp"
android:layout_marginTop="25dp"
android:layout_marginEnd="25dp"
android:layout_marginStart="25dp"
android:paddingStart="30dp"
android:paddingBottom="30dp"
android:background="@mipmap/enterprise_certification_bg"
android:orientation="vertical">
android:orientation="vertical"
android:paddingStart="30dp"
android:paddingBottom="30dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="40dp"
android:gravity="center_vertical">
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:gravity="left"
android:text="@string/enterprise_certification"
android:textSize="24sp"
android:textColor="#FF333333"
android:layout_marginRight="10dp"
android:gravity="left" />
android:textSize="24sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pending_review"
android:textSize="14sp"
android:background="@drawable/shape_solid_radius9_da3838"
android:gravity="center"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:paddingTop="2dp"
android:paddingRight="6dp"
android:paddingBottom="2dp"
android:text="@string/pending_review"
android:textColor="#FFF26E3D"
android:background="@drawable/shape_solid_radius9_da3838"
android:gravity="center" />
android:textSize="14sp" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/company_name"
android:textSize="16sp"
android:layout_marginTop="20dp"
android:gravity="left"
android:text="@string/company_name"
android:textColor="#FF999999"
android:gravity="left" />
android:textSize="16sp" />
<TextView
android:id="@+id/company_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="北京一点网聚科技有限公司"
android:layout_marginTop="6dp"
android:textSize="16sp"
android:gravity="left"
android:text="北京一点网聚科技有限公司"
android:textColor="#FF333333"
android:gravity="left" />
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/credit_code"
android:textSize="16sp"
android:layout_marginTop="20dp"
android:gravity="left"
android:text="@string/credit_code"
android:textColor="#FF999999"
android:gravity="left" />
android:textSize="16sp" />
<TextView
android:id="@+id/credit_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WD1212312223331"
android:layout_marginTop="6dp"
android:textSize="16sp"
android:gravity="left"
android:text="WD1212312223331"
android:textColor="#FF333333"
android:gravity="left" />
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/operator_information"
android:textSize="16sp"
android:layout_marginTop="20dp"
android:gravity="left"
android:text="@string/operator_information"
android:textColor="#FF999999"
android:gravity="left" />
android:textSize="16sp" />
<TextView
android:id="@+id/operator_information"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="兰花花 120803********0660"
android:layout_marginTop="6dp"
android:textSize="16sp"
android:gravity="left"
android:text="兰花花 120803********0660"
android:textColor="#FF333333"
android:gravity="left" />
android:textSize="16sp" />
</LinearLayout>
<TextView
android:id="@+id/create_life_number"
android:id="@+id/create_life_account"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/create_a_life_number"
android:textSize="16sp"
android:layout_marginTop="30dp"
android:background="@drawable/shape_stroke2_radius18_skin_primary_1852f1"
android:gravity="center"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="7dp"
android:paddingRight="20dp"
android:paddingBottom="7dp"
android:layout_marginTop="30dp"
android:text="@string/create_a_life_number"
android:textColor="#1852F1"
android:background="@drawable/shape_stroke2_radius18_skin_primary_1852f1"
android:gravity="center" />
android:textSize="16sp" />
</LinearLayout>
\ No newline at end of file
......@@ -13,52 +13,13 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.yidian.nightmode.widget.YdRelativeLayout
android:id="@+id/rl_professional_label"
<com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthSelectView
android:id="@+id/sv_occupation"
android:layout_width="match_parent"
android:layout_height="58dp"
android:paddingStart="19dp"
android:paddingEnd="12dp"
app:layout_constraintTop_toBottomOf="@id/view_common_header">
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:includeFontPadding="false"
android:text="@string/professional_label"
android:textColor="#FF333333"
android:textSize="15sp" />
<com.yidian.nightmode.widget.YdTextView
android:id="@+id/tv_professional_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="23dp"
android:layout_toEndOf="@id/tv_content"
android:hint="@string/describe_yourself"
android:includeFontPadding="false"
android:textColor="#FF333333"
android:textColorHint="#FFC2C2C2"
android:textSize="15sp" />
<com.yidian.nightmode.widget.YdImageView
android:id="@+id/iv_professional_label_choose"
android:layout_width="23dp"
android:layout_height="23dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:src="@mipmap/icon_next" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="#FFF2F2F2" />
</com.yidian.nightmode.widget.YdRelativeLayout>
app:LifeAccountAuthSelectView_content_hint_text="@string/describe_yourself"
app:LifeAccountAuthSelectView_name_text="@string/occupation_label"
app:layout_constraintTop_toBottomOf="@id/view_common_header" />
<com.yidian.nightmode.widget.YdFrameLayout
android:id="@+id/fragment_container"
......@@ -66,7 +27,7 @@
android:layout_height="0dp"
android:layout_marginBottom="19dp"
app:layout_constraintBottom_toTopOf="@id/ll_protocol"
app:layout_constraintTop_toBottomOf="@id/rl_professional_label" />
app:layout_constraintTop_toBottomOf="@id/sv_occupation" />
<com.yidian.nightmode.widget.YdLinearLayout
android:id="@+id/ll_protocol"
......@@ -84,8 +45,9 @@
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_marginEnd="2dp"
android:background="@drawable/selector_protocol_check"
android:button="@null" />
android:button="@drawable/selector_protocol_check"
android:clickable="true"
android:focusable="true" />
<com.yidian.nightmode.widget.YdTextView
android:layout_width="wrap_content"
......@@ -117,6 +79,7 @@
android:layout_width="302dp"
android:layout_height="42dp"
android:layout_marginBottom="33dp"
android:alpha="0.32"
android:background="@drawable/bg_btn_auth"
android:text="@string/auth_finish"
android:textColor="#FFFFFFFF"
......
......@@ -17,22 +17,22 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.yidian.nightmode.widget.YdImageView
<com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthImageView
android:id="@+id/iv_id_card_portrait_face"
android:layout_width="156dp"
android:layout_height="97dp"
android:layout_marginStart="19dp"
android:layout_marginTop="17dp"
android:src="@mipmap/img_id_card_portrait"
app:LifeAccountAuthImageView_place_holder_image="@mipmap/img_id_card_portrait"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_id_card_type" />
<com.yidian.nightmode.widget.YdImageView
<com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthImageView
android:id="@+id/iv_id_card_national_emblem_face"
android:layout_width="156dp"
android:layout_height="97dp"
android:layout_marginEnd="19dp"
android:src="@mipmap/img_id_card_national_emblem"
app:LifeAccountAuthImageView_place_holder_image="@mipmap/img_id_card_national_emblem"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_id_card_portrait_face" />
......@@ -79,6 +79,15 @@
app:LifeAccountAuthIdentityInfoEditView_hint_text="@string/input_id_card_number"
app:layout_constraintTop_toBottomOf="@id/ev_real_name" />
<com.yidian.shenghuoquan.newscontent.widget.LifeAccountAuthIdentityInfoEditView
android:id="@+id/ev_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
app:LifeAccountAuthIdentityInfoEditView_content_text="@string/enterprise_legal_mobile"
app:LifeAccountAuthIdentityInfoEditView_hint_text="@string/input_id_card_number"
app:layout_constraintTop_toBottomOf="@id/ev_id_card_number" />
<com.yidian.nightmode.widget.YdConstraintLayout
android:id="@+id/cl_face_auth"
android:layout_width="match_parent"
......@@ -87,6 +96,7 @@
android:paddingTop="17dp"
android:paddingEnd="12dp"
android:paddingBottom="6dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/ev_id_card_number">
<com.yidian.nightmode.widget.YdTextView
......
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:parentTag="LinearLayout"
android:gravity="center_vertical"
>
<TextView
android:id="@+id/tv_start"
tools:text="182"
android:letterSpacing="0.3"
android:textColor="@color/gray_333"
android:textSize="16sp"
android:layout_marginEnd="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.yidian.shenghuoquan.newscontent.widget.NumberWithBorderEditText
android:id="@+id/et_check"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:layout_marginStart="2dp"
android:id="@+id/tv_end"
tools:text="5678"
android:letterSpacing="0.3"
android:textColor="@color/gray_333"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.yidian.nightmode.widget.YdConstraintLayout 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">
<com.yidian.nightmode.widget.YdImageView
android:id="@+id/iv_place_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.yidian.nightmode.widget.YdImageView
android:id="@+id/iv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.yidian.nightmode.widget.YdImageView
android:id="@+id/iv_clear"
android:layout_width="23dp"
android:layout_height="23dp"
android:layout_marginTop="2dp"
android:layout_marginEnd="2dp"
android:src="@mipmap/icon_clear"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@id/iv_content"
app:layout_constraintTop_toTopOf="@id/iv_content" />
</com.yidian.nightmode.widget.YdConstraintLayout>
\ No newline at end of file
......@@ -16,4 +16,8 @@
<attr name="LifeAccountAuthBusinessInfoEditView_hint_text" format="string" />
</declare-styleable>
<declare-styleable name="LifeAccountAuthImageView">
<attr name="LifeAccountAuthImageView_place_holder_image" format="reference" />
</declare-styleable>
</resources>
\ No newline at end of file
......@@ -39,4 +39,6 @@
<color name="red_account_tips">#FF3A3A</color>
<color name="account_hint">#c2c2c2</color>
<color name="base">#FF1852F1</color>
<color name="edit_text_border_blue">#1852F1</color>
<color name="edit_text_border_gray">#cccccc</color>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools ="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string name="app_name">Yac</string>
<string name="action_settings">Settings</string>
<!-- Strings used for fragments for navigation -->
......@@ -86,17 +86,16 @@
<string name="enterprise_auth">企业认证</string>
<string name="enterprise_auth_condition">开店条件:营业执照、经营者身份证或法人身份证</string>
<string name="enterprise_auth_description">企业店开通适合拥有个体工商户或企业营业执照商户申请,入住成功将享有更优质企业级服务于管理</string>
<string name="professional_label">职业标签</string>
<string name="describe_yourself">一句话描述自己(选填)</string>
<string name="describe_yourself">一句话描述自己</string>
<string name="chinese_id_card">中国大陆居民身份证</string>
<string name="upload_portrait_face">点击上传人像面</string>
<string name="upload_national_emblem_face">点击上传国徽面</string>
<string name="real_name">真实姓名</string>
<string name="input_real_name">请输入真实姓名</string>
<string name="check_id_card_name">请核对证件姓名</string>
<string name="id_card_name_error_tips">请核对证件姓名</string>
<string name="id_card_number">证件号码</string>
<string name="input_id_card_number">请输入18位身份证号码</string>
<string name="check_id_card_number">请核对证件号码</string>
<string name="id_card_number_error_tips">请核对证件号码</string>
<string name="face_auth">人脸验证</string>
<string name="start_face_auth">去验证</string>
<string name="face_auth_success">验证通过</string>
......@@ -122,5 +121,8 @@
<string name="registration_code_description">统一社会信用代码(注册号)将作为生活号唯一企业身份标识,请仔细核对,确认无误。</string>
<string name="next_step">下一步</string>
<string name="cancel">取消</string>
<string name="enterprise_legal_name">法人姓名</string>
<string name="enterprise_legal_mobile">法人手机号</string>
<string name="individual_business_manager_name">经营者姓名</string>
</resources>
\ No newline at end of file
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