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
ce04dd07
Commit
ce04dd07
authored
Jul 25, 2022
by
YKai
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/release' into feature/yk_release
parents
3c986b80
0a61e308
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
274 additions
and
180 deletions
+274
-180
DemoGlobalConfig.java
app/src/main/java/com/ydl/component/base/DemoGlobalConfig.java
+2
-2
config.gradle
config.gradle
+3
-3
ArticleListBean.kt
m-article/src/main/java/data/ArticleListBean.kt
+2
-2
AudioHomeActivity.kt
m-audioim/src/main/java/com/ydl/audioim/AudioHomeActivity.kt
+44
-33
ConsultantAudioHomeActivity.kt
m-audioim/src/main/java/com/ydl/consultantim/ConsultantAudioHomeActivity.kt
+60
-51
build.gradle
m-confide/build.gradle
+3
-2
ConfideHomeEventImpl.kt
m-confide/src/main/java/com/ydl/confide/home/event/ConfideHomeEventImpl.kt
+9
-7
ItemIntroHolder.kt
m-confide/src/main/java/com/ydl/confide/intro/ItemIntroHolder.kt
+1
-1
confide_recommend_view_new.xml
m-confide/src/main/res/layout/confide_recommend_view_new.xml
+1
-1
build.gradle
m-consultant/build.gradle
+3
-1
HotSearchActivity.kt
m-consultant/src/main/java/com/yidianling/consultant/HotSearchActivity.kt
+5
-8
HomeArticleBean.kt
m-home/src/main/java/com/yidianling/home/model/bean/HomeArticleBean.kt
+2
-2
YdlHomeFragment.kt
m-home/src/ydl/java/com/yidianling/home/ui/fragment/YdlHomeFragment.kt
+89
-62
home_confide_item_layout.xml
m-home/src/ydl/res/layout/home_confide_item_layout.xml
+1
-1
NimSDKOptionConfig.java
m-im/src/main/java/com/yidianling/im/config/NimSDKOptionConfig.java
+3
-1
YDLMessageFragment.java
m-im/src/main/java/com/yidianling/uikit/business/session/fragment/YDLMessageFragment.java
+4
-0
ExpertConsultServiceItemView.kt
m-im/src/main/java/com/yidianling/uikit/custom/widget/expertConsultService/view/ExpertConsultServiceItemView.kt
+6
-0
ExpertConsultServiceListDialog2.kt
m-im/src/main/java/com/yidianling/uikit/custom/widget/expertConsultService/view/ExpertConsultServiceListDialog2.kt
+3
-1
im_expert_consult_service_list_fragment_layout.xml
m-im/src/main/res/layout/im_expert_consult_service_list_fragment_layout.xml
+32
-0
build.gradle
ydl-media/build.gradle
+1
-2
No files found.
app/src/main/java/com/ydl/component/base/DemoGlobalConfig.java
View file @
ce04dd07
...
...
@@ -20,8 +20,8 @@ import java.util.List;
*/
public
final
class
DemoGlobalConfig
implements
IConfigModule
{
String
APP_DOMAIN
=
"https://api.github.com/"
;
public
static
String
appEnv
=
YDLConstants
.
ENV_TEST
;
//
public static String appEnv = YDLConstants.ENV_PROD;
//
public static String appEnv = YDLConstants.ENV_TEST;
public
static
String
appEnv
=
YDLConstants
.
ENV_PROD
;
// public static String appEnv = YDLConstants.ENV_NEW_TEST;//配置未上传到maven库
@Override
...
...
config.gradle
View file @
ce04dd07
ext
{
dev_mode
=
false
//组件发布的时候需要设置为false
ydl2PublishVersion
=
"0.2.
1.9-SNAPSHOT
"
dev_mode
=
false
//组件发布的时候需要设置为false
ydl2PublishVersion
=
"0.2.
0.17
"
ydlPublishVersion
=
[
// -------------- 业务模块 --------------
//第三步 若干
...
...
@@ -8,7 +8,7 @@ ext {
"m-consultant"
:
"0.0.60.78"
,
"m-fm"
:
"0.0.30.09"
,
"m-user"
:
"0.0.62.72"
,
"m-home"
:
"0.0.24.0
8
"
,
"m-home"
:
"0.0.24.0
9
"
,
"m-im"
:
"0.0.21.69"
,
"m-dynamic"
:
"0.0.7.80"
,
"m-article"
:
"0.0.0.11"
,
...
...
m-article/src/main/java/data/ArticleListBean.kt
View file @
ce04dd07
...
...
@@ -35,7 +35,7 @@ data class ArticleListBean(
//"url": "https://h2.yidianling.com/article/12516"
data class
ArticleBean
(
val
id
:
Int
,
val
readNum
:
Int
,
val
readNum
:
String
=
"0"
,
val
title
:
String
,
val
desc
:
String
,
val
imgUrl
:
String
,
...
...
@@ -48,7 +48,7 @@ data class ArticleBean(
val
mUrl
:
String
,
val
createTime
:
String
,
val
createTimeFormat
:
String
,
val
zanNum
:
Int
,
val
zanNum
:
String
=
"0"
,
val
categoryId
:
Int
,
val
commentTotal
:
Int
,
val
label
:
String
,
...
...
m-audioim/src/main/java/com/ydl/audioim/AudioHomeActivity.kt
View file @
ce04dd07
...
...
@@ -283,7 +283,7 @@ class AudioHomeActivity :
LogUtil
.
e
(
"[agora]发生警告回调$warn"
)
writeAgoraLog
(
"声网警告回调($warn)"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网警告回调($warn)"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网警告回调($warn)
channelId:${channelId}
"
)
//103:没有可用的频道资源。可能是因为服务端没法分配频道资源
//104:查找频道超时。在加入频道时 SDK 先要查找指定的频道,出现该警告一般是因为网络太差,连接不到服务器
//105:查找频道请求被服务器拒绝。服务器可能没有办法处理这个请求或请求是非法的
...
...
@@ -301,7 +301,7 @@ class AudioHomeActivity :
uploadException
(
"mRtcEventHandler-onError:errorCode--%${err}"
,
callback
=
null
)
writeAgoraLog
(
"声网错误回调errorCode--%${err}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网错误回调errorCode--%${err}"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网错误回调errorCode--%${err}
channelId:${channelId}
"
)
//3:SDK 初始化失败。Agora 建议尝试以下处理方法
//7:SDK 尚未初始化,就调用其 API。请确认在调用 API 之前已创建 RtcEngine 对象并完成初始化
//9:没有操作权限。请检查用户是否授予 app 音视频设备使用权限。
...
...
@@ -315,7 +315,10 @@ class AudioHomeActivity :
//110:生成的 Token 无效
//123:此用户被服务器禁止
LogUtil
.
e
(
"[agora]发生错误回调$err"
)
YDLavManager
.
instances
.
callEndStatusUpdate
(
channelId
!!
,
4
,
"频道的错误回调信息$err"
)
if
(
err
==
0
||
err
==
18
)
{
return
}
channelId
?.
let
{
YDLavManager
.
instances
.
callEndStatusUpdate
(
it
,
4
,
"频道的错误回调信息$err"
)
}
}
override
fun
onApiCallExecuted
(
error
:
Int
,
api
:
String
?,
result
:
String
?)
{
...
...
@@ -367,7 +370,7 @@ class AudioHomeActivity :
super
.
onRtcStats
(
stats
)
writeAgoraLog
(
"声网onRtcStats:users:${stats?.users}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网onRtcStats:users:${stats?.users}"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"声网onRtcStats:users:${stats?.users}
channelId:${channelId}
"
)
// 不需要移动端做离开房间逻辑,服务端会判断进行踢人逻辑
//因为用户端直接加入了频道,防止该回调执行时,专家还未加入频道,因此在连接成功之后,才进行频道人数判断
// if (isConnectSuccess && null != stats?.users && stats.users == 1) {
...
...
@@ -391,7 +394,7 @@ class AudioHomeActivity :
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"通话结束:网络连接被服务器中止 该情况现在是因为后端踢人逻辑,原因(${reason})"
"通话结束:网络连接被服务器中止 该情况现在是因为后端踢人逻辑,原因(${reason})
channelId:${channelId}
"
)
// com.yidianling.common.tools.ToastUtil.toastShort("专家已挂断")
//通话结束或挂断时,上传日志文件
...
...
@@ -407,7 +410,7 @@ class AudioHomeActivity :
LogUtil
.
e
(
"[agora]离开频道回调"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"离开频道回调"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"离开频道回调
channelId:${channelId}
"
)
//通话结束或挂断时,上传日志文件
uploadLog
()
}
...
...
@@ -419,7 +422,7 @@ class AudioHomeActivity :
LogUtil
.
e
(
"[agora]远端用户/主播加入频道回调"
)
onPeerJoined
()
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"远端用户/主播加入频道回调"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"远端用户/主播加入频道回调
channelId:${channelId}
"
)
}
override
fun
onUserOffline
(
uid
:
Int
,
elapsed
:
Int
)
{
...
...
@@ -429,7 +432,7 @@ class AudioHomeActivity :
LogUtil
.
e
(
"[agora]远端用户$uid 离开频道回调"
)
writeAgoraLog
(
"接通后通话结束:对方已挂断"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"接通后通话结束:对方已挂断"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"接通后通话结束:对方已挂断
channelId:${channelId}
"
)
//通话结束或挂断时,上传日志文件
uploadLog
()
showToast
(
"专家已挂断"
)
...
...
@@ -465,6 +468,8 @@ class AudioHomeActivity :
if
(
txQuality
in
1
..
2
&&
rxQuality
in
1
..
2
)
{
""
}
else
if
(
txQuality
>=
5
||
rxQuality
>=
5
)
{
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"您的网络已断开 channelId:${channelId}"
)
"您的网络已断开"
}
else
{
status
=
if
(
txQuality
>=
4
||
rxQuality
>=
4
)
{
...
...
@@ -472,6 +477,8 @@ class AudioHomeActivity :
}
else
{
1
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"您的网络状况不佳 channelId:${channelId}"
)
"您的网络状况不佳"
}
}
...
...
@@ -479,6 +486,8 @@ class AudioHomeActivity :
if
(
txQuality
in
1
..
2
&&
rxQuality
in
1
..
2
)
{
""
}
else
if
(
txQuality
>=
5
||
rxQuality
>=
5
)
{
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"对方的网络已断开 channelId:${channelId}"
)
"对方的网络已断开"
}
else
{
status
=
if
(
txQuality
>=
4
||
rxQuality
>=
4
)
{
...
...
@@ -486,6 +495,8 @@ class AudioHomeActivity :
}
else
{
1
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"对方的网络状况不佳 channelId:${channelId}"
)
"对方的网络状况不佳"
}
}
...
...
@@ -515,7 +526,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"通话页面打开的时候,RTM登录状态码:${YDLavManager.sdkStatus}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
RTM
,
"通话页面打开的时候,RTM登录状态码:${YDLavManager.sdkStatus}"
)
.
sendRichLog
(
AliYunLogConfig
.
RTM
,
"通话页面打开的时候,RTM登录状态码:${YDLavManager.sdkStatus}
channelId:${channelId}
"
)
if
(
YDLavManager
.
sdkStatus
!=
Constants
.
CONNECTION_STATE_CONNECTED
)
{
//再次登录声网,确保声网登录状态
reLoginRTM
()
...
...
@@ -588,7 +599,7 @@ class AudioHomeActivity :
dialStatus
=
intent
.
getStringExtra
(
IntentConstants
.
INTENT_DIALSTATUS
)
writeAgoraLog
(
"专家的通话状态dialStatus:$dialStatus"
,
false
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"专家的通话状态dialStatus:$dialStatus"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"专家的通话状态dialStatus:$dialStatus
channelId:${channelId}
"
)
isShowAXB
=
intent
.
getBooleanExtra
(
IntentConstants
.
INTENT_ISSHOWAXB
,
true
)
val
logBean
=
AgoraLogInfoBean
(
...
...
@@ -604,7 +615,7 @@ class AudioHomeActivity :
val
content
=
Gson
().
toJson
(
logBean
)
writeAgoraLog
(
"主叫方发送的邀请通话消息内容:$content"
,
true
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫方发送的邀请通话消息内容:$content"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫方发送的邀请通话消息内容:$content
channelId:${channelId}
"
)
localRemainTime
=
remainTime
?.
toInt
()
?:
1500
handler
=
Handler
()
...
...
@@ -630,7 +641,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"RMT状态:${YDLavManager.sdkStatus},重新登录RMT"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
RTM
,
"RMT状态:${YDLavManager.sdkStatus},重新登录RMTt"
)
.
sendRichLog
(
AliYunLogConfig
.
RTM
,
"RMT状态:${YDLavManager.sdkStatus},重新登录RMTt
channelId:${channelId}
"
)
val
uid
=
YdlCommonRouterManager
.
getYdlCommonRoute
().
getUid
().
toString
()
YDLavManager
.
instances
.
login
(
uid
)
{
_isSuccess
,
_msg
->
// writeAgoraLog("拨打电话界面打开RTM重新登录,uid=${uid}")
...
...
@@ -644,7 +655,7 @@ class AudioHomeActivity :
callEventSave
(
"20"
,
"通话页面打开"
)
writeAgoraLog
(
"用户拨打电话界面开启"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户拨打电话界面开启"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户拨打电话界面开启
channelId:${channelId}
"
)
//水波纹view初始化
wave_view
.
setDuration
(
6000
)
wave_view
.
setStyle
(
Paint
.
Style
.
STROKE
)
...
...
@@ -695,13 +706,13 @@ class AudioHomeActivity :
audio_mute_text
.
text
=
"麦克风已关"
voiceManage
?.
getVoiceApi
()
?.
enableLocalAudio
(
false
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:麦克风已关"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:麦克风已关
channelId:${channelId}
"
)
}
else
{
iv_mute_on_off
.
isSelected
=
true
iv_mute_on_off
.
setImageResource
(
R
.
drawable
.
audiohome_muteon
)
audio_mute_text
.
text
=
"麦克风已开"
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:麦克风已开"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:麦克风已开
channelId:${channelId}
"
)
voiceManage
?.
getVoiceApi
()
?.
enableLocalAudio
(
true
)
}
}
...
...
@@ -713,7 +724,7 @@ class AudioHomeActivity :
return
@setOnClickListener
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:切换线路"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:切换线路
channelId:${channelId}
"
)
ActionCountUtils
.
record
(
"call_phone_page"
,
"call_phone_icon_click"
,
"0"
,
"4"
)
showChooseDialog
(
1
)
...
...
@@ -722,7 +733,7 @@ class AudioHomeActivity :
iv_hang_up
.
setOnClickListener
{
if
(!
canHangUp
)
{
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:挂断,展示提示弹窗"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:挂断,展示提示弹窗
channelId:${channelId}
"
)
showHangUpTimeOnlineDialog
()
return
@setOnClickListener
}
...
...
@@ -734,7 +745,7 @@ class AudioHomeActivity :
if
(
isConnectSuccess
)
{
writeAgoraLog
(
"已接通:主叫主动挂断"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"已接通:主叫主动挂断"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"已接通:主叫主动挂断
channelId:${channelId}
"
)
updateExpertStatus
(
false
,
1
)
leaveChannel
()
uploadLog
()
...
...
@@ -759,13 +770,13 @@ class AudioHomeActivity :
iv_hands_free
.
setImageResource
(
R
.
drawable
.
audioim_img_hands_free_unuse
)
hands_free_text
.
text
=
"扬声器已关"
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:免提,扬声器已关"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:免提,扬声器已关
channelId:${channelId}
"
)
}
else
{
iv_hands_free
.
isSelected
=
true
iv_hands_free
.
setImageResource
(
R
.
drawable
.
audioim_img_hands_free
)
hands_free_text
.
text
=
"扬声器已开"
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:免提,扬声器已开"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户端点击:免提,扬声器已开
channelId:${channelId}
"
)
}
//已经接通
...
...
@@ -796,7 +807,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"请求音频权限通过"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"请求音频权限通过"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"请求音频权限通过
channelId:${channelId}
"
)
init
()
}
...
...
@@ -812,7 +823,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"拒绝请求音频权限"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"拒绝请求音频权限"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"拒绝请求音频权限
channelId:${channelId}
"
)
uploadLog
()
showStorageDialog
()
...
...
@@ -823,7 +834,7 @@ class AudioHomeActivity :
callEventSave
(
"80"
,
"请求音频权限异常${e.message}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"请求音频权限异常${e.message}"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"请求音频权限异常${e.message}
channelId:${channelId}
"
)
init
()
}
...
...
@@ -934,7 +945,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"主叫(用户)发送通话邀请"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫(用户)发送通话邀请$msgBean"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫(用户)发送通话邀请$msgBean
channelId:${channelId}
"
)
rtcCall
()
//开始50s等待倒计时
...
...
@@ -987,7 +998,7 @@ class AudioHomeActivity :
LogUtil
.
d
(
it
.
message
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"倒计时异常${it.message}"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"倒计时异常${it.message}
channelId:${channelId}
"
)
dismissHangUpTimeOnlineDialog
()
...
...
@@ -1007,7 +1018,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"未接通挂断:50s等待倒计时结束挂断"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接通挂断:50s等待倒计时结束挂断"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接通挂断:50s等待倒计时结束挂断
channelId:${channelId}
"
)
//提示切换传统线路
//发送消息通知专家用户已挂断
YDLavManager
.
instances
.
cancelCall
(
...
...
@@ -1021,7 +1032,7 @@ class AudioHomeActivity :
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断"
"未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断
channelId:${channelId}
"
)
}
//通话结束或挂断时,上传日志文件
...
...
@@ -1081,7 +1092,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"未接听时:主叫(用户)主动挂断,取消呼叫"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫(用户)主动挂断,取消呼叫"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫(用户)主动挂断,取消呼叫
channelId:${channelId}
"
)
LogUtil
.
e
(
"未接听挂断"
)
//发送消息通知专家用户已挂断
YDLavManager
.
instances
.
cancelCall
(
...
...
@@ -1093,7 +1104,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫(用户)主动挂断失败,msg=$msg($code),再次挂断
channelId:${channelId}
"
)
}
//通话结束或挂断时,上传日志文件
uploadLog
()
...
...
@@ -1129,7 +1140,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"主叫点击切换AXB按钮"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫点击切换AXB按钮"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"主叫点击切换AXB按钮
channelId:${channelId}
"
)
switchAXB
()
}
...
...
@@ -1155,7 +1166,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"离开房间成功,主叫切换AXB之后"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"离开房间成功,主叫切换AXB之后"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"离开房间成功,主叫切换AXB之后
channelId:${channelId}
"
)
mPresenter
.
getAXBPhone
(
ConnectCommand
(
listenId
!!
,
"1"
))
}
...
...
@@ -1192,7 +1203,7 @@ class AudioHomeActivity :
writeAgoraLog
(
"未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"未接听时:主叫主动挂断失败,msg=$msg($code),再次挂断
channelId:${channelId}
"
)
}
leaveChannel
()
}
...
...
@@ -1419,7 +1430,7 @@ class AudioHomeActivity :
cmd
.
status
=
"CALL_OFF"
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户加入频道后,通知服务端发送推送"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"用户加入频道后,通知服务端发送推送
channelId:${channelId}
"
)
mPresenter
.
noticeServerPush
(
cmd
)
}
...
...
m-audioim/src/main/java/com/ydl/consultantim/ConsultantAudioHomeActivity.kt
View file @
ce04dd07
...
...
@@ -119,6 +119,18 @@ class ConsultantAudioHomeActivity :
*/
private
var
isConnectSuccess
:
Boolean
=
false
companion
object
{
const
val
PARAM
:
String
=
"param"
//0.未接听 1.已接听
const
val
STATUS_NOT_ANSWERED
=
0
const
val
STATUS_ANSWERED
=
1
//666.未接听,直接挂断 667.已接听,正常挂断 668:未接听,用户端取消了
const
val
RESULT_NOT_ANSWERED_CODE
=
666
const
val
RESULT_ANSWERED_CODE
=
667
const
val
RESULT_USER_CANCEL
=
668
}
/**
* 事件回调 (SDK 通过指定的事件通知应用程序 SDK 的运行事件,如: 加入或离开频道,新用户加入频道等)
*/
...
...
@@ -131,6 +143,8 @@ class ConsultantAudioHomeActivity :
*/
override
fun
onUserMuteAudio
(
uid
:
Int
,
muted
:
Boolean
)
{
callEventSave
(
"80"
,
"uid:${uid} 开启了静音 = ${muted}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:咨询用户端:uid:${uid} 开启了静音 = ${muted} channelId:${mAudioMessageBean?.channelId}"
)
// runOnUiThread {
// showToast("对方静音了,提醒他打开!")
// }
...
...
@@ -143,12 +157,12 @@ class ConsultantAudioHomeActivity :
LogUtil
.
e
(
"[agora]$uid 加入频道回调"
)
writeAgoraLog
(
"被叫(用户)加入声网($channel)频道成功"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
被叫(用户)
加入声网($channel)频道成功"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:被叫(用户)uid:${uid}
加入声网($channel)频道成功"
)
runOnUiThread
{
// 加入频道后再通知用户已接受
// YDLRTMClient.instances.acceptCall(mAudioMessageBean?.channelId)
YDLavManager
.
instances
.
acceptCall
(
mAudioMessageBean
!!
.
userId
!!
,
mAudioMessageBean
?
.
userId
!!
,
mAudioMessageBean
?.
channelId
,
Gson
().
toJson
(
mAudioMessageBean
)
)
...
...
@@ -174,7 +188,7 @@ class ConsultantAudioHomeActivity :
LogUtil
.
e
(
"[agora]$uid 重新加入频道回调"
)
writeAgoraLog
(
"被叫(用户)重新加入声网频道($channel)成功"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
被叫(用户)
重新加入声网频道($channel)成功"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:被叫(用户)uid:${uid}
重新加入声网频道($channel)成功"
)
runOnUiThread
{
if
(!
isConnectSuccess
)
{
...
...
@@ -195,7 +209,7 @@ class ConsultantAudioHomeActivity :
LogUtil
.
e
(
"[agora]远端用户加入频道回调"
)
writeAgoraLog
(
"主叫(专家)加入声网频道成功"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
主叫(专家)加入声网频道成功
"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:主叫(专家)uid:${uid}加入声网频道成功 channelId:${mAudioMessageBean?.channelId}
"
)
//另一方加入频道成功
runOnUiThread
{
...
...
@@ -269,7 +283,7 @@ class ConsultantAudioHomeActivity :
callEventSave
(
"52"
,
"自己离开频道回调"
)
LogUtil
.
e
(
"[agora]自己离开频道回调"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
自己离开频道回调
"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:自己离开频道回调 channelId:${mAudioMessageBean?.channelId}
"
)
//通知php 通话已结束
close
(
RESULT_ANSWERED_CODE
,
""
)
...
...
@@ -313,7 +327,7 @@ class ConsultantAudioHomeActivity :
showToast
(
"对方已挂断"
)
writeAgoraLog
(
"通话接通后挂断:主叫(专家)离开频道"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
通话接通后挂断:主叫(专家)离开频道
"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:通话接通后挂断:主叫(专家)$uid 离开频道 channelId:${mAudioMessageBean?.channelId}
"
)
if
(
null
!=
totalDisposable
)
{
totalDisposable
!!
.
dispose
()
...
...
@@ -331,7 +345,7 @@ class ConsultantAudioHomeActivity :
}
LogUtil
.
e
(
"[agora]发生警告回调=$warn"
)
writeAgoraLog
(
"声网警告回调码:($warn)"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
声网警告回调码:($warn)
"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:声网警告回调码:($warn) channelId:${mAudioMessageBean?.channelId}
"
)
//103:没有可用的频道资源。可能是因为服务端没法分配频道资源
//104:查找频道超时。在加入频道时 SDK 先要查找指定的频道,出现该警告一般是因为网络太差,连接不到服务器
...
...
@@ -359,7 +373,7 @@ class ConsultantAudioHomeActivity :
LogUtil
.
e
(
"[agora] 发生错误回调 =$err"
)
writeAgoraLog
(
"声网错误回调errorCode--%${err}"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
声网错误回调errorCode--%${err
}"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:声网错误回调errorCode--%${err} channelId:${mAudioMessageBean?.channelId
}"
)
//3:SDK 初始化失败。Agora 建议尝试以下处理方法
//7:SDK 尚未初始化,就调用其 API。请确认在调用 API 之前已创建 RtcEngine 对象并完成初始化
...
...
@@ -408,10 +422,13 @@ class ConsultantAudioHomeActivity :
else
->
{
}
}
if
(
err
==
0
||
err
==
18
)
{
return
@runOnUiThread
}
YDLavManager
.
instances
.
callEndStatusUpdate
(
mAudioMessageBean
?.
channelId
!!
,
4
,
"频道的错误回调信息${err}"
"频道的错误回调信息${err}
"
)
}
}
...
...
@@ -430,6 +447,8 @@ class ConsultantAudioHomeActivity :
if
(
txQuality
in
1
..
2
&&
rxQuality
in
1
..
2
)
{
""
}
else
if
(
txQuality
>=
5
||
rxQuality
>=
5
)
{
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:您的网络已断开 channelId:${mAudioMessageBean?.channelId}"
)
"您的网络已断开"
}
else
{
status
=
if
(
txQuality
>=
4
||
rxQuality
>=
4
)
{
...
...
@@ -437,6 +456,8 @@ class ConsultantAudioHomeActivity :
}
else
{
1
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:您的网络状况不佳 channelId:${mAudioMessageBean?.channelId}"
)
"您的网络状况不佳"
}
}
...
...
@@ -444,6 +465,8 @@ class ConsultantAudioHomeActivity :
if
(
txQuality
in
1
..
2
&&
rxQuality
in
1
..
2
)
{
""
}
else
if
(
txQuality
>=
5
||
rxQuality
>=
5
)
{
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:对方的网络已断开 channelId:${mAudioMessageBean?.channelId}"
)
"对方的网络已断开"
}
else
{
status
=
if
(
txQuality
>=
4
||
rxQuality
>=
4
)
{
...
...
@@ -451,6 +474,8 @@ class ConsultantAudioHomeActivity :
}
else
{
1
}
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:对方的网络状况不佳 channelId:${mAudioMessageBean?.channelId}"
)
"对方的网络状况不佳"
}
}
...
...
@@ -468,18 +493,7 @@ class ConsultantAudioHomeActivity :
return
R
.
layout
.
audioim_cativity_consultant_audio_home
}
companion
object
{
const
val
PARAM
:
String
=
"param"
//0.未接听 1.已接听
const
val
STATUS_NOT_ANSWERED
=
0
const
val
STATUS_ANSWERED
=
1
//666.未接听,直接挂断 667.已接听,正常挂断 668:未接听,用户端取消了
const
val
RESULT_NOT_ANSWERED_CODE
=
666
const
val
RESULT_ANSWERED_CODE
=
667
const
val
RESULT_USER_CANCEL
=
668
}
override
fun
initDataAndEvent
()
{
EventBus
.
getDefault
().
register
(
this
)
...
...
@@ -607,7 +621,7 @@ class ConsultantAudioHomeActivity :
callEventSave
(
"90"
,
"通话频道不存在"
)
LogUtil
.
e
(
"[agora]token not null"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
token isEmpty
"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:token isEmpty channelId:${mAudioMessageBean?.channelId}
"
)
showToast
(
"通话频道不存在"
)
finish
()
...
...
@@ -691,7 +705,7 @@ class ConsultantAudioHomeActivity :
LogUtil
.
e
(
"[agora] joinChannel:$account"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
joinChannel:$account
"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:joinChannel:$account channelId:${mAudioMessageBean?.channelId}
"
)
voiceManage
?.
getVoiceApi
()
?.
joinChannel
(
channelToken
...
...
@@ -929,7 +943,7 @@ class ConsultantAudioHomeActivity :
runOnUiThread
{
LogUtil
.
e
(
"[agora]close(code:$code,msg:$msg)"
)
AliYunRichLogsHelper
.
getInstance
()
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
close(code:$code,msg:$msg)
"
)
.
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:close(code:$code,msg:$msg) channelId:${mAudioMessageBean?.channelId}
"
)
//上传日志文件
uploadLog
()
...
...
@@ -940,6 +954,8 @@ class ConsultantAudioHomeActivity :
RESULT_ANSWERED_CODE
->
{
//已接听,正常挂断
//离开频道
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:已接听,正常挂断 channelId:${mAudioMessageBean?.channelId}"
)
leaveChannel
()
}
RESULT_NOT_ANSWERED_CODE
->
{
...
...
@@ -961,7 +977,7 @@ class ConsultantAudioHomeActivity :
}
ActivityManager
.
getInstance
().
removeStack
(
activity
=
this
)
LogUtil
.
e
(
"[agora]页面移除"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
页面移除
"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"
咨询用户端:页面移除 channelId:${mAudioMessageBean?.channelId}
"
)
finish
()
}
}
...
...
@@ -977,15 +993,17 @@ class ConsultantAudioHomeActivity :
* 停止播放
*/
private
fun
stopPlaying
()
{
if
(
mPlayer
!=
null
)
{
mPlayer
!!
.
pause
()
}
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:stopPlaying channelId:${mAudioMessageBean?.channelId}"
)
mPlayer
?.
pause
()
}
/**
* 播放结束音频
*/
private
fun
playFinishMusic
()
{
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:playFinishMusic channelId:${mAudioMessageBean?.channelId}"
)
if
(
mPlayer
==
null
)
{
mPlayer
=
AudioPlayer
(
this
,
true
)
}
...
...
@@ -1012,6 +1030,8 @@ class ConsultantAudioHomeActivity :
1
,
"被叫加入频道后主叫未加入超时"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:15s后如果还是处于连接中,则直接退出当前页面 channelId:${mAudioMessageBean?.channelId}"
)
writeAgoraLog
(
"通话未接通挂断:连接中的状态超过5s自动挂断"
)
showToast
(
"用户已挂断"
)
close
(
RESULT_NOT_ANSWERED_CODE
,
""
)
...
...
@@ -1025,28 +1045,16 @@ class ConsultantAudioHomeActivity :
*/
private
fun
leaveChannel
()
{
uploadException
(
""
,
"zhu"
,
"108"
)
if
(
totalDisposable
!=
null
)
{
totalDisposable
!!
.
dispose
()
}
if
(
connectingStatusDisposable
!=
null
)
{
connectingStatusDisposable
!!
.
dispose
()
}
if
(
null
!=
voiceManage
&&
null
!=
voiceManage
!!
.
getVoiceApi
())
{
voiceManage
!!
.
getVoiceApi
().
leaveChannel
()
voiceManage
!!
.
getVoiceApi
().
destroy
()
voiceManage
=
null
}
if
(
mPlayer
!=
null
)
{
mPlayer
!!
.
clear
()
}
if
(
null
!=
sensorManager
)
{
sensorManager
!!
.
unregisterListener
(
this
)
}
totalDisposable
?.
dispose
()
connectingStatusDisposable
?.
dispose
()
voiceManage
?.
getVoiceApi
()
?.
leaveChannel
()
voiceManage
?.
getVoiceApi
()
?.
destroy
()
voiceManage
=
null
mPlayer
?.
clear
()
sensorManager
?.
unregisterListener
(
this
)
//唤醒设备
if
(
null
!=
localWakeLock
&&
localWakeLock
!!
.
isHeld
)
{
localWakeLock
!!
.
release
()
if
(
localWakeLock
?.
isHeld
==
true
)
{
localWakeLock
?
.
release
()
}
sensorManager
=
null
localWakeLock
=
null
...
...
@@ -1054,9 +1062,7 @@ class ConsultantAudioHomeActivity :
}
private
fun
voiceDestory
()
{
if
(
null
!=
voiceManage
&&
null
!=
voiceManage
!!
.
getVoiceApi
())
{
voiceManage
!!
.
getVoiceApi
().
destroy
()
}
voiceManage
?.
getVoiceApi
()
?.
destroy
()
voiceManage
=
null
}
...
...
@@ -1108,6 +1114,8 @@ class ConsultantAudioHomeActivity :
override
fun
onDestroy
()
{
LogUtil
.
e
(
"http-------------onDestory"
)
AliYunRichLogsHelper
.
getInstance
().
sendRichLog
(
AliYunLogConfig
.
AGORA
,
"咨询用户端:onDestroy channelId:${mAudioMessageBean?.channelId}"
)
leaveChannel
()
voiceDestory
()
isConnectSuccess
=
false
...
...
@@ -1123,6 +1131,7 @@ class ConsultantAudioHomeActivity :
}
}
super
.
onDestroy
()
}
...
...
m-confide/build.gradle
View file @
ce04dd07
...
...
@@ -65,8 +65,9 @@ dependencies {
// 注意此处的依赖方式:kotlin中使用和java中使用方式有不同
kapt
"com.alibaba:arouter-compiler:$arouter_compiler"
implementation
'com.alibaba:fastjson:1.2.38'
implementation
"com.ydl:jjdxm-ijkplayer:0.0.33"
implementation
(
rootProject
.
ext
.
dependencies
[
"ydl-ijkplayer-jjdxm"
])
{
exclude
group:
'com.android.support'
,
module:
'appcompat-v7'
}
api
rootProject
.
ext
.
dependencies
[
"ydl-user-router"
]
if
(
rootProject
.
ext
.
dev_mode
){
//开发时使用
...
...
m-confide/src/main/java/com/ydl/confide/home/event/ConfideHomeEventImpl.kt
View file @
ce04dd07
...
...
@@ -133,13 +133,15 @@ class ConfideHomeEventImpl(context: Context, var confideHomeView: IConfideHomeCo
* @param linkUrl 跳转地址
*/
override
fun
consultantClick
(
doctorId
:
String
?,
confideId
:
String
?,
uid
:
String
?,
listenFree
:
Boolean
?,
expertUrl
:
String
?)
{
confideId
?.
let
{
ConfideBottomSheetDialogFragment
()
.
showBottomSheetDialog
(
mContext
as
FragmentActivity
,
HttpConfig
.
MH5_URL
+
ConfideRoute
.
h5ConfideIntro
(
it
),
doctorId
!!
,
uid
=
uid
,
listenFree
=
listenFree
?:
false
,
expertUrl
=
expertUrl
?:
""
)
doctorId
?.
let
{
doctorId
->
confideId
?.
let
{
confideId
->
ConfideBottomSheetDialogFragment
()
.
showBottomSheetDialog
(
mContext
as
FragmentActivity
,
HttpConfig
.
MH5_URL
+
ConfideRoute
.
h5ConfideIntro
(
confideId
),
doctorId
,
uid
=
uid
,
listenFree
=
listenFree
?:
false
,
expertUrl
=
expertUrl
?:
""
)
}
}
}
...
...
m-confide/src/main/java/com/ydl/confide/intro/ItemIntroHolder.kt
View file @
ce04dd07
...
...
@@ -433,7 +433,7 @@ internal fun VideoViewModel.mapOf(bean: ConfideHomeBodyBean): VideoViewModel {
avatar
.
set
(
bean
.
confidedIcon
)
linkedUrl
.
set
(
bean
.
linkUrl
)
val
num
=
bean
.
confideNum
?.
replace
(
"人"
,
""
)
?:
"0"
count
.
set
(
"
倾诉
人次 $num"
)
count
.
set
(
"
服务
人次 $num"
)
intro
.
set
(
bean
.
confideContent
)
title
.
set
(
bean
.
title
)
val
sb
=
StringBuilder
()
...
...
m-confide/src/main/res/layout/confide_recommend_view_new.xml
View file @
ce04dd07
...
...
@@ -116,7 +116,7 @@
android:layout_height=
"wrap_content"
android:textSize=
"@dimen/platform_sp_12"
android:textColor=
"#69696A"
android:text=
"
倾诉
人次"
android:text=
"
服务
人次"
/>
</LinearLayout>
<LinearLayout
...
...
m-consultant/build.gradle
View file @
ce04dd07
...
...
@@ -46,7 +46,9 @@ dependencies {
kapt
'com.alibaba:arouter-compiler:1.2.2'
implementation
rootProject
.
ext
.
dependencies
[
"BaseRecyclerViewAdapterHelper"
]
api
rootProject
.
ext
.
dependencies
[
"ydl-user-router"
]
implementation
"com.ydl:jjdxm-ijkplayer:0.0.33"
implementation
(
rootProject
.
ext
.
dependencies
[
"ydl-ijkplayer-jjdxm"
])
{
exclude
group:
'com.android.support'
,
module:
'appcompat-v7'
}
if
(
rootProject
.
ext
.
dev_mode
){
//开发时使用
implementation
project
(
":api:user"
)
...
...
m-consultant/src/main/java/com/yidianling/consultant/HotSearchActivity.kt
View file @
ce04dd07
...
...
@@ -113,14 +113,11 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
// 搜索的关联词
var
relatedWords
=
""
var
isRecommendWords
=
false
if
(!
lenovoResultSuccess
){
// 如果每次输入内容后联想词结果还没返回结果则直接进行搜索
if
(
etSearch
.
text
.
toString
().
isNullOrEmpty
())
{
doSearch
(
etSearch
.
hint
.
toString
(),
relatedWords
,
isRecommendWords
)
}
else
{
doSearch
(
etSearch
.
text
.
toString
(),
relatedWords
,
isRecommendWords
)
}
}
else
if
(
searchSuggestList
.
isNotEmpty
()
&&
searchSuggestList
.
size
>
0
)
{
if
(!
lenovoResultSuccess
&&
!
etSearch
.
text
.
toString
()
.
isNullOrEmpty
()
)
{
// 如果每次输入内容后联想词结果还没返回结果则直接进行搜索
doSearch
(
etSearch
.
text
.
toString
(),
relatedWords
,
isRecommendWords
)
}
else
if
(
searchSuggestList
.
isNotEmpty
()
&&
searchSuggestList
.
size
>
0
)
{
if
(
searchSuggestList
[
0
].
suggest_relations
.
size
>
0
)
{
relatedWords
=
searchSuggestList
[
0
].
suggest_relations
[
0
]
isRecommendWords
=
true
...
...
m-home/src/main/java/com/yidianling/home/model/bean/HomeArticleBean.kt
View file @
ce04dd07
...
...
@@ -26,7 +26,7 @@ class HomeArticleBean : HomeItemBaseBean {
/**
* 收藏数
*/
var
countOfFavorite
:
Int
=
0
var
countOfFavorite
:
String
=
"0"
var
createTime
:
String
?
=
null
var
createTimeFormat
:
String
?
=
null
/**
...
...
@@ -55,7 +55,7 @@ class HomeArticleBean : HomeItemBaseBean {
/**
* 阅读次数
*/
var
readNum
:
Int
=
0
var
readNum
:
String
=
"0"
/**
* 120*120小头像
*/
...
...
m-home/src/ydl/java/com/yidianling/home/ui/fragment/YdlHomeFragment.kt
View file @
ce04dd07
...
...
@@ -5,7 +5,6 @@ import android.content.Context
import
android.graphics.Color
import
android.graphics.Typeface
import
android.media.MediaPlayer
import
android.os.Build
import
android.text.TextUtils
import
android.view.View
import
android.widget.FrameLayout
...
...
@@ -53,8 +52,6 @@ import kotlinx.android.synthetic.ydl.home_fragment.tab_layout
import
kotlinx.android.synthetic.ydl.home_muse_view.*
import
kotlinx.android.synthetic.ydl.home_muse_view.view.*
import
java.util.concurrent.TimeUnit
import
kotlin.properties.Delegates
/**
...
...
@@ -136,7 +133,7 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
private
fun
initAdapter
()
{
mPresenter
?.
localHomeData
(
mContext
,
"home_data.json"
)
adapter
=
YdlHomeAdapter
(
mContext
,
homeEvent
!!
,
ArrayList
())
adapter
=
homeEvent
?.
let
{
YdlHomeAdapter
(
mContext
,
it
,
ArrayList
())
}
val
layoutManager
=
LinearLayoutManager
(
context
)
home_module_fragment_recycler
.
layoutManager
=
layoutManager
home_module_fragment_recycler
.
adapter
=
adapter
...
...
@@ -147,11 +144,13 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
open
fun
initRvListener
()
{
if
(
HomeViewConfig
.
getOrder
().
bannerIndex
!=
-
1
)
{
home_module_fragment_recycler
.
addOnScrollListener
(
homeEvent
!!
.
onPageScroll
(
view_rl_top_bg
)
!!
)
homeEvent
?.
onPageScroll
(
view_rl_top_bg
)
?.
let
{
home_module_fragment_recycler
.
addOnScrollListener
(
it
)
}
}
scrollListner
=
HomeConfideRecyleSuspendListener
()
home_module_fragment_recycler
.
addOnScrollListener
(
scrollListner
)
...
...
@@ -272,7 +271,7 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
scrollListner
.
setHomeView
(
this
)
scrollListner
.
setConfideFilterView
(
ll_layout
)
scrollListner
.
setConsultFilterView
(
ll_consultLayout
)
scrollListner
.
setSectionAdapter
(
adapter
!!
)
adapter
?.
let
{
scrollListner
.
setSectionAdapter
(
it
)
}
scrollListner
.
setPhoneCallImageView
(
home_service_call
)
}
...
...
@@ -302,24 +301,30 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
//展示活动数据
val
act
=
homeHeaderBean
.
activityResponse
if
(
act
!=
null
)
{
act
?.
let
{
act
->
if
(!
TextUtils
.
isEmpty
(
act
.
imageUrl
))
{
img_ad
.
visibility
=
View
.
VISIBLE
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_SEARCH_TAG
,
act
.
title
?:
"1"
)
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_SEARCH_TAG
,
act
.
title
?:
"1"
)
GlideApp
.
with
(
this
).
load
(
act
!!
.
imageUrl
).
into
(
img_ad
)
GlideApp
.
with
(
this
).
load
(
act
.
imageUrl
).
into
(
img_ad
)
img_ad
.
setOnClickListener
{
if
(
Utils
.
isFastClick
())
{
//防止连击
return
@setOnClickListener
}
if
(
act
.
btnLinkurl
!=
null
&&
act
.
btnLinkurl
!!
.
startsWith
(
"http"
))
{
NewH5Activity
.
start
(
activity
,
H5Params
(
act
.
btnLinkurl
!!
,
null
))
}
else
{
YDLRouterManager
.
router
(
act
.
btnLinkurl
)
act
.
btnLinkurl
?.
let
{
btnLinkurl
->
if
(
btnLinkurl
.
startsWith
(
"http"
))
{
NewH5Activity
.
start
(
activity
,
H5Params
(
btnLinkurl
,
null
))
}
else
{
YDLRouterManager
.
router
(
btnLinkurl
)
}
//定制咨询点击事件埋点
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_SEARCH_TAG_CLICK
,
act
.
title
?:
"1"
)
}
//定制咨询点击事件埋点
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_SEARCH_TAG_CLICK
,
act
.
title
?:
"1"
)
}
}
else
{
img_ad
.
visibility
=
View
.
GONE
...
...
@@ -340,7 +345,7 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
if
(!
TextUtils
.
isEmpty
(
act
.
imageBanner
))
{
//展示弹窗
if
(
aa
==
null
)
{
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_POPUPWINDOWS_PAGE_POPUP
,
act
?.
title
?:
"1"
)
ActionCountUtils
.
count
(
HomeBIConstants
.
YDL_HOME_POPUPWINDOWS_PAGE_POPUP
,
act
?.
title
?:
"1"
)
aa
=
ActivityDialog
(
mActivity
,
act
.
imageBanner
,
act
.
linkUrl
,
act
.
title
)
aa
?.
show
()
aa
?.
setOnDismissListener
{
...
...
@@ -361,7 +366,7 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
//更新首页数据
adapter
?.
updateItems
(
list
)
if
(!
TextUtils
.
isEmpty
(
list
[
0
].
headerBean
?.
doctorName
))
{
doctorName
=
list
[
0
].
headerBean
?.
doctorName
!!
doctorName
=
list
[
0
].
headerBean
?.
doctorName
.
toString
()
initSearchBar
()
}
...
...
@@ -372,9 +377,9 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
for
(
bean
in
list
)
{
//咨询模块
if
(
bean
.
type
==
HomeViewConfig
.
getOrder
().
bannerIndex
)
{
initTabLayout
(
bean
.
headerBean
!!
.
listenCategoryDate
)
initConsultTabLayout
(
bean
.
headerBean
!!
.
consultCategoryData
)
consultLastSelectType
=
bean
.
headerBean
!!
.
consultCategoryData
!!
[
0
]
.
id
.
toString
()
initTabLayout
(
bean
.
headerBean
?
.
listenCategoryDate
)
initConsultTabLayout
(
bean
.
headerBean
?
.
consultCategoryData
)
consultLastSelectType
=
bean
.
headerBean
?.
consultCategoryData
?.
get
(
0
)
?
.
id
.
toString
()
}
}
}
...
...
@@ -384,19 +389,22 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
*/
private
fun
initTabLayout
(
listenCategoryDate
:
List
<
HomeHeaderBean
.
ListenCategoryDateBean
>?)
{
if
(
confideTabListener
==
null
)
{
confideTabListener
=
ConfideExpertTabSelectedListener
(
listenCategoryDate
!!
,
tab_layout
)
tab_layout
.
addOnTabSelectedListener
(
confideTabListener
!!
)
confideTabListener
=
listenCategoryDate
?.
let
{
ConfideExpertTabSelectedListener
(
it
,
tab_layout
)
}
tab_layout
.
addOnTabSelectedListener
(
confideTabListener
)
}
tab_layout
.
removeAllTabs
()
for
((
index
,
bean
)
in
listenCategoryDate
!!
.
withIndex
())
{
tab_layout
.
addTab
(
tab_layout
.
newTab
().
setText
(
bean
.
name
),
index
==
confideLastSelectPosition
)
if
(
listenCategoryDate
!=
null
)
{
for
((
index
,
bean
)
in
listenCategoryDate
.
withIndex
())
{
tab_layout
.
addTab
(
tab_layout
.
newTab
().
setText
(
bean
.
name
),
index
==
confideLastSelectPosition
)
}
}
var
textView
=
((
tab_layout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
confideLastSelectPosition
)
as
LinearLayout
).
getChildAt
(
((
tab_layout
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
confideLastSelectPosition
)
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
...
...
@@ -412,16 +420,17 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
private
fun
initConsultTabLayout
(
listenCategoryDate
:
List
<
HomeHeaderBean
.
ConsultCategoryDateBean
>?)
{
if
(
consultTabListener
==
null
)
{
consultTabListener
=
ConsultExpertTabSelectedListener
(
listenCategoryDate
!!
,
tab_consultLayout
)
tab_consultLayout
.
addOnTabSelectedListener
(
consultTabListener
!!
)
listenCategoryDate
?.
let
{
ConsultExpertTabSelectedListener
(
it
,
tab_consultLayout
)
}
tab_consultLayout
.
addOnTabSelectedListener
(
consultTabListener
)
}
if
(
null
==
consultCategoryDate
)
{
consultCategoryDate
=
ArrayList
()
}
//如果 数据不变 则不重新构建
if
(
null
!=
listenCategoryDate
&&
consultCategoryDate
!!
.
size
==
listenCategoryDate
.
size
&&
consultCategoryDate
!!
.
retainAll
(
if
(
null
!=
listenCategoryDate
&&
consultCategoryDate
!!
.
size
==
listenCategoryDate
.
size
&&
consultCategoryDate
?.
retainAll
(
listenCategoryDate
)
)
==
true
)
{
return
}
...
...
@@ -430,14 +439,16 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
consultCategoryDate
?.
addAll
(
listenCategoryDate
)
}
tab_consultLayout
.
removeAllTabs
()
for
((
index
,
bean
)
in
listenCategoryDate
!!
.
withIndex
())
{
tab_consultLayout
.
addTab
(
tab_consultLayout
.
newTab
().
setText
(
bean
.
name
),
index
==
confideLastSelectPosition
)
if
(
listenCategoryDate
!=
null
)
{
for
((
index
,
bean
)
in
listenCategoryDate
.
withIndex
())
{
tab_consultLayout
.
addTab
(
tab_consultLayout
.
newTab
().
setText
(
bean
.
name
),
index
==
confideLastSelectPosition
)
}
}
val
textView
=
((
tab_consultLayout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
val
textView
=
((
tab_consultLayout
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
confideLastSelectPosition
)
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
...
...
@@ -589,39 +600,47 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
override
fun
onTabUnselected
(
tab
:
TabLayout
.
Tab
?)
{
var
textView
=
(
(
tabLayout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
tab
!!
.
position
)
as
LinearLayout
).
getChildAt
(
(
tab
?.
position
?.
let
{
(
tabLayout
?.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
it
)
}
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
textView
.
textSize
=
15f
textView
.
setTextColor
(
activity
?.
let
{
ContextCompat
.
getColor
(
activity
!!
,
it
,
R
.
color
.
platform_color_333333
)
)
}
?.
let
{
textView
.
setTextColor
(
it
)
}
}
}
override
fun
onTabSelected
(
tab
:
TabLayout
.
Tab
?)
{
if
(
tab
!!
.
position
==
consultLastSelectPosition
)
{
if
(
tab
?
.
position
==
consultLastSelectPosition
)
{
return
}
var
textView
=
(
(
tabLayout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
tab
!!
.
position
)
as
LinearLayout
).
getChildAt
(
(
tab
?.
position
?.
let
{
(
tabLayout
?.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
it
)
}
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
textView
.
textSize
=
17f
textView
.
setTextColor
(
activity
?.
let
{
ContextCompat
.
getColor
(
activity
!!
,
it
,
R
.
color
.
platform_color_242424
)
)
}
?.
let
{
textView
.
setTextColor
(
it
)
}
textView
.
typeface
=
Typeface
.
defaultFromStyle
(
Typeface
.
BOLD
)
}
homeEvent
!!
.
getConsultData
(
list
!!
[
tab
!!
.
position
],
tab
!!
.
position
)
list
?.
get
(
tab
.
position
)
?.
let
{
homeEvent
?.
getConsultData
(
it
,
tab
.
position
)
}
}
}
...
...
@@ -639,40 +658,48 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
override
fun
onTabUnselected
(
tab
:
TabLayout
.
Tab
?)
{
var
textView
=
(
(
tabLayout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
tab
!!
.
position
)
as
LinearLayout
).
getChildAt
(
(
tab
?.
let
{
(
tabLayout
?.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
it
.
position
)
}
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
textView
.
textSize
=
15f
textView
.
setTextColor
(
activity
?.
let
{
ContextCompat
.
getColor
(
activity
!!
,
it
,
R
.
color
.
platform_color_333333
)
)
}
?.
let
{
textView
.
setTextColor
(
it
)
}
}
}
override
fun
onTabSelected
(
tab
:
TabLayout
.
Tab
?)
{
if
(
tab
!!
.
position
==
confideLastSelectPosition
)
{
if
(
tab
?
.
position
==
confideLastSelectPosition
)
{
return
}
var
textView
=
(
(
tabLayout
!!
.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
tab
!!
.
position
)
as
LinearLayout
).
getChildAt
(
(
tab
?.
let
{
(
tabLayout
?.
getChildAt
(
0
)
as
LinearLayout
).
getChildAt
(
it
.
position
)
}
as
LinearLayout
).
getChildAt
(
1
)
if
(
textView
!=
null
&&
textView
is
TextView
)
{
textView
.
textSize
=
17f
textView
.
setTextColor
(
activity
?.
let
{
ContextCompat
.
getColor
(
activity
!!
,
it
,
R
.
color
.
platform_color_242424
)
)
}
?.
let
{
textView
.
setTextColor
(
it
)
}
textView
.
typeface
=
Typeface
.
defaultFromStyle
(
Typeface
.
BOLD
)
}
homeEvent
!!
.
getConfideData
(
list
!!
[
tab
!!
.
position
],
tab
!!
.
position
)
list
?.
get
(
tab
.
position
)
?.
let
{
homeEvent
?.
getConfideData
(
it
,
tab
.
position
)
}
}
}
...
...
m-home/src/ydl/res/layout/home_confide_item_layout.xml
View file @
ce04dd07
...
...
@@ -121,7 +121,7 @@
android:layout_height=
"wrap_content"
android:textSize=
"@dimen/platform_sp_12"
android:textColor=
"#69696A"
android:text=
"
倾诉
人次"
android:text=
"
服务
人次"
/>
</LinearLayout>
<LinearLayout
...
...
m-im/src/main/java/com/yidianling/im/config/NimSDKOptionConfig.java
View file @
ce04dd07
...
...
@@ -82,7 +82,9 @@ class NimSDKOptionConfig {
options
.
shouldConsiderRevokedMessageUnreadCount
=
true
;
options
.
mixPushConfig
=
buildMixPushConfig
(
configBean
);
//https://faq.yunxin.163.com/kb/main/#/item/KB0373
//disableAwake为true来禁止后台进程唤醒UI进程。
options
.
disableAwake
=
true
;
return
options
;
}
...
...
m-im/src/main/java/com/yidianling/uikit/business/session/fragment/YDLMessageFragment.java
View file @
ce04dd07
...
...
@@ -936,6 +936,10 @@ public class YDLMessageFragment extends TFragment implements ModuleProxy {
@SuppressLint
(
"CheckResult"
)
private
void
initMenu
()
{
rela_zixun
.
setOnClickListener
(
view
->
{
if
(
Utils
.
isFastClick
())
{
//防止连击
return
;
}
if
(
sessionId
!=
null
&&
ActionHandlerStorage
.
getL
(
sessionId
)
!=
null
&&
ActionHandlerStorage
.
getL
(
sessionId
).
getInfo
()
!=
null
)
{
if
(
serviceItemBeanList
==
null
||
serviceItemBeanList
.
size
()
==
0
)
{
ServiceImpl
.
Companion
.
getInstance
().
serviceList
(
ActionHandlerStorage
.
getL
(
sessionId
).
getInfo
().
doctorId
)
...
...
m-im/src/main/java/com/yidianling/uikit/custom/widget/expertConsultService/view/ExpertConsultServiceItemView.kt
View file @
ce04dd07
...
...
@@ -158,6 +158,12 @@ class ExpertConsultServiceItemView : LinearLayout {
}
im_expert_service_list_btn
.
setOnClickListener
{
mContext
?.
let
{
context
->
if
(!
ImIn
.
loginByOneKeyLogin
(
context
,
true
))
{
return
@setOnClickListener
}
}
if
(
ImIn
.
getUserService
().
isBindPhone
())
{
NewH5Activity
.
start
(
mContext
,
...
...
m-im/src/main/java/com/yidianling/uikit/custom/widget/expertConsultService/view/ExpertConsultServiceListDialog2.kt
View file @
ce04dd07
...
...
@@ -82,6 +82,7 @@ class ExpertConsultServiceListDialog2(
if
(
mList
!=
null
)
{
dialog_ll_empty
.
visibility
=
View
.
GONE
mList
.
forEach
{
item
->
typeList
.
add
(
item
.
cateName
)
}
...
...
@@ -92,6 +93,7 @@ class ExpertConsultServiceListDialog2(
.
observeOn
(
AndroidSchedulers
.
mainThread
())
.
subscribe
(
Consumer
<
BaseAPIResponse
<
List
<
ServiceItemBean
>>>
{
res
:
BaseAPIResponse
<
List
<
ServiceItemBean
>>
->
if
(
res
.
data
!=
null
&&
res
.
data
.
size
>
0
)
{
dialog_ll_empty
.
visibility
=
View
.
GONE
var
serviceItemBeanList
=
res
.
data
serviceItemBeanList
.
forEach
{
item
->
...
...
@@ -112,7 +114,7 @@ class ExpertConsultServiceListDialog2(
}
else
{
ToastUtil
.
toastShort
(
"咨询师暂未发布服务"
)
dialog_ll_empty
.
visibility
=
View
.
VISIBLE
}
},
Consumer
{
throwable
:
Throwable
?
->
})
}
...
...
m-im/src/main/res/layout/im_expert_consult_service_list_fragment_layout.xml
View file @
ce04dd07
...
...
@@ -22,10 +22,41 @@
android:layout_gravity=
"center"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/dialog_ll_empty"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"@dimen/platform_dp_5"
android:gravity=
"center_horizontal"
android:orientation=
"vertical"
android:visibility=
"gone"
>
<TextView
android:id=
"@+id/empty_tv_title"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_centerInParent=
"true"
android:text=
"选择服务主题"
android:textStyle=
"bold"
android:textColor=
"#1C1F28"
android:textSize=
"18sp"
/>
<TextView
android:id=
"@+id/dialog_empty"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_below=
"@id/tv_title"
android:gravity=
"center_horizontal"
android:paddingTop=
"20dp"
android:text=
"暂未开通咨询服务"
android:textColor=
"@color/color_666666"
/>
</LinearLayout>
<com.ydl.ydlcommon.view.NoScrollViewPager
android:id=
"@+id/dialog_bottom_scroll_view"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"#ffffff"
></com.ydl.ydlcommon.view.NoScrollViewPager>
</LinearLayout>
\ No newline at end of file
ydl-media/build.gradle
View file @
ce04dd07
...
...
@@ -39,8 +39,7 @@ dependencies {
implementation
fileTree
(
dir:
'libs'
,
include:
[
'*.jar'
])
implementation
"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
api
(
rootProject
.
ext
.
dependencies
[
""
+
"ydl-ijkplayer-jjdxm"
])
{
api
(
rootProject
.
ext
.
dependencies
[
"ydl-ijkplayer-jjdxm"
])
{
exclude
group:
'com.android.support'
,
module:
'appcompat-v7'
}
...
...
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