Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
YDL-Component-Medical
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
杨凯
YDL-Component-Medical
Commits
aa09a02c
Commit
aa09a02c
authored
Dec 16, 2019
by
严久程
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
动态支付功能
parent
76709a76
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
370 additions
and
70 deletions
+370
-70
DemoGlobalConfig.java
app/src/main/java/com/ydl/component/base/DemoGlobalConfig.java
+3
-3
config.gradle
config.gradle
+1
-1
ThankActivity.java
m-dynamic/src/main/java/com/yidianling/dynamic/thank/ThankActivity.java
+1
-3
ThankHeadView.kt
m-dynamic/src/main/java/com/yidianling/dynamic/thank/view/ThankHeadView.kt
+47
-40
CommonPayDialog.kt
ydl-pay/src/main/java/com/yidianling/ydl_pay/CommonPayDialog.kt
+174
-10
BalanceBean.kt
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/BalanceBean.kt
+11
-0
BalanceParam.java
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/params/BalanceParam.java
+14
-0
ChargePayParam.java
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/params/ChargePayParam.java
+14
-0
HttpUtils.kt
ydl-pay/src/main/java/com/yidianling/ydl_pay/http/HttpUtils.kt
+40
-6
PayServices.kt
ydl-pay/src/main/java/com/yidianling/ydl_pay/http/PayServices.kt
+11
-0
PayInfoDetailView.kt
ydl-pay/src/main/java/com/yidianling/ydl_pay/widget/PayInfoDetailView.kt
+44
-6
view_pay_info_detail.xml
ydl-pay/src/main/res/layout/view_pay_info_detail.xml
+10
-1
No files found.
app/src/main/java/com/ydl/component/base/DemoGlobalConfig.java
View file @
aa09a02c
...
@@ -19,9 +19,9 @@ import java.util.List;
...
@@ -19,9 +19,9 @@ import java.util.List;
*/
*/
public
final
class
DemoGlobalConfig
implements
IConfigModule
{
public
final
class
DemoGlobalConfig
implements
IConfigModule
{
String
APP_DOMAIN
=
"https://api.github.com/"
;
String
APP_DOMAIN
=
"https://api.github.com/"
;
// String appEnv = YDLConstants.ENV_AUTO_TEST;
//
public static
String appEnv = YDLConstants.ENV_AUTO_TEST;
public
static
String
appEnv
=
YDLConstants
.
ENV_PROD
;
//
public static String appEnv = YDLConstants.ENV_PROD;
//
String appEnv = YDLConstants.ENV_TEST;
public
static
String
appEnv
=
YDLConstants
.
ENV_TEST
;
@Override
@Override
public
void
injectAppLifecycle
(
@NotNull
Context
context
,
@NotNull
List
<
IAppLifecycles
>
lifecycles
)
{
public
void
injectAppLifecycle
(
@NotNull
Context
context
,
@NotNull
List
<
IAppLifecycles
>
lifecycles
)
{
...
...
config.gradle
View file @
aa09a02c
ext
{
ext
{
kotlin_version
=
"1.3.21"
kotlin_version
=
"1.3.21"
dev_mode
=
fals
e
dev_mode
=
tru
e
ydl_app
=
[
ydl_app
=
[
appName
:
"心理咨询壹点灵"
,
appName
:
"心理咨询壹点灵"
,
...
...
m-dynamic/src/main/java/com/yidianling/dynamic/thank/ThankActivity.java
View file @
aa09a02c
...
@@ -101,8 +101,6 @@ public class ThankActivity extends BaseActivity implements PtrHandler, LoadMoreH
...
@@ -101,8 +101,6 @@ public class ThankActivity extends BaseActivity implements PtrHandler, LoadMoreH
lv_content
.
setAdapter
(
adapter
);
lv_content
.
setAdapter
(
adapter
);
getData
(
false
);
getData
(
false
);
}
}
...
@@ -146,7 +144,7 @@ public class ThankActivity extends BaseActivity implements PtrHandler, LoadMoreH
...
@@ -146,7 +144,7 @@ public class ThankActivity extends BaseActivity implements PtrHandler, LoadMoreH
}
}
void
getData
(
final
boolean
loadMore
)
{
public
void
getData
(
final
boolean
loadMore
)
{
if
(
loadMore
&&
!
hasMore
)
{
if
(
loadMore
&&
!
hasMore
)
{
load_more_list_view_container
.
loadMoreFinish
(
false
,
false
);
load_more_list_view_container
.
loadMoreFinish
(
false
,
false
);
return
;
return
;
...
...
m-dynamic/src/main/java/com/yidianling/dynamic/thank/view/ThankHeadView.kt
View file @
aa09a02c
package
com.yidianling.dynamic.thank.view
package
com.yidianling.dynamic.thank.view
import
android.app.Activity
import
android.app.Activity
import
android.text.TextUtils
import
android.view.View
import
android.view.View
import
android.widget.LinearLayout
import
android.widget.LinearLayout
import
butterknife.ButterKnife
import
butterknife.OnClick
import
com.ydl.ydl_image.module.GlideApp
import
com.ydl.ydl_image.module.GlideApp
import
com.ydl.ydl_image.transform.GlideCircleTransform
import
com.ydl.ydl_image.transform.GlideCircleTransform
import
com.ydl.ydl_router.manager.YDLRouterManager
import
com.ydl.ydlcommon.base.BaseActivity
import
com.ydl.ydlcommon.base.BaseActivity
import
com.ydl.ydlcommon.data.PlatformDataManager
import
com.ydl.ydlcommon.router.IYDLRouterConstant
import
com.ydl.ydlcommon.view.RoundCornerButton
import
com.ydl.ydlcommon.view.RoundCornerButton
import
com.yidianling.common.tools.LogUtil
import
com.yidianling.common.tools.LogUtil
import
com.yidianling.common.tools.ToastUtil
import
com.yidianling.common.tools.ToastUtil
import
com.yidianling.dynamic.R
import
com.yidianling.dynamic.R
import
com.yidianling.dynamic.R2
import
com.yidianling.dynamic.common.net.DynamicApiUtils
import
com.yidianling.dynamic.common.net.DynamicApiUtils
import
com.yidianling.dynamic.event.ThankReplyUpdateEvent
import
com.yidianling.dynamic.event.ThankReplyUpdateEvent
import
com.yidianling.dynamic.model.Command
import
com.yidianling.dynamic.model.Command
import
com.yidianling.dynamic.router.DynamicIn
import
com.yidianling.dynamic.router.DynamicIn
import
com.yidianling.dynamic.thank.ShowIntroduceDialogFragment
import
com.yidianling.dynamic.thank.ShowIntroduceDialogFragment
import
com.yidianling.dynamic.thank.ThankActivity
import
com.yidianling.dynamic.thank.WorryDetailAnswer
import
com.yidianling.dynamic.thank.WorryDetailAnswer
import
com.yidianling.dynamic.thank.data.ThxData
import
com.yidianling.dynamic.thank.data.ThxData
import
com.yidianling.ydl_pay.CommonPayDialog
import
de.greenrobot.event.EventBus
import
de.greenrobot.event.EventBus
import
io.reactivex.android.schedulers.AndroidSchedulers
import
io.reactivex.android.schedulers.AndroidSchedulers
import
io.reactivex.schedulers.Schedulers
import
io.reactivex.schedulers.Schedulers
...
@@ -62,7 +65,6 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
...
@@ -62,7 +65,6 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
init
{
init
{
View
.
inflate
(
activity
,
R
.
layout
.
ui_thank_head
,
this
)
View
.
inflate
(
activity
,
R
.
layout
.
ui_thank_head
,
this
)
ButterKnife
.
bind
(
this
)
this
.
activity
=
activity
as
BaseActivity
this
.
activity
=
activity
as
BaseActivity
}
}
...
@@ -70,31 +72,36 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
...
@@ -70,31 +72,36 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
this
.
thxData
=
thxData
this
.
thxData
=
thxData
tsv_select
!!
.
setData
(
thxData
.
star_money
)
tsv_select
!!
.
setData
(
thxData
.
star_money
)
LogUtil
.
d
(
"thank userInfo head: "
+
thxData
.
userInfo
.
head
)
LogUtil
.
d
(
"thank userInfo head: "
+
thxData
.
userInfo
.
head
)
GlideApp
.
with
(
context
)
GlideApp
.
with
(
activity
)
.
load
(
thxData
.
userInfo
.
head
)
.
load
(
thxData
.
userInfo
.
head
)
.
transform
(
GlideCircleTransform
(
context
))
.
transform
(
GlideCircleTransform
(
activity
))
.
placeholder
(
R
.
drawable
.
head_place_hold_pic
)
.
placeholder
(
R
.
drawable
.
head_place_hold_pic
)
.
error
(
R
.
drawable
.
head_place_hold_pic
)
.
error
(
R
.
drawable
.
head_place_hold_pic
)
.
into
(
sdv_head
!!
)
.
into
(
sdv_head
!!
)
}
@OnClick
(
R2
.
id
.
rcb_submit
,
R2
.
id
.
rcb_msg_submit
)
rcb_submit
.
setOnClickListener
{
internal
fun
click
(
view
:
View
)
{
if
(
answerId
==
0
)
if
(
answerId
==
0
)
return
return
@setOnClickListener
if
(
thxData
==
null
||
thxData
!!
.
userInfo
==
null
||
thxData
!!
.
userInfo
.
uid
==
null
)
if
(
thxData
==
null
||
thxData
!!
.
userInfo
==
null
||
thxData
!!
.
userInfo
.
uid
==
null
)
return
return
@setOnClickListener
if
(
thxData
!!
.
userInfo
.
uid
==
DynamicIn
.
getUserInfo
()
!!
.
uid
)
{
if
(
thxData
!!
.
userInfo
.
uid
==
DynamicIn
.
getUserInfo
()
!!
.
uid
)
{
ToastUtil
.
toastShort
(
"不能给自己点赞"
)
ToastUtil
.
toastShort
(
"不能给自己点赞"
)
return
return
@setOnClickListener
}
}
if
(
view
.
id
==
R
.
id
.
rcb_submit
)
{
submitWithMoney
()
submitWithMoney
()
}
else
if
(
view
.
id
==
R
.
id
.
rcb_msg_submit
)
{
submitWithoutMoney
()
}
}
}
}
// @OnClick(R2.id.rcb_submit, R2.id.rcb_msg_submit)
// internal fun click(view: View) {
//
// if (view.id == R.id.rcb_submit) {
// submitWithMoney()
// } else if (view.id == R.id.rcb_msg_submit) {
// submitWithoutMoney()
// }
// }
internal
fun
submitWithMoney
()
{
internal
fun
submitWithMoney
()
{
var
starNum
=
0
var
starNum
=
0
if
(
selectId
==
-
1
)
{
if
(
selectId
==
-
1
)
{
...
@@ -121,7 +128,7 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
...
@@ -121,7 +128,7 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
// payParams.setNeedPay(sendThxWithMoney.money)
// payParams.setNeedPay(sendThxWithMoney.money)
// YdlCommonOut.startPayActivity(context as Activity, payParams, 0)
// YdlCommonOut.startPayActivity(context as Activity, payParams, 0)
toPay
(
sendThxWithMoney
.
payId
,
sendThxWithMoney
.
money
)
toPay
(
sendThxWithMoney
.
payId
,
sendThxWithMoney
.
money
)
}
else
{
}
else
{
ToastUtil
.
toastShort
(
resp
.
msg
)
ToastUtil
.
toastShort
(
resp
.
msg
)
}
}
...
@@ -177,31 +184,31 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
...
@@ -177,31 +184,31 @@ class ThankHeadView(activity: Activity) : LinearLayout(activity) {
fun
toPay
(
payId
:
String
,
money
:
Float
)
{
fun
toPay
(
payId
:
String
,
money
:
Float
)
{
// TODO: 2019-12-13 支付逻辑待补充 by:HaoRui
val
userInfo
=
DynamicIn
.
getUserInfo
()
//
if
(
userInfo
==
null
||
TextUtils
.
isEmpty
(
userInfo
.
uid
))
{
// val userInfo = YdlCommonRouterManager.getYdlCommonRoute().getUserInfo()
YDLRouterManager
.
router
(
IYDLRouterConstant
.
ROUTER_MINE_LOGIN
)
// if (userInfo == null || TextUtils.isEmpty(userInfo.userId)) {
return
// YDLRouterManager.router(IYDLRouterConstant.ROUTER_MINE_LOGIN)
}
// return
// }
//
// val build = CommonPayDialog.Build(activity)
// .setCourseId(course_id.toString())
// .setToken(userInfo.token)
// .setUid(userInfo.userId)
// .setFfrom(PlatformDataManager.getRam().getChannelName())
// .setListener(object : CommonPayDialog.OnPayResultListener {
// override fun onSuccesed() {
// //刷新界面
// initData()
// }
//
// override fun onFailed() {
//
//
// }
val
build
=
CommonPayDialog
.
Build
(
activity
)
// })
.
setPayId
(
payId
)
// .setIsTestEnvironment(BuildConfig.DEBUG)
.
setPayMoney
(
money
)
// build.build().show()
.
setToken
(
userInfo
.
accessToken
!!
)
.
setUid
(
userInfo
.
uid
)
.
setFfrom
(
PlatformDataManager
.
getRam
().
getChannelName
())
.
setListener
(
object
:
CommonPayDialog
.
OnPayResultListener
{
override
fun
onSuccesed
()
{
//刷新界面
(
activity
as
ThankActivity
).
getData
(
false
)
}
override
fun
onFailed
()
{
}
})
.
setIsTestEnvironment
(
false
)
build
.
build
().
show
()
}
}
}
}
ydl-pay/src/main/java/com/yidianling/ydl_pay/CommonPayDialog.kt
View file @
aa09a02c
...
@@ -14,14 +14,15 @@ import android.widget.LinearLayout
...
@@ -14,14 +14,15 @@ import android.widget.LinearLayout
import
com.alipay.sdk.app.PayTask
import
com.alipay.sdk.app.PayTask
import
com.tencent.mm.opensdk.modelpay.PayReq
import
com.tencent.mm.opensdk.modelpay.PayReq
import
com.tencent.mm.opensdk.openapi.WXAPIFactory
import
com.tencent.mm.opensdk.openapi.WXAPIFactory
import
com.yidianling.ydl_pay.http.HttpUtils
import
com.yidianling.common.tools.RxImageTool
import
com.yidianling.ydl_pay.toast.ToastHelper
import
com.yidianling.ydl_pay.widget.PayCouponView
import
com.yidianling.ydl_pay.widget.PayInfoDetailView
import
com.yidianling.ydl_pay.bean.*
import
com.yidianling.ydl_pay.bean.*
import
com.yidianling.ydl_pay.bean.params.*
import
com.yidianling.ydl_pay.bean.params.*
import
com.yidianling.ydl_pay.http.HttpUtils
import
com.yidianling.ydl_pay.http.utils.NetUtils
import
com.yidianling.ydl_pay.http.utils.NetUtils
import
com.yidianling.ydl_pay.http.utils.RxDeviceTool
import
com.yidianling.ydl_pay.http.utils.RxDeviceTool
import
com.yidianling.ydl_pay.toast.ToastHelper
import
com.yidianling.ydl_pay.widget.PayCouponView
import
com.yidianling.ydl_pay.widget.PayInfoDetailView
import
de.greenrobot.event.EventBus
import
de.greenrobot.event.EventBus
import
io.reactivex.android.schedulers.AndroidSchedulers
import
io.reactivex.android.schedulers.AndroidSchedulers
import
io.reactivex.schedulers.Schedulers
import
io.reactivex.schedulers.Schedulers
...
@@ -45,6 +46,8 @@ class CommonPayDialog : Dialog {
...
@@ -45,6 +46,8 @@ class CommonPayDialog : Dialog {
private
var
payCouponView
:
PayCouponView
?
=
null
private
var
payCouponView
:
PayCouponView
?
=
null
private
var
detailView
:
PayInfoDetailView
?
=
null
private
var
detailView
:
PayInfoDetailView
?
=
null
private
var
listener
:
OnPayResultListener
?
=
null
private
var
listener
:
OnPayResultListener
?
=
null
private
var
payMoney
:
Float
?
=
null
private
var
thankPayId
:
String
?
=
null
//加载中弹窗
//加载中弹窗
private
var
dialog
:
AlertDialog
?
=
null
private
var
dialog
:
AlertDialog
?
=
null
private
var
dialogContentView
:
View
?
=
null
private
var
dialogContentView
:
View
?
=
null
...
@@ -59,6 +62,7 @@ class CommonPayDialog : Dialog {
...
@@ -59,6 +62,7 @@ class CommonPayDialog : Dialog {
* [TYPE_CONFIDE] 倾诉支付
* [TYPE_CONFIDE] 倾诉支付
* [TYPE_TEST] 测评支付
* [TYPE_TEST] 测评支付
* [TYPE_CONSULTANT] 咨询支付
* [TYPE_CONSULTANT] 咨询支付
* [TYPE_TRENDS_THANKS] 动态打赏
*/
*/
private
var
payBusinessType
=
0
private
var
payBusinessType
=
0
...
@@ -79,6 +83,10 @@ class CommonPayDialog : Dialog {
...
@@ -79,6 +83,10 @@ class CommonPayDialog : Dialog {
* 咨询
* 咨询
*/
*/
const
val
TYPE_CONSULTANT
=
4
const
val
TYPE_CONSULTANT
=
4
/**
* 动态打赏
*/
const
val
TYPE_TRENDS_THANKS
=
5
/**
/**
* 支付方式
* 支付方式
...
@@ -95,6 +103,8 @@ class CommonPayDialog : Dialog {
...
@@ -95,6 +103,8 @@ class CommonPayDialog : Dialog {
this
.
activity
=
build
.
mActivity
this
.
activity
=
build
.
mActivity
this
.
listener
=
build
.
listener
this
.
listener
=
build
.
listener
this
.
payBusinessType
=
build
.
payType
this
.
payBusinessType
=
build
.
payType
this
.
payMoney
=
build
.
payMoney
this
.
thankPayId
=
build
.
payId
}
}
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
...
@@ -108,9 +118,70 @@ class CommonPayDialog : Dialog {
...
@@ -108,9 +118,70 @@ class CommonPayDialog : Dialog {
EventBus
.
getDefault
().
register
(
this
)
EventBus
.
getDefault
().
register
(
this
)
if
(
payBusinessType
==
TYPE_TRENDS_THANKS
)
{
var
parmas
=
view_pager
.
layoutParams
parmas
.
width
=
ViewGroup
.
LayoutParams
.
MATCH_PARENT
parmas
.
height
=
RxImageTool
.
dp2px
(
371f
)
view_pager
.
layoutParams
=
parmas
getMyBalance
()
}
else
{
getOrderInfo
()
getOrderInfo
()
}
}
}
private
fun
initThanksPayInfoDetailView
(
bean
:
OrderInfoBean
)
{
view_pager
.
setScanScroll
(
false
)
detailView
=
PayInfoDetailView
(
activity
,
object
:
PayInfoDetailView
.
OnCouponDetailClickListener
{
override
fun
selectCoupon
(
couponId
:
String
)
{
}
override
fun
ensurePay
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
{
//感谢的时候比较暴力:payid是外部传过来的、余额一定会被扣掉
if
(
payBusinessType
==
TYPE_TRENDS_THANKS
)
{
showProgressDialog
()
if
(
payMoney
>
0
)
{
when
(
payWay
)
{
PAY_WECHAT
->
{
getWeiXinPayOrderId
(
thankPayId
!!
,
if
(
useMoneyType
==
2
)
1
else
0
)
}
else
->
{
getAliPayOrderId
(
thankPayId
!!
,
if
(
useMoneyType
==
2
)
1
else
0
)
}
}
}
else
{
//余额支付
payByCharge
()
}
}
}
})
if
(
bean
.
maxCoupon
!=
null
)
{
//最优的优惠券id为0时,把最优优惠券对象置为null,因为正常的可用的优惠券id一定不为0,这里接口为了前端页面展示,返回的maxCoupon对象不为null,
//但maxCoupon的属性均为null或初始值
if
(
TextUtils
.
equals
(
bean
.
maxCoupon
.
id
,
"0"
))
{
bean
.
maxCoupon
=
null
}
}
detailView
!!
.
setData
(
bean
,
payBusinessType
)
viewList
.
add
(
detailView
!!
)
view_pager
.
adapter
=
ViewPagerAdapter
()
view_pager
.
currentItem
=
0
}
override
fun
show
()
{
override
fun
show
()
{
super
.
show
()
super
.
show
()
...
@@ -158,9 +229,40 @@ class CommonPayDialog : Dialog {
...
@@ -158,9 +229,40 @@ class CommonPayDialog : Dialog {
})
})
}
}
@SuppressLint
(
"CheckResult"
)
private
fun
getMyBalance
()
{
HttpUtils
.
getMyBalance
(
BalanceParam
())
.
subscribeOn
(
Schedulers
.
io
())
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
({
dismissProgressDialog
()
if
(
it
.
status
==
200
)
{
if
(
it
.
data
!=
null
)
{
progress_layout
.
visibility
=
View
.
GONE
view_pager
.
visibility
=
View
.
VISIBLE
val
bean
=
OrderInfoBean
()
bean
.
availableMoney
=
it
.
data
.
balance
bean
.
applyFee
=
payMoney
!!
bean
.
isShowCoupon
=
false
initThanksPayInfoDetailView
(
bean
)
}
else
{
ToastHelper
.
show
(
activity
,
it
.
msg
)
}
}
else
{
ToastHelper
.
show
(
activity
,
it
.
msg
)
}
},
{
dismissProgressDialog
()
ToastHelper
.
show
(
activity
,
it
.
message
!!
)
})
}
private
fun
updateDataOnView
(
bean
:
OrderInfoBean
)
{
private
fun
updateDataOnView
(
bean
:
OrderInfoBean
)
{
view_pager
.
setScanScroll
(
false
)
view_pager
.
setScanScroll
(
false
)
detailView
=
PayInfoDetailView
(
activity
,
object
:
PayInfoDetailView
.
OnCouponDetailClickListener
{
detailView
=
PayInfoDetailView
(
activity
,
object
:
PayInfoDetailView
.
OnCouponDetailClickListener
{
override
fun
selectCoupon
(
couponId
:
String
)
{
override
fun
selectCoupon
(
couponId
:
String
)
{
if
(
couponListBean
!=
null
)
{
if
(
couponListBean
!=
null
)
{
view_pager
.
currentItem
=
1
view_pager
.
currentItem
=
1
...
@@ -169,7 +271,13 @@ class CommonPayDialog : Dialog {
...
@@ -169,7 +271,13 @@ class CommonPayDialog : Dialog {
}
}
}
}
override
fun
ensurePay
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
{
override
fun
ensurePay
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
{
createOrder
(
payWay
,
payMoney
,
useMoneyType
,
code
,
couponType
)
createOrder
(
payWay
,
payMoney
,
useMoneyType
,
code
,
couponType
)
}
}
})
})
...
@@ -255,7 +363,12 @@ class CommonPayDialog : Dialog {
...
@@ -255,7 +363,12 @@ class CommonPayDialog : Dialog {
*/
*/
private
fun
updateSelectCouponView
()
{
private
fun
updateSelectCouponView
()
{
detailView
!!
.
setAvailableCount
(
couponListBean
!!
.
availableCount
)
detailView
!!
.
setAvailableCount
(
couponListBean
!!
.
availableCount
)
payCouponView
!!
.
setData
(
couponListBean
!!
,
payBusinessType
==
TYPE_COURSE
,
selectedCouponBean
,
goodsId
!!
)
payCouponView
!!
.
setData
(
couponListBean
!!
,
payBusinessType
==
TYPE_COURSE
,
selectedCouponBean
,
goodsId
!!
)
view_pager
.
currentItem
=
1
view_pager
.
currentItem
=
1
}
}
...
@@ -268,7 +381,13 @@ class CommonPayDialog : Dialog {
...
@@ -268,7 +381,13 @@ class CommonPayDialog : Dialog {
*
*
*/
*/
@SuppressLint
(
"CheckResult"
)
@SuppressLint
(
"CheckResult"
)
private
fun
createOrder
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
{
private
fun
createOrder
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
{
if
(!
NetUtils
.
isConnected
(
activity
))
{
if
(!
NetUtils
.
isConnected
(
activity
))
{
ToastHelper
.
show
(
activity
,
activity
.
getString
(
R
.
string
.
net_error
))
ToastHelper
.
show
(
activity
,
activity
.
getString
(
R
.
string
.
net_error
))
return
return
...
@@ -307,7 +426,10 @@ class CommonPayDialog : Dialog {
...
@@ -307,7 +426,10 @@ class CommonPayDialog : Dialog {
}
else
{
}
else
{
when
(
payWay
)
{
when
(
payWay
)
{
PAY_WECHAT
->
{
PAY_WECHAT
->
{
getWeiXinPayOrderId
(
it
.
data
.
payId
,
if
(
useMoneyType
==
2
)
1
else
0
)
getWeiXinPayOrderId
(
it
.
data
.
payId
,
if
(
useMoneyType
==
2
)
1
else
0
)
}
}
else
->
{
else
->
{
getAliPayOrderId
(
it
.
data
.
payId
,
if
(
useMoneyType
==
2
)
1
else
0
)
getAliPayOrderId
(
it
.
data
.
payId
,
if
(
useMoneyType
==
2
)
1
else
0
)
...
@@ -429,6 +551,33 @@ class CommonPayDialog : Dialog {
...
@@ -429,6 +551,33 @@ class CommonPayDialog : Dialog {
api
.
sendReq
(
request
)
api
.
sendReq
(
request
)
}
}
@SuppressLint
(
"CheckResult"
)
private
fun
payByCharge
()
{
var
bean
=
ChargePayParam
()
bean
.
payId
=
thankPayId
HttpUtils
.
payByCharge
(
bean
)
.
subscribeOn
(
Schedulers
.
io
())
.
subscribe
({
dismissProgressDialog
()
if
(
it
.
data
!=
null
&&
it
.
code
==
0
)
{
activity
.
runOnUiThread
{
listener
!!
.
onSuccesed
()
dismiss
()
}
}
else
{
activity
.
runOnUiThread
{
ToastHelper
.
show
(
activity
,
it
.
msg
)
}
}
},
{
activity
.
runOnUiThread
{
ToastHelper
.
show
(
activity
,
it
.
localizedMessage
)
}
dismissProgressDialog
()
})
}
fun
onEvent
(
event
:
WeiXinPayStatusEvent
)
{
fun
onEvent
(
event
:
WeiXinPayStatusEvent
)
{
dismissProgressDialog
()
dismissProgressDialog
()
if
(
event
.
success
)
{
if
(
event
.
success
)
{
...
@@ -456,7 +605,8 @@ class CommonPayDialog : Dialog {
...
@@ -456,7 +605,8 @@ class CommonPayDialog : Dialog {
.
create
()
.
create
()
}
}
if
(
dialogContentView
==
null
)
{
if
(
dialogContentView
==
null
)
{
dialogContentView
=
LayoutInflater
.
from
(
activity
).
inflate
(
R
.
layout
.
pay_loading_dialog
,
null
)
dialogContentView
=
LayoutInflater
.
from
(
activity
).
inflate
(
R
.
layout
.
pay_loading_dialog
,
null
)
}
}
dialog
?.
show
()
dialog
?.
show
()
dialog
?.
window
?.
setContentView
(
dialogContentView
)
dialog
?.
window
?.
setContentView
(
dialogContentView
)
...
@@ -510,6 +660,8 @@ class CommonPayDialog : Dialog {
...
@@ -510,6 +660,8 @@ class CommonPayDialog : Dialog {
*/
*/
class
Build
(
internal
var
mActivity
:
Activity
)
{
class
Build
(
internal
var
mActivity
:
Activity
)
{
internal
var
goodsId
:
String
?
=
null
internal
var
goodsId
:
String
?
=
null
internal
var
payId
:
String
?
=
null
internal
var
payMoney
:
Float
?
=
null
private
lateinit
var
uid
:
String
private
lateinit
var
uid
:
String
private
lateinit
var
token
:
String
private
lateinit
var
token
:
String
private
lateinit
var
ffrom
:
String
private
lateinit
var
ffrom
:
String
...
@@ -529,6 +681,18 @@ class CommonPayDialog : Dialog {
...
@@ -529,6 +681,18 @@ class CommonPayDialog : Dialog {
return
this
@Build
return
this
@Build
}
}
fun
setPayId
(
payId
:
String
):
Build
{
this
.
payId
=
payId
payType
=
TYPE_TRENDS_THANKS
return
this
@Build
}
fun
setPayMoney
(
money
:
Float
):
Build
{
this
.
payMoney
=
money
return
this
@Build
}
/**
/**
* 商品id(调用此方法请务必再调用[setBusinessType]方法)
* 商品id(调用此方法请务必再调用[setBusinessType]方法)
*/
*/
...
...
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/BalanceBean.kt
0 → 100644
View file @
aa09a02c
package
com.yidianling.ydl_pay.bean
/**
* @author jiucheng
* @描述:
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/12/16
*/
class
BalanceBean
(
val
balance
:
Float
)
\ No newline at end of file
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/params/BalanceParam.java
0 → 100644
View file @
aa09a02c
package
com
.
yidianling
.
ydl_pay
.
bean
.
params
;
import
com.ydl.ydlcommon.data.http.BaseCommand
;
/**
* @author jiucheng
* @描述:
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/12/16
*/
public
class
BalanceParam
extends
BaseCommand
{
public
int
balance
=
1
;
}
ydl-pay/src/main/java/com/yidianling/ydl_pay/bean/params/ChargePayParam.java
0 → 100644
View file @
aa09a02c
package
com
.
yidianling
.
ydl_pay
.
bean
.
params
;
import
com.ydl.ydlcommon.data.http.BaseCommand
;
/**
* @author jiucheng
* @描述:
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/12/16
*/
public
class
ChargePayParam
extends
BaseCommand
{
public
String
payId
;
}
ydl-pay/src/main/java/com/yidianling/ydl_pay/http/HttpUtils.kt
View file @
aa09a02c
package
com.yidianling.ydl_pay.http
package
com.yidianling.ydl_pay.http
import
com.google.gson.Gson
import
com.google.gson.Gson
import
com.yidianling.ydl_pay.actionpoint.ActionDataBean
import
com.ydl.ydlcommon.data.http.BaseCommand
import
com.ydl.ydlcommon.data.http.BaseCommand
import
com.ydl.ydlcommon.data.http.BaseResponse
import
com.ydl.ydlcommon.data.http.BaseResponse
import
com.ydl.ydlcommon.utils.NetworkParamsUtils
import
com.ydl.ydlcommon.utils.NetworkParamsUtils
import
com.ydl.ydlnet.YDLHttpUtils
import
com.ydl.ydlnet.YDLHttpUtils
import
com.yidianling.ydl_pay.actionpoint.ActionDataBean
import
com.yidianling.ydl_pay.bean.*
import
com.yidianling.ydl_pay.bean.*
import
com.yidianling.ydl_pay.bean.params.CheckRequestCouponBean
import
com.yidianling.ydl_pay.bean.params.CheckRequestCouponBean
import
com.yidianling.ydl_pay.bean.params.CreateOrderRequestBean
import
com.yidianling.ydl_pay.bean.params.CreateOrderRequestBean
...
@@ -29,7 +29,10 @@ class HttpUtils {
...
@@ -29,7 +29,10 @@ class HttpUtils {
*/
*/
fun
getOrderInfo
(
bean
:
OrderRequestBean
):
Observable
<
BaseResponse
<
OrderInfoBean
>>
{
fun
getOrderInfo
(
bean
:
OrderRequestBean
):
Observable
<
BaseResponse
<
OrderInfoBean
>>
{
var
str
=
Gson
().
toJson
(
bean
)
var
str
=
Gson
().
toJson
(
bean
)
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
getOrderInfo
(
body
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
getOrderInfo
(
body
)
}
}
...
@@ -38,7 +41,10 @@ class HttpUtils {
...
@@ -38,7 +41,10 @@ class HttpUtils {
*/
*/
fun
checkCourseCoupon
(
bean
:
CheckRequestCouponBean
):
Observable
<
BaseResponse
<
CouponCodeInfoBean
>>
{
fun
checkCourseCoupon
(
bean
:
CheckRequestCouponBean
):
Observable
<
BaseResponse
<
CouponCodeInfoBean
>>
{
var
str
=
Gson
().
toJson
(
bean
)
var
str
=
Gson
().
toJson
(
bean
)
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
checkCourseCoupon
(
body
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
checkCourseCoupon
(
body
)
}
}
...
@@ -48,7 +54,10 @@ class HttpUtils {
...
@@ -48,7 +54,10 @@ class HttpUtils {
*/
*/
fun
selectCoupon
(
bean
:
GetAllCouponRequestBean
):
Observable
<
BaseResponse
<
AllCouponListBean
>>
{
fun
selectCoupon
(
bean
:
GetAllCouponRequestBean
):
Observable
<
BaseResponse
<
AllCouponListBean
>>
{
var
str
=
Gson
().
toJson
(
bean
)
var
str
=
Gson
().
toJson
(
bean
)
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
selectCoupon
(
body
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
selectCoupon
(
body
)
}
}
...
@@ -58,7 +67,10 @@ class HttpUtils {
...
@@ -58,7 +67,10 @@ class HttpUtils {
*/
*/
fun
createOrder
(
bean
:
CreateOrderRequestBean
):
Observable
<
BaseResponse
<
PayOrderBean
>>
{
fun
createOrder
(
bean
:
CreateOrderRequestBean
):
Observable
<
BaseResponse
<
PayOrderBean
>>
{
var
str
=
Gson
().
toJson
(
bean
)
var
str
=
Gson
().
toJson
(
bean
)
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
str
)
as
RequestBody
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
createOrder
(
body
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
createOrder
(
body
)
}
}
...
@@ -83,10 +95,32 @@ class HttpUtils {
...
@@ -83,10 +95,32 @@ class HttpUtils {
/**
/**
* 余额的接口
*/
fun
getMyBalance
(
bean
:
BaseCommand
):
Observable
<
BaseResponse
<
BalanceBean
>>
{
var
params
=
NetworkParamsUtils
.
getPostList
(
bean
)
var
map
=
NetworkParamsUtils
.
getMaps
(
params
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
getMyBalance
(
map
)
}
/**
* 余额支付
*/
fun
payByCharge
(
bean
:
BaseCommand
):
Observable
<
BaseResponse
<
Any
>>
{
var
params
=
NetworkParamsUtils
.
getPostList
(
bean
)
var
map
=
NetworkParamsUtils
.
getMaps
(
params
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
pay
(
map
)
}
/**
* 行为数据埋点统计接口
* 行为数据埋点统计接口
*/
*/
internal
fun
actionDataCount
(
actionDataParams
:
ActionDataBean
):
Observable
<
BaseResponse
<
String
>>
{
internal
fun
actionDataCount
(
actionDataParams
:
ActionDataBean
):
Observable
<
BaseResponse
<
String
>>
{
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
Gson
().
toJson
(
actionDataParams
))
val
body
=
RequestBody
.
create
(
MediaType
.
parse
(
"application/json; charset=utf-8"
),
Gson
().
toJson
(
actionDataParams
)
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
actionDataCount
(
body
)
return
YDLHttpUtils
.
obtainApi
(
PayServices
::
class
.
java
).
actionDataCount
(
body
)
}
}
}
}
...
...
ydl-pay/src/main/java/com/yidianling/ydl_pay/http/PayServices.kt
View file @
aa09a02c
...
@@ -65,4 +65,14 @@ interface PayServices {
...
@@ -65,4 +65,14 @@ interface PayServices {
//行为动作埋点统计接口
//行为动作埋点统计接口
@POST
(
"maidian/writeMaiDianData"
)
@POST
(
"maidian/writeMaiDianData"
)
fun
actionDataCount
(
@Body
body
:
RequestBody
):
Observable
<
BaseResponse
<
String
>>
fun
actionDataCount
(
@Body
body
:
RequestBody
):
Observable
<
BaseResponse
<
String
>>
//余额的接口
@FormUrlEncoded
@POST
(
"uc/mybalance"
)
fun
getMyBalance
(
@FieldMap
params
:
Map
<
String
,
String
>):
Observable
<
BaseResponse
<
BalanceBean
>>
//余额支付
@FormUrlEncoded
@POST
(
"pay/vcount-pay"
)
fun
pay
(
@FieldMap
params
:
Map
<
String
,
String
>):
Observable
<
BaseResponse
<
Any
>>
}
}
\ No newline at end of file
ydl-pay/src/main/java/com/yidianling/ydl_pay/widget/PayInfoDetailView.kt
View file @
aa09a02c
...
@@ -20,7 +20,8 @@ import java.math.BigDecimal
...
@@ -20,7 +20,8 @@ import java.math.BigDecimal
* @date 2019/4/4
* @date 2019/4/4
*/
*/
@SuppressLint
(
"ViewConstructor"
)
@SuppressLint
(
"ViewConstructor"
)
class
PayInfoDetailView
(
context
:
Context
,
var
listener
:
OnCouponDetailClickListener
)
:
LinearLayout
(
context
)
{
class
PayInfoDetailView
(
context
:
Context
,
var
listener
:
OnCouponDetailClickListener
)
:
LinearLayout
(
context
)
{
private
var
orderInfoBean
:
OrderInfoBean
?
=
null
private
var
orderInfoBean
:
OrderInfoBean
?
=
null
/**
/**
* 是否使用余额
* 是否使用余额
...
@@ -76,7 +77,10 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -76,7 +77,10 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
private
fun
initView
()
{
private
fun
initView
()
{
orientation
=
VERTICAL
orientation
=
VERTICAL
val
params
=
LinearLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
)
val
params
=
LinearLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
)
layoutParams
=
params
layoutParams
=
params
View
.
inflate
(
context
,
R
.
layout
.
view_pay_info_detail
,
this
)
View
.
inflate
(
context
,
R
.
layout
.
view_pay_info_detail
,
this
)
...
@@ -123,7 +127,13 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -123,7 +127,13 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
MONEY_TYPE_CHANGE
MONEY_TYPE_CHANGE
}
}
if
(
orderInfoBean
!!
.
maxCoupon
!=
null
)
{
if
(
orderInfoBean
!!
.
maxCoupon
!=
null
)
{
listener
.
ensurePay
(
payWay
,
sdkPayMoney
,
useMoneyType
,
orderInfoBean
!!
.
maxCoupon
.
code
,
orderInfoBean
!!
.
maxCoupon
.
couponType
)
listener
.
ensurePay
(
payWay
,
sdkPayMoney
,
useMoneyType
,
orderInfoBean
!!
.
maxCoupon
.
code
,
orderInfoBean
!!
.
maxCoupon
.
couponType
)
}
else
{
}
else
{
listener
.
ensurePay
(
payWay
,
sdkPayMoney
,
useMoneyType
,
""
,
""
)
listener
.
ensurePay
(
payWay
,
sdkPayMoney
,
useMoneyType
,
""
,
""
)
}
}
...
@@ -154,6 +164,16 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -154,6 +164,16 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
tv_pay_title
.
text
=
"咨询服务"
tv_pay_title
.
text
=
"咨询服务"
}
}
if
(
payBusinessType
==
5
)
{
tv_pay_title
.
text
=
"送感谢"
tv_change_money
.
isEnabled
=
false
if
(
orderInfoBean
.
availableMoney
>=
orderInfoBean
.
applyFee
)
{
rl_third_pay
.
visibility
=
View
.
INVISIBLE
rl_third_pay
.
isEnabled
=
false
}
}
//价格
//价格
tv_price
.
text
=
orderInfoBean
.
applyFee
.
toString
()
tv_price
.
text
=
orderInfoBean
.
applyFee
.
toString
()
...
@@ -217,6 +237,7 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -217,6 +237,7 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
ll_third_pay
.
isEnabled
=
true
ll_third_pay
.
isEnabled
=
true
}
}
if
(
isUseChange
)
{
//使用余额
if
(
isUseChange
)
{
//使用余额
if
(
orderInfoBean
!!
.
availableMoney
>=
needPay
)
{
if
(
orderInfoBean
!!
.
availableMoney
>=
needPay
)
{
tv_change_money
.
text
=
needPay
.
toString
()
tv_change_money
.
text
=
needPay
.
toString
()
...
@@ -275,9 +296,19 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -275,9 +296,19 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
*/
*/
private
fun
setChooseChangeMoney
(
isUse
:
Boolean
)
{
private
fun
setChooseChangeMoney
(
isUse
:
Boolean
)
{
if
(
isUse
)
{
if
(
isUse
)
{
tv_change_money
.
setCompoundDrawablesWithIntrinsicBounds
(
0
,
0
,
R
.
drawable
.
pay_img_select
,
0
)
tv_change_money
.
setCompoundDrawablesWithIntrinsicBounds
(
0
,
0
,
R
.
drawable
.
pay_img_select
,
0
)
}
else
{
}
else
{
tv_change_money
.
setCompoundDrawablesWithIntrinsicBounds
(
0
,
0
,
R
.
drawable
.
pay_img_no_select
,
0
)
tv_change_money
.
setCompoundDrawablesWithIntrinsicBounds
(
0
,
0
,
R
.
drawable
.
pay_img_no_select
,
0
)
}
}
}
}
...
@@ -297,6 +328,12 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
...
@@ -297,6 +328,12 @@ class PayInfoDetailView(context: Context, var listener: OnCouponDetailClickListe
* @param couponType 券类型 1兑换券 2新优惠券
* @param couponType 券类型 1兑换券 2新优惠券
*
*
*/
*/
fun
ensurePay
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
fun
ensurePay
(
payWay
:
Int
,
payMoney
:
Float
,
useMoneyType
:
Int
,
code
:
String
,
couponType
:
String
)
}
}
}
}
\ No newline at end of file
ydl-pay/src/main/res/layout/view_pay_info_detail.xml
View file @
aa09a02c
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android=
"http://schemas.android.com/apk/res/android"
<merge
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:tools=
"http://schemas.android.com/tools"
android:background=
"@color/pay_color_FFFFFF"
>
android:background=
"@color/pay_color_FFFFFF"
android:orientation=
"vertical"
tools:parentTag=
"android.widget.LinearLayout"
>
<RelativeLayout
<RelativeLayout
...
@@ -197,6 +199,11 @@
...
@@ -197,6 +199,11 @@
</RelativeLayout>
</RelativeLayout>
<RelativeLayout
android:id=
"@+id/rl_third_pay"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<LinearLayout
<LinearLayout
android:id=
"@+id/ll_third_pay"
android:id=
"@+id/ll_third_pay"
...
@@ -297,6 +304,8 @@
...
@@ -297,6 +304,8 @@
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<View
<View
android:id=
"@+id/view_empty"
android:id=
"@+id/view_empty"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment