Commit 1d3660dd by Dell

1、修改直播间表情和直播间排版等问题

parent 07b31ccc
......@@ -42,7 +42,7 @@ android {
applicationVariants.all { variant ->
variant.outputs.all {
// outputFileName = "A_v${variant.versionName}_${variant.buildType.name}_id_0_250.apk"
outputFileName = "v${variant.versionName}_${variant.buildType.name}_${releaseTime()}.apk"
outputFileName = "mLive_v${variant.versionName}_${variant.buildType.name}_${releaseTime()}.apk"
}
}
......
......@@ -587,6 +587,12 @@ interface HostUrl {
*/
const val POST_ROOM_SEND_LIST = "room/sendGift"
/**
* 获取历史聊天记录
*/
const val POST_GET_CHAT_HISTORY_MESSAGE = "room/getChatHistoryMessage"
/**
* 获取礼物排行榜
*/
......
......@@ -620,6 +620,13 @@ interface RetrofitService {/*@Field("is_new") int is_new*/
@POST(HostUrl.Companion.POST_ROOM_SEND_LIST)
fun sendGift(@Body requestBody: RequestBody): Observable<BaseBean<String>>
/**
* 历史消息
*/
@POST(HostUrl.Companion.POST_GET_CHAT_HISTORY_MESSAGE)
fun getHistoryMessage(@Body requestBody: RequestBody): Observable<BaseBean<List<HistoryMessageEntity>>>
/**
* 获取赛事列表
*/
......
package com.hupu.tv.player.app.bean
/**
* @author by Dell
* @date on 2022/3/7
* @describe
*/
data class HistoryMessageEntity(
val msgContent: String,
val sendUser: String
)
\ No newline at end of file
......@@ -26,6 +26,7 @@ import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshActivity
import com.hupu.tv.player.app.bean.GiftBean
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.event.*
......@@ -66,16 +67,26 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private var anchorName = ""
private var matchId = ""
private var followNum = ""
var historyList = arrayListOf<HistoryMessageEntity>()
override fun loadData() {
presenter?.getHistoryMessage(roomId)
presenter?.getFakeMessage()
presenter?.getRoomInfo(roomId)
presenter?.getRecommend(roomId,mPage)
}
fun setHistoryList(){
}
override fun setToolbar(builder: BaseToolbar.Builder): BaseToolbar.Builder? {
return null
}
override fun onHistoryMessage(data: List<HistoryMessageEntity>?) {
historyList = data as ArrayList<HistoryMessageEntity>
}
override val layoutId: Int
get() = R.layout.activity_live
......
......@@ -72,7 +72,6 @@ class MainActivity : RefreshActivity<MainActivityPresenter>(), MainActivityConta
showAdDialog()
initTabLayout()
DialogSettings.modalDialog = true
DialogSettings.init()
presenter?.checkUpdate()
EventBus.getDefault().register(this)
......
......@@ -45,6 +45,8 @@ class MatchContentAdapter(layoutResId: Int, private val baseFragment: BaseFragme
if (recyclerView.itemDecorationCount == 0) {
addItemDecoration(baseFragment.activity!!, recyclerView, R.color.view_color, 0.5f, OrientationHelper.VERTICAL)
}
matchContentIncludeAdapter.bindToRecyclerView(recyclerView)
recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = matchContentIncludeAdapter
matchContentIncludeAdapter.setNewData(item.matchInfos)
......
package com.hupu.tv.player.app.ui.adapter
import android.widget.ImageView
import android.widget.TextView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.bean.HistoryMessageEntity
/**
* @author by Dell
* @date on 2022/3/7
* @describe
*/
class MessageHistoryAdapter : BaseQuickAdapter<HistoryMessageEntity, BaseViewHolder>(R.layout.custom_row_received_message) {
override fun convert(helper: BaseViewHolder, item: HistoryMessageEntity) {
helper
.setVisible(R.id.tv_userid,true)
.setText(R.id.tv_userid, "${item.sendUser}:")
.setText(R.id.tv_chatcontent, item.msgContent)
.getView<ImageView>(R.id.iv_level).setImageResource(R.mipmap.icon_user_level_25)
}
}
\ No newline at end of file
package com.hupu.tv.player.app.ui.contact
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.softgarden.baselibrary.base.IBaseDisplay
import com.hupu.tv.player.app.bean.RoomInfoBean
......@@ -15,6 +16,7 @@ interface LiveActivityContact {
fun onFollowAnchor(msg:String,status:Boolean)
fun onSendGift(id:Int,position:Int)
fun onRecommend(data: LiveBean?)
fun onHistoryMessage(data:List<HistoryMessageEntity>?)
}
......@@ -25,5 +27,6 @@ interface LiveActivityContact {
fun unFollowAnchor(id:String)
fun getRecommend(id:String,pageNum:Int)
fun sendGift (giftId:Int,roomId:String,giftPosition:Int)
fun getHistoryMessage(id:String)
}
}
\ No newline at end of file
......@@ -15,16 +15,15 @@ import android.widget.RelativeLayout;
import androidx.annotation.Nullable;
import com.hupu.tv.player.app.bean.FakeMessageEntity;
import com.hupu.tv.player.app.bean.HistoryMessageEntity;
import com.hupu.tv.player.app.ui.activity.LiveActivity;
import com.hupu.tv.player.app.widget.CustomEaseChatMessageListLayout;
import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.interfaces.EaseChatRoomListener;
import com.hyphenate.easeui.modules.chat.EaseChatFragment;
import com.hyphenate.easeui.modules.chat.EaseChatMessageListLayout;
import com.hyphenate.easeui.modules.chat.interfaces.OnRecallMessageResultListener;
import com.hyphenate.easeui.modules.chat.presenter.IChatMessageListView;
import com.hyphenate.easeui.modules.menu.EasePopupWindowHelper;
import com.hyphenate.easeui.modules.menu.MenuItemBean;
import com.hyphenate.util.EMLog;
......@@ -35,8 +34,7 @@ import com.hupu.tv.player.app.app.Constants;
import com.hupu.tv.player.app.bean.LiveUserBean;
import com.hupu.tv.player.app.widget.danmuku.CustomChatPrimaryMenu;
import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Random;
......@@ -59,12 +57,12 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
@Override
public void initView() {
super.initView();
userHxId = getArguments().getString(Constants.USER_HX_ID,"");
userHxId = getArguments().getString(Constants.USER_HX_ID, "");
liveUserName = getArguments().getString(Constants.LIVE_ROOM_USER_NAME);
liveRoomName = getArguments().getString(Constants.LIVE_ROOM_NAME);
chatLayout.getChatMessageListLayout().setItemShowType(EaseChatMessageListLayout.ShowType.LEFT);
chatLayout.getChatMessageListLayout().setBackgroundColor(getContext().getColor(R.color.background_f5));
chatLayout.getChatMessageListLayout().setLiveName("欢迎来到"+liveRoomName+"直播间");
chatLayout.getChatMessageListLayout().setLiveName("欢迎来到" + liveRoomName + "直播间");
customChatPrimaryMenu = new CustomChatPrimaryMenu(getContext());
chatLayout.getChatInputMenu().setCustomPrimaryMenu(customChatPrimaryMenu);
clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
......@@ -118,7 +116,9 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
chatMessageListLayout.setOnJoinRoomListener(new CustomEaseChatMessageListLayout.OnJoinRoomListener() {
@Override
public void onJoinRoomSuccess() {
sendJoinRoomData();
importHistory();
}
@Override
......@@ -138,13 +138,41 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
if (!isSend) {
boolean isLogin = (boolean) SPUtil.Companion.get(Constants.USER_LOGIN, false);
if (isLogin) {
chatLayout.sendTextMessage("进入直播间");
sendFakeMessage();
isSend = true;
}
}
}
private void importHistory() {
LiveConversationFragment parentFragment = (LiveConversationFragment) getParentFragment();
LiveActivity activity = (LiveActivity) parentFragment.getActivity();
if (activity != null) {
chatLayout.getChatMessageListLayout().setHistoryListData(activity.getHistoryList());
}
// if (activity != null) {
// ArrayList<HistoryMessageEntity> historyList = activity.getHistoryList();
// ArrayList<EMMessage> emMessages = new ArrayList<>();
// for (HistoryMessageEntity entity : historyList) {
// EMMessage msg = EMMessage.createSendMessage(EMMessage.Type.TXT);
// EMTextMessageBody body = new EMTextMessageBody(entity.getMsgContent());
// msg.addBody(body);
// msg.setTo(userHxId);
// msg.setFrom(entity.getSendUser());
// msg.setMsgTime(System.currentTimeMillis());
// msg.setAttribute(Constants.USER_NICK, entity.getSendUser());
// msg.setIsNeedGroupAck(false);
// msg.setChatType(EMMessage.ChatType.ChatRoom);
// emMessages.add(msg);
// }
// EMClient.getInstance().chatManager().importMessages(emMessages);
// }
}
private void sendFakeMessage() {
FakeMessageEntity fakeMessage = SPUtil.Companion.getSerializableObject(Constants.FAKE_MESSAGE);
if (fakeMessage != null) {
......
......@@ -87,6 +87,7 @@ class FollowMatchFragment : ToolbarFragment<FollowMatchPresenter>(), FollowMatch
matchContentAdapter = FollowMatchContentAdapter(R.layout.item_match_content, this, 0)
mRecyclerView?.adapter = matchContentAdapter
mRecyclerView?.layoutManager = LinearLayoutManager(activity)
matchContentAdapter?.bindToRecyclerView(mRecyclerView!!)
}
......
......@@ -45,7 +45,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres
args.putString(EaseConstant.EXTRA_CONVERSATION_ID, conversationId)
args.putString(Constants.USER_HX_ID, userHxId)
args.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_CHATROOM)
args.putBoolean(EaseConstant.EXTRA_IS_ROAM, true)
args.putBoolean(EaseConstant.EXTRA_IS_ROAM, false)
args.putString(Constants.LIVE_NOTICE, notice)
args.putString(Constants.LIVE_ROOM_USER_NAME, userName)
args.putString(Constants.LIVE_ROOM_NAME, roomName)
......@@ -102,7 +102,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres
val bundle = Bundle()
bundle.putString(EaseConstant.EXTRA_CONVERSATION_ID, arguments?.getString(EaseConstant.EXTRA_CONVERSATION_ID))
bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_CHATROOM)
bundle.putBoolean(EaseConstant.EXTRA_IS_ROAM, true)
bundle.putBoolean(EaseConstant.EXTRA_IS_ROAM, false)
bundle.putString(Constants.LIVE_ROOM_USER_NAME, liveUserName)
bundle.putString(Constants.USER_HX_ID, arguments?.getString(Constants.USER_HX_ID))
bundle.putString(Constants.LIVE_ROOM_NAME, arguments?.getString(Constants.LIVE_ROOM_NAME))
......
......@@ -15,6 +15,7 @@ import com.softgarden.baselibrary.utils.RecyclerViewUtil
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshFragment
import com.hupu.tv.player.app.base.RefreshVP2Fragment
import com.hupu.tv.player.app.base.ToolbarFragment
import com.hupu.tv.player.app.bean.*
......@@ -48,7 +49,7 @@ import org.greenrobot.eventbus.ThreadMode
* @date on 2020/6/14
* @describe
*/
class MainContentAllFragment : RefreshVP2Fragment<MainContentAllPresenter>(), MainContentAllContract.Display {
class MainContentAllFragment : RefreshFragment<MainContentAllPresenter>(), MainContentAllContract.Display {
private var sportId: String = ""
private var liveItemAdapter: LiveItemAdapter? = null
private var liveTopAdapter: LiveTopAdapter? = null
......
......@@ -10,6 +10,7 @@ import com.softgarden.baselibrary.utils.L
import com.softgarden.baselibrary.utils.RecyclerViewUtil
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.base.RefreshFragment
import com.hupu.tv.player.app.base.RefreshVP2Fragment
import com.hupu.tv.player.app.base.ToolbarFragment
import com.hupu.tv.player.app.bean.CategoryBean
......@@ -36,7 +37,7 @@ import org.greenrobot.eventbus.ThreadMode
* @date on 2020/6/14
* @describe
*/
class MainContentNormalFragment : RefreshVP2Fragment<MainContentNormalPresenter>(), MainContentNormalContract.Display {
class MainContentNormalFragment : RefreshFragment<MainContentNormalPresenter>(), MainContentNormalContract.Display {
private var imageCarousel: ImageCarousel? = null
private var liveItemAdapter: LiveItemAdapter? = null
private var sportId: String = ""
......
......@@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import com.flyco.tablayout.utils.FragmentBasePager2Adapter
import com.kongzue.dialog.v3.WaitDialog
import com.softgarden.baselibrary.base.FragmentBaseStatePagerAdapter
......@@ -55,10 +56,10 @@ class MainFragment : RefreshFragment<MainFragmentPresenter>(), MainFragmentConta
}
}
val mAdapter = FragmentBasePager2Adapter(childFragmentManager, mFragments, mTitles,lifecycle)
val mAdapter = FragmentBaseStatePagerAdapter(childFragmentManager, mFragments, mTitles)
vp_main.offscreenPageLimit = list.size
vp_main.adapter = mAdapter
tabLayout_main.setViewPager2(vp_main)
tabLayout_main.setViewPager(vp_main)
}
......
package com.hupu.tv.player.app.ui.im;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.blankj.utilcode.util.SpanUtils;
import com.hupu.tv.player.app.utils.CommonUtils;
import com.hupu.tv.player.app.widget.CustomEaseSmileUtils;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.modules.chat.EaseChatMessageListLayout;
import com.hyphenate.easeui.modules.chat.model.EaseChatItemStyleHelper;
import com.hyphenate.easeui.modules.chat.model.EaseChatSetStyle;
......@@ -24,6 +37,7 @@ import com.hupu.tv.player.app.app.Constants;
public class CustomTextRow extends EaseChatRowText {
private TextView tvLevel;
private ImageView ivLevel;
private TextView contentView;
public CustomTextRow(Context context, boolean isSender) {
super(context, isSender);
......@@ -38,6 +52,7 @@ public class CustomTextRow extends EaseChatRowText {
super.onFindViewById();
tvLevel = findViewById(R.id.tv_level);
ivLevel = findViewById(R.id.iv_level);
contentView = findViewById(R.id.tv_chatcontent);
}
@Override
......@@ -48,6 +63,24 @@ public class CustomTextRow extends EaseChatRowText {
}
@SuppressLint("UseCompatLoadingForDrawables")
@Override
public void onSetUpView() {
EMTextMessageBody txtBody = (EMTextMessageBody) message.getBody();
Spannable span = CustomEaseSmileUtils.getSmiledText(context, CommonUtils.INSTANCE.replaceBlank(txtBody.getMessage()));
// 设置内容
String userNick = message.getStringAttribute(Constants.USER_NICK, message.getFrom());
int level = message.getIntAttribute(Constants.USER_LEVEL, 1);
SpannableStringBuilder content = SpanUtils
.with(contentView)
.appendImage(getLevel(level),SpanUtils.ALIGN_CENTER)
.append(userNick+":")
.setForegroundColor(getContext().getColor(R.color.user_nick))
.append(span)
.create();
contentView.setText(content, TextView.BufferType.SPANNABLE);
}
@Override
protected void setAvatarOptions(EaseChatSetStyle itemStyle) {
super.setAvatarOptions(itemStyle);
......@@ -61,30 +94,30 @@ public class CustomTextRow extends EaseChatRowText {
@Override
protected void setAvatarAndNick() {
String userNick = message.getStringAttribute(Constants.USER_NICK, message.getFrom());
int level = message.getIntAttribute(Constants.USER_LEVEL, 1);
userNick = userNick.replace("\n", "");
if (isSender()) {
EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView);
//只要不是常规布局形式,就展示昵称
if (EaseChatItemStyleHelper.getInstance().getStyle().getItemShowType() != EaseChatMessageListLayout.ShowType.NORMAL.ordinal()) {
EaseUserUtils.setUserNick(userNick + ":", usernickView);
setLevel(level);
tvLevel.setText("LV." + level);
}
} else {
//todo 接受来的昵称
EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView);
EaseUserUtils.setUserNick(userNick + ":", usernickView);
setLevel(level);
tvLevel.setText("LV." + level);
}
// String userNick = message.getStringAttribute(Constants.USER_NICK, message.getFrom());
// int level = message.getIntAttribute(Constants.USER_LEVEL, 1);
// userNick = userNick.replace("\n", "");
//
// if (isSender()) {
// EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView);
// //只要不是常规布局形式,就展示昵称
// if (EaseChatItemStyleHelper.getInstance().getStyle().getItemShowType() != EaseChatMessageListLayout.ShowType.NORMAL.ordinal()) {
// EaseUserUtils.setUserNick(userNick + ":", usernickView);
// setLevel(level);
// tvLevel.setText("LV." + level);
//
// }
// } else {
// //todo 接受来的昵称
//
// EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView);
// EaseUserUtils.setUserNick(userNick + ":", usernickView);
// setLevel(level);
// tvLevel.setText("LV." + level);
// }
}
private void setLevel(int level) {
private int getLevel(int level) {
int levelIcon = 0;
switch (level) {
case 1:
......@@ -165,7 +198,7 @@ public class CustomTextRow extends EaseChatRowText {
}
ivLevel.setImageResource(levelIcon);
return levelIcon;
}
// @Override
// public void onSetUpView() {
......
......@@ -7,6 +7,7 @@ import com.softgarden.baselibrary.network.RxCallback
import com.hupu.tv.player.app.api.RetrofitClient
import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.bean.FakeMessageEntity
import com.hupu.tv.player.app.bean.HistoryMessageEntity
import com.hupu.tv.player.app.bean.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.ui.contact.LiveActivityContact
......@@ -117,5 +118,18 @@ class LiveActivityPresenter : IBasePresenter, LiveActivityContact.Presenter {
}
override fun getHistoryMessage(id: String) {
val hashMap = HashMap<String, Any>()
hashMap["id"] = id
RetrofitClient.retrofitService
.getHistoryMessage(JsonUtils.toRequestBody(hashMap))
.compose(NetworkTransformer(mView))
.subscribe(object : RxCallback<List<HistoryMessageEntity>>() {
override fun onSuccess(data: List<HistoryMessageEntity>?) {
mView?.onHistoryMessage(data)
}
})
}
}
\ No newline at end of file
......@@ -37,6 +37,8 @@ import java.io.Serializable
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* @author by Dell
......@@ -75,6 +77,16 @@ object CommonUtils {
return collection
}
fun replaceBlank(str: String?): String? {
var dest = ""
if (str != null) {
val p: Pattern = Pattern.compile("\\s*|\t|\r|\n")
val m: Matcher = p.matcher(str)
dest = m.replaceAll("")
}
return dest
}
/**
* 保持屏幕常亮
*/
......
......@@ -65,6 +65,9 @@ object DialogUtils {
if (main?.isNotEmpty() == true){
GlideUtils.loadImage(activity,main[0].picPath,v.findViewById(R.id.iv_img))
}
v.findViewById<ImageView>(R.id.iv_close).setOnClickListener {
dialog.doDismiss()
}
}
}
......
package com.hupu.tv.player.app.widget;
import android.annotation.SuppressLint;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.adapter.EaseBaseChatExtendMenuAdapter;
import com.hyphenate.easeui.interfaces.OnItemClickListener;
public class CustomEaseChatExtendMenuAdapter extends EaseBaseChatExtendMenuAdapter<CustomEaseChatExtendMenuAdapter.ViewHolder, CustomEaseChatExtendMenu.ChatMenuItemModel> {
private OnItemClickListener itemListener;
@Override
protected int getItemLayoutId() {
return R.layout.ease_chat_menu_item;
}
@Override
protected ViewHolder easeCreateViewHolder(View view) {
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") int position) {
CustomEaseChatExtendMenu.ChatMenuItemModel item = mData.get(position);
holder.imageView.setBackgroundResource(item.image);
holder.textView.setText(item.name);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(item.clickListener != null){
item.clickListener.onChatExtendMenuItemClick(item.id, v);
}
if(itemListener != null) {
itemListener.onItemClick(v, position);
}
}
});
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.itemListener = listener;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = (ImageView) itemView.findViewById(R.id.image);
textView = (TextView) itemView.findViewById(R.id.text);
}
}
}
......@@ -90,7 +90,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL
public static final String AT_SUFFIX = " ";
private CustomEaseChatMessageListLayout messageListLayout;
private EaseChatInputMenu inputMenu;
private CustomEaseChatInputMenu inputMenu;
private EaseVoiceRecorderView voiceRecorder;
/**
* "正在输入"功能的开关,打开后本设备发送消息将持续发送cmd类型消息通知对方"正在输入"
......@@ -368,7 +368,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL
}
@Override
public EaseChatInputMenu getChatInputMenu() {
public CustomEaseChatInputMenu getChatInputMenu() {
return inputMenu;
}
......
......@@ -16,12 +16,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.ConcatAdapter;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.hupu.tv.player.app.R;
import com.hupu.tv.player.app.bean.HistoryMessageEntity;
import com.hupu.tv.player.app.ui.adapter.MessageHistoryAdapter;
import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
......@@ -64,6 +67,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
private String msgId;
private int pageSize = DEFAULT_PAGE_SIZE;
private RecyclerView rvList;
private NestedScrollView nestedScroll;
private SwipeRefreshLayout srlRefresh;
private LinearLayoutManager layoutManager;
private EMConversation conversation;
......@@ -90,6 +94,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
private MessageListItemClickListener messageListItemClickListener;
private EaseChatItemStyleHelper chatSetHelper;
MessageHistoryAdapter messageHistoryAdapter;
public CustomEaseChatMessageListLayout(@NonNull Context context) {
this(context, null);
}
......@@ -172,7 +178,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
}
}
public void setLiveName(String liveName){
public void setLiveName(String liveName) {
tvLive.setText(liveName);
}
......@@ -183,11 +189,18 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
rvList = findViewById(R.id.message_list);
srlRefresh = findViewById(R.id.srl_refresh);
nestedScroll = findViewById(R.id.nestedScroll);
RecyclerView recyclerView = findViewById(R.id.top_message);
messageHistoryAdapter = new MessageHistoryAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(messageHistoryAdapter);
srlRefresh.setEnabled(canUseRefresh);
layoutManager = new LinearLayoutManager(getContext());
rvList.setLayoutManager(layoutManager);
baseAdapter = new ConcatAdapter();
messageAdapter = new EaseMessageAdapter();
baseAdapter.addAdapter(messageAdapter);
......@@ -197,6 +210,9 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
initListener();
}
public void setHistoryListData(List<HistoryMessageEntity> list){
messageHistoryAdapter.setNewData(list);
}
public void setOnJoinRoomListener(OnJoinRoomListener onJoinRoomListener) {
this.onJoinRoomListener = onJoinRoomListener;
......@@ -657,8 +673,11 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
@Override
public void showNickname(boolean showNickname) {
chatSetHelper.setShowNickname(showNickname);
notifyDataSetChanged();
if (chatSetHelper!=null){
chatSetHelper.setShowNickname(showNickname);
notifyDataSetChanged();
}
}
@Override
......@@ -828,6 +847,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
((LinearLayoutManager) manager).scrollToPositionWithOffset(position, 0);
//setMoveAnimation(manager, position);
}
nestedScroll.post(() -> nestedScroll.fullScroll(View.FOCUS_DOWN));
}
private void setMoveAnimation(RecyclerView.LayoutManager manager, int position) {
......
package com.hupu.tv.player.app.widget;
import com.hupu.tv.player.app.R;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.domain.EaseEmojicon.Type;
public class CustomEaseDefaultEmojiconDatas {
private static String[] emojis = new String[]{
CustomEaseSmileUtils.ee_1,
CustomEaseSmileUtils.ee_2,
CustomEaseSmileUtils.ee_3,
CustomEaseSmileUtils.ee_4,
CustomEaseSmileUtils.ee_5,
CustomEaseSmileUtils.ee_6,
CustomEaseSmileUtils.ee_7,
CustomEaseSmileUtils.ee_8,
CustomEaseSmileUtils.ee_9,
CustomEaseSmileUtils.ee_10,
CustomEaseSmileUtils.ee_11,
CustomEaseSmileUtils.ee_12,
CustomEaseSmileUtils.ee_13,
CustomEaseSmileUtils.ee_14,
CustomEaseSmileUtils.ee_15,
CustomEaseSmileUtils.ee_16,
CustomEaseSmileUtils.ee_17,
CustomEaseSmileUtils.ee_18,
CustomEaseSmileUtils.ee_19,
CustomEaseSmileUtils.ee_20,
CustomEaseSmileUtils.ee_21,
CustomEaseSmileUtils.ee_22,
CustomEaseSmileUtils.ee_23,
CustomEaseSmileUtils.ee_24,
CustomEaseSmileUtils.ee_25,
CustomEaseSmileUtils.ee_26,
CustomEaseSmileUtils.ee_27,
CustomEaseSmileUtils.ee_28,
CustomEaseSmileUtils.ee_29,
CustomEaseSmileUtils.ee_30,
CustomEaseSmileUtils.ee_31,
CustomEaseSmileUtils.ee_32,
CustomEaseSmileUtils.ee_33,
CustomEaseSmileUtils.ee_34,
CustomEaseSmileUtils.ee_35,
};
private static int[] icons = new int[]{
R.mipmap.ee_1,
R.mipmap.ee_2,
R.mipmap.ee_3,
R.mipmap.ee_4,
R.mipmap.ee_5,
R.mipmap.ee_6,
R.mipmap.ee_7,
R.mipmap.ee_8,
R.mipmap.ee_9,
R.mipmap.ee_10,
R.mipmap.ee_11,
R.mipmap.ee_12,
R.mipmap.ee_13,
R.mipmap.ee_14,
R.mipmap.ee_15,
R.mipmap.ee_16,
R.mipmap.ee_17,
R.mipmap.ee_18,
R.mipmap.ee_19,
R.mipmap.ee_20,
R.mipmap.ee_21,
R.mipmap.ee_22,
R.mipmap.ee_23,
R.mipmap.ee_24,
R.mipmap.ee_25,
R.mipmap.ee_26,
R.mipmap.ee_27,
R.mipmap.ee_28,
R.mipmap.ee_29,
R.mipmap.ee_30,
R.mipmap.ee_31,
R.mipmap.ee_32,
R.mipmap.ee_33,
R.mipmap.ee_34,
R.mipmap.ee_35,
};
private static final EaseEmojicon[] DATA = createData();
private static EaseEmojicon[] createData() {
EaseEmojicon[] datas = new EaseEmojicon[icons.length];
for (int i = 0; i < icons.length; i++) {
datas[i] = new EaseEmojicon(icons[i], emojis[i], Type.NORMAL);
}
return datas;
}
public static EaseEmojicon[] getData() {
return DATA;
}
}
package com.hupu.tv.player.app.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import com.hupu.tv.player.app.R;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.domain.EaseEmojiconGroupEntity;
import com.hyphenate.easeui.modules.chat.interfaces.EaseEmojiconMenuListener;
import com.hyphenate.easeui.modules.chat.interfaces.IChatEmojiconMenu;
import com.hyphenate.easeui.widget.emojicon.EaseEmojiconIndicatorView;
import com.hyphenate.easeui.widget.emojicon.EaseEmojiconPagerView;
import com.hyphenate.easeui.widget.emojicon.EaseEmojiconScrollTabBar;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CustomEaseEmojiconMenu extends LinearLayout implements IChatEmojiconMenu {
private int emojiconColumns;
private int bigEmojiconColumns;
private EaseEmojiconScrollTabBar tabBar;
private EaseEmojiconIndicatorView indicatorView;
private CustomEaseEmojiconPagerView pagerView;
private List<EaseEmojiconGroupEntity> emojiconGroupList = new ArrayList<>();
private EaseEmojiconMenuListener listener;
private static final int defaultColumns = 7;
private static final int defaultBigColumns = 4;
public CustomEaseEmojiconMenu(Context context) {
this(context, null);
}
public CustomEaseEmojiconMenu(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomEaseEmojiconMenu(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater.from(context).inflate(R.layout.custom_ease_widget_emojicon, this);
pagerView = (CustomEaseEmojiconPagerView) findViewById(R.id.pager_view);
indicatorView = (EaseEmojiconIndicatorView) findViewById(R.id.indicator_view);
tabBar = (EaseEmojiconScrollTabBar) findViewById(R.id.tab_bar);
initAttrs(context, attrs);
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.EaseEmojiconMenu);
emojiconColumns = ta.getInt(R.styleable.EaseEmojiconMenu_emojiconColumns, defaultColumns);
bigEmojiconColumns = ta.getInt(R.styleable.EaseEmojiconMenu_bigEmojiconRows, defaultBigColumns);
ta.recycle();
}
public void init() {
init(null);
}
public void init(List<EaseEmojiconGroupEntity> groupEntities){
if(groupEntities == null || groupEntities.size() == 0){
groupEntities = new ArrayList<>();
groupEntities.add(new EaseEmojiconGroupEntity(R.mipmap.ee_1, Arrays.asList(CustomEaseDefaultEmojiconDatas.getData())));
}
for(EaseEmojiconGroupEntity groupEntity : groupEntities){
emojiconGroupList.add(groupEntity);
tabBar.addTab(groupEntity.getIcon());
}
pagerView.setPagerViewListener( new CustomEmojiconPagerViewListener());
pagerView.init(emojiconGroupList, emojiconColumns,bigEmojiconColumns);
tabBar.setTabBarItemClickListener(new EaseEmojiconScrollTabBar.EaseScrollTabBarItemClickListener() {
@Override
public void onItemClick(int position) {
pagerView.setGroupPostion(position);
}
});
}
/**
* add emojicon group
* @param groupEntity
*/
public void addEmojiconGroup(EaseEmojiconGroupEntity groupEntity){
emojiconGroupList.add(groupEntity);
pagerView.addEmojiconGroup(groupEntity, true);
tabBar.addTab(groupEntity.getIcon());
}
/**
* add emojicon group list
* @param groupEntitieList
*/
public void addEmojiconGroup(List<EaseEmojiconGroupEntity> groupEntitieList){
for(int i= 0; i < groupEntitieList.size(); i++){
EaseEmojiconGroupEntity groupEntity = groupEntitieList.get(i);
emojiconGroupList.add(groupEntity);
pagerView.addEmojiconGroup(groupEntity, i == groupEntitieList.size()-1 ? true : false);
tabBar.addTab(groupEntity.getIcon());
}
}
/**
* remove emojicon group
* @param position
*/
public void removeEmojiconGroup(int position){
emojiconGroupList.remove(position);
pagerView.removeEmojiconGroup(position);
tabBar.removeTab(position);
}
public void setTabBarVisibility(boolean isVisible){
if(!isVisible){
tabBar.setVisibility(View.GONE);
}else{
tabBar.setVisibility(View.VISIBLE);
}
}
@Override
public void setEmojiconMenuListener(EaseEmojiconMenuListener listener) {
this.listener = listener;
}
private class CustomEmojiconPagerViewListener implements EaseEmojiconPagerView.EaseEmojiconPagerViewListener {
@Override
public void onPagerViewInited(int groupMaxPageSize, int firstGroupPageSize) {
indicatorView.init(groupMaxPageSize);
indicatorView.updateIndicator(firstGroupPageSize);
tabBar.selectedTo(0);
}
@Override
public void onGroupPositionChanged(int groupPosition, int pagerSizeOfGroup) {
indicatorView.updateIndicator(pagerSizeOfGroup);
tabBar.selectedTo(groupPosition);
}
@Override
public void onGroupInnerPagePostionChanged(int oldPosition, int newPosition) {
indicatorView.selectTo(oldPosition, newPosition);
}
@Override
public void onGroupPagePostionChangedTo(int position) {
indicatorView.selectTo(position);
}
@Override
public void onGroupMaxPageSizeChanged(int maxCount) {
indicatorView.updateIndicator(maxCount);
}
@Override
public void onDeleteImageClicked() {
if(listener != null){
listener.onDeleteImageClicked();
}
}
@Override
public void onExpressionClicked(EaseEmojicon emojicon) {
if(listener != null){
listener.onExpressionClicked(emojicon);
}
}
}
}
package com.hupu.tv.player.app.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.adapter.EmojiconGridAdapter;
import com.hyphenate.easeui.adapter.EmojiconPagerAdapter;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.domain.EaseEmojicon.Type;
import com.hyphenate.easeui.domain.EaseEmojiconGroupEntity;
import com.hyphenate.easeui.utils.EaseSmileUtils;
import com.hyphenate.easeui.widget.emojicon.EaseEmojiconPagerView;
import java.util.ArrayList;
import java.util.List;
public class CustomEaseEmojiconPagerView extends ViewPager {
private Context context;
private List<EaseEmojiconGroupEntity> groupEntities;
private PagerAdapter pagerAdapter;
private int emojiconRows = 3;
private int emojiconColumns = 7;
private int bigEmojiconRows = 2;
private int bigEmojiconColumns = 4;
private int firstGroupPageSize;
private int maxPageCount;
private int previousPagerPosition;
private EaseEmojiconPagerView.EaseEmojiconPagerViewListener pagerViewListener;
private List<View> viewpages;
public CustomEaseEmojiconPagerView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public CustomEaseEmojiconPagerView(Context context) {
this(context, null);
}
public void init(List<EaseEmojiconGroupEntity> emojiconGroupList, int emijiconColumns, int bigEmojiconColumns){
if(emojiconGroupList == null){
throw new RuntimeException("emojiconGroupList is null");
}
this.groupEntities = emojiconGroupList;
this.emojiconColumns = emijiconColumns;
this.bigEmojiconColumns = bigEmojiconColumns;
viewpages = new ArrayList<View>();
for(int i = 0; i < groupEntities.size(); i++){
EaseEmojiconGroupEntity group = groupEntities.get(i);
List<EaseEmojicon> groupEmojicons = group.getEmojiconList();
List<View> gridViews = getGroupGridViews(group);
if(i == 0){
firstGroupPageSize = gridViews.size();
}
maxPageCount = Math.max(gridViews.size(), maxPageCount);
viewpages.addAll(gridViews);
}
pagerAdapter = new EmojiconPagerAdapter(viewpages);
setAdapter(pagerAdapter);
setOnPageChangeListener(new EmojiPagerChangeListener());
if(pagerViewListener != null){
pagerViewListener.onPagerViewInited(maxPageCount, firstGroupPageSize);
}
}
public void setPagerViewListener(EaseEmojiconPagerView.EaseEmojiconPagerViewListener pagerViewListener){
this.pagerViewListener = pagerViewListener;
}
/**
* set emojicon group position
* @param position
*/
public void setGroupPostion(int position){
if (getAdapter() != null && position >= 0 && position < groupEntities.size()) {
int count = 0;
for (int i = 0; i < position; i++) {
count += getPageSize(groupEntities.get(i));
}
setCurrentItem(count);
}
}
/**
* get emojicon group gridview list
* @param groupEntity
* @return
*/
public List<View> getGroupGridViews(EaseEmojiconGroupEntity groupEntity){
List<EaseEmojicon> emojiconList = groupEntity.getEmojiconList();
int itemSize = emojiconColumns * emojiconRows -1;
int totalSize = emojiconList.size();
Type emojiType = groupEntity.getType();
if(emojiType == Type.BIG_EXPRESSION){
itemSize = bigEmojiconColumns * bigEmojiconRows;
}
int pageSize = totalSize % itemSize == 0 ? totalSize/itemSize : totalSize/itemSize + 1;
List<View> views = new ArrayList<View>();
for(int i = 0; i < pageSize; i++){
View view = View.inflate(context, R.layout.ease_expression_gridview, null);
GridView gv = (GridView) view.findViewById(R.id.gridview);
if(emojiType == Type.BIG_EXPRESSION){
gv.setNumColumns(bigEmojiconColumns);
}else{
gv.setNumColumns(emojiconColumns);
}
List<EaseEmojicon> list = new ArrayList<EaseEmojicon>();
if(i != pageSize -1){
list.addAll(emojiconList.subList(i * itemSize, (i+1) * itemSize));
}else{
list.addAll(emojiconList.subList(i * itemSize, totalSize));
}
if(emojiType != Type.BIG_EXPRESSION){
EaseEmojicon deleteIcon = new EaseEmojicon();
deleteIcon.setEmojiText(EaseSmileUtils.DELETE_KEY);
list.add(deleteIcon);
}
final CustomEmojiconGridAdapter gridAdapter = new CustomEmojiconGridAdapter(context, 1, list, emojiType);
gv.setAdapter(gridAdapter);
gv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
EaseEmojicon emojicon = gridAdapter.getItem(position);
if(pagerViewListener != null){
String emojiText = emojicon.getEmojiText();
if(emojiText != null && emojiText.equals(EaseSmileUtils.DELETE_KEY)){
pagerViewListener.onDeleteImageClicked();
}else{
pagerViewListener.onExpressionClicked(emojicon);
}
}
}
});
views.add(view);
}
return views;
}
/**
* add emojicon group
* @param groupEntity
*/
public void addEmojiconGroup(EaseEmojiconGroupEntity groupEntity, boolean notifyDataChange) {
int pageSize = getPageSize(groupEntity);
if(pageSize > maxPageCount){
maxPageCount = pageSize;
if(pagerViewListener != null && pagerAdapter != null){
pagerViewListener.onGroupMaxPageSizeChanged(maxPageCount);
}
}
viewpages.addAll(getGroupGridViews(groupEntity));
if(pagerAdapter != null && notifyDataChange){
pagerAdapter.notifyDataSetChanged();
}
}
/**
* remove emojicon group
* @param position
*/
public void removeEmojiconGroup(int position){
if(position > groupEntities.size() - 1){
return;
}
if(pagerAdapter != null){
pagerAdapter.notifyDataSetChanged();
}
}
/**
* get size of pages
* @param emojiconList
* @return
*/
private int getPageSize(EaseEmojiconGroupEntity groupEntity) {
List<EaseEmojicon> emojiconList = groupEntity.getEmojiconList();
int itemSize = emojiconColumns * emojiconRows -1;
int totalSize = emojiconList.size();
Type emojiType = groupEntity.getType();
if(emojiType == Type.BIG_EXPRESSION){
itemSize = bigEmojiconColumns * bigEmojiconRows;
}
int pageSize = totalSize % itemSize == 0 ? totalSize/itemSize : totalSize/itemSize + 1;
return pageSize;
}
private class EmojiPagerChangeListener implements OnPageChangeListener{
@Override
public void onPageSelected(int position) {
int endSize = 0;
int groupPosition = 0;
for(EaseEmojiconGroupEntity groupEntity : groupEntities){
int groupPageSize = getPageSize(groupEntity);
//if the position is in current group
if(endSize + groupPageSize > position){
//this is means user swipe to here from previous page
if(previousPagerPosition - endSize < 0){
if(pagerViewListener != null){
pagerViewListener.onGroupPositionChanged(groupPosition, groupPageSize);
pagerViewListener.onGroupPagePostionChangedTo(0);
}
break;
}
//this is means user swipe to here from back page
if(previousPagerPosition - endSize >= groupPageSize){
if(pagerViewListener != null){
pagerViewListener.onGroupPositionChanged(groupPosition, groupPageSize);
pagerViewListener.onGroupPagePostionChangedTo(position - endSize);
}
break;
}
//page changed
if(pagerViewListener != null){
pagerViewListener.onGroupInnerPagePostionChanged(previousPagerPosition-endSize, position-endSize);
}
break;
}
groupPosition++;
endSize += groupPageSize;
}
previousPagerPosition = position;
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
}
/**
* Copyright (C) 2016 Hyphenate Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hupu.tv.player.app.widget;
import android.content.Context;
import android.net.Uri;
import android.text.Spannable;
import android.text.Spannable.Factory;
import android.text.style.ImageSpan;
import com.hyphenate.easeui.EaseIM;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.model.EaseDefaultEmojiconDatas;
import com.hyphenate.easeui.provider.EaseEmojiconInfoProvider;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CustomEaseSmileUtils {
public static final String DELETE_KEY = "em_delete_delete_expression";
public static final String ee_1 = "[):]";
public static final String ee_2 = "[:D]";
public static final String ee_3 = "[;)]";
public static final String ee_4 = "[:-o]";
public static final String ee_5 = "[:p]";
public static final String ee_6 = "[(H)]";
public static final String ee_7 = "[:@]";
public static final String ee_8 = "[:s]";
public static final String ee_9 = "[:$]";
public static final String ee_10 = "[:(]";
public static final String ee_11 = "[:'(]";
public static final String ee_12 = "[:|]";
public static final String ee_13 = "[(a)]";
public static final String ee_14 = "[8o|]";
public static final String ee_15 = "[8-|]";
public static final String ee_16 = "[+o(]";
public static final String ee_17 = "[<o)]";
public static final String ee_18 = "[|-)]";
public static final String ee_19 = "[*-)]";
public static final String ee_20 = "[:-#]";
public static final String ee_21 = "[:-*]";
public static final String ee_22 = "[^o)]";
public static final String ee_23 = "[8-)]";
public static final String ee_24 = "[(|)]";
public static final String ee_25 = "[(u)]";
public static final String ee_26 = "[(S)]";
public static final String ee_27 = "[(*)]";
public static final String ee_28 = "[(#)]";
public static final String ee_29 = "[(R)]";
public static final String ee_30 = "[({)]";
public static final String ee_31 = "[(})]";
public static final String ee_32 = "[(k)]";
public static final String ee_33 = "[(F)]";
public static final String ee_34 = "[(W)]";
public static final String ee_35 = "[(D)]";
private static final Factory spannableFactory = Factory
.getInstance();
private static final Map<Pattern, Object> emoticons = new HashMap<Pattern, Object>();
static {
EaseEmojicon[] emojicons = CustomEaseDefaultEmojiconDatas.getData();
for (EaseEmojicon emojicon : emojicons) {
addPattern(emojicon.getEmojiText(), emojicon.getIcon());
}
EaseEmojiconInfoProvider emojiconInfoProvider = EaseIM.getInstance().getEmojiconInfoProvider();
if(emojiconInfoProvider != null && emojiconInfoProvider.getTextEmojiconMapping() != null){
for(Entry<String, Object> entry : emojiconInfoProvider.getTextEmojiconMapping().entrySet()){
addPattern(entry.getKey(), entry.getValue());
}
}
}
/**
* add text and icon to the map
* @param emojiText-- text of emoji
* @param icon -- resource id or local path
*/
public static void addPattern(String emojiText, Object icon){
emoticons.put(Pattern.compile(Pattern.quote(emojiText)), icon);
}
/**
* replace existing spannable with smiles
* @param context
* @param spannable
* @return
*/
public static boolean addSmiles(Context context, Spannable spannable) {
boolean hasChanges = false;
for (Entry<Pattern, Object> entry : emoticons.entrySet()) {
Matcher matcher = entry.getKey().matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(),
matcher.end(), ImageSpan.class))
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end())
spannable.removeSpan(span);
else {
set = false;
break;
}
if (set) {
hasChanges = true;
Object value = entry.getValue();
if(value instanceof String && !((String) value).startsWith("http")){
File file = new File((String) value);
if(!file.exists() || file.isDirectory()){
return false;
}
spannable.setSpan(new ImageSpan(context, Uri.fromFile(file)),
matcher.start(), matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}else{
spannable.setSpan(new ImageSpan(context, (Integer)value),
matcher.start(), matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
return hasChanges;
}
public static Spannable getSmiledText(Context context, CharSequence text) {
Spannable spannable = spannableFactory.newSpannable(text);
addSmiles(context, spannable);
return spannable;
}
public static boolean containsKey(String key){
boolean b = false;
for (Entry<Pattern, Object> entry : emoticons.entrySet()) {
Matcher matcher = entry.getKey().matcher(key);
if (matcher.find()) {
b = true;
break;
}
}
return b;
}
public static int getSmilesSize(){
return emoticons.size();
}
}
package com.hupu.tv.player.app.widget;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.hupu.tv.player.app.R;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.domain.EaseEmojicon.Type;
import com.hyphenate.easeui.utils.EaseSmileUtils;
import java.util.List;
public class CustomEmojiconGridAdapter extends ArrayAdapter<EaseEmojicon>{
private Type emojiconType;
public CustomEmojiconGridAdapter(Context context, int textViewResourceId, List<EaseEmojicon> objects, Type emojiconType) {
super(context, textViewResourceId, objects);
this.emojiconType = emojiconType;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
if(emojiconType == Type.BIG_EXPRESSION){
convertView = View.inflate(getContext(), R.layout.ease_row_big_expression, null);
}else{
convertView = View.inflate(getContext(), R.layout.custom_ease_row_expression, null);
}
}
ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_expression);
TextView textView = (TextView) convertView.findViewById(R.id.tv_name);
EaseEmojicon emojicon = getItem(position);
if(textView != null && emojicon.getName() != null){
textView.setText(emojicon.getName());
}
if(EaseSmileUtils.DELETE_KEY.equals(emojicon.getEmojiText())){
imageView.setImageResource(R.drawable.ease_delete_expression);
}else{
if(emojicon.getIcon() != 0){
imageView.setImageResource(emojicon.getIcon());
}else if(emojicon.getIconPath() != null){
Glide.with(getContext()).load(emojicon.getIconPath())
.apply(RequestOptions.placeholderOf(R.drawable.ease_default_expression))
.into(imageView);
}
}
return convertView;
}
}
......@@ -21,7 +21,7 @@ public interface ICustomChatLayout {
* 获取输入菜单
* @return
*/
EaseChatInputMenu getChatInputMenu();
CustomEaseChatInputMenu getChatInputMenu();
/**
* 获取输入框内容
......
package com.hupu.tv.player.app.widget
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import android.widget.FrameLayout
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL
import kotlin.math.absoluteValue
import kotlin.math.sign
/**
* Layout to wrap a scrollable component inside a ViewPager2. Provided as a solution to the problem
* where pages of ViewPager2 have nested scrollable elements that scroll in the same direction as
* ViewPager2. The scrollable element needs to be the immediate and only child of this host layout.
*
* This solution has limitations when using multiple levels of nested scrollable elements
* (e.g. a horizontal RecyclerView in a vertical RecyclerView in a horizontal ViewPager2).
*/
class NestedScrollableHost : FrameLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
private var touchSlop = 0
private var initialX = 0f
private var initialY = 0f
private val parentViewPager: ViewPager2?
get() {
var v: View? = parent as? View
while (v != null && v !is ViewPager2) {
v = v.parent as? View
}
return v as? ViewPager2
}
private val child: View? get() = if (childCount > 0) getChildAt(0) else null
init {
touchSlop = ViewConfiguration.get(context).scaledTouchSlop
}
private fun canChildScroll(orientation: Int, delta: Float): Boolean {
val direction = -delta.sign.toInt()
return when (orientation) {
0 -> child?.canScrollHorizontally(direction) ?: false
1 -> child?.canScrollVertically(direction) ?: false
else -> throw IllegalArgumentException()
}
}
override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
handleInterceptTouchEvent(e)
return super.onInterceptTouchEvent(e)
}
private fun handleInterceptTouchEvent(e: MotionEvent) {
val orientation = parentViewPager?.orientation ?: return
// Early return if child can't scroll in same direction as parent
if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) {
return
}
if (e.action == MotionEvent.ACTION_DOWN) {
initialX = e.x
initialY = e.y
parent.requestDisallowInterceptTouchEvent(true)
} else if (e.action == MotionEvent.ACTION_MOVE) {
val dx = e.x - initialX
val dy = e.y - initialY
val isVpHorizontal = orientation == ORIENTATION_HORIZONTAL
// assuming ViewPager2 touch-slop is 2x touch-slop of child
val scaledDx = dx.absoluteValue * if (isVpHorizontal) .5f else 1f
val scaledDy = dy.absoluteValue * if (isVpHorizontal) 1f else .5f
if (scaledDx > touchSlop || scaledDy > touchSlop) {
if (isVpHorizontal == (scaledDy > scaledDx)) {
// Gesture is perpendicular, allow all parents to intercept
parent.requestDisallowInterceptTouchEvent(false)
} else {
// Gesture is parallel, query child if movement in that direction is possible
if (canChildScroll(orientation, if (isVpHorizontal) dx else dy)) {
// Child can scroll, disallow all parents to intercept
parent.requestDisallowInterceptTouchEvent(true)
} else {
// Child cannot scroll, allow all parents to intercept
parent.requestDisallowInterceptTouchEvent(false)
}
}
}
}
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import android.graphics.Color
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.shuyu.gsyvideoplayer.utils.Debuger
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer
......@@ -12,6 +13,7 @@ import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.utils.GlideUtils
import com.hupu.tv.player.app.widget.CustomEaseSmileUtils
import master.flame.danmaku.controller.DrawHandler
import master.flame.danmaku.danmaku.model.BaseDanmaku
import master.flame.danmaku.danmaku.model.DanmakuTimer
......@@ -317,7 +319,10 @@ class DanmakuVideoPlayer : StandardGSYVideoPlayer {
if (danmaku == null || danmaku_view == null) {
return
}
danmaku.text = text
//弹幕加表情
val span = CustomEaseSmileUtils.getSmiledText(context, text)
danmaku.text = span
danmaku.padding = 5
danmaku.priority = 8 // 可能会被各种过滤器过滤并隐藏显示,所以提高等级
danmaku.isLive = true
......
......@@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_bg_dialog_white"
tools:background="@drawable/shape_bg_dialog_white"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<LinearLayout
......@@ -17,6 +18,14 @@
android:layout_height="match_parent"/>
</LinearLayout>
<ImageView
android:layout_marginTop="@dimen/dp_20"
android:layout_gravity="center_horizontal"
android:src="@mipmap/icon_sign_close"
android:id="@+id/iv_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
......
......@@ -6,6 +6,7 @@
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
......@@ -35,6 +36,11 @@
android:textSize="@dimen/sp_13" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/top_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/message_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />
......
......@@ -11,7 +11,7 @@
android:paddingBottom="5dp"
android:layout_above="@id/layout_menu"/>
<com.hyphenate.easeui.modules.chat.EaseChatInputMenu
<com.hupu.tv.player.app.widget.CustomEaseChatInputMenu
android:id="@+id/layout_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<ImageView xmlns:tools="http://schemas.android.com/tools"
android:src="@mipmap/ee_3"
android:id="@+id/iv_expression"
android:layout_width="45dp"
android:layout_height="45dp"
android:padding="8dp"
android:scaleType="centerCrop" />
</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/ll_face_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<com.hupu.tv.player.app.widget.NestedScrollableHost
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.hupu.tv.player.app.widget.CustomEaseEmojiconPagerView
android:layout_width="match_parent"
android:layout_height="142dp"
android:id="@+id/pager_view" />
</com.hupu.tv.player.app.widget.NestedScrollableHost>
<com.hyphenate.easeui.widget.emojicon.EaseEmojiconIndicatorView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/indicator_view"
android:layout_marginBottom="2dp"
/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#CFCFCF"
/>
<com.hyphenate.easeui.widget.emojicon.EaseEmojiconScrollTabBar
android:layout_width="match_parent"
android:layout_height="35dp"
android:id="@+id/tab_bar"
/>
</LinearLayout>
\ No newline at end of file
......@@ -36,6 +36,7 @@
android:layout_marginTop="2dp">
<ImageView
android:visibility="gone"
android:src="@mipmap/icon_user_level_1"
android:id="@+id/iv_level"
android:layout_width="wrap_content"
......@@ -54,15 +55,17 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:maxEms="10"
android:ellipsize="end"
android:id="@+id/tv_userid"
android:layout_toEndOf="@id/tv_level"
android:maxLines="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_5"
android:textSize="@dimen/sp_13"
android:textColor="#6FA9D0"
tools:text="无敌猪猪:"
tools:text="无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪:"
tools:visibility="visible"
android:visibility="gone" />
......
......@@ -99,7 +99,7 @@
<androidx.viewpager2.widget.ViewPager2
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp_main"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
......
......@@ -36,6 +36,7 @@
<color name="match_vs">#DB1110</color>
<color name="bg_red_2">#FB3A6D</color>
<color name="share_income">#FBD666</color>
<color name="user_nick">#6FA9D0</color>
<color name="bg_bind_phone">#FFFFFF</color>
<color name="mine_play_count_bg">#181B1E</color>
<color name="mine_play_count_text">#8D8D8D</color>
......
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