Commit 7f627417 by 刘鹏

Merge remote-tracking branch 'origin/new_dev_4.3.91' into new_dev_4.3.91

# Conflicts:
#	config.gradle
parents 493da86b e2c30018
......@@ -21,9 +21,9 @@ import java.util.List;
public final class DemoGlobalConfig implements IConfigModule {
String APP_DOMAIN = "https://api.github.com/";
// public static String appEnv = YDLConstants.ENV_AUTO_TEST;
public static String appEnv = YDLConstants.ENV_TEST;
// public static String appEnv = YDLConstants.ENV_TEST;
// public static String appEnv = YDLConstants.ENV_NEW_TEST;//配置未上传到maven库
// public static String appEnv = YDLConstants.ENV_PROD;
public static String appEnv = YDLConstants.ENV_PROD;
@Override
public void injectAppLifecycle(@NotNull Context context, @NotNull List<IAppLifecycles> lifecycles) {
lifecycles.add(new DemoAppLifecycles());
......
apply from: "config.gradle"
buildscript {
ext.kotlin_version = '1.3.50'
ext {
kotlin_version = '1.3.21'
kotlin_version = '1.3.50'
support_version = '26.1.0'
minSdkVersion = 21
targetSdkVersion = 28
......@@ -16,50 +15,27 @@ buildscript {
constrait_support_version = '1.0.2'
}
repositories {
google()
//壹点灵android maven私服 开发版
maven {
url 'http://nexus.yidianling.com/repository/AndroidRepository/'
credentials {
username "admin"
password "fjoi#1+#@"
}
}
maven {
url 'http://nexus.yidianling.com/repository/AndroidReleases/'
url 'http://nexus.yidianling.com/repository/android/'
credentials {
username "admin"
password "fjoi#1+#@"
}
}
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
// maven {
// url 'https://dl.bintray.com/zouyuhan/maven'
// }
mavenCentral()
google()
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
//Umeng sdk maven 地址
maven { url 'https://repo1.maven.org/maven2/'}
mavenLocal()
// maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
classpath 'com.meituan.android.walle:plugin:1.1.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.meituan.robust:gradle-plugin:0.4.87'
classpath 'com.meituan.robust:auto-patch-plugin:0.4.87'
//bugly 符号表
classpath 'com.tencent.bugly:symtabfileuploader:2.2.1'
//微信资源混淆
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.16'
classpath 'com.ydl.plugins:modular:1.0.3'
classpath 'com.ydl:notracepoint-gradle-plugin:0.0.3'
classpath 'com.ydl.plugins:restools:0.0.1'
classpath 'com.ydl.plugins:restools:1.0.1'
classpath 'com.jakewharton:butterknife-gradle-plugin:9.0.0-rc1'
}
}
......@@ -68,34 +44,16 @@ allprojects {
repositories {
//壹点灵android maven私服 开发版
maven {
url 'http://nexus.yidianling.com/repository/AndroidRepository/'
credentials {
username "admin"
password "fjoi#1+#@"
}
}
maven {
url 'http://nexus.yidianling.com/repository/AndroidReleases/'
url 'http://nexus.yidianling.com/repository/android/'
credentials {
username "admin"
password "fjoi#1+#@"
}
}
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
// maven { url'http://developer.huawei.com/repo/' }
maven { url "https://jitpack.io" }
maven {
// url 'https://maven.google.com'
url'https://dl.google.com/dl/android/maven2/'
}
// maven {
// url 'https://dl.bintray.com/zouyuhan/maven'
// }
mavenCentral()
google()
jcenter()
maven { url 'https://maven.aliyun.com/repository/releases' }
//Umeng sdk maven 地址
maven { url 'https://repo1.maven.org/maven2/'}
mavenLocal()
}
}
......
......@@ -6,9 +6,11 @@ ext {
// -------------- 业务模块 --------------
//第三步 若干
"m-confide" : "0.0.49.69",
"m-consultant" : "0.0.60.19",
"m-consultant" : "0.0.60.20",
"m-fm" : "0.0.30.08",
"m-user" : "0.0.62.04",
"m-home" : "0.0.23.18",
"m-im" : "0.0.21.30",
"m-home" : "0.0.23.35",
"m-im" : "0.0.21.30",
"m-dynamic" : "0.0.7.35",
......@@ -92,9 +94,11 @@ ext {
//第三步 若干
"m-confide" : "0.0.49.69",
"m-consultant" : "0.0.60.19",
"m-consultant" : "0.0.60.20",
"m-fm" : "0.0.30.08",
"m-user" : "0.0.62.04",
"m-home" : "0.0.23.18",
"m-im" : "0.0.21.30",
"m-home" : "0.0.23.35",
"m-im" : "0.0.21.30",
"m-dynamic" : "0.0.7.35",
......
......@@ -75,9 +75,8 @@ dependencies {
kapt "com.alibaba:arouter-compiler:$arouter_compiler"
api "com.alibaba:arouter-api:$arouter_api"
api ('com.ydl:ydl-av:1.3.4@aar'){
transitive = true
}
implementation "com.ydl:ydl-av:1.3.9"
implementation 'com.volcengine:apm_insight:1.4.6.cn'
if (rootProject.ext.dev_mode){
//开发时使用
......
......@@ -34,6 +34,7 @@ import com.ydl.audioim.player.AudioPlayer
import com.ydl.audioim.presenter.AudioHomePresenterImpl
import com.ydl.audioim.utils.AudioLogUtils
import com.ydl.audioim.utils.DateUtils
import com.ydl.audioim.utils.onConfideEvent
import com.ydl.audioim.widget.AxbConfirmDialog
import com.ydl.audioim.widget.ZDialog
import com.ydl.webview.H5Params
......@@ -55,7 +56,6 @@ import com.ydl.ydlcommon.utils.log.AliYunLogConfig
import com.ydl.ydlcommon.utils.log.AliYunRichLogsHelper
import com.ydl.ydlcommon.utils.log.LogHelper
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.yidianling.common.tools.ToastUtil
import com.yidianling.user.api.service.IUserService
import de.greenrobot.event.EventBus
import io.agora.rtc.Constants
......@@ -262,6 +262,7 @@ class AudioHomeActivity :
override fun onJoinChannelSuccess(channel: String?, uid: Int, elapsed: Int) {
super.onJoinChannelSuccess(channel, uid, elapsed)
onMeJoined()
callEventSave("20", "$uid 用户声网加入频道成功:channel=$channel")
LogUtil.e("[agora]$uid 用户声网加入频道成功:channel=$channel")
......@@ -349,6 +350,7 @@ class AudioHomeActivity :
super.onUserJoined(uid, elapsed)
callEventSave("20", "${uid}加入频道回调")
LogUtil.e("[agora]远端用户/主播加入频道回调")
onPeerJoined()
AliYunRichLogsHelper.getInstance()
.sendRichLog(AliYunLogConfig.AGORA, "远端用户/主播加入频道回调")
}
......@@ -795,6 +797,7 @@ class AudioHomeActivity :
fun rtcCall() {
YDLavManager.instances.rtcCall(listenerUid, channelId, sendDoctocrMsg)
onStartCall()
}
/**
......@@ -1411,4 +1414,24 @@ class AudioHomeActivity :
) {
YDLavManager.instances.callEventSave(status,res , session, line)
}
private fun onStartCall() {
val dimension = hashMapOf("conversation" to "start_call", "call" to "call_start")
onConfideEvent(dimension, channelId)
}
private fun onMeJoined() {
val dimension = hashMapOf("conversation" to "me_joined")
onConfideEvent(dimension, channelId)
}
fun onPeerAccepted() {
val dimension = hashMapOf("conversation" to "peer_accepted", "call" to "call_accepted")
onConfideEvent(dimension, channelId)
}
private fun onPeerJoined() {
val dimension = hashMapOf("conversation" to "peer_joined")
onConfideEvent(dimension, channelId)
}
}
......@@ -6,6 +6,7 @@ import android.os.Handler
import android.text.TextUtils
import android.util.Log
import com.alibaba.android.arouter.launcher.ARouter
import com.bytedance.apm.insight.ApmInsightAgent
import com.google.gson.Gson
import com.ydl.audioim.bean.AgoraInvitationBean
import com.ydl.audioim.http.AudioApiRequestUtil
......@@ -13,6 +14,7 @@ import com.ydl.audioim.http.command.ConnectExceptionCommand
import com.ydl.audioim.router.AudioImIn
import com.ydl.audioim.utils.AudioLogUtils
import com.ydl.audioim.utils.AudioLogUtils.Companion.writeAgoraLog
import com.ydl.audioim.utils.onConfideEvent
import com.ydl.consultantim.ConsultantAudioHomeActivity
import com.ydl.ydl_av.messge_service.YDLRTMClient
import com.ydl.ydl_av.messge_service.bean.RTMMesssage
......@@ -41,6 +43,7 @@ import io.agora.rtm.RtmStatusCode.ConnectionChangeReason.CONNECTION_CHANGE_REASO
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import org.json.JSONObject
import java.util.*
import java.util.concurrent.TimeUnit
......@@ -99,6 +102,8 @@ class YDLavManager {
"${response?.calleeId}已收到呼叫邀请,频道号${response?.ChannelId}"
)
val dimension = hashMapOf("call" to "call_received_by_peer")
onConfideEvent(dimension, response?.ChannelId)
val act = ActivityManager.getInstance().getTopTaskActivity()
if (act is AudioHomeActivity) {
act.runOnUiThread {
......@@ -120,6 +125,7 @@ class YDLavManager {
if (act is AudioHomeActivity) {
act.runOnUiThread {
act.joinChannel()
act.onPeerAccepted()
}
}
}
......@@ -131,6 +137,8 @@ class YDLavManager {
AliYunLogConfig.AGORA,
"${response?.calleeId}已拒绝呼叫邀请"
)
val dimension = hashMapOf("call" to "call_refused")
onConfideEvent(dimension, response?.ChannelId)
val act = ActivityManager.getInstance().getTopTaskActivity()
if (act is AudioHomeActivity) {
act.runOnUiThread {
......@@ -152,6 +160,8 @@ class YDLavManager {
AliYunLogConfig.AGORA,
"主叫已取消呼叫邀请"
)
val dimension = hashMapOf("call" to "call_canceled")
onConfideEvent(dimension, response?.ChannelId)
val act = ActivityManager.getInstance().getTopTaskActivity()
if (act is AudioHomeActivity) {
act.runOnUiThread {
......@@ -168,6 +178,11 @@ class YDLavManager {
AliYunLogConfig.AGORA,
"呼叫${response?.calleeId}用户失败:${response?.response}"
)
val dimension = hashMapOf(
"call" to "call_fail",
"call_fail" to "code${errorCode}"
)
onConfideEvent(dimension, response?.ChannelId)
val act = ActivityManager.getInstance().getTopTaskActivity()
//专家离线或者30 秒后仍未收到专家响应,重新再邀请一次
when (errorCode) {
......
package com.ydl.audioim.utils
import com.apm.insight.log.VLog
import com.bytedance.apm.insight.ApmInsightAgent
import com.ydl.ydlcommon.modular.ModularServiceManager
import org.json.JSONObject
internal fun onConfideEvent(dimension: HashMap<String, String>, channel: String?) {
try {
val uid = ModularServiceManager.getPlatformUserService()?.getUser()?.userId
val ext = JSONObject(mapOf("uid" to uid, "channelId" to (channel ?: "unknown")))
ApmInsightAgent.monitorEvent("confide", dimension, hashMapOf(), ext)
} catch (throwable: Throwable) {
VLog.e("onConfideEvent", throwable.message)
}
}
\ No newline at end of file
......@@ -230,7 +230,13 @@ class ExpertSearchAdapter(
if (it.isNotEmpty()){
for (tag in itemBean.tagList){
val view = LayoutInflater.from(context).inflate(R.layout.consultant_item_tag, holder.ll_tags, false)
view.tvTag.text = tag.tagName
tag.tagName?.let { name ->
if (name.length>4){
view.tvTag.text = "${name.substring(0,4)}…"
}else{
view.tvTag.text = name
}
}
if (tag.isHigh==1){
view.tvTag.setBackgroundResource(R.drawable.consultant_bg_radius_line_eb892c)
view.tvTag.setTextColor(ContextCompat.getColor(context,R.color.color_EB892C))
......
......@@ -8,7 +8,6 @@
android:gravity="center"
android:layout_marginEnd="6dp"
android:padding="3dp"
android:maxLength="5"
android:textColor="@color/platform_color_999999"
android:textSize="10sp"
tools:text="恋爱情感" />
package com.yidianling.dynamic.event
data class dynamicFocusEvent (
var focusState:String
)
\ No newline at end of file
......@@ -42,6 +42,7 @@ import com.yidianling.dynamic.common.net.DynamicApiUtils;
import com.yidianling.dynamic.dialog.CancelFocusDialog;
import com.yidianling.dynamic.event.BlackEvent;
import com.yidianling.dynamic.event.LoginStateEvent;
import com.yidianling.dynamic.event.dynamicFocusEvent;
import com.yidianling.dynamic.model.Command;
import com.yidianling.dynamic.model.MemberInfoBean;
import com.yidianling.dynamic.router.DynamicIn;
......@@ -433,7 +434,9 @@ public class MembersActivity extends BaseActivity implements View.OnClickListene
/**
*
*/
@SuppressLint("CheckResult")
private void Focus() {
showProgressDialog("");
Command.FocusCmd cmd = new Command.FocusCmd(mem_id, "1");
DynamicApiUtils.focus(cmd)
......@@ -450,6 +453,7 @@ public class MembersActivity extends BaseActivity implements View.OnClickListene
fans_count = (fans_counti + 1) + "";
members_top_user_fensi_num_tv.setText("粉丝 " + fans_count);
focus_state = "1";
EventBus.getDefault().post(new dynamicFocusEvent(focus_state));
Drawable drawable = getResources().getDrawable(R.drawable.dynamic_ic_expand);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
members_top_user_focus_ortion_tv.setCompoundDrawablePadding(20);
......@@ -461,6 +465,7 @@ public class MembersActivity extends BaseActivity implements View.OnClickListene
fans_count = (fans_counti - 1) + "";
members_top_user_fensi_num_tv.setText("粉丝 " + fans_count);
focus_state = "2";
EventBus.getDefault().post(new dynamicFocusEvent(focus_state));
members_top_user_focus_ortion_tv.setCompoundDrawables(null, null, null, null);
members_top_user_focus_ortion_tv.setText("+ 关注");
members_top_user_focus_ortion_tv.setTextColor(getResources().getColor(R.color.dynamic_white));
......
......@@ -290,6 +290,11 @@ public class TopicDetailActivity extends BaseMvpActivity<TopicDetailView, TopicD
totalMembers = 0;
topicId = getIntent().getStringExtra("topic_id");
isSplash = getIntent().getBooleanExtra("isSplash", false);
Bundle bundle = getIntent().getBundleExtra("bundle");
if (bundle != null) {
topicId = bundle.getString("topic_id", "44");
isSplash = bundle.getBoolean("isSplash", false);
}
adapter = new TopicDetailMemberAdapter(this);
mFragments = new Fragment[]{TrendListInFragment.newInstance("1", topicId, "default", "0"),
TrendListInFragment.newInstance("2", topicId, "default", "0")};
......
......@@ -24,6 +24,7 @@ import android.text.Html;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.ImageSpan;
import android.util.EventLog;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
......@@ -72,6 +73,8 @@ import com.yidianling.dynamic.R2;
import com.yidianling.dynamic.common.browsePictures.BrowsePicturesActivity2;
import com.yidianling.dynamic.common.emoji.EmoticonPickerView;
import com.yidianling.dynamic.common.emoji.IEmoticonSelectedListener;
import com.yidianling.dynamic.event.LoginStateEvent;
import com.yidianling.dynamic.event.dynamicFocusEvent;
import com.yidianling.dynamic.members.MembersActivity;
import com.yidianling.dynamic.model.CommentBean;
import com.yidianling.dynamic.model.Reply;
......@@ -95,6 +98,7 @@ import java.util.concurrent.TimeUnit;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.greenrobot.event.EventBus;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
......@@ -374,6 +378,7 @@ public class TrendsDetailActivity extends BaseMvpActivity<ITrendsDetailView, ITr
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
setContentView(R.layout.dynamic_activity_trend_details);
ButterKnife.bind(this);
initDatas();
......@@ -1451,8 +1456,18 @@ public class TrendsDetailActivity extends BaseMvpActivity<ITrendsDetailView, ITr
if (subscribe != null) {
subscribe.dispose();
}
EventBus.getDefault().unregister(this);
}
public void onEvent(dynamicFocusEvent event) {
// 1已关注 2关注
if (event.getFocusState().equals("1")){
tvGuanzhu.setVisibility(GONE);
tvGuanzhu.setText("已关注");
}else{
tvGuanzhu.setVisibility(VISIBLE);
tvGuanzhu.setText("关注");
}
}
@NonNull
@Override
public ITrendsDetailPresenterImpl createPresenter() {
......
......@@ -4,10 +4,10 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import android.text.TextUtils
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.RecyclerView
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.media.audio.AudioPlayer
import com.ydl.media.audio.model.Music
......@@ -23,6 +23,7 @@ import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.bean.ShareData
import com.ydl.ydlcommon.data.PlatformRamImpl
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.modular.ModularServiceManager.provide
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.utils.LogUtil
import com.ydl.ydlcommon.utils.Utils
......@@ -110,6 +111,16 @@ open class HomeBaseImpl : IHomeBaseEvent {
mHomeView!!.getConsultData(type.id.toString(), selectPosition)
}
override fun jumpToTopicDetail(topic_id: String) {
val bundle = Bundle()
bundle.putString("topic_id", topic_id)
bundle.putBoolean("isSplash", false)
//动态详情
ARouter.getInstance().build("/topic/detail")
.withBundle("bundle", bundle)
.navigation()
}
private var headerView: View? = null
var mContext: Context? = null
......
......@@ -185,4 +185,10 @@ interface IHomeBaseEvent {
* @param selectPosition 选中的position
*/
fun getConsultData(type: HomeHeaderBean.ConsultCategoryDateBean, selectPosition: Int)
/*
* 跳转话题详情
*
* */
fun jumpToTopicDetail(topic_id:String)
}
\ No newline at end of file
......@@ -67,7 +67,10 @@ class HomeAssuageGriefItemView(private val mContext: Context, private var homeEv
homeModuleAssuageGriefViewTag.text = bean?.askTag
homeModuleAssuageGriefViewCommentsCount.text = bean?.commentsCount.toString()
homeModuleAssuageGriefViewZanCount.text = bean?.zanCount.toString()
ll_topic_detail.setOnClickListener {
//跳转话题详情
homeEvent?.jumpToTopicDetail(bean.topicId.toString())
}
/**
* 点赞
......
......@@ -187,6 +187,7 @@
android:background="@drawable/home_assuage_grief_item_view_tab_back"
android:gravity="center_vertical"
android:orientation="horizontal"
android:id="@+id/ll_topic_detail"
android:paddingLeft="@dimen/platform_dp_7"
android:paddingTop="@dimen/platform_dp_4"
android:paddingRight="@dimen/platform_dp_7"
......
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>
......@@ -5,6 +5,13 @@ def mavenRepositoryUrl = "http://nexus.yidianling.com/repository/AndroidReleases
def getVersionName() {
return hasProperty('VERSION_NAME') ? VERSION_NAME : rootProject.ext.ydlPublishVersion[project.getName()]
}
task sourceJar(type:Jar){
classifier = 'source'
from android.sourceSets.main.java.srcDirs
}
artifacts {
archives sourceJar
}
afterEvaluate { project ->
uploadArchives {
......@@ -16,6 +23,7 @@ afterEvaluate { project ->
repository(url: mavenRepositoryUrl) {
authentication(userName: "admin", password: "fjoi#1+#@")
}
// repository(url:mavenLocal().url)
}
}
}
......
......@@ -75,6 +75,7 @@ dependencies {
//====================YDL Repository====================
// api rootProject.ext.dependencies["ydl-pushagent"]
// api rootProject.ext.dependencies["ydl-hnet"]
implementation 'com.volcengine:apm_insight:1.4.6.cn'
api(rootProject.ext.dependencies["ydl-notracepoint"]) {
transitive = true
exclude group: 'com.google.code.gson', module: 'gson'
......
package com.ydl.ydlcommon.utils.log
import com.aliyun.sls.android.producer.*
import com.apm.insight.log.VLog
import com.ydl.ydlcommon.base.BaseApp.Companion.getApp
import com.ydl.ydlcommon.data.PlatformDataManager.getRam
import com.ydl.ydlcommon.modular.ModularServiceManager.getPlatformUserService
......@@ -45,6 +46,7 @@ class AliYunRichLogsHelper {
* @param value 具体的状态值
* */
fun sendRichLog(key: String, value: String) {
VLog.i(key, value)
val log = Log()
val userInfo = getPlatformUserService()!!.getUser()
......
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