Commit d168c011 by upwork.021

feat: 新增会话用户开口引导,m-im组件升级

parent a820c49b
......@@ -10,7 +10,7 @@ ext {
"m-fm" : "0.0.30.04",
"m-user" : "0.0.62.04",
"m-home" : "0.0.23.17",
"m-im" : "0.0.21.21",
"m-im" : "0.0.21.30",
"m-dynamic" : "0.0.7.35",
"m-article" : "0.0.0.10",
......@@ -96,7 +96,7 @@ ext {
"m-fm" : "0.0.30.07",
"m-user" : "0.0.62.04",
"m-home" : "0.0.23.17",
"m-im" : "0.0.21.21",
"m-im" : "0.0.21.30",
"m-dynamic" : "0.0.7.35",
"m-article" : "0.0.0.8",
......
package com.yidianling.im.bean
/**
* Created by Ykai on 2022/5/6.
*/
data class FirstQuestionBean(
var objects:List<ContentBean>
)
data class ContentBean(
var type:Int,
var content:String,
var id:Long
)
\ No newline at end of file
package com.yidianling.im.ui.adapter
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yidianling.im.R
import com.yidianling.im.bean.ContentBean
/**
* Created by Ykai on 2022/5/5.
*
* 首问语适配器
*/
class FirstQuestionAdapter(data:MutableList<ContentBean>): BaseQuickAdapter<ContentBean,BaseViewHolder>(R.layout.im_item_chat_first_question) {
override fun convert(holder: BaseViewHolder, item: ContentBean) {
holder.setText(R.id.tv_question_name,item.content)
}
}
\ No newline at end of file
......@@ -30,6 +30,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.blankj.utilcode.util.SPUtils;
import com.google.gson.Gson;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
......@@ -250,6 +251,7 @@ public class YDLMessageFragment extends TFragment implements ModuleProxy {
}
};
@SuppressLint("CheckResult")
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
......@@ -257,9 +259,6 @@ public class YDLMessageFragment extends TFragment implements ModuleProxy {
titleBar = ((YDLBaseMessageActivity) getActivity()).getTitleBarBottom();
titleBar.setTitleLeftDraw(getResources().getDrawable(R.drawable.loading_01));
titleBar.setTitle("正在连接中...");
if (sessionType==SessionTypeEnum.Team){
titleBar.setRightIcon(getContext().getDrawable(R.drawable.platform_common_more));
}
fl_container = rootView.findViewById(R.id.message_activity_list_view_container);
v_chattips = rootView.findViewById(R.id.v_chattips);
......@@ -318,9 +317,27 @@ public class YDLMessageFragment extends TFragment implements ModuleProxy {
}
//如果是群聊
if (SessionTypeEnum.Team==sessionType){
titleBar.setRightIcon(getContext().getDrawable(R.drawable.platform_common_more));
rela_zixun.setVisibility(View.GONE);
titleBar.setTitleRightDraw(null);
}
// 判断最近一次发送消息的时间是否大于24小时
long time = System.currentTimeMillis()-SPUtils.getInstance().getLong(ModularServiceManager.INSTANCE.provide(IUserService.class).getUserInfo().getUid(),0L);
if (time==0L||time>24*60*60*1000){ //如果等于0或者大于则请求首问语接口
// 获取首问语数据
ServiceImpl.Companion.getInstance().getFirstQuestion()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(res -> {
if (res.code.equals("200")){
if (!res.data.getObjects().isEmpty()){
inputPanel.setFirstQuestion(res.data.getObjects());
}
}
}, throwable -> {
ToastUtil.toastShort(throwable.getMessage());
});
}
}
......@@ -429,8 +446,8 @@ public class YDLMessageFragment extends TFragment implements ModuleProxy {
}, throwable -> {
});
}
}
/**
* 是否隐藏输入框相关控件
*/
......
......@@ -26,7 +26,13 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.SPUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.media.record.AudioRecorder;
import com.netease.nimlib.sdk.media.record.IAudioRecordCallback;
......@@ -40,9 +46,13 @@ import com.netease.nimlib.sdk.msg.model.CustomNotificationConfig;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.tbruyelle.rxpermissions2.Permission;
import com.tbruyelle.rxpermissions2.RxPermissions;
import com.ydl.ydlcommon.modular.ModularServiceManager;
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils;
import com.yidianling.common.tools.ToastUtil;
import com.yidianling.im.R;
import com.yidianling.im.bean.ContentBean;
import com.yidianling.im.event.MultipleSelectedEvent;
import com.yidianling.im.ui.adapter.FirstQuestionAdapter;
import com.yidianling.nimbase.api.UIKitOptions;
import com.yidianling.nimbase.api.model.session.SessionCustomization;
import com.yidianling.nimbase.business.session.actions.BaseAction;
......@@ -58,8 +68,10 @@ import com.yidianling.uikit.api.NimUIKit;
import com.yidianling.uikit.api.NimUIKitImpl;
import com.yidianling.uikit.business.ait.AitTextChangeListener;
import com.yidianling.uikit.custom.widget.SafeHelpRemindDialog;
import com.yidianling.user.api.service.IUserService;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import de.greenrobot.event.EventBus;
......@@ -112,6 +124,11 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
/***贴图表情控件*/
protected EmoticonPickerView emoticonPickerView;
/**首问语相关控件*/
public ConstraintLayout clFirstQuestion;
public RecyclerView rvFirstQuestion;
private FirstQuestionAdapter firstQuestionAdapter;
/***语音*/
protected AudioRecorder audioMessageHelper;
private Chronometer time;
......@@ -148,6 +165,8 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
private Boolean onlyShowInputTest=false;//灵犀2.0 点击其他的时候隐藏除输入框以外的其他内容
private String uid;
/***设置输入框内容*/
public void setInputContent(String content) {
messageEditText.setText(content == null ? "" : content);
......@@ -218,6 +237,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
}
private void init() {
uid = ModularServiceManager.INSTANCE.provide(IUserService.class).getUserInfo().getUid();
initViews();
initInputBarListener();
initTextEdit();
......@@ -276,6 +296,35 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
textAudioSwitchLayout.setVisibility(View.GONE);
}
initVoice();
// 首问语控件初始化
initFirstQuestion();
}
private void initFirstQuestion() {
clFirstQuestion = view.findViewById(R.id.cl_first_question);
rvFirstQuestion = view.findViewById(R.id.rv_first_question);
firstQuestionAdapter = new FirstQuestionAdapter(new ArrayList<>());
rvFirstQuestion.setLayoutManager(new LinearLayoutManager(context));
rvFirstQuestion.setAdapter(firstQuestionAdapter);
firstQuestionAdapter.setOnItemClickListener((adapter, view, position) -> {
String content = firstQuestionAdapter.getData().get(position).getContent();
// 埋点
ActionCountUtils.Companion.baiDuCountSign3("counselor_consult_page","quick_language_click",content,"","");
// 根据uid记录每次发消息的时间戳
SPUtils.getInstance().put(uid,System.currentTimeMillis());
onTextMessageSendButtonPressed(content);
clFirstQuestion.setVisibility(View.GONE);
});
}
/**
* 设置首问语数据
* @param data
*/
public void setFirstQuestion(List<ContentBean> data){
clFirstQuestion.setVisibility(View.VISIBLE);
firstQuestionAdapter.getData().addAll(data);
firstQuestionAdapter.notifyDataSetChanged();
}
private void initVoice() {
......@@ -446,6 +495,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
// 点击edittext,切换键盘和更多布局
private void switchToTextLayout(boolean needShowInput) {
hideEmojiLayout();
hideFirstQuestionLayout();
hideActionPanelLayout();
audioRecordBtn.setVisibility(View.GONE);
......@@ -500,8 +550,10 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
* 替换之后最终发送的字符串
*/
private void onTextMessageSendButtonClick() {
IMMessage textMessage = createTextMessage(sendText);
// 根据uid记录每次发消息的时间戳
SPUtils.getInstance().put(uid,System.currentTimeMillis());
IMMessage textMessage = createTextMessage(sendText);
if (container.proxy.sendMessage(textMessage)) {
restoreText(true);
}
......@@ -605,6 +657,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
messageEditLL.setVisibility(View.GONE);
hideInputMethod();
hideEmojiLayout();
hideFirstQuestionLayout();
hideActionPanelLayout();
switchToAudioButtonInInputBar.setVisibility(View.GONE);
......@@ -644,6 +697,16 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
}
/**
* 隐藏首问语布局
*/
public void hideFirstQuestionLayout(){
uiHandler.removeCallbacks(showFirstQuestionRunnable);
if (clFirstQuestion != null) {
clFirstQuestion.setVisibility(View.GONE);
}
}
/**
* 隐藏更多布局
*/
private void hideActionPanelLayout() {
......@@ -704,6 +767,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
* 显示表情布局
*/
private void showEmojiLayout() {
hideFirstQuestionLayout();
hideInputMethod();
hideActionPanelLayout();
hideAudioLayout();
......@@ -752,6 +816,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
*/
private void showActionPanelLayout() {
hideEmojiLayout();
hideFirstQuestionLayout();
hideInputMethod();
uiHandler.postDelayed(showMoreFuncRunnable, SHOW_LAYOUT_DELAY);
......@@ -765,6 +830,13 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
}
};
private Runnable showFirstQuestionRunnable = new Runnable() {
@Override
public void run() {
clFirstQuestion.setVisibility(View.VISIBLE);
}
};
private Runnable showMoreFuncRunnable = new Runnable() {
@Override
public void run() {
......@@ -875,6 +947,7 @@ public class InputPanel implements IEmoticonSelectedListener, IAudioRecordCallba
hideInputMethod();
hideActionPanelLayout();
hideEmojiLayout();
hideFirstQuestionLayout();
}
};
}
......
......@@ -4,6 +4,7 @@ import com.ydl.ydlcommon.base.config.YDL_DOMAIN
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.yidianling.im.bean.BusyBean
import com.yidianling.im.bean.FirstQuestionBean
import com.yidianling.uikit.custom.http.response.*
import com.yidianling.uikit.custom.http.response.question.QuestionsInfoBean
import io.reactivex.Observable
......@@ -115,10 +116,13 @@ interface ServiceApi {
//答题
@POST("cms/exam/api/v1/exams/{id}/lingxi/answer-question")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun answerQuestion(
@Path("id") id: String,
@Body body: RequestBody
): Observable<BaseAPIResponse<String>>
fun answerQuestion(@Path("id") id: String, @Body body: RequestBody): Observable<BaseAPIResponse<String>>
/**
* 获取首问语
*/
@POST("dmp/v1/clouddata/schemas/lingxi_quick_replies/query")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA,"X-App-Id: crm_cloud")
fun getFirstQuestion( @Body map: Map<String,@JvmSuppressWildcards Any>): Observable<BaseAPIResponse<FirstQuestionBean>>
}
\ No newline at end of file
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.im.bean.BusyBean
import com.yidianling.im.bean.FirstQuestionBean
import com.yidianling.im.http.ImRetrofitApi
import com.yidianling.uikit.custom.http.response.*
import com.yidianling.uikit.custom.http.response.question.QuestionsInfoBean
......@@ -188,4 +189,15 @@ class ServiceImpl private constructor() {
return YDLHttpUtils.obtainApi(ImRetrofitApi::class.java).batchSendCustomizeMessage(body)
}
/**
* 获取首问语
*/
fun getFirstQuestion(): Observable<BaseAPIResponse<FirstQuestionBean>> {
val filterMap = HashMap<String,Any>()
filterMap["type"] = 1
val map = HashMap<String,Any>()
map["filter"] = filterMap
return YDLHttpUtils.obtainApi(ServiceApi::class.java).getFirstQuestion(map)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_question_name"
android:layout_width="match_parent"
android:layout_height="48dp"
tools:text="我感觉自己心里有抑郁倾向"
android:gravity="center_vertical"
android:paddingStart="12dp"
android:textSize="14sp"
android:textColor="#16263D"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/platform_color_F2F2F2" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/messageActivityBottomLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/im_nim_message_activity_text_layout" />
<com.yidianling.nimbase.business.session.emoji.EmoticonPickerView
android:id="@+id/emoticon_picker_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/messageActivityBottomLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/im_nim_message_activity_text_layout" />
<com.yidianling.nimbase.business.session.emoji.EmoticonPickerView
android:id="@+id/emoticon_picker_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cl_first_question"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:background="@color/white"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="46dp"
android:gravity="center_vertical"
android:paddingStart="12dp"
android:text="您可以试试这样描述您的问题:"
app:layout_constraintTop_toTopOf="parent"
android:textColor="@color/platform_color_999999"
android:textSize="13sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="46dp"
android:background="@color/platform_color_F2F2F2" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_first_question"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintHeight_default="wrap"
app:layout_constraintHeight_max="200dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="47dp"
app:layout_constraintBottom_toBottomOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textMessageLayout"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/platform_color_F7F7F7"
android:gravity="center_vertical">
<!--android:paddingTop="@dimen/bottom_component_margin_vertical"-->
<!--android:paddingBottom="@dimen/bottom_component_margin_vertical"-->
android:id="@+id/textMessageLayout"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/platform_color_F7F7F7"
android:gravity="center_vertical">
<FrameLayout
android:id="@+id/switchLayout"
android:layout_width="wrap_content"
......@@ -42,6 +41,7 @@
<Button
android:id="@+id/audioRecord"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
......@@ -52,7 +52,6 @@
android:textColor="@color/color_3D3D3D"
android:textSize="15sp"
android:textStyle="bold"
style="?android:attr/borderlessButtonStyle"
android:visibility="gone" />
</FrameLayout>
......@@ -75,10 +74,10 @@
android:layout_gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:hint="隐私保密,安心咨询"
android:layout_weight="1"
android:autoLink="all"
android:background="#ffffff"
android:hint="隐私保密,安心咨询"
android:maxHeight="72dp"
android:maxLines="4"
android:textColorHint="#CCCCCC"
......@@ -114,17 +113,17 @@
android:scaleType="center" />
<TextView
android:id="@+id/buttonSendMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/platform_bg_radius_5"
android:contentDescription="@string/im_empty"
android:gravity="center"
android:padding="5dp"
android:text="@string/im_send"
android:textColor="@color/platform_but_text_color"
android:textSize="14sp" />
android:id="@+id/buttonSendMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/platform_bg_radius_5"
android:contentDescription="@string/im_empty"
android:gravity="center"
android:padding="5dp"
android:text="@string/im_send"
android:textColor="@color/platform_but_text_color"
android:textSize="14sp" />
</FrameLayout>
</RelativeLayout>
......@@ -613,7 +613,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone" />
android:visibility="gone"
/>
<include
layout="@layout/im_nim_message_activity_bottom_layout" />
</LinearLayout>
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