Commit 1d3660dd by Dell

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

parent 07b31ccc
...@@ -42,7 +42,7 @@ android { ...@@ -42,7 +42,7 @@ android {
applicationVariants.all { variant -> applicationVariants.all { variant ->
variant.outputs.all { variant.outputs.all {
// outputFileName = "A_v${variant.versionName}_${variant.buildType.name}_id_0_250.apk" // 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 { ...@@ -587,6 +587,12 @@ interface HostUrl {
*/ */
const val POST_ROOM_SEND_LIST = "room/sendGift" 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*/ ...@@ -620,6 +620,13 @@ interface RetrofitService {/*@Field("is_new") int is_new*/
@POST(HostUrl.Companion.POST_ROOM_SEND_LIST) @POST(HostUrl.Companion.POST_ROOM_SEND_LIST)
fun sendGift(@Body requestBody: RequestBody): Observable<BaseBean<String>> 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 ...@@ -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.app.Constants
import com.hupu.tv.player.app.base.RefreshActivity import com.hupu.tv.player.app.base.RefreshActivity
import com.hupu.tv.player.app.bean.GiftBean 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.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.event.* import com.hupu.tv.player.app.event.*
...@@ -66,16 +67,26 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta ...@@ -66,16 +67,26 @@ class LiveActivity : RefreshActivity<LiveActivityPresenter>(), LiveActivityConta
private var anchorName = "" private var anchorName = ""
private var matchId = "" private var matchId = ""
private var followNum = "" private var followNum = ""
var historyList = arrayListOf<HistoryMessageEntity>()
override fun loadData() { override fun loadData() {
presenter?.getHistoryMessage(roomId)
presenter?.getFakeMessage() presenter?.getFakeMessage()
presenter?.getRoomInfo(roomId) presenter?.getRoomInfo(roomId)
presenter?.getRecommend(roomId,mPage) presenter?.getRecommend(roomId,mPage)
} }
fun setHistoryList(){
}
override fun setToolbar(builder: BaseToolbar.Builder): BaseToolbar.Builder? { override fun setToolbar(builder: BaseToolbar.Builder): BaseToolbar.Builder? {
return null return null
} }
override fun onHistoryMessage(data: List<HistoryMessageEntity>?) {
historyList = data as ArrayList<HistoryMessageEntity>
}
override val layoutId: Int override val layoutId: Int
get() = R.layout.activity_live get() = R.layout.activity_live
......
...@@ -72,7 +72,6 @@ class MainActivity : RefreshActivity<MainActivityPresenter>(), MainActivityConta ...@@ -72,7 +72,6 @@ class MainActivity : RefreshActivity<MainActivityPresenter>(), MainActivityConta
showAdDialog() showAdDialog()
initTabLayout() initTabLayout()
DialogSettings.modalDialog = true DialogSettings.modalDialog = true
DialogSettings.init()
presenter?.checkUpdate() presenter?.checkUpdate()
EventBus.getDefault().register(this) EventBus.getDefault().register(this)
......
...@@ -45,6 +45,8 @@ class MatchContentAdapter(layoutResId: Int, private val baseFragment: BaseFragme ...@@ -45,6 +45,8 @@ class MatchContentAdapter(layoutResId: Int, private val baseFragment: BaseFragme
if (recyclerView.itemDecorationCount == 0) { if (recyclerView.itemDecorationCount == 0) {
addItemDecoration(baseFragment.activity!!, recyclerView, R.color.view_color, 0.5f, OrientationHelper.VERTICAL) addItemDecoration(baseFragment.activity!!, recyclerView, R.color.view_color, 0.5f, OrientationHelper.VERTICAL)
} }
matchContentIncludeAdapter.bindToRecyclerView(recyclerView)
recyclerView.layoutManager = linearLayoutManager recyclerView.layoutManager = linearLayoutManager
recyclerView.adapter = matchContentIncludeAdapter recyclerView.adapter = matchContentIncludeAdapter
matchContentIncludeAdapter.setNewData(item.matchInfos) 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 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.hupu.tv.player.app.bean.LiveBean
import com.softgarden.baselibrary.base.IBaseDisplay import com.softgarden.baselibrary.base.IBaseDisplay
import com.hupu.tv.player.app.bean.RoomInfoBean import com.hupu.tv.player.app.bean.RoomInfoBean
...@@ -15,6 +16,7 @@ interface LiveActivityContact { ...@@ -15,6 +16,7 @@ interface LiveActivityContact {
fun onFollowAnchor(msg:String,status:Boolean) fun onFollowAnchor(msg:String,status:Boolean)
fun onSendGift(id:Int,position:Int) fun onSendGift(id:Int,position:Int)
fun onRecommend(data: LiveBean?) fun onRecommend(data: LiveBean?)
fun onHistoryMessage(data:List<HistoryMessageEntity>?)
} }
...@@ -25,5 +27,6 @@ interface LiveActivityContact { ...@@ -25,5 +27,6 @@ interface LiveActivityContact {
fun unFollowAnchor(id:String) fun unFollowAnchor(id:String)
fun getRecommend(id:String,pageNum:Int) fun getRecommend(id:String,pageNum:Int)
fun sendGift (giftId:Int,roomId:String,giftPosition: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; ...@@ -15,16 +15,15 @@ import android.widget.RelativeLayout;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.hupu.tv.player.app.bean.FakeMessageEntity; 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.hupu.tv.player.app.widget.CustomEaseChatMessageListLayout;
import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMMessage; import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.interfaces.EaseChatRoomListener; 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.EaseChatMessageListLayout;
import com.hyphenate.easeui.modules.chat.interfaces.OnRecallMessageResultListener; 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.EasePopupWindowHelper;
import com.hyphenate.easeui.modules.menu.MenuItemBean; import com.hyphenate.easeui.modules.menu.MenuItemBean;
import com.hyphenate.util.EMLog; import com.hyphenate.util.EMLog;
...@@ -35,8 +34,7 @@ import com.hupu.tv.player.app.app.Constants; ...@@ -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.bean.LiveUserBean;
import com.hupu.tv.player.app.widget.danmuku.CustomChatPrimaryMenu; import com.hupu.tv.player.app.widget.danmuku.CustomChatPrimaryMenu;
import java.io.Serializable; import java.util.ArrayList;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
...@@ -59,12 +57,12 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess ...@@ -59,12 +57,12 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
@Override @Override
public void initView() { public void initView() {
super.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); liveUserName = getArguments().getString(Constants.LIVE_ROOM_USER_NAME);
liveRoomName = getArguments().getString(Constants.LIVE_ROOM_NAME); liveRoomName = getArguments().getString(Constants.LIVE_ROOM_NAME);
chatLayout.getChatMessageListLayout().setItemShowType(EaseChatMessageListLayout.ShowType.LEFT); chatLayout.getChatMessageListLayout().setItemShowType(EaseChatMessageListLayout.ShowType.LEFT);
chatLayout.getChatMessageListLayout().setBackgroundColor(getContext().getColor(R.color.background_f5)); chatLayout.getChatMessageListLayout().setBackgroundColor(getContext().getColor(R.color.background_f5));
chatLayout.getChatMessageListLayout().setLiveName("欢迎来到"+liveRoomName+"直播间"); chatLayout.getChatMessageListLayout().setLiveName("欢迎来到" + liveRoomName + "直播间");
customChatPrimaryMenu = new CustomChatPrimaryMenu(getContext()); customChatPrimaryMenu = new CustomChatPrimaryMenu(getContext());
chatLayout.getChatInputMenu().setCustomPrimaryMenu(customChatPrimaryMenu); chatLayout.getChatInputMenu().setCustomPrimaryMenu(customChatPrimaryMenu);
clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); clipboard = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE);
...@@ -118,7 +116,9 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess ...@@ -118,7 +116,9 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
chatMessageListLayout.setOnJoinRoomListener(new CustomEaseChatMessageListLayout.OnJoinRoomListener() { chatMessageListLayout.setOnJoinRoomListener(new CustomEaseChatMessageListLayout.OnJoinRoomListener() {
@Override @Override
public void onJoinRoomSuccess() { public void onJoinRoomSuccess() {
sendJoinRoomData(); sendJoinRoomData();
importHistory();
} }
@Override @Override
...@@ -138,13 +138,41 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess ...@@ -138,13 +138,41 @@ public class ChatFragment extends CustomEaseChatFragment implements OnRecallMess
if (!isSend) { if (!isSend) {
boolean isLogin = (boolean) SPUtil.Companion.get(Constants.USER_LOGIN, false); boolean isLogin = (boolean) SPUtil.Companion.get(Constants.USER_LOGIN, false);
if (isLogin) { if (isLogin) {
chatLayout.sendTextMessage("进入直播间"); chatLayout.sendTextMessage("进入直播间");
sendFakeMessage(); sendFakeMessage();
isSend = true; 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() { private void sendFakeMessage() {
FakeMessageEntity fakeMessage = SPUtil.Companion.getSerializableObject(Constants.FAKE_MESSAGE); FakeMessageEntity fakeMessage = SPUtil.Companion.getSerializableObject(Constants.FAKE_MESSAGE);
if (fakeMessage != null) { if (fakeMessage != null) {
......
...@@ -87,6 +87,7 @@ class FollowMatchFragment : ToolbarFragment<FollowMatchPresenter>(), FollowMatch ...@@ -87,6 +87,7 @@ class FollowMatchFragment : ToolbarFragment<FollowMatchPresenter>(), FollowMatch
matchContentAdapter = FollowMatchContentAdapter(R.layout.item_match_content, this, 0) matchContentAdapter = FollowMatchContentAdapter(R.layout.item_match_content, this, 0)
mRecyclerView?.adapter = matchContentAdapter mRecyclerView?.adapter = matchContentAdapter
mRecyclerView?.layoutManager = LinearLayoutManager(activity) mRecyclerView?.layoutManager = LinearLayoutManager(activity)
matchContentAdapter?.bindToRecyclerView(mRecyclerView!!)
} }
......
...@@ -45,7 +45,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres ...@@ -45,7 +45,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres
args.putString(EaseConstant.EXTRA_CONVERSATION_ID, conversationId) args.putString(EaseConstant.EXTRA_CONVERSATION_ID, conversationId)
args.putString(Constants.USER_HX_ID, userHxId) args.putString(Constants.USER_HX_ID, userHxId)
args.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_CHATROOM) 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_NOTICE, notice)
args.putString(Constants.LIVE_ROOM_USER_NAME, userName) args.putString(Constants.LIVE_ROOM_USER_NAME, userName)
args.putString(Constants.LIVE_ROOM_NAME, roomName) args.putString(Constants.LIVE_ROOM_NAME, roomName)
...@@ -102,7 +102,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres ...@@ -102,7 +102,7 @@ class LiveConversationFragment : RefreshVP2Fragment<LiveConversationFragmentPres
val bundle = Bundle() val bundle = Bundle()
bundle.putString(EaseConstant.EXTRA_CONVERSATION_ID, arguments?.getString(EaseConstant.EXTRA_CONVERSATION_ID)) bundle.putString(EaseConstant.EXTRA_CONVERSATION_ID, arguments?.getString(EaseConstant.EXTRA_CONVERSATION_ID))
bundle.putInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_CHATROOM) 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.LIVE_ROOM_USER_NAME, liveUserName)
bundle.putString(Constants.USER_HX_ID, arguments?.getString(Constants.USER_HX_ID)) bundle.putString(Constants.USER_HX_ID, arguments?.getString(Constants.USER_HX_ID))
bundle.putString(Constants.LIVE_ROOM_NAME, arguments?.getString(Constants.LIVE_ROOM_NAME)) bundle.putString(Constants.LIVE_ROOM_NAME, arguments?.getString(Constants.LIVE_ROOM_NAME))
......
...@@ -15,6 +15,7 @@ import com.softgarden.baselibrary.utils.RecyclerViewUtil ...@@ -15,6 +15,7 @@ import com.softgarden.baselibrary.utils.RecyclerViewUtil
import com.hupu.tv.player.app.R import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants 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.RefreshVP2Fragment
import com.hupu.tv.player.app.base.ToolbarFragment import com.hupu.tv.player.app.base.ToolbarFragment
import com.hupu.tv.player.app.bean.* import com.hupu.tv.player.app.bean.*
...@@ -48,7 +49,7 @@ import org.greenrobot.eventbus.ThreadMode ...@@ -48,7 +49,7 @@ import org.greenrobot.eventbus.ThreadMode
* @date on 2020/6/14 * @date on 2020/6/14
* @describe * @describe
*/ */
class MainContentAllFragment : RefreshVP2Fragment<MainContentAllPresenter>(), MainContentAllContract.Display { class MainContentAllFragment : RefreshFragment<MainContentAllPresenter>(), MainContentAllContract.Display {
private var sportId: String = "" private var sportId: String = ""
private var liveItemAdapter: LiveItemAdapter? = null private var liveItemAdapter: LiveItemAdapter? = null
private var liveTopAdapter: LiveTopAdapter? = null private var liveTopAdapter: LiveTopAdapter? = null
......
...@@ -10,6 +10,7 @@ import com.softgarden.baselibrary.utils.L ...@@ -10,6 +10,7 @@ import com.softgarden.baselibrary.utils.L
import com.softgarden.baselibrary.utils.RecyclerViewUtil import com.softgarden.baselibrary.utils.RecyclerViewUtil
import com.hupu.tv.player.app.R import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.app.Constants 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.RefreshVP2Fragment
import com.hupu.tv.player.app.base.ToolbarFragment import com.hupu.tv.player.app.base.ToolbarFragment
import com.hupu.tv.player.app.bean.CategoryBean import com.hupu.tv.player.app.bean.CategoryBean
...@@ -36,7 +37,7 @@ import org.greenrobot.eventbus.ThreadMode ...@@ -36,7 +37,7 @@ import org.greenrobot.eventbus.ThreadMode
* @date on 2020/6/14 * @date on 2020/6/14
* @describe * @describe
*/ */
class MainContentNormalFragment : RefreshVP2Fragment<MainContentNormalPresenter>(), MainContentNormalContract.Display { class MainContentNormalFragment : RefreshFragment<MainContentNormalPresenter>(), MainContentNormalContract.Display {
private var imageCarousel: ImageCarousel? = null private var imageCarousel: ImageCarousel? = null
private var liveItemAdapter: LiveItemAdapter? = null private var liveItemAdapter: LiveItemAdapter? = null
private var sportId: String = "" private var sportId: String = ""
......
...@@ -5,6 +5,7 @@ import android.os.Bundle ...@@ -5,6 +5,7 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import com.flyco.tablayout.utils.FragmentBasePager2Adapter import com.flyco.tablayout.utils.FragmentBasePager2Adapter
import com.kongzue.dialog.v3.WaitDialog import com.kongzue.dialog.v3.WaitDialog
import com.softgarden.baselibrary.base.FragmentBaseStatePagerAdapter import com.softgarden.baselibrary.base.FragmentBaseStatePagerAdapter
...@@ -55,10 +56,10 @@ class MainFragment : RefreshFragment<MainFragmentPresenter>(), MainFragmentConta ...@@ -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.offscreenPageLimit = list.size
vp_main.adapter = mAdapter vp_main.adapter = mAdapter
tabLayout_main.setViewPager2(vp_main) tabLayout_main.setViewPager(vp_main)
} }
......
package com.hupu.tv.player.app.ui.im; package com.hupu.tv.player.app.ui.im;
import android.annotation.SuppressLint;
import android.content.Context; 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.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; 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.EMClient;
import com.hyphenate.chat.EMMessage; import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.modules.chat.EaseChatMessageListLayout; import com.hyphenate.easeui.modules.chat.EaseChatMessageListLayout;
import com.hyphenate.easeui.modules.chat.model.EaseChatItemStyleHelper; import com.hyphenate.easeui.modules.chat.model.EaseChatItemStyleHelper;
import com.hyphenate.easeui.modules.chat.model.EaseChatSetStyle; import com.hyphenate.easeui.modules.chat.model.EaseChatSetStyle;
...@@ -24,6 +37,7 @@ import com.hupu.tv.player.app.app.Constants; ...@@ -24,6 +37,7 @@ import com.hupu.tv.player.app.app.Constants;
public class CustomTextRow extends EaseChatRowText { public class CustomTextRow extends EaseChatRowText {
private TextView tvLevel; private TextView tvLevel;
private ImageView ivLevel; private ImageView ivLevel;
private TextView contentView;
public CustomTextRow(Context context, boolean isSender) { public CustomTextRow(Context context, boolean isSender) {
super(context, isSender); super(context, isSender);
...@@ -38,6 +52,7 @@ public class CustomTextRow extends EaseChatRowText { ...@@ -38,6 +52,7 @@ public class CustomTextRow extends EaseChatRowText {
super.onFindViewById(); super.onFindViewById();
tvLevel = findViewById(R.id.tv_level); tvLevel = findViewById(R.id.tv_level);
ivLevel = findViewById(R.id.iv_level); ivLevel = findViewById(R.id.iv_level);
contentView = findViewById(R.id.tv_chatcontent);
} }
@Override @Override
...@@ -48,6 +63,24 @@ public class CustomTextRow extends EaseChatRowText { ...@@ -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 @Override
protected void setAvatarOptions(EaseChatSetStyle itemStyle) { protected void setAvatarOptions(EaseChatSetStyle itemStyle) {
super.setAvatarOptions(itemStyle); super.setAvatarOptions(itemStyle);
...@@ -61,30 +94,30 @@ public class CustomTextRow extends EaseChatRowText { ...@@ -61,30 +94,30 @@ public class CustomTextRow extends EaseChatRowText {
@Override @Override
protected void setAvatarAndNick() { protected void setAvatarAndNick() {
String userNick = message.getStringAttribute(Constants.USER_NICK, message.getFrom()); // String userNick = message.getStringAttribute(Constants.USER_NICK, message.getFrom());
int level = message.getIntAttribute(Constants.USER_LEVEL, 1); // int level = message.getIntAttribute(Constants.USER_LEVEL, 1);
userNick = userNick.replace("\n", ""); // userNick = userNick.replace("\n", "");
//
if (isSender()) { // if (isSender()) {
EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView); // EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView);
//只要不是常规布局形式,就展示昵称 // //只要不是常规布局形式,就展示昵称
if (EaseChatItemStyleHelper.getInstance().getStyle().getItemShowType() != EaseChatMessageListLayout.ShowType.NORMAL.ordinal()) { // if (EaseChatItemStyleHelper.getInstance().getStyle().getItemShowType() != EaseChatMessageListLayout.ShowType.NORMAL.ordinal()) {
EaseUserUtils.setUserNick(userNick + ":", usernickView); // EaseUserUtils.setUserNick(userNick + ":", usernickView);
setLevel(level); // setLevel(level);
tvLevel.setText("LV." + level); // tvLevel.setText("LV." + level);
//
} // }
} else { // } else {
//todo 接受来的昵称 // //todo 接受来的昵称
//
EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView); // EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView);
EaseUserUtils.setUserNick(userNick + ":", usernickView); // EaseUserUtils.setUserNick(userNick + ":", usernickView);
setLevel(level); // setLevel(level);
tvLevel.setText("LV." + level); // tvLevel.setText("LV." + level);
} // }
} }
private void setLevel(int level) { private int getLevel(int level) {
int levelIcon = 0; int levelIcon = 0;
switch (level) { switch (level) {
case 1: case 1:
...@@ -165,7 +198,7 @@ public class CustomTextRow extends EaseChatRowText { ...@@ -165,7 +198,7 @@ public class CustomTextRow extends EaseChatRowText {
} }
ivLevel.setImageResource(levelIcon); return levelIcon;
} }
// @Override // @Override
// public void onSetUpView() { // public void onSetUpView() {
......
...@@ -7,6 +7,7 @@ import com.softgarden.baselibrary.network.RxCallback ...@@ -7,6 +7,7 @@ import com.softgarden.baselibrary.network.RxCallback
import com.hupu.tv.player.app.api.RetrofitClient import com.hupu.tv.player.app.api.RetrofitClient
import com.hupu.tv.player.app.app.Constants import com.hupu.tv.player.app.app.Constants
import com.hupu.tv.player.app.bean.FakeMessageEntity 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.LiveBean
import com.hupu.tv.player.app.bean.RoomInfoBean import com.hupu.tv.player.app.bean.RoomInfoBean
import com.hupu.tv.player.app.ui.contact.LiveActivityContact import com.hupu.tv.player.app.ui.contact.LiveActivityContact
...@@ -117,5 +118,18 @@ class LiveActivityPresenter : IBasePresenter, LiveActivityContact.Presenter { ...@@ -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 ...@@ -37,6 +37,8 @@ import java.io.Serializable
import java.text.ParseException import java.text.ParseException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern
/** /**
* @author by Dell * @author by Dell
...@@ -75,6 +77,16 @@ object CommonUtils { ...@@ -75,6 +77,16 @@ object CommonUtils {
return collection 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 { ...@@ -65,6 +65,9 @@ object DialogUtils {
if (main?.isNotEmpty() == true){ if (main?.isNotEmpty() == true){
GlideUtils.loadImage(activity,main[0].picPath,v.findViewById(R.id.iv_img)) 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.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.ConcatAdapter;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.RecyclerView;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.adapter.EaseChatExtendMenuIndicatorAdapter;
import com.hyphenate.easeui.interfaces.OnItemClickListener;
import com.hyphenate.easeui.modules.chat.interfaces.EaseChatExtendMenuItemClickListener;
import com.hyphenate.easeui.modules.chat.interfaces.IChatExtendMenu;
import com.hyphenate.easeui.widget.chatextend.HorizontalPageLayoutManager;
import com.hyphenate.easeui.widget.chatextend.PagingScrollHelper;
import com.hyphenate.util.DensityUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Extend menu when user want send image, voice clip, etc
*
*/
public class CustomEaseChatExtendMenu extends FrameLayout implements PagingScrollHelper.onPageChangeListener, IChatExtendMenu, OnItemClickListener {
protected Context context;
private RecyclerView rvExtendMenu;
private RecyclerView rvIndicator;
private List<ChatMenuItemModel> itemModels = new ArrayList<ChatMenuItemModel>();
private Map<Integer, ChatMenuItemModel> itemMap = new HashMap();
private CustomEaseChatExtendMenuAdapter adapter;
private int numColumns;
private int numRows;
private int currentPosition;
private PagingScrollHelper helper;
private EaseChatExtendMenuIndicatorAdapter indicatorAdapter;
private EaseChatExtendMenuItemClickListener itemListener;
private int[] itemStrings = { R.string.attach_take_pic, R.string.attach_picture,
R.string.attach_location, R.string.attach_video, R.string.attach_file};
private int[] itemdrawables = { R.drawable.ease_chat_takepic_selector, R.drawable.ease_chat_image_selector,
R.drawable.ease_chat_location_selector, R.drawable.em_chat_video_selector, R.drawable.em_chat_file_selector };
private int[] itemIds = { R.id.extend_item_take_picture, R.id.extend_item_picture, R.id.extend_item_location, R.id.extend_item_video, R.id.extend_item_file};
public CustomEaseChatExtendMenu(Context context) {
this(context, null);
}
public CustomEaseChatExtendMenu(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomEaseChatExtendMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
initLayout();
}
private void init(Context context, AttributeSet attrs){
this.context = context;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.EaseChatExtendMenu);
numColumns = ta.getInt(R.styleable.EaseChatExtendMenu_numColumns, 4);
numRows = ta.getInt(R.styleable.EaseChatExtendMenu_numRows, 2);
ta.recycle();
}
private void initLayout() {
LayoutInflater.from(context).inflate(R.layout.ease_layout_chat_extend_menu, this);
rvExtendMenu = findViewById(R.id.rv_extend_menu);
rvIndicator = findViewById(R.id.rv_indicator);
}
/**
* init
*/
public void init(){
initChatExtendMenu();
initChatExtendMenuIndicator();
addDefaultData();
}
private void initChatExtendMenu() {
HorizontalPageLayoutManager manager = new HorizontalPageLayoutManager(numRows, numColumns);
manager.setItemHeight(DensityUtil.dip2px(context, 90));
rvExtendMenu.setLayoutManager(manager);
rvExtendMenu.setHasFixedSize(true);
ConcatAdapter concatAdapter = new ConcatAdapter();
adapter = new CustomEaseChatExtendMenuAdapter();
concatAdapter.addAdapter(adapter);
rvExtendMenu.setAdapter(concatAdapter);
adapter.setData(itemModels);
helper = new PagingScrollHelper();
helper.setUpRecycleView(rvExtendMenu);
helper.updateLayoutManger();
helper.scrollToPosition(0);
setHorizontalFadingEdgeEnabled(true);
helper.setOnPageChangeListener(this);
adapter.setOnItemClickListener(this);
}
private void initChatExtendMenuIndicator() {
indicatorAdapter = new EaseChatExtendMenuIndicatorAdapter();
rvIndicator.setAdapter(indicatorAdapter);
DividerItemDecoration itemDecoration = new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL);
itemDecoration.setDrawable(ContextCompat.getDrawable(context, R.drawable.ease_chat_extend_menu_indicator_divider));
rvIndicator.addItemDecoration(itemDecoration);
indicatorAdapter.setSelectedPosition(currentPosition);
}
private void addDefaultData() {
for(int i = 0; i < itemStrings.length; i++) {
registerMenuItem(itemStrings[i], itemdrawables[i], itemIds[i], null);
}
}
/**
* 清空数据
*/
@Override
public void clear() {
itemModels.clear();
itemMap.clear();
adapter.notifyDataSetChanged();
indicatorAdapter.setPageCount(0);
}
@Override
public void setMenuOrder(int itemId, int order) {
if(itemMap.containsKey(itemId)) {
ChatMenuItemModel model = itemMap.get(itemId);
if(model != null) {
model.order = order;
sortByOrder(itemModels);
adapter.notifyDataSetChanged();
}
}
}
/**
* register menu item
*
* @param name
* item name
* @param drawableRes
* background of item
* @param itemId
* id
* @param listener
* on click event of item
*/
public void registerMenuItem(String name, int drawableRes, int itemId, EaseChatExtendMenuItemClickListener listener) {
if(!itemMap.containsKey(itemId)) {
ChatMenuItemModel item = new ChatMenuItemModel();
item.name = name;
item.image = drawableRes;
item.id = itemId;
item.clickListener = listener;
itemMap.put(itemId, item);
itemModels.add(item);
adapter.notifyItemInserted(itemModels.size() - 1);
//设置需要显示的indicator的个数
indicatorAdapter.setPageCount((int) Math.ceil(itemModels.size() * 1.0f / (numColumns * numRows)));
}
}
/**
* register menu item
*
* @param name
* item name
* @param drawableRes
* background of item
* @param itemId
* id
* @param order
* order by
* @param listener
* on click event of item
*/
public void registerMenuItem(String name, int drawableRes, int itemId, int order, EaseChatExtendMenuItemClickListener listener) {
if(!itemMap.containsKey(itemId)) {
ChatMenuItemModel item = new ChatMenuItemModel();
item.name = name;
item.image = drawableRes;
item.id = itemId;
item.order = order;
item.clickListener = listener;
itemMap.put(itemId, item);
itemModels.add(item);
sortByOrder(itemModels);
adapter.notifyDataSetChanged();
//设置需要显示的indicator的个数
indicatorAdapter.setPageCount((int) Math.ceil(itemModels.size() * 1.0f / (numColumns * numRows)));
}
}
/**
* register menu item
*
* @param nameRes
* resource id of item name
* @param drawableRes
* background of item
* @param itemId
* id
* @param listener
* on click event of item
*/
public void registerMenuItem(int nameRes, int drawableRes, int itemId, EaseChatExtendMenuItemClickListener listener) {
registerMenuItem(context.getString(nameRes), drawableRes, itemId, listener);
}
/**
* register menu item
*
* @param nameRes
* resource id of item name
* @param drawableRes
* background of item
* @param itemId
* id
* @param order
* order by
* @param listener
* on click event of item
*/
public void registerMenuItem(int nameRes, int drawableRes, int itemId, int order, EaseChatExtendMenuItemClickListener listener) {
registerMenuItem(context.getString(nameRes), drawableRes, itemId, order, listener);
}
private void sortByOrder(List<ChatMenuItemModel> itemModels) {
Collections.sort(itemModels, new Comparator<ChatMenuItemModel>() {
@Override
public int compare(ChatMenuItemModel o1, ChatMenuItemModel o2) {
int val = o1.order - o2.order;
if(val > 0) {
return 1;
}else if(val == 0) {
return 0;
}else {
return -1;
}
}
});
}
@Override
public void onPageChange(int index) {
currentPosition = index;
//设置选中的indicator
indicatorAdapter.setSelectedPosition(index);
}
@Override
public void onItemClick(View view, int position) {
ChatMenuItemModel itemModel = itemModels.get(position);
if(itemListener != null) {
itemListener.onChatExtendMenuItemClick(itemModel.id, view);
}
}
@Override
public void registerMenuItem(String name, int drawableRes, int itemId) {
registerMenuItem(name, drawableRes, itemId, null);
}
@Override
public void registerMenuItem(String name, int drawableRes, int itemId, int order) {
registerMenuItem(name, drawableRes, itemId, order, null);
}
@Override
public void registerMenuItem(int nameRes, int drawableRes, int itemId) {
registerMenuItem(nameRes, drawableRes, itemId, null);
}
@Override
public void registerMenuItem(int nameRes, int drawableRes, int itemId, int order) {
registerMenuItem(nameRes, drawableRes, itemId, order, null);
}
@Override
public void setEaseChatExtendMenuItemClickListener(EaseChatExtendMenuItemClickListener listener) {
this.itemListener = listener;
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(helper != null && rvExtendMenu != null) {
helper.scrollToPosition(0);
helper.checkCurrentStatus();
}
}
public static class ChatMenuItemModel{
/**
* 条目名称
*/
public String name;
/**
* 条目图标
*/
public int image;
/**
* 条目id
*/
public int id;
/**
* 用作排序
*/
public int order;
public EaseChatExtendMenuItemClickListener clickListener;
}
class ChatMenuItem extends LinearLayout {
private ImageView imageView;
private TextView textView;
public ChatMenuItem(Context context, AttributeSet attrs, int defStyle) {
this(context, attrs);
}
public ChatMenuItem(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public ChatMenuItem(Context context) {
super(context);
init(context, null);
}
private void init(Context context, AttributeSet attrs) {
LayoutInflater.from(context).inflate(R.layout.ease_chat_menu_item, this);
imageView = (ImageView) findViewById(R.id.image);
textView = (TextView) findViewById(R.id.text);
}
public void setImage(int resid) {
imageView.setBackgroundResource(resid);
}
public void setText(int resid) {
textView.setText(resid);
}
public void setText(String text) {
textView.setText(text);
}
}
}
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);
}
}
}
package com.hupu.tv.player.app.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.domain.EaseEmojicon;
import com.hyphenate.easeui.modules.chat.EaseChatExtendMenu;
import com.hyphenate.easeui.modules.chat.EaseChatPrimaryMenu;
import com.hyphenate.easeui.modules.chat.EaseEmojiconMenu;
import com.hyphenate.easeui.modules.chat.interfaces.ChatInputMenuListener;
import com.hyphenate.easeui.modules.chat.interfaces.EaseChatExtendMenuItemClickListener;
import com.hyphenate.easeui.modules.chat.interfaces.EaseChatPrimaryMenuListener;
import com.hyphenate.easeui.modules.chat.interfaces.EaseEmojiconMenuListener;
import com.hyphenate.easeui.modules.chat.interfaces.IChatEmojiconMenu;
import com.hyphenate.easeui.modules.chat.interfaces.IChatExtendMenu;
import com.hyphenate.easeui.modules.chat.interfaces.IChatInputMenu;
import com.hyphenate.easeui.modules.chat.interfaces.IChatPrimaryMenu;
import com.hyphenate.easeui.utils.EaseSmileUtils;
import com.hyphenate.util.EMLog;
public class CustomEaseChatInputMenu extends LinearLayout implements IChatInputMenu, EaseChatPrimaryMenuListener, EaseEmojiconMenuListener, EaseChatExtendMenuItemClickListener {
private static final String TAG = CustomEaseChatInputMenu.class.getSimpleName();
private LinearLayout chatMenuContainer;
private FrameLayout primaryMenuContainer;
private FrameLayout extendMenuContainer;
private IChatPrimaryMenu primaryMenu;
private IChatEmojiconMenu emojiconMenu;
private IChatExtendMenu extendMenu;
private ChatInputMenuListener menuListener;
public CustomEaseChatInputMenu(Context context) {
this(context, null);
}
public CustomEaseChatInputMenu(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomEaseChatInputMenu(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater.from(context).inflate(R.layout.ease_widget_chat_input_menu_container, this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
chatMenuContainer = findViewById(R.id.chat_menu_container);
primaryMenuContainer = findViewById(R.id.primary_menu_container);
extendMenuContainer = findViewById(R.id.extend_menu_container);
init();
}
private void init() {
showPrimaryMenu();
if(extendMenu == null) {
extendMenu = new CustomEaseChatExtendMenu(getContext());
((CustomEaseChatExtendMenu)extendMenu).init();
}
if(emojiconMenu == null) {
emojiconMenu = new CustomEaseEmojiconMenu(getContext());
((CustomEaseEmojiconMenu)emojiconMenu).init();
}
}
@Override
public void setCustomPrimaryMenu(IChatPrimaryMenu menu) {
this.primaryMenu = menu;
showPrimaryMenu();
}
@Override
public void setCustomEmojiconMenu(IChatEmojiconMenu menu) {
this.emojiconMenu = menu;
}
@Override
public void setCustomExtendMenu(IChatExtendMenu menu) {
this.extendMenu = menu;
}
@Override
public void hideExtendContainer() {
primaryMenu.showNormalStatus();
extendMenuContainer.setVisibility(GONE);
}
@Override
public void showEmojiconMenu(boolean show) {
if(show) {
showEmojiconMenu();
}else {
extendMenuContainer.setVisibility(GONE);
}
}
@Override
public void showExtendMenu(boolean show) {
if(show) {
showExtendMenu();
}else {
extendMenuContainer.setVisibility(GONE);
if(primaryMenu != null) {
primaryMenu.hideExtendStatus();
}
}
}
@Override
public void hideSoftKeyboard() {
if(primaryMenu != null) {
primaryMenu.hideSoftKeyboard();
}
}
@Override
public void setChatInputMenuListener(ChatInputMenuListener listener) {
this.menuListener = listener;
}
@Override
public IChatPrimaryMenu getPrimaryMenu() {
return primaryMenu;
}
@Override
public IChatEmojiconMenu getEmojiconMenu() {
return emojiconMenu;
}
@Override
public IChatExtendMenu getChatExtendMenu() {
return extendMenu;
}
@Override
public boolean onBackPressed() {
if(extendMenuContainer.getVisibility() == VISIBLE) {
extendMenuContainer.setVisibility(GONE);
return false;
}
return true;
}
private void showPrimaryMenu() {
if(primaryMenu == null) {
primaryMenu = new EaseChatPrimaryMenu(getContext());
}
if(primaryMenu instanceof View) {
primaryMenuContainer.removeAllViews();
primaryMenuContainer.addView((View) primaryMenu);
primaryMenu.setEaseChatPrimaryMenuListener(this);
}
if(primaryMenu instanceof Fragment && getContext() instanceof AppCompatActivity) {
FragmentManager manager = ((AppCompatActivity) getContext()).getSupportFragmentManager();
manager.beginTransaction().replace(R.id.primary_menu_container, (Fragment) primaryMenu).commitAllowingStateLoss();
primaryMenu.setEaseChatPrimaryMenuListener(this);
}
}
private void showExtendMenu() {
if(extendMenu == null) {
extendMenu = new EaseChatExtendMenu(getContext());
((EaseChatExtendMenu)extendMenu).init();
}
if(extendMenu instanceof View) {
extendMenuContainer.setVisibility(VISIBLE);
extendMenuContainer.removeAllViews();
extendMenuContainer.addView((View) extendMenu);
extendMenu.setEaseChatExtendMenuItemClickListener(this);
}
if(extendMenu instanceof Fragment && getContext() instanceof AppCompatActivity) {
extendMenuContainer.setVisibility(VISIBLE);
FragmentManager manager = ((AppCompatActivity) getContext()).getSupportFragmentManager();
manager.beginTransaction().replace(R.id.extend_menu_container, (Fragment) extendMenu).commitAllowingStateLoss();
extendMenu.setEaseChatExtendMenuItemClickListener(this);
}
}
private void showEmojiconMenu() {
if(emojiconMenu == null) {
emojiconMenu = new EaseEmojiconMenu(getContext());
((EaseEmojiconMenu)emojiconMenu).init();
}
if(emojiconMenu instanceof View) {
extendMenuContainer.setVisibility(VISIBLE);
extendMenuContainer.removeAllViews();
extendMenuContainer.addView((View) emojiconMenu);
emojiconMenu.setEmojiconMenuListener(this);
}
if(emojiconMenu instanceof Fragment && getContext() instanceof AppCompatActivity) {
extendMenuContainer.setVisibility(VISIBLE);
FragmentManager manager = ((AppCompatActivity) getContext()).getSupportFragmentManager();
manager.beginTransaction().replace(R.id.extend_menu_container, (Fragment) emojiconMenu).commitAllowingStateLoss();
emojiconMenu.setEmojiconMenuListener(this);
}
}
@Override
public void onSendBtnClicked(String content) {
EMLog.i(TAG, "onSendBtnClicked content:"+content);
if(menuListener != null) {
menuListener.onSendMessage(content);
}
}
@Override
public void onTyping(CharSequence s, int start, int before, int count) {
EMLog.i(TAG, "onTyping: s = "+s);
if(menuListener != null) {
menuListener.onTyping(s, start, before, count);
}
}
@Override
public boolean onPressToSpeakBtnTouch(View v, MotionEvent event) {
if(menuListener != null) {
return menuListener.onPressToSpeakBtnTouch(v, event);
}
return false;
}
@Override
public void onToggleVoiceBtnClicked() {
Log.e("TAG", "onToggleVoiceBtnClicked");
showExtendMenu(false);
}
@Override
public void onToggleTextBtnClicked() {
EMLog.i(TAG, "onToggleTextBtnClicked");
showExtendMenu(false);
}
@Override
public void onToggleExtendClicked(boolean extend) {
EMLog.i(TAG, "onToggleExtendClicked extend:"+extend);
showExtendMenu(extend);
}
@Override
public void onToggleEmojiconClicked(boolean extend) {
EMLog.i(TAG, "onToggleEmojiconClicked extend:"+extend);
showEmojiconMenu(extend);
}
@Override
public void onEditTextClicked() {
EMLog.i(TAG, "onEditTextClicked");
}
@Override
public void onEditTextHasFocus(boolean hasFocus) {
EMLog.i(TAG, "onEditTextHasFocus: hasFocus = "+hasFocus);
}
@Override
public void onExpressionClicked(Object emojicon) {
EMLog.i(TAG, "onExpressionClicked");
if(emojicon instanceof EaseEmojicon) {
EaseEmojicon easeEmojicon = (EaseEmojicon) emojicon;
if(easeEmojicon.getType() != EaseEmojicon.Type.BIG_EXPRESSION){
if(easeEmojicon.getEmojiText() != null){
primaryMenu.onEmojiconInputEvent(CustomEaseSmileUtils.getSmiledText(getContext(),easeEmojicon.getEmojiText()));
}
}else{
if(menuListener != null){
menuListener.onExpressionClicked(emojicon);
}
}
}else {
if(menuListener != null){
menuListener.onExpressionClicked(emojicon);
}
}
}
@Override
public void onDeleteImageClicked() {
EMLog.i(TAG, "onDeleteImageClicked");
primaryMenu.onEmojiconDeleteEvent();
}
@Override
public void onChatExtendMenuItemClick(int itemId, View view) {
EMLog.i(TAG, "onChatExtendMenuItemClick itemId = "+itemId);
if(menuListener != null) {
menuListener.onChatExtendMenuItemClick(itemId, view);
}
}
}
...@@ -90,7 +90,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL ...@@ -90,7 +90,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL
public static final String AT_SUFFIX = " "; public static final String AT_SUFFIX = " ";
private CustomEaseChatMessageListLayout messageListLayout; private CustomEaseChatMessageListLayout messageListLayout;
private EaseChatInputMenu inputMenu; private CustomEaseChatInputMenu inputMenu;
private EaseVoiceRecorderView voiceRecorder; private EaseVoiceRecorderView voiceRecorder;
/** /**
* "正在输入"功能的开关,打开后本设备发送消息将持续发送cmd类型消息通知对方"正在输入" * "正在输入"功能的开关,打开后本设备发送消息将持续发送cmd类型消息通知对方"正在输入"
...@@ -368,7 +368,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL ...@@ -368,7 +368,7 @@ public class CustomEaseChatLayout extends RelativeLayout implements ICustomChatL
} }
@Override @Override
public EaseChatInputMenu getChatInputMenu() { public CustomEaseChatInputMenu getChatInputMenu() {
return inputMenu; return inputMenu;
} }
......
...@@ -16,12 +16,15 @@ import androidx.annotation.NonNull; ...@@ -16,12 +16,15 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.ConcatAdapter; import androidx.recyclerview.widget.ConcatAdapter;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.hupu.tv.player.app.R; 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.EMChatRoom;
import com.hyphenate.chat.EMClient; import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation; import com.hyphenate.chat.EMConversation;
...@@ -64,6 +67,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -64,6 +67,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
private String msgId; private String msgId;
private int pageSize = DEFAULT_PAGE_SIZE; private int pageSize = DEFAULT_PAGE_SIZE;
private RecyclerView rvList; private RecyclerView rvList;
private NestedScrollView nestedScroll;
private SwipeRefreshLayout srlRefresh; private SwipeRefreshLayout srlRefresh;
private LinearLayoutManager layoutManager; private LinearLayoutManager layoutManager;
private EMConversation conversation; private EMConversation conversation;
...@@ -90,6 +94,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -90,6 +94,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
private MessageListItemClickListener messageListItemClickListener; private MessageListItemClickListener messageListItemClickListener;
private EaseChatItemStyleHelper chatSetHelper; private EaseChatItemStyleHelper chatSetHelper;
MessageHistoryAdapter messageHistoryAdapter;
public CustomEaseChatMessageListLayout(@NonNull Context context) { public CustomEaseChatMessageListLayout(@NonNull Context context) {
this(context, null); this(context, null);
} }
...@@ -172,7 +178,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -172,7 +178,7 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
} }
} }
public void setLiveName(String liveName){ public void setLiveName(String liveName) {
tvLive.setText(liveName); tvLive.setText(liveName);
} }
...@@ -183,11 +189,18 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -183,11 +189,18 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
rvList = findViewById(R.id.message_list); rvList = findViewById(R.id.message_list);
srlRefresh = findViewById(R.id.srl_refresh); 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); srlRefresh.setEnabled(canUseRefresh);
layoutManager = new LinearLayoutManager(getContext()); layoutManager = new LinearLayoutManager(getContext());
rvList.setLayoutManager(layoutManager); rvList.setLayoutManager(layoutManager);
baseAdapter = new ConcatAdapter(); baseAdapter = new ConcatAdapter();
messageAdapter = new EaseMessageAdapter(); messageAdapter = new EaseMessageAdapter();
baseAdapter.addAdapter(messageAdapter); baseAdapter.addAdapter(messageAdapter);
...@@ -197,6 +210,9 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -197,6 +210,9 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
initListener(); initListener();
} }
public void setHistoryListData(List<HistoryMessageEntity> list){
messageHistoryAdapter.setNewData(list);
}
public void setOnJoinRoomListener(OnJoinRoomListener onJoinRoomListener) { public void setOnJoinRoomListener(OnJoinRoomListener onJoinRoomListener) {
this.onJoinRoomListener = onJoinRoomListener; this.onJoinRoomListener = onJoinRoomListener;
...@@ -657,8 +673,11 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -657,8 +673,11 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
@Override @Override
public void showNickname(boolean showNickname) { public void showNickname(boolean showNickname) {
chatSetHelper.setShowNickname(showNickname); if (chatSetHelper!=null){
notifyDataSetChanged(); chatSetHelper.setShowNickname(showNickname);
notifyDataSetChanged();
}
} }
@Override @Override
...@@ -828,6 +847,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I ...@@ -828,6 +847,8 @@ public class CustomEaseChatMessageListLayout extends RelativeLayout implements I
((LinearLayoutManager) manager).scrollToPositionWithOffset(position, 0); ((LinearLayoutManager) manager).scrollToPositionWithOffset(position, 0);
//setMoveAnimation(manager, position); //setMoveAnimation(manager, position);
} }
nestedScroll.post(() -> nestedScroll.fullScroll(View.FOCUS_DOWN));
} }
private void setMoveAnimation(RecyclerView.LayoutManager manager, int position) { 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 { ...@@ -21,7 +21,7 @@ public interface ICustomChatLayout {
* 获取输入菜单 * 获取输入菜单
* @return * @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 ...@@ -5,6 +5,7 @@ import android.graphics.Color
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.TextView
import com.shuyu.gsyvideoplayer.utils.Debuger import com.shuyu.gsyvideoplayer.utils.Debuger
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer
...@@ -12,6 +13,7 @@ import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer ...@@ -12,6 +13,7 @@ import com.shuyu.gsyvideoplayer.video.base.GSYVideoPlayer
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import com.hupu.tv.player.app.R import com.hupu.tv.player.app.R
import com.hupu.tv.player.app.utils.GlideUtils 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.controller.DrawHandler
import master.flame.danmaku.danmaku.model.BaseDanmaku import master.flame.danmaku.danmaku.model.BaseDanmaku
import master.flame.danmaku.danmaku.model.DanmakuTimer import master.flame.danmaku.danmaku.model.DanmakuTimer
...@@ -317,7 +319,10 @@ class DanmakuVideoPlayer : StandardGSYVideoPlayer { ...@@ -317,7 +319,10 @@ class DanmakuVideoPlayer : StandardGSYVideoPlayer {
if (danmaku == null || danmaku_view == null) { if (danmaku == null || danmaku_view == null) {
return return
} }
danmaku.text = text //弹幕加表情
val span = CustomEaseSmileUtils.getSmiledText(context, text)
danmaku.text = span
danmaku.padding = 5 danmaku.padding = 5
danmaku.priority = 8 // 可能会被各种过滤器过滤并隐藏显示,所以提高等级 danmaku.priority = 8 // 可能会被各种过滤器过滤并隐藏显示,所以提高等级
danmaku.isLive = true danmaku.isLive = true
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="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"> android:orientation="vertical">
<LinearLayout <LinearLayout
...@@ -17,6 +18,14 @@ ...@@ -17,6 +18,14 @@
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
</LinearLayout> </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 @@ ...@@ -6,6 +6,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/nestedScroll"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fillViewport="true"> android:fillViewport="true">
...@@ -35,6 +36,11 @@ ...@@ -35,6 +36,11 @@
android:textSize="@dimen/sp_13" /> android:textSize="@dimen/sp_13" />
<androidx.recyclerview.widget.RecyclerView <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:id="@+id/message_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
android:paddingBottom="5dp" android:paddingBottom="5dp"
android:layout_above="@id/layout_menu"/> 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:id="@+id/layout_menu"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" 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 @@ ...@@ -36,6 +36,7 @@
android:layout_marginTop="2dp"> android:layout_marginTop="2dp">
<ImageView <ImageView
android:visibility="gone"
android:src="@mipmap/icon_user_level_1" android:src="@mipmap/icon_user_level_1"
android:id="@+id/iv_level" android:id="@+id/iv_level"
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -54,15 +55,17 @@ ...@@ -54,15 +55,17 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"/> android:layout_height="wrap_content"/>
<TextView <TextView
android:maxEms="10"
android:ellipsize="end"
android:id="@+id/tv_userid" android:id="@+id/tv_userid"
android:layout_toEndOf="@id/tv_level" android:layout_toEndOf="@id/tv_level"
android:maxLines="1"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_5" android:layout_marginStart="@dimen/dp_5"
android:textSize="@dimen/sp_13" android:textSize="@dimen/sp_13"
android:textColor="#6FA9D0" android:textColor="#6FA9D0"
tools:text="无敌猪猪:" tools:text="无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪无敌猪猪:"
tools:visibility="visible" tools:visibility="visible"
android:visibility="gone" /> android:visibility="gone" />
......
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager.widget.ViewPager
android:id="@+id/vp_main" android:id="@+id/vp_main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<color name="match_vs">#DB1110</color> <color name="match_vs">#DB1110</color>
<color name="bg_red_2">#FB3A6D</color> <color name="bg_red_2">#FB3A6D</color>
<color name="share_income">#FBD666</color> <color name="share_income">#FBD666</color>
<color name="user_nick">#6FA9D0</color>
<color name="bg_bind_phone">#FFFFFF</color> <color name="bg_bind_phone">#FFFFFF</color>
<color name="mine_play_count_bg">#181B1E</color> <color name="mine_play_count_bg">#181B1E</color>
<color name="mine_play_count_text">#8D8D8D</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