From d167ae82b44d2380fb765c8ddb60441b26b7d118 Mon Sep 17 00:00:00 2001 From: Martin <13046765170@163.com> Date: Fri, 26 Jul 2024 18:38:53 +0800 Subject: [PATCH] 6.9.0 --- .../adapter/MainConversationListAdapter.java | 20 +- .../common/adapter/MsgRecommendAdapter.java | 101 +++++ .../yunbao/common/bean/HomeUserInfoBean.java | 10 + .../common/bean/MsgOnlineStatusBean.java | 24 ++ .../yunbao/common/bean/MsgRecommendBean.java | 70 +++ .../event/LiveMsgWindowsCloseEvent.java | 6 + .../common/event/MessageIMLiveEvent.java | 33 ++ .../AbsMainMessageChatListFragment.java | 57 +++ .../fragment/MainMessageChatFragment.java | 4 - .../fragment/MainMessageChatListFragment.java | 116 ++++- .../MainMessageRecommendFragment.java | 114 ++++- .../yunbao/common/http/CommonHttpUtil.java | 33 ++ .../common/views/MsgCommemdViewHolder.java | 49 +++ .../common/views/MsgRecommendPopupView.java | 40 ++ .../res/drawable/backgroud_user_home_msg.xml | 8 + .../main/res/drawable/bg_msg_recommend.xml | 11 + .../main/res/drawable/bg_msg_recommended.xml | 11 + .../main/res/layout/activity_user_home.xml | 74 +++- .../res/layout/dialog_live_new_function.xml | 40 +- .../res/layout/msg_main_recommend_item.xml | 59 +-- .../msg_main_recommend_list_fragment.xml | 3 +- .../res/layout/rc_conversationlist_item.xml | 57 ++- .../main/res/layout/view_msg_recommend.xml | 14 + .../res/mipmap-b+en+us/recommed_msg_bg.png | Bin 0 -> 43052 bytes common/src/main/res/mipmap-mdpi/msg_off.png | Bin 0 -> 222 bytes .../src/main/res/mipmap-mdpi/msg_online.png | Bin 0 -> 221 bytes .../res/mipmap-xxhdpi/recommed_msg_bg.png | Bin 0 -> 39478 bytes config.gradle | 4 +- .../yunbao/live/activity/LiveActivity.java | 24 +- .../live/activity/LiveAudienceActivity.java | 19 +- .../dialog/LiveUserAnchorMsgPopDialog.java | 23 +- .../live/dialog/LiveUserDialogFragment.java | 31 +- .../live/presenter/AbsLinkMicPkPresenter.java | 19 +- .../live/views/LiveAudienceViewHolder.java | 8 +- .../live/views/LivePlaySwViewHolder.java | 1 + .../live/views/PortraitLiveManager.java | 2 + .../res/layout/dialog_live_user_bottom_1.xml | 57 ++- .../main/res/layout/dialog_live_user_msg.xml | 18 +- live/src/main/res/values-en/strings.xml | 10 +- live/src/main/res/values/strings.xml | 2 + .../activity/PDLiveConversationActivity.java | 4 +- .../main/activity/RegisterActivity.java | 36 +- .../main/activity/UserHomeActivity.java | 32 ++ .../main/dialog/MainStartDialogFragment.java | 2 +- .../ConversationIMListManager.java | 4 + .../main/views/MainMessageViewHolder.java | 404 ++++++++++++------ .../src/main/res/layout/view_main_message.xml | 192 ++++++++- .../res/mipmap-xxhdpi/icon_msg_recommend.png | Bin 0 -> 2136 bytes 48 files changed, 1506 insertions(+), 340 deletions(-) create mode 100644 common/src/main/java/com/yunbao/common/adapter/MsgRecommendAdapter.java create mode 100644 common/src/main/java/com/yunbao/common/bean/MsgOnlineStatusBean.java create mode 100644 common/src/main/java/com/yunbao/common/bean/MsgRecommendBean.java create mode 100644 common/src/main/java/com/yunbao/common/event/LiveMsgWindowsCloseEvent.java create mode 100644 common/src/main/java/com/yunbao/common/event/MessageIMLiveEvent.java create mode 100644 common/src/main/java/com/yunbao/common/views/MsgCommemdViewHolder.java create mode 100644 common/src/main/java/com/yunbao/common/views/MsgRecommendPopupView.java create mode 100644 common/src/main/res/drawable/backgroud_user_home_msg.xml create mode 100644 common/src/main/res/drawable/bg_msg_recommend.xml create mode 100644 common/src/main/res/drawable/bg_msg_recommended.xml create mode 100644 common/src/main/res/layout/view_msg_recommend.xml create mode 100644 common/src/main/res/mipmap-b+en+us/recommed_msg_bg.png create mode 100644 common/src/main/res/mipmap-mdpi/msg_off.png create mode 100644 common/src/main/res/mipmap-mdpi/msg_online.png create mode 100644 common/src/main/res/mipmap-xxhdpi/recommed_msg_bg.png create mode 100644 main/src/main/res/mipmap-xxhdpi/icon_msg_recommend.png diff --git a/common/src/main/java/com/yunbao/common/adapter/MainConversationListAdapter.java b/common/src/main/java/com/yunbao/common/adapter/MainConversationListAdapter.java index c746da32d..91f9417cf 100644 --- a/common/src/main/java/com/yunbao/common/adapter/MainConversationListAdapter.java +++ b/common/src/main/java/com/yunbao/common/adapter/MainConversationListAdapter.java @@ -39,6 +39,7 @@ import io.rong.imkit.widget.adapter.ViewHolder; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.Message; +import io.rong.message.SightMessage; import io.rong.message.TextMessage; public class MainConversationListAdapter extends ConversationListAdapter { @@ -55,6 +56,11 @@ public class MainConversationListAdapter extends ConversationListAdapter { this.mContext = mContext; } + public void setSrcList(List srcList) { + this.srcList = srcList; + notifyDataSetChanged(); + } + public void setOnRefreshListener(OnRecyclerListRefreshListener> onRefreshListener) { this.onRefreshListener = onRefreshListener; } @@ -134,6 +140,13 @@ public class MainConversationListAdapter extends ConversationListAdapter { } else if (holder.getView(R.id.rc_conversation_date) != null) { holder.getView(R.id.rc_conversation_date).setVisibility(View.GONE); } + if("0".equals(conversation.mCore.getDraft())){ + holder.setImageDrawable(R.id.rc_conversation_live_online_icon,mContext.getResources().getDrawable(R.mipmap.msg_online)); + holder.setText(R.id.rc_conversation_live_online,WordUtil.isNewZh()?"在線":"Online"); + }else{ + holder.setImageDrawable(R.id.rc_conversation_live_online_icon,mContext.getResources().getDrawable(R.mipmap.msg_off)); + holder.setText(R.id.rc_conversation_live_online,WordUtil.isNewZh()?"離線":"Offline"); + } if (holder.getView(R.id.rc_conversation_live_status) == null || IMLoginManager.get(holder.getContext()).getAnchorB() != 1) { return; } @@ -322,7 +335,12 @@ public class MainConversationListAdapter extends ConversationListAdapter { BaseUiConversation conversation = mDataList.get(id); conversation.mCore.setSentTime(bean.getSentTime()); conversation.mCore.setUnreadMessageCount(integer); - conversation.mConversationContent = new SpannableString(((TextMessage) bean.getContent()).getContent()); + if(bean.getContent() instanceof SightMessage){ + conversation.mConversationContent = new SpannableString(WordUtil.isNewZh()?"[小視頻]":"[Video]"); + }else{ + conversation.mConversationContent = new SpannableString(((TextMessage) bean.getContent()).getContent()); + } + mDataList.set(id, conversation); notifyItemChanged(id); } diff --git a/common/src/main/java/com/yunbao/common/adapter/MsgRecommendAdapter.java b/common/src/main/java/com/yunbao/common/adapter/MsgRecommendAdapter.java new file mode 100644 index 000000000..a216f47e1 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/adapter/MsgRecommendAdapter.java @@ -0,0 +1,101 @@ +package com.yunbao.common.adapter; + +import static com.yunbao.common.utils.StringUtil.isEmpty; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.yunbao.common.R; +import com.yunbao.common.bean.MessageChatUserBean; +import com.yunbao.common.bean.MsgRecommendBean; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.weight.ClipPathCircleImage; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by cxf on 2019/4/22. + */ + +public class MsgRecommendAdapter extends RecyclerView.Adapter { + + private Context mContext; + private List mList; + private LayoutInflater mInflater; + + public MsgRecommendAdapter.onItemSayHi onItemSayHi; + + public void setOnItemSayHi(onItemSayHi onItemSayHi) { + this.onItemSayHi = onItemSayHi; + } + + public MsgRecommendAdapter(Context context, List list) { + mContext = context; + mInflater = LayoutInflater.from(context); + mList = list; + } + + public void setDataCollection(List data) { + if (data == null) { + data = new ArrayList(); + } + this.mList = data; + this.notifyDataSetChanged(); + } + + @NonNull + @Override + public Vh onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new Vh(mInflater.inflate(R.layout.msg_main_recommend_item, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull Vh holder, @SuppressLint("RecyclerView") int position) { + if (isEmpty() || mList.isEmpty()) { + return; + } + ImgLoader.display(holder.itemView.getContext(), mList.get(position).getAvatar(), holder.mAvatar); + holder.rc_conversation_title.setText(mList.get(position).getUser_nicename()); + holder.sayHi.setText(mList.get(position).isSayHi()? (WordUtil.isNewZh()?"已打招呼":"Said Hallo"):(WordUtil.isNewZh()?"打招呼":"Greet")); + holder.sayHi.setBackground(mList.get(position).isSayHi()? mContext.getDrawable(R.drawable.bg_msg_recommended):mContext.getDrawable(R.drawable.bg_msg_recommend)); + holder.sayHi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onItemSayHi!=null){ + onItemSayHi.onSayHi(mList.get(position),position); + } + } + }); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + class Vh extends RecyclerView.ViewHolder { + private ClipPathCircleImage mAvatar; + private TextView rc_conversation_title; + private TextView sayHi; + + public Vh(@NonNull View itemView) { + super(itemView); + mAvatar = itemView.findViewById(R.id.avatar); + rc_conversation_title = itemView.findViewById(R.id.rc_conversation_title); + sayHi = itemView.findViewById(R.id.sayHi); + } + } + + public interface onItemSayHi{ + void onSayHi(MsgRecommendBean model,int position); + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/HomeUserInfoBean.java b/common/src/main/java/com/yunbao/common/bean/HomeUserInfoBean.java index e27e9b7da..12dde677b 100644 --- a/common/src/main/java/com/yunbao/common/bean/HomeUserInfoBean.java +++ b/common/src/main/java/com/yunbao/common/bean/HomeUserInfoBean.java @@ -54,6 +54,16 @@ public class HomeUserInfoBean extends BaseModel { private String rong_online; + private String type; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + public String getRong_online() { return rong_online; } diff --git a/common/src/main/java/com/yunbao/common/bean/MsgOnlineStatusBean.java b/common/src/main/java/com/yunbao/common/bean/MsgOnlineStatusBean.java new file mode 100644 index 000000000..df8af0547 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/MsgOnlineStatusBean.java @@ -0,0 +1,24 @@ +package com.yunbao.common.bean; +/** + * 消息列表用户在线状态 + */ +public class MsgOnlineStatusBean { + private String id; + private String online; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getOnline() { + return online; + } + + public void setOnline(String online) { + this.online = online; + } +} diff --git a/common/src/main/java/com/yunbao/common/bean/MsgRecommendBean.java b/common/src/main/java/com/yunbao/common/bean/MsgRecommendBean.java new file mode 100644 index 000000000..57dfec7c8 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/MsgRecommendBean.java @@ -0,0 +1,70 @@ +package com.yunbao.common.bean; + +/** + * 消息-推荐消息 + */ +public class MsgRecommendBean { + private String id; + private String avatar; + private String user_login; + private String user_nicename; + private String langue; + private String online; + private boolean sayHi = false; + + public boolean isSayHi() { + return sayHi; + } + + public void setSayHi(boolean sayHi) { + this.sayHi = sayHi; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getUser_login() { + return user_login; + } + + public void setUser_login(String user_login) { + this.user_login = user_login; + } + + public String getUser_nicename() { + return user_nicename; + } + + public void setUser_nicename(String user_nicename) { + this.user_nicename = user_nicename; + } + + public String getLangue() { + return langue; + } + + public void setLangue(String langue) { + this.langue = langue; + } + + public String getOnline() { + return online; + } + + public void setOnline(String online) { + this.online = online; + } +} diff --git a/common/src/main/java/com/yunbao/common/event/LiveMsgWindowsCloseEvent.java b/common/src/main/java/com/yunbao/common/event/LiveMsgWindowsCloseEvent.java new file mode 100644 index 000000000..56761a285 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/LiveMsgWindowsCloseEvent.java @@ -0,0 +1,6 @@ +package com.yunbao.common.event; + +public class LiveMsgWindowsCloseEvent { + public LiveMsgWindowsCloseEvent() { + } +} diff --git a/common/src/main/java/com/yunbao/common/event/MessageIMLiveEvent.java b/common/src/main/java/com/yunbao/common/event/MessageIMLiveEvent.java new file mode 100644 index 000000000..4ab2fa6ca --- /dev/null +++ b/common/src/main/java/com/yunbao/common/event/MessageIMLiveEvent.java @@ -0,0 +1,33 @@ +package com.yunbao.common.event; + +import com.yunbao.common.bean.BaseModel; + +/** + * 未读消息整合 + */ +public class MessageIMLiveEvent extends BaseModel { + private int number = 0; + private int message = 0; + + public int getMessage() { + return message; + } + + public MessageIMLiveEvent setMessage(int message) { + this.message = message; + return this; + } + + public MessageIMLiveEvent(int number) { + this.number = number; + } + + public int getNumber() { + return number; + } + + public MessageIMLiveEvent setNumber(int number) { + this.number = number; + return this; + } +} diff --git a/common/src/main/java/com/yunbao/common/fragment/AbsMainMessageChatListFragment.java b/common/src/main/java/com/yunbao/common/fragment/AbsMainMessageChatListFragment.java index 6cc8c97ae..e17e9d1af 100644 --- a/common/src/main/java/com/yunbao/common/fragment/AbsMainMessageChatListFragment.java +++ b/common/src/main/java/com/yunbao/common/fragment/AbsMainMessageChatListFragment.java @@ -1,33 +1,51 @@ package com.yunbao.common.fragment; +import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.alibaba.fastjson.JSON; +import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.MainMessageChatListTimer; +import com.yunbao.common.bean.MessageChatUserBean; +import com.yunbao.common.bean.MsgOnlineStatusBean; +import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.interfaces.OnRecyclerListRefreshListener; import com.yunbao.common.adapter.MainConversationListAdapter; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.manager.InstructorRemarkManager; +import com.yunbao.common.utils.StringUtil; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import io.rong.imkit.conversationlist.model.BaseUiConversation; +import io.rong.imkit.conversationlist.model.SingleConversation; +import io.rong.imkit.userinfo.RongUserInfoManager; import io.rong.imkit.widget.refresh.SmartRefreshLayout; import io.rong.imlib.model.Conversation; +import io.rong.imlib.model.Message; +import io.rong.imlib.model.UserInfo; public abstract class AbsMainMessageChatListFragment extends Fragment { + private static final String TAG = "全部聊天"; public RecyclerView recyclerView; public MainConversationListAdapter mAdapter; public SmartRefreshLayout refreshLayout; @@ -118,6 +136,45 @@ public abstract class AbsMainMessageChatListFragment extends Fragment { }); } + public void loadLiveOnlineStatus(List srcList, OnRecyclerListRefreshListener> onRefreshListener){ + List uids = new ArrayList<>(); + isNet = true; + for (BaseUiConversation conversation : srcList) { + map.put(conversation.mCore.getTargetId(), conversation); + if (conversation.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) { + uids.add(conversation.mCore.getTargetId()); + } + } + CommonHttpUtil.getUserOnline(String.join(",", uids), new com.yunbao.common.http.HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if(code==0&&info!=null){ + List listUserBean = JSON.parseArray(Arrays.toString(info), MsgOnlineStatusBean.class); + for (int i = 0; i list, String search) { diff --git a/common/src/main/java/com/yunbao/common/fragment/MainMessageChatListFragment.java b/common/src/main/java/com/yunbao/common/fragment/MainMessageChatListFragment.java index 3d8da397d..064807c63 100644 --- a/common/src/main/java/com/yunbao/common/fragment/MainMessageChatListFragment.java +++ b/common/src/main/java/com/yunbao/common/fragment/MainMessageChatListFragment.java @@ -1,27 +1,44 @@ package com.yunbao.common.fragment; import android.content.Context; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.recyclerview.widget.LinearLayoutManager; import com.yunbao.common.R; +import com.yunbao.common.bean.MessageChatUserBean; +import com.yunbao.common.event.MessageIMLiveEvent; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.interfaces.OnRecyclerListRefreshListener; +import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.InstructorRemarkManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.StringUtil; +import java.util.ArrayList; import java.util.List; import java.util.Map; import io.rong.imkit.conversationlist.model.BaseUiConversation; +import io.rong.imkit.conversationlist.model.SingleConversation; +import io.rong.imkit.userinfo.RongUserInfoManager; +import io.rong.imkit.widget.refresh.api.RefreshLayout; +import io.rong.imkit.widget.refresh.listener.OnLoadMoreListener; +import io.rong.imkit.widget.refresh.listener.OnRefreshListener; +import io.rong.imlib.model.Conversation; +import io.rong.imlib.model.Message; +import io.rong.imlib.model.UserInfo; public class MainMessageChatListFragment extends AbsMainMessageChatListFragment { private static final String TAG = "MainMessageChatListFragment"; @@ -33,20 +50,20 @@ public class MainMessageChatListFragment extends AbsMainMessageChatListFragment @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + L.eSw("111111"); return inflater.inflate(R.layout.fragment_main_message_chat_list, container, false); } MainMessageChatFragment conversationListFragment; @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - Log.i(TAG, "onViewCreated: 准备创建融云"); + public void onResume() { + super.onResume(); conversationListFragment = new MainMessageChatFragment(); setAdapter(conversationListFragment.getAdapter()); - FragmentManager manager = ((FragmentActivity) mContext).getSupportFragmentManager(); + FragmentManager manager = getChildFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); - transaction.replace(view.findViewById(R.id.container).getId(), conversationListFragment); + transaction.replace(R.id.container, conversationListFragment); transaction.commitAllowingStateLoss(); //自定义空数据背景View //conversationListFragment.setEmptyView(emptyView); @@ -60,10 +77,95 @@ public class MainMessageChatListFragment extends AbsMainMessageChatListFragment public void onFinish(Map stringIntegerMap) { conversationListFragment.getAdapter().setTimerMap(stringIntegerMap); updateList(); + loadLiveOnlineStatus(baseUiConversations, new OnRecyclerListRefreshListener>() { + @Override + public void onFinish(List baseUiConversations) { + conversationListFragment.getAdapter().setSrcList(baseUiConversations); + } + }); + int count=0; + for (int i = 0; i uids = new ArrayList<>(); + for (BaseUiConversation conversation : baseUiConversations) { + map.put(conversation.mCore.getTargetId(), conversation); + if (conversation.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) { + uids.add(conversation.mCore.getTargetId()); + } + } + getUserInfo(uids); } }); + } + + private void getUserInfo(List uidList) { + String uids = String.join(",", uidList); + LiveNetManager.get(getContext()) + .getOtherList(uids, new HttpCallback>() { + @Override + public void onSuccess(List data) { + List list = new ArrayList<>(); + for (MessageChatUserBean datum : data) { + Conversation conversation = new Conversation(); + BaseUiConversation baseUiConversation = new SingleConversation(getContext(), conversation); + baseUiConversation.mCore.setTargetId(datum.getId()); + baseUiConversation.mCore.setSenderUserId(IMLoginManager.get(getContext()).getUserInfo().getId() + ""); + baseUiConversation.mCore.setSentStatus(Message.SentStatus.CANCELED); + baseUiConversation.mCore.setSentTime(-1); + baseUiConversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE); + baseUiConversation.mCore.setPortraitUrl(datum.getAvatar()); + String remark = InstructorRemarkManager.get(getContext()).getInstructorRemark().get(datum.getId()); + baseUiConversation.mCore.setConversationTitle(StringUtil.isEmpty(remark) ? datum.getUserNiceName() : remark); + + list.add(baseUiConversation); + + UserInfo userInfo = new UserInfo(baseUiConversation.mCore.getTargetId(), + baseUiConversation.mCore.getConversationTitle(), + Uri.parse(baseUiConversation.mCore.getPortraitUrl())); + RongUserInfoManager.getInstance().refreshUserInfoCache(userInfo); + } + if (!list.isEmpty()) { + List srcList = new ArrayList<>(mAdapter.getSrcList()); + srcList.addAll(list); + Log.i(TAG, "onSuccess: 增加用户数:" + list.size() + "||总用户数:" + srcList.size()); + for (BaseUiConversation conversation : srcList) { + Log.i(TAG, "onSuccess: 用户id:" + conversation.mCore.getTargetId() + "||用户名:" + conversation.mCore.getConversationTitle() + "||用户头像:" + conversation.mCore.getPortraitUrl()); + } + int position = 0; + try { + position = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); + } catch (Exception e) { + + } + mAdapter.setDataCollection(srcList); + //mAdapter.onFinish(); + recyclerView.scrollToPosition(position); + } + onRefreshFinished(); + onLoadMoreFinished(); + } + + @Override + public void onError(String error) { + onLoadMoreFinished(); + onRefreshFinished(); + } + }); + + } + + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + L.eSw("222222"); + Log.i(TAG, "onViewCreated: 准备创建融云"); + } diff --git a/common/src/main/java/com/yunbao/common/fragment/MainMessageRecommendFragment.java b/common/src/main/java/com/yunbao/common/fragment/MainMessageRecommendFragment.java index 0c72d07a3..2fa8ea33a 100644 --- a/common/src/main/java/com/yunbao/common/fragment/MainMessageRecommendFragment.java +++ b/common/src/main/java/com/yunbao/common/fragment/MainMessageRecommendFragment.java @@ -1,51 +1,131 @@ package com.yunbao.common.fragment; +import android.content.Context; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; -import com.google.gson.Gson; +import com.alibaba.fastjson.JSON; import com.yunbao.common.R; -import com.yunbao.common.adapter.MainConversationListAdapter; -import com.yunbao.common.utils.L; -import com.yunbao.common.utils.StringUtil; +import com.yunbao.common.adapter.MsgRecommendAdapter; +import com.yunbao.common.bean.MsgRecommendBean; +import com.yunbao.common.http.CommonHttpUtil; +import com.yunbao.common.http.HttpCallback; import com.yunbao.common.utils.ToastUtil; -import com.yunbao.common.utils.WordUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import io.rong.imkit.conversationlist.ConversationListAdapter; -import io.rong.imkit.conversationlist.ConversationListFragment; -import io.rong.imkit.conversationlist.model.BaseUiConversation; -import io.rong.imkit.conversationlist.model.SingleConversation; -import io.rong.imkit.event.Event; -import io.rong.imlib.RongIMClient; -import io.rong.imlib.model.Conversation; -import io.rong.imlib.model.SearchConversationResult; +import io.rong.imkit.widget.refresh.SmartRefreshLayout; +import io.rong.imkit.widget.refresh.api.RefreshLayout; +import io.rong.imkit.widget.refresh.listener.OnLoadMoreListener; +import io.rong.imkit.widget.refresh.listener.OnRefreshListener; +import io.rong.imkit.widget.refresh.wrapper.RongRefreshHeader; -public class MainMessageRecommendFragment extends ConversationListFragment { +public class MainMessageRecommendFragment extends AbsMainMessageChatListFragment { + SmartRefreshLayout mRefreshLayout; + RecyclerView mList; + Context mContext; + MsgRecommendAdapter adapter; + List list = new ArrayList<>(); @Nullable public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.msg_main_recommend_list_fragment, container, false); } + public MainMessageRecommendFragment(Context context) { + this.mContext = context; + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + initView(view); + initRefreshView(); + initData(); + } + + private void initView(View view) { + mRefreshLayout = view.findViewById(R.id.rc_refresh); + mList = view.findViewById(R.id.rc_conversation_list); + LinearLayoutManager layoutManager = new LinearLayoutManager(this.getActivity()); + mList.setLayoutManager(layoutManager); + mList.setItemViewCacheSize(0); + } + + protected void initRefreshView() { + mRefreshLayout.setNestedScrollingEnabled(false); + mRefreshLayout.setRefreshHeader(new RongRefreshHeader(getContext())); + mRefreshLayout.setRefreshFooter(new RongRefreshHeader(getContext())); + mRefreshLayout.setEnableLoadMore(false); + mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + initData(); + } + }); + mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + + } + }); + adapter = new MsgRecommendAdapter(mContext,list); + mList.setAdapter(adapter); + adapter.setOnItemSayHi(new MsgRecommendAdapter.onItemSayHi() { + @Override + public void onSayHi(MsgRecommendBean model,int position) { + if (model.isSayHi()) { + return; + } + CommonHttpUtil.sayHi(model.getId(), new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0) { + list.get(position).setSayHi(true); + adapter.notifyItemChanged(position); + } + ToastUtil.show(msg); + } + }); + } + }); + } + + private void initData() { + CommonHttpUtil.getMainMsgRecommend(new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info != null) { + list = JSON.parseArray(Arrays.toString(info), MsgRecommendBean.class); + adapter.setDataCollection(list); + mRefreshLayout.finishRefresh(true); + } else { + ToastUtil.show(msg); + } + } + }); + } + + @Override + public void onChatList() { } + @Override + public void search(String string) { + } + @Override + public void updateList() { - + } } diff --git a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java index 8c30a1cb4..9b6b8d3f0 100644 --- a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java +++ b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java @@ -685,6 +685,39 @@ public class CommonHttpUtil { .params("dynamic_id", dynamic_id) .execute(callback); } + + /** + * 获取打招呼推荐列表 + */ + public static void getMainMsgRecommend(HttpCallback callback) { + HttpClient.getInstance().get("Pdluser.getRecommendUser", "Pdluser.getRecommendUser") + .execute(callback); + } + + /** + * 打招呼 + * @param toUid + * @param callback + */ + public static void sayHi(String toUid,HttpCallback callback) { + HttpClient.getInstance().get("Pdluser.liveCall", "Pdluser.liveCall") + .params("target_uid",toUid) + .params("behavior_type","5") + .execute(callback); + } + + /** + *获取聊天列表用户在线状态 + * @param toUid + * @param callback + */ + public static void getUserOnline(String toUid,HttpCallback callback) { + HttpClient.getInstance().get("Pdluser.getUserOnline", "Pdluser.getUserOnline") + .params("uids",toUid) + .execute(callback); + } + + } diff --git a/common/src/main/java/com/yunbao/common/views/MsgCommemdViewHolder.java b/common/src/main/java/com/yunbao/common/views/MsgCommemdViewHolder.java new file mode 100644 index 000000000..6e8297e3b --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/MsgCommemdViewHolder.java @@ -0,0 +1,49 @@ +package com.yunbao.common.views; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.exoplayer2.C; +import com.makeramen.roundedimageview.RoundedImageView; +import com.yunbao.common.R; +import com.yunbao.common.bean.MsgRecommendBean; +import com.yunbao.common.bean.playerObject; +import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.WordUtil; +import com.yunbao.common.views.weight.ClipPathCircleImage; + +public class MsgCommemdViewHolder extends RecyclerView.ViewHolder { + private ClipPathCircleImage mAvatar; + private TextView rc_conversation_title; + private TextView sayHi; + + public MsgCommemdViewHolder(@NonNull View itemView) { + super(itemView); + mAvatar = itemView.findViewById(R.id.avatar); + rc_conversation_title = itemView.findViewById(R.id.rc_conversation_title); + sayHi = itemView.findViewById(R.id.sayHi); + } + + public void setData(MsgRecommendBean model, Context mContext,onItemSayHi onItemSayHi) { + ImgLoader.display(itemView.getContext(), model.getAvatar(), mAvatar); + rc_conversation_title.setText(model.getUser_nicename()); + sayHi.setText(model.isSayHi()? (WordUtil.isNewZh()?"已打招呼":"Said Hallo"):(WordUtil.isNewZh()?"打招呼":"Greet")); + sayHi.setBackground(model.isSayHi()? mContext.getDrawable(R.drawable.bg_msg_recommended):mContext.getDrawable(R.drawable.bg_msg_recommend)); + sayHi.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(onItemSayHi!=null){ + onItemSayHi.onSayHi(model); + } + } + }); + } + + public interface onItemSayHi{ + void onSayHi(MsgRecommendBean model); + } +} diff --git a/common/src/main/java/com/yunbao/common/views/MsgRecommendPopupView.java b/common/src/main/java/com/yunbao/common/views/MsgRecommendPopupView.java new file mode 100644 index 000000000..cff035874 --- /dev/null +++ b/common/src/main/java/com/yunbao/common/views/MsgRecommendPopupView.java @@ -0,0 +1,40 @@ +package com.yunbao.common.views; + +import android.content.Context; + +import androidx.annotation.NonNull; + +import com.lxj.xpopup.core.AttachPopupView; +import com.yunbao.common.R; +import com.yunbao.common.views.weight.ViewClicksAntiShake; + +public class MsgRecommendPopupView extends AttachPopupView { + + ItemDelListener itemDelListener; + + public MsgRecommendPopupView(@NonNull Context context, ItemDelListener itemDelListener) { + super(context); + this.itemDelListener = itemDelListener; + } + + @Override + protected int getImplLayoutId() { + return R.layout.view_msg_recommend; + } + + @Override + protected void onCreate() { + //特效设置 + ViewClicksAntiShake.clicksAntiShake(findViewById(R.id.close), new ViewClicksAntiShake.ViewClicksCallBack() { + @Override + public void onViewClicks() { + dismiss(); + itemDelListener.onItemDel(); + } + }); + } + + public interface ItemDelListener { + void onItemDel(); + } +} diff --git a/common/src/main/res/drawable/backgroud_user_home_msg.xml b/common/src/main/res/drawable/backgroud_user_home_msg.xml new file mode 100644 index 000000000..1d5b3309d --- /dev/null +++ b/common/src/main/res/drawable/backgroud_user_home_msg.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_msg_recommend.xml b/common/src/main/res/drawable/bg_msg_recommend.xml new file mode 100644 index 000000000..718443abb --- /dev/null +++ b/common/src/main/res/drawable/bg_msg_recommend.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/drawable/bg_msg_recommended.xml b/common/src/main/res/drawable/bg_msg_recommended.xml new file mode 100644 index 000000000..f093ebea8 --- /dev/null +++ b/common/src/main/res/drawable/bg_msg_recommended.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/res/layout/activity_user_home.xml b/common/src/main/res/layout/activity_user_home.xml index af0023e3c..1024df10f 100644 --- a/common/src/main/res/layout/activity_user_home.xml +++ b/common/src/main/res/layout/activity_user_home.xml @@ -213,30 +213,62 @@ + android:orientation="vertical" + android:gravity="center_horizontal" + android:layout_height="wrap_content"> - - - + android:layout_height="35dp" + android:minWidth="90dp" + android:background="@drawable/bg_main_com_type" + android:gravity="center" + android:paddingStart="10dp" + android:paddingEnd="10dp"> + + + + + + + + + + + + diff --git a/common/src/main/res/layout/dialog_live_new_function.xml b/common/src/main/res/layout/dialog_live_new_function.xml index c3f4f3f5b..5f56e7029 100644 --- a/common/src/main/res/layout/dialog_live_new_function.xml +++ b/common/src/main/res/layout/dialog_live_new_function.xml @@ -529,11 +529,32 @@ android:textColor="#FF9A9A9A" android:textSize="12sp" /> + + + + + @@ -566,26 +587,7 @@ android:layout_marginStart="16dp" android:layout_marginBottom="20dp"> - - - - - diff --git a/common/src/main/res/layout/msg_main_recommend_item.xml b/common/src/main/res/layout/msg_main_recommend_item.xml index 2594d56a9..9cbc6b4be 100644 --- a/common/src/main/res/layout/msg_main_recommend_item.xml +++ b/common/src/main/res/layout/msg_main_recommend_item.xml @@ -16,36 +16,12 @@ > - - - - - - + tools:text="" /> - - + android:id="@+id/sayHi" + android:layout_width="51dp" + android:layout_height="26dp" + android:ellipsize="end" + android:background="@drawable/bg_msg_recommend" + android:maxWidth="120dp" + android:gravity="center" + android:layout_gravity="center_vertical" + android:maxLines="1" + android:textColor="@color/white" + android:textSize="11dp" + tools:text="打招呼" /> diff --git a/common/src/main/res/layout/msg_main_recommend_list_fragment.xml b/common/src/main/res/layout/msg_main_recommend_list_fragment.xml index 2844c7f9a..5927df3a3 100644 --- a/common/src/main/res/layout/msg_main_recommend_list_fragment.xml +++ b/common/src/main/res/layout/msg_main_recommend_list_fragment.xml @@ -2,7 +2,6 @@ @@ -11,7 +10,7 @@ android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="match_parent"> + + + + + + + - @@ -131,7 +142,7 @@ android:maxLines="1" android:text="你好,朋友!11111111111111111111111111111111111111111" android:textColor="@color/rc_secondary_color" - android:textSize="@dimen/rc_font_text_third_size" + android:textSize="13dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toEndOf="@+id/rc_conversation_portrait_rl" diff --git a/common/src/main/res/layout/view_msg_recommend.xml b/common/src/main/res/layout/view_msg_recommend.xml new file mode 100644 index 000000000..f3fc22927 --- /dev/null +++ b/common/src/main/res/layout/view_msg_recommend.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/common/src/main/res/mipmap-b+en+us/recommed_msg_bg.png b/common/src/main/res/mipmap-b+en+us/recommed_msg_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..92929e199d1063078b396058c9599f4b3dc30e26 GIT binary patch literal 43052 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 Q0Nu#o>FVdQ&MBb@0B}J~m;e9( literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-mdpi/msg_online.png b/common/src/main/res/mipmap-mdpi/msg_online.png new file mode 100644 index 0000000000000000000000000000000000000000..6d27acad7df7dce3b26e344e85e35d61ebd1d0b2 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}(>+}rLn7SY zPT9!YVj#d$F1={7dV|>lCYf1W3wSwx`0ZO*ZK>es@nX)L3D;KY-ml23b@`A~P|M-K zmI6czZXL+DeEh(&o}xo_+|TpRMyzL&(9LDo<$bU=@!ej5yoOIj4aaL0v-hgqVQ603 z>9CL4Kw<5f&BqV@W;hfb@TINo!<+mU=3iRgyj)}5;xAtHomGL^2#7wgKgcyuT=~Ia QInap=p00i_>zopr0Ow3rM*si- literal 0 HcmV?d00001 diff --git a/common/src/main/res/mipmap-xxhdpi/recommed_msg_bg.png b/common/src/main/res/mipmap-xxhdpi/recommed_msg_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..f07598cdd4cbca587443c32e22b971ddd4f43fe6 GIT binary patch literal 39478 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 N<|fw0wGcP#zW}tHWSam0 literal 0 HcmV?d00001 diff --git a/config.gradle b/config.gradle index 1272389ce..66f4bf4f3 100644 --- a/config.gradle +++ b/config.gradle @@ -4,8 +4,8 @@ ext { buildToolsVersion: "29.0.2", minSdkVersion : 23, targetSdkVersion : 34, - versionCode : 536, - versionName : "6.7.1", + versionCode : 538, + versionName : "6.7.2", namespace : "com.pandoralive.shayu" ] manifestPlaceholders = [ diff --git a/live/src/main/java/com/yunbao/live/activity/LiveActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveActivity.java index e130bbd06..1ba93ce68 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveActivity.java @@ -21,6 +21,10 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.GsonUtils; +import com.yunbao.common.event.LiveMsgWindowsCloseEvent; +import com.yunbao.common.event.MessageIMEvent; +import com.yunbao.common.event.MessageIMLiveEvent; +import com.yunbao.common.manager.imrongcloud.MessageIMManager; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; @@ -232,6 +236,9 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL } } } + if(fragment!=null){ + fragment.dismiss(); + } } @@ -990,14 +997,29 @@ public abstract class LiveActivity extends AbsActivity implements SocketMessageL new LiveUserAnchorMailBoxPopDialog(mContext).showDialog(); } + LiveUserAnchorMsgPopDialog fragment; /** * 用户端打开聊天列表页面 */ public void openLiveMsgWindow() { - LiveUserAnchorMsgPopDialog fragment = new LiveUserAnchorMsgPopDialog(); + fragment = new LiveUserAnchorMsgPopDialog(); fragment.show(((LiveActivity) mContext).getSupportFragmentManager(), "LiveUserAnchorMsgPopDialog"); } + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onMessageIMEvent(LiveMsgWindowsCloseEvent event) { + if(fragment!=null){ + fragment.dismiss(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onMessageIMEvent(MessageIMLiveEvent event) { + if(fragment!=null){ + fragment.refreshMsgCount(event.getNumber()); + } + } + /** * 发 弹幕 消息 */ diff --git a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java index 59018127d..fe0eaa2d0 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java @@ -39,6 +39,7 @@ import com.lxj.xpopup.interfaces.XPopupCallback; import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.enums.ShowPattern; import com.yunbao.common.dialog.DebugDialog; +import com.yunbao.common.event.MessageIMEvent; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; @@ -1860,7 +1861,7 @@ public class LiveAudienceActivity extends LiveActivity { @SuppressLint("SetTextI18n") public void showMsgRed(int num) { - if (manager == null || manager.mLiveAudienceViewHolder == null || manager.mLiveAudienceViewHolder.mRedPoint == null) { + /*if (manager == null || manager.mLiveAudienceViewHolder == null || manager.mLiveAudienceViewHolder.mRedPoint == null) { return; } if (num == -1) { @@ -1869,7 +1870,21 @@ public class LiveAudienceActivity extends LiveActivity { } else if (num > 0) { manager.mLiveAudienceViewHolder.mRedPoint.setText(num + ""); } - manager.mLiveAudienceViewHolder.mRedPoint.setVisibility(View.VISIBLE); + manager.mLiveAudienceViewHolder.mRedPoint.setVisibility(View.VISIBLE);*/ + } + + //消息中心 + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onMessageIMEvent(MessageIMEvent event) { + if (manager == null || manager.mLiveAudienceViewHolder == null || manager.mLiveAudienceViewHolder.mRedPoint == null) { + return; + } + if(event.getNumber()>0){ + manager.mLiveAudienceViewHolder.mRedPoint.setVisibility(View.VISIBLE); + }else{ + manager.mLiveAudienceViewHolder.mRedPoint.setVisibility(View.GONE); + } + } public void setShowCrownRed(boolean isShow) { diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveUserAnchorMsgPopDialog.java b/live/src/main/java/com/yunbao/live/dialog/LiveUserAnchorMsgPopDialog.java index 2172f9d31..171591a07 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveUserAnchorMsgPopDialog.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveUserAnchorMsgPopDialog.java @@ -1,12 +1,14 @@ package com.yunbao.live.dialog; import android.content.Context; +import android.content.DialogInterface; import android.graphics.Color; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -45,6 +47,8 @@ import java.util.List; public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { private ViewPager2 viewPager; private MagicIndicator mIndicator; + private TextView titleCount; + private List fragmentList; @Override @@ -68,7 +72,7 @@ public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { WindowManager.LayoutParams params = window.getAttributes(); window.setWindowAnimations(R.style.bottomToTopAnim); params.width = WindowManager.LayoutParams.MATCH_PARENT; - params.height = (int) (ScreenDimenUtil.getInstance().getScreenHeight()*0.6); + params.height = (int) (ScreenDimenUtil.getInstance().getScreenHeight() * 0.6); params.gravity = Gravity.BOTTOM; window.setAttributes(params); } @@ -78,10 +82,10 @@ public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { super.onActivityCreated(savedInstanceState); mIndicator = (MagicIndicator) findViewById(R.id.indicator); viewPager = (ViewPager2) findViewById(R.id.viewPager); + titleCount= (TextView) findViewById(R.id.titleCount); fragmentList = new ArrayList<>(); fragmentList.add(new MainMessageChatListFragment(AppManager.getInstance().getLiveActivity())); viewPager.setAdapter(new FragmentStateAdapter((FragmentActivity) AppManager.getInstance().getLiveActivity()) { - @Override public int getItemCount() { return fragmentList.size(); @@ -98,6 +102,18 @@ public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { initIndicator(); initData(); } + + public void refreshMsgCount(int num){ + if(titleCount!=null){ + titleCount.setText(getResources().getString(R.string.message_chat_msg_all_an_a)+"("+num+")"); + } + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + } + /** * 初始化数据 */ @@ -105,6 +121,7 @@ public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { IMLoginManager.get(mContext).checkInstructor(); MessageIMManager.get(mContext).getSystemMessages(); } + private void initIndicator() { final String[] titles = new String[]{ WordUtil.getNewString(R.string.message_chat_msg_all), @@ -148,6 +165,8 @@ public class LiveUserAnchorMsgPopDialog extends AbsDialogFragment { return linePagerIndicator; } }); + LinePagerIndicator linePagerIndicator = new LinePagerIndicator(mContext); + linePagerIndicator.setLineHeight(0); mIndicator.setNavigator(commonNavigator); ViewPageIndicatorUtils.bind(mIndicator, viewPager, new ViewPager2.OnPageChangeCallback() { @Override diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveUserDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveUserDialogFragment.java index da6d5452b..1deb21138 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveUserDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveUserDialogFragment.java @@ -1,5 +1,6 @@ package com.yunbao.live.dialog; +import android.app.Activity; import android.app.Dialog; import android.graphics.Color; import android.graphics.drawable.Drawable; @@ -22,6 +23,7 @@ import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGAImageView; import com.opensource.svgaplayer.SVGAParser; import com.opensource.svgaplayer.SVGAVideoEntity; +import com.yunbao.common.event.MainHomeCommunityToChatEvent; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; @@ -48,6 +50,7 @@ import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SVGAViewUtils; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; +import com.yunbao.common.utils.WordUtil; import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.live.R; import com.yunbao.live.activity.LiveActivity; @@ -129,6 +132,7 @@ public class LiveUserDialogFragment extends AbsDialogFragment implements View.On GifImageView btn_live; SVGAImageView gift_svga; + String userType; @Override protected int getLayoutId() { @@ -347,6 +351,8 @@ public class LiveUserDialogFragment extends AbsDialogFragment implements View.On isAnchor = obj.getInteger("is_anchor") == 1; mUserBean = JSON.toJavaObject(obj, UserBean.class); + userType = obj.getString("type"); + mToName = obj.getString("user_nicename"); mAvatarUrl = obj.getString("avatar"); mAction = obj.getIntValue("action"); @@ -663,7 +669,7 @@ public class LiveUserDialogFragment extends AbsDialogFragment implements View.On LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk,boolean isSw) { + public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk, boolean isSw) { if (liveBean == null) { return; } @@ -738,9 +744,32 @@ public class LiveUserDialogFragment extends AbsDialogFragment implements View.On } else if (i == R.id.btn_setting) { if (TextUtils.equals(mLiveUid, "uid")) return; setting(); + } else if (i == R.id.btn_pri_msg) { + //私聊 + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("C") && userType.equals("C")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("A") && userType.equals("A")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("A") && userType.equals("B")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("B") && userType.equals("A")) { + showMsgError(); + return; + } + EventBus.getDefault().post(new MainHomeCommunityToChatEvent().setTargetId(mToUid)); } } + public void showMsgError() { + ToastUtil.show(WordUtil.isNewZh()?"無法聊天,待開發":"Unable to chat, awaiting development"); + } + /** * 设置 diff --git a/live/src/main/java/com/yunbao/live/presenter/AbsLinkMicPkPresenter.java b/live/src/main/java/com/yunbao/live/presenter/AbsLinkMicPkPresenter.java index c99610974..110acedd9 100644 --- a/live/src/main/java/com/yunbao/live/presenter/AbsLinkMicPkPresenter.java +++ b/live/src/main/java/com/yunbao/live/presenter/AbsLinkMicPkPresenter.java @@ -11,6 +11,8 @@ import com.yunbao.common.http.LiveHttpUtil; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.utils.AppManager; +import com.yunbao.common.utils.ToastUtil; +import com.yunbao.live.R; import com.yunbao.live.views.LiveRoomViewHolder; public abstract class AbsLinkMicPkPresenter { @@ -115,7 +117,22 @@ public abstract class AbsLinkMicPkPresenter { } protected void isPKTmp(UserBean u) { - isPK(u); + LiveHttpUtil.livePkCheckLive(IMLoginManager.get(AppManager.getInstance().getMainActivity()).getUserInfo().getId()+"", "", "", new HttpCallback() { + @Override + public void onSuccess(int code, String msg, String[] info) { + if (code == 0 && info.length > 0) { + JSONObject obj = JSON.parseObject(info[0]); + if (obj != null) { + if (obj.getString("ispk").equals("0")) { + isPK(u); + } else { + ToastUtil.show(AppManager.getInstance().getMainActivity().getString(R.string.pking_over)); + } + } + } + } + }); + } protected void onDRPkApplyTmp(UserBean u) { diff --git a/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java b/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java index fdf3883ba..9a1723c46 100644 --- a/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LiveAudienceViewHolder.java @@ -25,6 +25,7 @@ import android.widget.ViewFlipper; import androidx.fragment.app.FragmentActivity; import com.lxj.xpopup.XPopup; +import com.yunbao.common.manager.imrongcloud.MessageIMManager; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; @@ -374,6 +375,11 @@ public class LiveAudienceViewHolder extends AbsLiveViewHolder { } else { findViewById(R.id.total_image_red_point).setVisibility(View.GONE); } + getMsgCount(); + } + + private void getMsgCount() { + MessageIMManager.get(mContext).resetImUnReadMessageCount(mContext); } public void onGuardRed() { @@ -768,7 +774,7 @@ public class LiveAudienceViewHolder extends AbsLiveViewHolder { @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onMessageIMEvent(MessageIMEvent event) { //判断消息中心红点是否已经展示,如果已经展示并且未读消息大于0则不再执行之后的逻辑 - int number = event.getMessage(); + int number = event.getNumber(); if (v_msg_redpoint.getVisibility() == View.VISIBLE && number > 0 || SpUtil.getInstance().getBooleanValue("private_chat_message_switch")) return; if (number > 0) { diff --git a/live/src/main/java/com/yunbao/live/views/LivePlaySwViewHolder.java b/live/src/main/java/com/yunbao/live/views/LivePlaySwViewHolder.java index d72767c8e..d29fb747e 100644 --- a/live/src/main/java/com/yunbao/live/views/LivePlaySwViewHolder.java +++ b/live/src/main/java/com/yunbao/live/views/LivePlaySwViewHolder.java @@ -184,6 +184,7 @@ public class LivePlaySwViewHolder extends LiveRoomPlayViewHolder { } public void initSwEngine(String liveUid) { + dr_pk_view.setVisibility(View.GONE); this.liveUid = liveUid; //初始化声网SDK swAuManager = SWAuManager.get(); diff --git a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java index bf75a8e8d..64aeda683 100644 --- a/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java +++ b/live/src/main/java/com/yunbao/live/views/PortraitLiveManager.java @@ -31,6 +31,7 @@ import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.enums.ShowPattern; import com.lzf.easyfloat.permission.PermissionUtils; import com.lzf.easyfloat.utils.LifecycleUtils; +import com.yunbao.common.event.LiveMsgWindowsCloseEvent; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; @@ -1556,6 +1557,7 @@ public class PortraitLiveManager implements LivePlayListener, SocketMessageListe @Override public void onLiveEnd() { + Bus.get().post(new LiveMsgWindowsCloseEvent()); MicStatusManager.getInstance().clear(); endPlay(); if (!CommonAppConfig.LIVE_ROOM_SCROLL) { diff --git a/live/src/main/res/layout/dialog_live_user_bottom_1.xml b/live/src/main/res/layout/dialog_live_user_bottom_1.xml index f3a185349..a70f32bfb 100644 --- a/live/src/main/res/layout/dialog_live_user_bottom_1.xml +++ b/live/src/main/res/layout/dialog_live_user_bottom_1.xml @@ -14,38 +14,6 @@ android:layout_height="50dp" android:orientation="horizontal"> - - - - - - - - - - - - - + + + + + + + + + android:visibility="gone" /> + + diff --git a/live/src/main/res/values-en/strings.xml b/live/src/main/res/values-en/strings.xml index 75ff980bd..843734054 100644 --- a/live/src/main/res/values-en/strings.xml +++ b/live/src/main/res/values-en/strings.xml @@ -117,13 +117,15 @@ Fan group level Of Lv%s Can send this gift Join the fan group can be opened [Join] Join the fan group to open - 全部聊天 - 系統匹配 - 對方主動 + Chat All + Chat All + Suggest chat + System matching + User initiated 看直播%dmin [Read] [Unread] - 發起聊天 + Initiate a chat Progress To do diff --git a/live/src/main/res/values/strings.xml b/live/src/main/res/values/strings.xml index 6e72a609d..fbd77e73b 100644 --- a/live/src/main/res/values/strings.xml +++ b/live/src/main/res/values/strings.xml @@ -116,6 +116,8 @@ 加入粉絲團可開啟【加入】 加入粉絲團可開啟 全部聊天 + 全部聊天 + 推荐聊天 系統匹配 對方主動 看直播%dmin diff --git a/main/src/main/java/com/yunbao/main/activity/PDLiveConversationActivity.java b/main/src/main/java/com/yunbao/main/activity/PDLiveConversationActivity.java index aa9ed9314..3469deb3e 100644 --- a/main/src/main/java/com/yunbao/main/activity/PDLiveConversationActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/PDLiveConversationActivity.java @@ -535,7 +535,8 @@ public class PDLiveConversationActivity extends AbsActivity implements View.OnCl if (!TextUtils.isEmpty(content)) { IMCenter.getInstance().saveTextMessageDraft(Conversation.ConversationType.PRIVATE, targetId, content, null); } - + //关闭对话框后,刷新未读数量 + MessageIMManager.get(mContext).resetImUnReadMessageCount(mContext); EventBus.getDefault().unregister(this); } @@ -560,4 +561,5 @@ public class PDLiveConversationActivity extends AbsActivity implements View.OnCl hideUserCard(); } } + } diff --git a/main/src/main/java/com/yunbao/main/activity/RegisterActivity.java b/main/src/main/java/com/yunbao/main/activity/RegisterActivity.java index 70768fd69..8e6a13fbc 100644 --- a/main/src/main/java/com/yunbao/main/activity/RegisterActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/RegisterActivity.java @@ -471,8 +471,9 @@ public class RegisterActivity extends AbsActivity { mDialog.dismiss(); } if (bean != null) { - netHandler.post(getRandJoinAnchor); -// EventBus.getDefault().post(new RegSuccessEvent()); + //netHandler.post(getRandJoinAnchor); + jumpMain(false, null); + EventBus.getDefault().post(new RegSuccessEvent()); } } }); @@ -488,22 +489,27 @@ public class RegisterActivity extends AbsActivity { HttpClient.getInstance().post("Home.getRandJoinAnchor", "Home.getRandJoinAnchor").params("uid", userInfo.getId()).params("token", userInfo.getToken()).execute(new HttpCallback() { @Override public void onSuccess(int code, String msg, String[] info) { - if (info[0] != null) { - JSONObject obj = JSON.parseObject(info[0]); - IMLoginManager.get(activity).setisNewUserOne(true); - IMLoginManager.get(activity).setNewUserGif(true); - if (obj.containsKey("home_zdy_img_us")) { - home_zdy_img_us = obj.getString("home_zdy_img_us"); - home_zdy_img_cn = obj.getString("home_zdy_img_cn"); + if(info!=null){ + if (info[0] != null) { + JSONObject obj = JSON.parseObject(info[0]); + IMLoginManager.get(activity).setisNewUserOne(true); + IMLoginManager.get(activity).setNewUserGif(true); + if (obj.containsKey("home_zdy_img_us")) { + home_zdy_img_us = obj.getString("home_zdy_img_us"); + home_zdy_img_cn = obj.getString("home_zdy_img_cn"); + } + // gotoLive(obj.getString("anchor_id")); + if (obj.containsKey("home_zdy_pop")) { + NoviceInstructorManager.get(mContext).setHomeZdyPop(obj.getString("home_zdy_pop")); + } + jumpMain(false, obj.getString("anchor_id")); + } else { + jumpMain(false, null); } - // gotoLive(obj.getString("anchor_id")); - if (obj.containsKey("home_zdy_pop")) { - NoviceInstructorManager.get(mContext).setHomeZdyPop(obj.getString("home_zdy_pop")); - } - jumpMain(false, obj.getString("anchor_id")); - } else { + }else{ jumpMain(false, null); } + EventBus.getDefault().post(new RegSuccessEvent()); } }); diff --git a/main/src/main/java/com/yunbao/main/activity/UserHomeActivity.java b/main/src/main/java/com/yunbao/main/activity/UserHomeActivity.java index 6415edf00..527544e9d 100644 --- a/main/src/main/java/com/yunbao/main/activity/UserHomeActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/UserHomeActivity.java @@ -52,6 +52,7 @@ import com.yunbao.common.bean.NewLevelModel; import com.yunbao.common.bean.UserHomeImgBean; import com.yunbao.common.dialog.ImagePreviewDialog; import com.yunbao.common.event.LiveRoomChangeEvent; +import com.yunbao.common.event.MainHomeCommunityToChatEvent; import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.LiveHttpUtil; @@ -167,6 +168,7 @@ public class UserHomeActivity extends AbsActivity { private TextView authorNum; private TextView levelNum; private View top_bg; + private LinearLayout msgLayout; @Override protected int getLayoutId() { @@ -586,6 +588,31 @@ public class UserHomeActivity extends AbsActivity { communityRecyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); communityRecyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); + msgLayout = findViewById(R.id.msgLayout); + msgLayout.setVisibility(uid.equals(CommonAppConfig.getInstance().getUid())?View.GONE:View.VISIBLE); + msgLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //私聊 + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("C") && userInfo.getUserHomeTopInfo().getType().equals("C")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("A") && userInfo.getUserHomeTopInfo().getType().equals("A")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("A") && userInfo.getUserHomeTopInfo().getType().equals("B")) { + showMsgError(); + return; + } + if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("B") && userInfo.getUserHomeTopInfo().getType().equals("A")) { + showMsgError(); + return; + } + EventBus.getDefault().post(new MainHomeCommunityToChatEvent().setTargetId(String.valueOf(userInfo.getUserHomeTopInfo().getUser_id()))); + } + }); findViewById(R.id.back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -815,6 +842,11 @@ public class UserHomeActivity extends AbsActivity { }); } + public void showMsgError() { + ToastUtil.show(WordUtil.isNewZh()?"無法聊天,待開發":"Unable to chat, awaiting development"); + } + + private void selectImg() { String permission1 = Manifest.permission.READ_EXTERNAL_STORAGE; String permission2 = Manifest.permission.WRITE_EXTERNAL_STORAGE; diff --git a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java index 755fcf47b..37192a33e 100644 --- a/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java +++ b/main/src/main/java/com/yunbao/main/dialog/MainStartDialogFragment.java @@ -289,7 +289,7 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O @Override public void run() { Intent intent = new Intent(mContext, CommunitySendActivity.class); - startActivity(intent); + mContext.startActivity(intent); /*String mBeautySdkType = CommonAppConfig.getInstance().getBeautySdkType(); if ("2".equals(mBeautySdkType)) { Constants.myIntoIndex = 2; diff --git a/main/src/main/java/com/yunbao/main/manager/imrongcloud/ConversationIMListManager.java b/main/src/main/java/com/yunbao/main/manager/imrongcloud/ConversationIMListManager.java index 5502b9cd2..080ee9794 100644 --- a/main/src/main/java/com/yunbao/main/manager/imrongcloud/ConversationIMListManager.java +++ b/main/src/main/java/com/yunbao/main/manager/imrongcloud/ConversationIMListManager.java @@ -21,17 +21,20 @@ import com.google.gson.Gson; import com.lxj.xpopup.XPopup; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.VipModel; +import com.yunbao.common.event.LiveMsgWindowsCloseEvent; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.live.LiveNetManager; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.manager.InstructorRemarkManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; import com.yunbao.live.activity.PDLIiveChatActivity; import com.yunbao.live.bean.SearchUserBean; import com.yunbao.live.dialog.PDLIiveChatConversationFragment; +import com.yunbao.live.event.LiveOpenSuccessEvent; import com.yunbao.main.R; import com.yunbao.main.activity.PDLiveConversationActivity; import com.yunbao.main.activity.PDLiveConversationListActivity; @@ -231,6 +234,7 @@ public class ConversationIMListManager { context.runOnUiThread(() -> { Conversation.ConversationType type = Conversation.ConversationType.PRIVATE; RouteUtils.routeToConversationActivity(context, type, userId, null); + Bus.get().post(new LiveMsgWindowsCloseEvent()); }); } conversationIMListHandler.post(getUserBaseinfoRunnable); diff --git a/main/src/main/java/com/yunbao/main/views/MainMessageViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainMessageViewHolder.java index 8398e4e7b..41459f6a9 100644 --- a/main/src/main/java/com/yunbao/main/views/MainMessageViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainMessageViewHolder.java @@ -1,13 +1,23 @@ package com.yunbao.main.views; import android.app.Activity; +import android.app.Dialog; import android.content.Context; import android.content.Intent; import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.os.Handler; import android.text.Editable; +import android.text.Layout; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextPaint; import android.text.TextUtils; import android.text.TextWatcher; +import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; +import android.text.style.ImageSpan; import android.util.Log; import android.util.TypedValue; import android.view.KeyEvent; @@ -16,9 +26,13 @@ import android.view.ViewGroup; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; @@ -29,10 +43,14 @@ import com.binioter.guideview.Guide; import com.binioter.guideview.GuideBuilder; import com.facebook.appevents.AppEventsLogger; import com.lxj.xpopup.XPopup; +import com.lxj.xpopup.enums.PopupPosition; import com.opensource.svgaplayer.SVGADrawable; import com.opensource.svgaplayer.SVGAImageView; import com.opensource.svgaplayer.SVGAParser; import com.opensource.svgaplayer.SVGAVideoEntity; +import com.yunbao.common.CommonAppConfig; +import com.yunbao.common.fragment.MainMessageRecommendFragment; +import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.bean.ImUserInfoModel; @@ -48,11 +66,14 @@ import com.yunbao.common.utils.DeviceUtils; import com.yunbao.common.utils.LiveRoomCheckLivePresenter; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SVGAViewUtils; +import com.yunbao.common.utils.SpUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.ViewPageIndicatorUtils; import com.yunbao.common.utils.WordUtil; import com.yunbao.common.views.AbsMainViewHolder; +import com.yunbao.common.views.MsgRecommendPopupView; +import com.yunbao.common.views.MsgSysDelPopupView; import com.yunbao.common.views.weight.ViewClicksAntiShake; import com.yunbao.live.activity.SystemMessageActivity; import com.yunbao.live.bean.ImUserBean; @@ -110,6 +131,18 @@ public class MainMessageViewHolder extends AbsMainViewHolder { private MagicIndicator mIndicator; private List fragmentList; + private ConstraintLayout tabLayout1, tabLayout2, tabLayout3; + private TextView tab1, tab2, tab3; + private View tab_line1, tab_line2, tab_line3; + private ImageView tab_icon; + + private List relativeLayouts = new ArrayList<>(); + private List tabTexts = new ArrayList<>(); + private List tabLine = new ArrayList<>(); + private LinearLayout tabLayouts; + + private int userType = 0; // (0)普通用户 (1)主播A (2)主播B + public MainMessageViewHolder setHomeZdyPop(String homeZdyPop) { this.homeZdyPop = homeZdyPop; if (TextUtils.equals(homeZdyPop, "1")) { @@ -156,6 +189,21 @@ public class MainMessageViewHolder extends AbsMainViewHolder { contacts = findViewById(R.id.news_icon_contacts); more = findViewById(R.id.news_icon_more); search = findViewById(R.id.search); + tabLayouts = findViewById(R.id.tabLayouts); + + tab_icon = findViewById(R.id.tab_icon); + tabLayout1 = findViewById(R.id.tabLayout1); + tabLayout2 = findViewById(R.id.tabLayout2); + tabLayout3 = findViewById(R.id.tabLayout3); + + tab1 = findViewById(R.id.tab1); + tab2 = findViewById(R.id.tab2); + tab3 = findViewById(R.id.tab3); + + tab_line1 = findViewById(R.id.tab_line1); + tab_line2 = findViewById(R.id.tab_line2); + tab_line3 = findViewById(R.id.tab_line3); + contacts.setOnClickListener(view -> { //通讯录 RouteUtil.forwardActivity(RouteUtil.PATH_ADDRESSBOOK); @@ -168,6 +216,133 @@ public class MainMessageViewHolder extends AbsMainViewHolder { return i == KeyEvent.KEYCODE_ENTER || i == KeyEvent.KEYCODE_NUMPAD_ENTER; } }); + netHandler = new Handler(); + moreXPopup = new XPopup.Builder(mContext).atView(more); + more.setOnClickListener(view -> { + moreXPopup.asCustom(new MsgMoreDialog(mContext)).show(); + }); + } + + private void initFragment() { + final String[] titles; + fragmentList = new ArrayList<>(); + ViewGroup.LayoutParams params = mIndicator.getLayoutParams(); + if (userType == 0) { //普通用户 + params.width = ViewGroup.LayoutParams.WRAP_CONTENT; + mIndicator.setLayoutParams(params); + titles = new String[]{WordUtil.getNewString(R.string.message_chat_msg_all_an_a)}; + fragmentList.add(new MainMessageChatListFragment(AppManager.getInstance().getMainActivity())); + } else if (userType == 1) {//主播A + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + mIndicator.setLayoutParams(params); + titles = new String[]{WordUtil.getNewString(R.string.message_chat_msg_recommend), WordUtil.getNewString(R.string.message_chat_msg_all_an_a)}; + fragmentList.add(new MainMessageRecommendFragment(AppManager.getInstance().getMainActivity())); + fragmentList.add(new MainMessageChatListFragment(AppManager.getInstance().getMainActivity())); + } else { //主播B + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + mIndicator.setLayoutParams(params); + fragmentList.add(new MainMessageChatListFragment(AppManager.getInstance().getMainActivity())); + fragmentList.add(new MainMessageChatListSystemFragment()); + fragmentList.add(new MainMessageChatListUserFragment()); + titles = new String[]{WordUtil.getNewString(R.string.message_chat_msg_all), WordUtil.getNewString(R.string.message_chat_msg_system), WordUtil.getNewString(R.string.message_chat_msg_user)}; + } + initTabView(); + ToastUtil.showDebug("列表数量x" + fragmentList.size()); + viewPager.setAdapter(new FragmentStateAdapter((FragmentActivity) AppManager.getInstance().getMainActivity()) { + + @Override + public int getItemCount() { + Log.i(TAG, "viewpage 列表 getItemCount: " + fragmentList.size()); + return fragmentList.size(); + } + + @NonNull + @Override + public Fragment createFragment(int i) { + Log.i(TAG, "createFragment: 创建fragment :" + i + " | " + fragmentList.get(i)); + return fragmentList.get(i); + } + }); + if(userType==1){ + viewPager.setCurrentItem(1); + }else{ + viewPager.setCurrentItem(0); + } + viewPager.setUserInputEnabled(false); + ConversationIMListManager.get(mContext).addUserInfoProvider(); + + CommonNavigator commonNavigator = new CommonNavigator(AppManager.getInstance().getMainActivity()); + commonNavigator.setAdjustMode(true); + commonNavigator.setAdapter(new CommonNavigatorAdapter() { + + @Override + public int getCount() { + return titles.length; + } + + @Override + public IPagerTitleView getTitleView(Context context, final int index) { + SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context); + simplePagerTitleView.setNormalColor(Color.parseColor("#777777")); + simplePagerTitleView.setSelectedColor(Color.parseColor("#333333")); + if (titles.length == 2 && index == 0) { + Drawable drawable = ContextCompat.getDrawable(context, R.mipmap.icon_msg_recommend); + drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); // 设置Drawable的边界 + SpannableString spannableString = new SpannableString(" " + titles[index] + " "); + ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); + spannableString.setSpan(imageSpan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + spannableString.setSpan(new ClickableSpan() { + @Override + public void onClick(View widget) { + // 点击事件的处理逻辑 + /*XPopup.Builder builder = new XPopup.Builder(mContext).atView(simplePagerTitleView); + builder.hasShadowBg(false).isLightStatusBar(false).popupPosition(PopupPosition.Top).asCustom(new MsgRecommendPopupView(mContext).show());*/ + } + + @Override + public void updateDrawState(TextPaint ds) { + //super.updateDrawState(ds); + //ds.setUnderlineText(false); + } + }, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + simplePagerTitleView.setText(spannableString); + simplePagerTitleView.setMovementMethod(LinkMovementMethod.getInstance()); // 必须调用此方法 + } else { + simplePagerTitleView.setText(titles[index]); + } + + simplePagerTitleView.setTextSize(15); + simplePagerTitleView.getPaint().setFakeBoldText(true); + simplePagerTitleView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (viewPager != null) { + viewPager.setCurrentItem(index); + } + } + }); + return simplePagerTitleView; + } + + @Override + public IPagerIndicator getIndicator(Context context) { + LinePagerIndicator linePagerIndicator = new LinePagerIndicator(context); + linePagerIndicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT); + linePagerIndicator.setXOffset(DpUtil.dp2px(5)); + linePagerIndicator.setRoundRadius(DpUtil.dp2px(2)); + linePagerIndicator.setColors(Color.parseColor("#EB6FFF"), Color.parseColor("#FF83C6")); + return linePagerIndicator; + } + }); + mIndicator.setNavigator(commonNavigator); + ViewPageIndicatorUtils.bind(mIndicator, viewPager, new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + search.setText(""); + selectTab(position); + } + }); search.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { @@ -189,96 +364,84 @@ public class MainMessageViewHolder extends AbsMainViewHolder { } } }); - netHandler = new Handler(); - moreXPopup = new XPopup.Builder(mContext).atView(more); - more.setOnClickListener(view -> { - moreXPopup.asCustom(new MsgMoreDialog(mContext)).show(); - }); - initFragment(); - initIndicator(); } - private void initFragment() { - fragmentList = new ArrayList<>(); - fragmentList.add(new MainMessageChatListFragment(AppManager.getInstance().getMainActivity())); - fragmentList.add(new MainMessageChatListSystemFragment()); - fragmentList.add(new MainMessageChatListUserFragment()); + private void initTabView() { + relativeLayouts = new ArrayList<>(); + tabTexts = new ArrayList<>(); + tabLine = new ArrayList<>(); - ToastUtil.showDebug("列表数量x" + fragmentList.size()); - viewPager.setAdapter(new FragmentStateAdapter((FragmentActivity) AppManager.getInstance().getMainActivity()) { + relativeLayouts.add(tabLayout1); + relativeLayouts.add(tabLayout2); + relativeLayouts.add(tabLayout3); - @Override - public int getItemCount() { - Log.i(TAG, "viewpage 列表 getItemCount: " + fragmentList.size()); - return fragmentList.size(); - } - - @NonNull - @Override - public Fragment createFragment(int i) { - Log.i(TAG, "createFragment: 创建fragment :" + i + " | " + fragmentList.get(i)); - return fragmentList.get(i); - } - }); - viewPager.setCurrentItem(0); - viewPager.setUserInputEnabled(false); - ConversationIMListManager.get(mContext).addUserInfoProvider(); - } - - private void initIndicator() { - final String[] titles = new String[]{ - WordUtil.getNewString(R.string.message_chat_msg_all), - WordUtil.getNewString(R.string.message_chat_msg_system), - WordUtil.getNewString(R.string.message_chat_msg_user) - }; - CommonNavigator commonNavigator = new CommonNavigator(AppManager.getInstance().getMainActivity()); - commonNavigator.setAdjustMode(true); - commonNavigator.setAdapter(new CommonNavigatorAdapter() { - - @Override - public int getCount() { - return titles.length; - } - - - @Override - public IPagerTitleView getTitleView(Context context, final int index) { - SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context); - simplePagerTitleView.setNormalColor(Color.parseColor("#777777")); - simplePagerTitleView.setSelectedColor(Color.parseColor("#333333")); - simplePagerTitleView.setText(titles[index]); - simplePagerTitleView.setTextSize(18); - simplePagerTitleView.getPaint().setFakeBoldText(true); - simplePagerTitleView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (viewPager != null) { - viewPager.setCurrentItem(index); + tabTexts.add(tab1); + tabTexts.add(tab2); + tabTexts.add(tab3); + tabLine.add(tab_line1); + tabLine.add(tab_line2); + tabLine.add(tab_line3); + if (userType == 0) { //普通用户 + relativeLayouts.get(0).setVisibility(View.VISIBLE); + tabTexts.get(0).setText(WordUtil.getNewString(R.string.message_chat_msg_all_an_a)); + ViewGroup.LayoutParams params = tabLayouts.getLayoutParams(); + params.width = LinearLayout.LayoutParams.WRAP_CONTENT; + tabLayouts.setLayoutParams(params); + } else if (userType == 1) {//主播A + tab_icon.setVisibility(View.VISIBLE); + tab_icon.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + /*XPopup.Builder builder = new XPopup.Builder(mContext).atView(v); + builder.hasShadowBg(false).isLightStatusBar(false).popupPosition(PopupPosition.Top).asCustom(new MsgRecommendPopupView(mContext).show());*/ + XPopup.Builder builder = new XPopup.Builder(mContext).atView(v); + builder.hasShadowBg(false).isDestroyOnDismiss(true).isLightStatusBar(false).popupPosition(PopupPosition.Bottom).asCustom(new MsgRecommendPopupView(mContext, new MsgRecommendPopupView.ItemDelListener() { + @Override + public void onItemDel() { } - } - }); - return simplePagerTitleView; - } + })).show(); + } + }); + relativeLayouts.get(0).setVisibility(View.VISIBLE); + tabTexts.get(0).setText(WordUtil.getNewString(R.string.message_chat_msg_recommend)); + relativeLayouts.get(1).setVisibility(View.VISIBLE); + tabTexts.get(1).setText(WordUtil.getNewString(R.string.message_chat_msg_all_an_a)); + } else { //主播B + relativeLayouts.get(0).setVisibility(View.VISIBLE); + tabTexts.get(0).setText(WordUtil.getNewString(R.string.message_chat_msg_all)); + relativeLayouts.get(1).setVisibility(View.VISIBLE); + tabTexts.get(1).setText(WordUtil.getNewString(R.string.message_chat_msg_system)); + relativeLayouts.get(2).setVisibility(View.VISIBLE); + tabTexts.get(2).setText(WordUtil.getNewString(R.string.message_chat_msg_user)); + } + for (int i = 0; i < relativeLayouts.size(); i++) { + int finalI = i; + relativeLayouts.get(i).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + selectTab(finalI); + viewPager.setCurrentItem(finalI); + } + }); + } + if(userType==1){ + selectTab(1); + }else{ + selectTab(0); + } + } - @Override - public IPagerIndicator getIndicator(Context context) { - LinePagerIndicator linePagerIndicator = new LinePagerIndicator(context); - linePagerIndicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT); - linePagerIndicator.setXOffset(DpUtil.dp2px(5)); - linePagerIndicator.setRoundRadius(DpUtil.dp2px(2)); - linePagerIndicator.setColors(Color.parseColor("#EB6FFF"), Color.parseColor("#FF83C6")); - return linePagerIndicator; + public void selectTab(int position) { + for (int i = 0; i < relativeLayouts.size(); i++) { + if (position == i) { + tabTexts.get(i).setTextColor(Color.parseColor("#333333")); + tabLine.get(i).setVisibility(View.VISIBLE); + } else { + tabTexts.get(i).setTextColor(Color.parseColor("#777777")); + tabLine.get(i).setVisibility(View.INVISIBLE); } - }); - mIndicator.setNavigator(commonNavigator); - ViewPageIndicatorUtils.bind(mIndicator, viewPager, new ViewPager2.OnPageChangeCallback() { - @Override - public void onPageSelected(int position) { - super.onPageSelected(position); - search.setText(""); - } - }); + } } @Override @@ -292,10 +455,7 @@ public class MainMessageViewHolder extends AbsMainViewHolder { MessageGuideView guideView = new MessageGuideView((Activity) mContext); //top_noback GuideBuilder builder = new GuideBuilder(); - builder.setTargetView(topLayout) - .setAlpha(180) - .setHighTargetCorner(20) - .setHighTargetPadding(10); + builder.setTargetView(topLayout).setAlpha(180).setHighTargetCorner(20).setHighTargetPadding(10); builder.setOverlayTarget(true); builder.setAutoDismiss(false); @@ -345,27 +505,31 @@ public class MainMessageViewHolder extends AbsMainViewHolder { Log.i(TAG, "initData: 初始化数据"); //获取一下系统通知 MessageIMManager.get(mContext).getSystemMessages(); - LiveNetManager.get(mContext) - .getIsAnchor(new com.yunbao.common.http.base.HttpCallback() { - @Override - public void onSuccess(MessageChatIsAnchor data) { - AppManager.runDebugCode(() -> { - more.setVisibility(View.VISIBLE); - }); - if (data.getIsAnchor() == 1) { - more.setVisibility(View.VISIBLE); - viewPager.setUserInputEnabled(true); - mIndicator.setVisibility(View.VISIBLE); - } - IMLoginManager.get(mContext) - .setAnchorB(data.getIsAnchor()); - } - - @Override - public void onError(String error) { - - } + LiveNetManager.get(mContext).getIsAnchor(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(MessageChatIsAnchor data) { + AppManager.runDebugCode(() -> { + more.setVisibility(View.VISIBLE); }); + if (data.getIsAnchor() == 1 && CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("C")) { + userType = 2;//主播B + more.setVisibility(View.VISIBLE); + viewPager.setUserInputEnabled(true); + //mIndicator.setVisibility(View.VISIBLE); + } else if (CommonAppConfig.getInstance().getUserBean().getUsers_type().equals("C")) { + userType = 1;//主播A + } else { + userType = 0; + } + IMLoginManager.get(mContext).setAnchorB(data.getIsAnchor()); + initFragment(); + } + + @Override + public void onError(String error) { + + } + }); } @@ -405,11 +569,7 @@ public class MainMessageViewHolder extends AbsMainViewHolder { MobclickAgent.onEvent(mContext, "information_official_notice", "官方通知"); type = userBean.getType(); netHandler.post(systemNumberRunnable); - mContext.startActivity(new Intent(mContext, SystemMessageActivity.class) - .putExtra("type", userBean.getType()) - .putExtra("uid", "") - .putExtra("title", userBean.getTitle()) - .putExtra("headImg", "")); + mContext.startActivity(new Intent(mContext, SystemMessageActivity.class).putExtra("type", userBean.getType()).putExtra("uid", "").putExtra("title", userBean.getTitle()).putExtra("headImg", "")); }); break; //互動消息 @@ -432,11 +592,7 @@ public class MainMessageViewHolder extends AbsMainViewHolder { MobclickAgent.onEvent(mContext, "information_system_interactive", "互動消息"); type = userBean.getType(); netHandler.post(systemNumberRunnable); - mContext.startActivity(new Intent(mContext, SystemMessageActivity.class) - .putExtra("type", userBean.getType()) - .putExtra("uid", "") - .putExtra("title", userBean.getTitle()) - .putExtra("headImg", "")); + mContext.startActivity(new Intent(mContext, SystemMessageActivity.class).putExtra("type", userBean.getType()).putExtra("uid", "").putExtra("title", userBean.getTitle()).putExtra("headImg", "")); }); break; //在線客服 @@ -464,11 +620,7 @@ public class MainMessageViewHolder extends AbsMainViewHolder { // WebViewActivity.forward(mContext, userBean.getLink()); RouteUtil.forwardCustomerService(userBean.getLink()); } else { - mContext.startActivity(new Intent(mContext, SystemMessageActivity.class) - .putExtra("type", userBean.getType()) - .putExtra("uid", "") - .putExtra("title", userBean.getTitle()) - .putExtra("headImg", "")); + mContext.startActivity(new Intent(mContext, SystemMessageActivity.class).putExtra("type", userBean.getType()).putExtra("uid", "").putExtra("title", userBean.getTitle()).putExtra("headImg", "")); } }); break; @@ -492,11 +644,7 @@ public class MainMessageViewHolder extends AbsMainViewHolder { MobclickAgent.onEvent(mContext, "information_system_notice", "系统消息"); type = userBean.getType(); netHandler.post(systemNumberRunnable); - mContext.startActivity(new Intent(mContext, SystemMessageActivity.class) - .putExtra("type", userBean.getType()) - .putExtra("uid", "") - .putExtra("title", userBean.getTitle()) - .putExtra("headImg", "")); + mContext.startActivity(new Intent(mContext, SystemMessageActivity.class).putExtra("type", userBean.getType()).putExtra("uid", "").putExtra("title", userBean.getTitle()).putExtra("headImg", "")); }); break; } @@ -675,8 +823,8 @@ public class MainMessageViewHolder extends AbsMainViewHolder { LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk,boolean isSw) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal),isSw); + public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk, boolean isSw) { + RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal), isSw); } @Override diff --git a/main/src/main/res/layout/view_main_message.xml b/main/src/main/res/layout/view_main_message.xml index 4e2b23189..47097b605 100644 --- a/main/src/main/res/layout/view_main_message.xml +++ b/main/src/main/res/layout/view_main_message.xml @@ -301,22 +301,196 @@ android:id="@+id/indicator" android:layout_width="match_parent" android:layout_height="37dp" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/line" /> + android:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/main/src/main/res/mipmap-xxhdpi/icon_msg_recommend.png b/main/src/main/res/mipmap-xxhdpi/icon_msg_recommend.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d9072914e49cd1f4a14658a80ca58f66898be4 GIT binary patch literal 2136 zcmV-e2&eanP)Px-5=lfsR9Hu?SbL0IWfec?+{Zk2OS_>o8ZE*~v)!iDL@P>s5)kW>w%cXzz0+=K zt(q2mBvfPKA4G@nkBWcGV}ES&;bAh z0Mm##6-Cjr0PqA6O_WNdGdp(dm|5s+aDf}KP$+ECT5lnu&!tkSML`gN*1F+wA_B{@ zpi-%v1Ar%^DEfo%`@i0{ZCk0;`&t50O7#Q4PXJ&!B3fe5FbptFvu3+eshmQ@cbORx z(X?&5TL6V&2vHQ(_As*`e+>Y>@49ZW8K_u5!^6W@Boc`%5$zVkh$tQ@A>zN7c^DCM zuIo-UGOm>B0ss#HwgbS2h$tc66t9J0xR;p)*mR?_4FMI4#g$s?hi%)wQ9>gg34%Zo z(L;{oJk`qWbJz3vyo-oCEX!IaUK3E&YIWSQtZ()8^-a#VbqS!+(b4WO4381f)v{S@ z?Q5-jiRcN}b>EA@Wj+%V6V}w!)R!#FdW4AVy4}}^=*#{6{U_#{y9kg{s-2k+8-{Tc zGfV7W4}#$4fq{XSFB3zfV7(~QZqbSN}GMUGk{fWA#UPMG&Dl!NHH#u?4!a;pu)cr=knbV|}oc_?Vwt%N{J7+uKRQo8(*<)`=~eo z08YBDd!2NM8lYS*cQ+#b+%OE%S|97|?A)++?b;xwq;EsSLqxPl)&;=K%#3v6N-CA= z@O{5_Oly4(5jVwErBcdZ=7U7!GIPMpU-LX~829blmuzcmJ1B>lxr&H)IF3_u-~4BA zaM0@L=

W>+ydc0KNeLZH7xva0R?@S|mg+k$Gt@Wcs z)TXsQdiLyD2M--OwA?U^lhS3GSzPzgCTpurUaLe5OG52LMb}Y+!oQOWn%%=gM+jZTyW59PMlgSejV&C`o$`qdnfZB>g9fqT{aXeykOs`RjFN@N_zzzOtSN7q)1vJA5h$TY(xI8)NZK6h(g#KzmHn zyt7r=#~GEp0f1qdi_9z`icR)LHbzE9K53ffbJ9es)#|SV(8g3MH6}CYJj$%&II)c} z4%E=l(6zR0Co`GMB@D2Yca%~;G)?o~x+vI)BO@ap)LIKSUc}6=xURdRm67*zT`Bbs zMC@edFp8p16s@&n$&vyQ^$3Y4qK%iso0*x0hK4#)sg&rlw=ak0*7^1jA|{ymky5F& zrIy6`e17ZsuKKXZ9A?hfxlBv`oXuvJ4*>Wr z5v`N{!_42yWHP^~0g?(S6bi2ZK&OT`2QhF6UU5r6k)IN@4f!-+yH)m3kHtYm|kV{|x|Z z;#j~ept^2*9ubpuUggXR$oVAye#^3UFO=j<{wSsHLd1JS*E91^CnqQOWwY5DFKzS) z{UxGtp(avUK@jY99Otgty%zxz+F;wZXtEm@DuX1CR;^kkmkp8QIPV~0!#O7}JaFK^ z3d^!YXf79WA4QP>+b~zfUecL!xtwV8i-ckj1e?0Lx_%eOvs<-+@$qr<^y$;LBH~3t z(KO9<^VMs^Q6cIz2!aO_iNsC9Q|fU(CY2b+w;O>{N{LGSEHi)Gw(U)`Qrh?ZXU^-s zuQzI>v9n85EF%6)#)^Ov7i+DBWW7m5`?c2jW|s{_HEHni%@chnXgDDlQsT4?>a^#l_=pK%nHJ|Ft-FG z2SrGhN~N7d^mzbSpGu|7dL=frJ9}YOE|^q%*Y2w*>*3H6pw^nM_`V zh#v=lTZ!mX%-kg*5p4(nQe`h_txquXu^1e=ElctM O0000