diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/EndCallActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/EndCallActivity.java index 4fd1365cd..8de0b7dbe 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/EndCallActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/EndCallActivity.java @@ -57,7 +57,7 @@ public class EndCallActivity extends AbsOTOActivity { return; } ImgLoader.display(mContext, user.getUser().getAvatar(), avatar); - ImgLoader.displayBlur(mContext, user.getUser().getAvatar(), findViewById(R.id.bg), 45); + ImgLoader.displayBlur(mContext, user.getUser().getAvatar(), findViewById(R.id.bg), 85); usernameView.setText(user.getUser().getUserNicename()); callTimerButton.setText(timer); if (user.getUser().isFollow()) { diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java index 1738cc626..b0e4f8275 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/MainActivity.java @@ -24,6 +24,7 @@ import com.shayu.onetoone.bean.MatchingItemSizeBean; import com.shayu.onetoone.bean.OfficialNoticeBean; import com.shayu.onetoone.dialog.FirstTipsDialog; import com.shayu.onetoone.dialog.TipsDialog; +import com.shayu.onetoone.event.HomeBusEvent; import com.shayu.onetoone.event.MessageMsgBusEvent; import com.shayu.onetoone.listener.OnDialogClickListener; import com.shayu.onetoone.manager.CallClientManager; @@ -118,11 +119,10 @@ public class MainActivity extends AbsOTOActivity { @Override public void onCountChanged(int count) { showRedPoint(count); - Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_UPDATE_SYSTEM)); } }); CallClientManager.getManager(); - //initFirstLoginTips(); + initFirstLoginTips(); } private void initFirstLoginTips() { @@ -141,6 +141,7 @@ public class MainActivity extends AbsOTOActivity { } else { isShow = false; } + Bus.get().post(new HomeBusEvent(HomeBusEvent.TYPE_UPDATE_MATCHING, data.getNum())); if (isShow) { new FirstTipsDialog(mContext) .setHome(isMan) @@ -171,8 +172,6 @@ public class MainActivity extends AbsOTOActivity { protected void onResume() { super.onResume(); checkUserInfoIsSet(); - //测试 - //RouteManager.forwardChooseActivity(); } /** @@ -203,6 +202,7 @@ public class MainActivity extends AbsOTOActivity { for (OfficialNoticeBean datum : data) { point += datum.getNum(); } + Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_UPDATE_SYSTEM,point + count)); //大于0则是通过会话未读监听器获取到的数,则不用再调用获取未读数接口了 if (count >= 0) { updateUnreadCount(point + count); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/RecommendFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/RecommendFragment.java index 0fa42e6ab..c3e9ff3a3 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/RecommendFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/RecommendFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import androidx.annotation.NonNull; @@ -12,13 +13,24 @@ import com.shayu.onetoone.R; import com.shayu.onetoone.activity.fragments.BaseFragment; import com.shayu.onetoone.adapter.HomeRecommendListAdapter; import com.shayu.onetoone.bean.HomeItemBean; +import com.shayu.onetoone.bean.MatchingItemSizeBean; import com.shayu.onetoone.bean.SendConsumeBean; +import com.shayu.onetoone.dialog.FirstTipsDialog; +import com.shayu.onetoone.event.HomeBusEvent; +import com.shayu.onetoone.event.MessageMsgBusEvent; import com.shayu.onetoone.listener.OnSendMessageListener; import com.shayu.onetoone.manager.OTONetManager; import com.shayu.onetoone.manager.RouteManager; import com.shayu.onetoone.manager.SendMessageManager; import com.yanzhenjie.recyclerview.SwipeRecyclerView; import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.interfaces.OnItemClickListener; +import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.ToastUtil; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import java.util.List; @@ -36,20 +48,28 @@ public class RecommendFragment extends BaseFragment { private int page = 1; private boolean isScreen; Bundle screen; - View matching; + ImageView matching; + + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } @Override public void initView(View itemView) { + Bus.getOn(this); recyclerView = itemView.findViewById(R.id.recyclerView); mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); top = itemView.findViewById(R.id.btn_top_list); - matching=itemView.findViewById(R.id.matching); + matching = itemView.findViewById(R.id.matching); adapter = new HomeRecommendListAdapter(getContext()); recyclerView.setAdapter(adapter); mRefreshLayout.setNestedScrollingEnabled(false); mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext())); mRefreshLayout.setRefreshFooter(new RongRefreshHeader(this.getContext())); recyclerView.setEmptyView(itemView.findViewById(R.id.view_empty)); + recyclerView.setAutoLoadMore(true); mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { public void onRefresh(@NonNull RefreshLayout refreshLayout) { page = 1; @@ -62,7 +82,7 @@ public class RecommendFragment extends BaseFragment { } }); top.setOnClickListener(view -> { - recyclerView.scrollToPosition(0); + recyclerView.scrollToPosition(0); }); matching.setOnClickListener(v -> { SendMessageManager.matching(new OnSendMessageListener() { @@ -71,7 +91,7 @@ public class RecommendFragment extends BaseFragment { super.onSuccess(token, bean); Bundle bundle = new Bundle(); bundle.putString("data", JSONObject.toJSONString(bean)); - RouteManager.forwardActivity(RouteManager.ACTIVITY_MATCHING,bundle); + RouteManager.forwardActivity(RouteManager.ACTIVITY_MATCHING, bundle); } @Override @@ -152,6 +172,7 @@ public class RecommendFragment extends BaseFragment { if (page != 1 && data.isEmpty()) { page--; mRefreshLayout.finishLoadMore(); + recyclerView.loadMoreFinish(true, false); return; } if (page != 1) { @@ -173,4 +194,16 @@ public class RecommendFragment extends BaseFragment { public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recommend, container, false); } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void event(HomeBusEvent event) { + if (event.getType() == HomeBusEvent.TYPE_UPDATE_MATCHING) { + int num = event.getMatching(); + if (num > 0) { + matching.setImageResource(R.mipmap.ic_matching_free); + } else { + matching.setImageResource(R.mipmap.ic_matching); + } + } + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java index d7ea5b353..d5711b737 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/ChatMessageFragment.java @@ -29,11 +29,13 @@ import com.shayu.onetoone.bean.GiftBean; import com.shayu.onetoone.bean.MessageChatAuthContent; import com.shayu.onetoone.bean.MessageChatTipsContent; import com.shayu.onetoone.bean.MessageConsumeConfigBean; +import com.shayu.onetoone.bean.OfficialNoticeBean; import com.shayu.onetoone.bean.SendConsumeBean; import com.shayu.onetoone.bean.UserBean; import com.shayu.onetoone.dialog.BottomListDialog; import com.shayu.onetoone.dialog.MsgChatClickDialog; import com.shayu.onetoone.dialog.TipsDialog; +import com.shayu.onetoone.event.MessageMsgBusEvent; import com.shayu.onetoone.listener.OnDialogClickListener; import com.shayu.onetoone.listener.OnSendMessageListener; import com.shayu.onetoone.manager.CallClientManager; @@ -48,12 +50,15 @@ import com.yunbao.common.http.base.HttpCallback; import com.yunbao.common.interfaces.ImageResultCallback; import com.yunbao.common.interfaces.OnItemClickListener; import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.ProcessImageUtil; import com.yunbao.common.utils.SpUtil; import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.WordUtil; +import org.greenrobot.eventbus.Subscribe; + import java.io.File; import java.lang.reflect.Field; import java.util.Arrays; @@ -81,6 +86,7 @@ import io.rong.message.TextMessage; public class ChatMessageFragment extends AbsConversationFragment { Button mSendBtn; View mInputPanel; + View numLayout; EditText mEditText; ImageView img, call, video, gift; ProcessImageUtil cameraUtil; @@ -94,6 +100,7 @@ public class ChatMessageFragment extends AbsConversationFragment { TextView home; ImageView sex; ImageView status; + TextView num; Button follow; @@ -101,10 +108,20 @@ public class ChatMessageFragment extends AbsConversationFragment { private static final String TAG = "聊天界面"; private MessageConsumeConfigBean configBean; + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + Bus.getOn(this); targetId = getActivity().getIntent().getStringExtra("targetId"); + num = findViewById(R.id.num); + numLayout = findViewById(R.id.constraintLayout2); + numLayout.setVisibility(View.INVISIBLE); initBtn(); initChat(); initPriceBean(); @@ -120,8 +137,8 @@ public class ChatMessageFragment extends AbsConversationFragment { } SendMessageManager.sendMessageForText(targetId, mEditText.getText().toString(), new OnSendMessageListener() { @Override - public void onSuccess(String token,SendConsumeBean bean) { - super.onSuccess(token,bean); + public void onSuccess(String token, SendConsumeBean bean) { + super.onSuccess(token, bean); ChatMessageFragment.this.token = token; sendText(); @@ -148,6 +165,7 @@ public class ChatMessageFragment extends AbsConversationFragment { }); }); updateMyInfo(); + showRedPoint(); } @Override @@ -202,11 +220,11 @@ public class ChatMessageFragment extends AbsConversationFragment { giftPanel.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(GiftBean bean, int position) { - if(call.getTag()!=null){ - call.setTag(null); - call.setImageResource(R.mipmap.ic_msg_call); - video.setImageResource(R.mipmap.ic_msg_video); - } + if (call.getTag() != null) { + call.setTag(null); + call.setImageResource(R.mipmap.ic_msg_call); + video.setImageResource(R.mipmap.ic_msg_video); + } } }); mVoiceToggleBtn.setOnClickListener(view -> { @@ -218,13 +236,13 @@ public class ChatMessageFragment extends AbsConversationFragment { }); video.setOnClickListener(v -> { - if(call.getTag()!=null){ + if (call.getTag() != null) { return; } checkAuth(new OnSendMessageListener() { @Override public void onSuccess(String token, SendConsumeBean bean) { - super.onSuccess(token,bean); + super.onSuccess(token, bean); new BottomListDialog(mContext).setSelect(new OnItemClickListener() { @Override public void onItemClick(String bean, int position) { @@ -244,19 +262,18 @@ public class ChatMessageFragment extends AbsConversationFragment { super.onError(status, msg); new TipsDialog(mContext) .setTitle("餘額不足") - .setContent("與TA視頻聊天每分鐘續消耗"+configBean.getVideoPrice() - +"鑽石,您可通過充值獲取更多鑽石,以便繼續聊天") + .setContent("與TA視頻聊天每分鐘續消耗" + configBean.getVideoPrice() + + "鑽石,您可通過充值獲取更多鑽石,以便繼續聊天") .setCancelText("離開") .setApplyText("去充值") .showDialog(); } }); } - }).setStrings(Collections.singletonList("发起视频通话\n"+configBean.getVideoPrice()+"钻/分钟")) + }).setStrings(Collections.singletonList("发起视频通话\n" + configBean.getVideoPrice() + "钻/分钟")) .showDialog(); - } @Override @@ -267,13 +284,13 @@ public class ChatMessageFragment extends AbsConversationFragment { }); }); call.setOnClickListener(v -> { - if(call.getTag()!=null){ + if (call.getTag() != null) { return; } checkAuth(new OnSendMessageListener() { @Override - public void onSuccess(String token,SendConsumeBean bean) { - super.onSuccess(token,bean); + public void onSuccess(String token, SendConsumeBean bean) { + super.onSuccess(token, bean); new BottomListDialog(mContext).setSelect(new OnItemClickListener() { @Override public void onItemClick(String bean, int position) { @@ -293,8 +310,8 @@ public class ChatMessageFragment extends AbsConversationFragment { super.onError(status, msg); new TipsDialog(mContext) .setTitle("餘額不足") - .setContent("與TA语音聊天每分鐘續消耗"+configBean.getMp3Price() - +"鑽石,您可通過充值獲取更多鑽石,以便繼續聊天") + .setContent("與TA语音聊天每分鐘續消耗" + configBean.getMp3Price() + + "鑽石,您可通過充值獲取更多鑽石,以便繼續聊天") .setCancelText("離開") .setApplyText("去充值") .showDialog(); @@ -302,7 +319,7 @@ public class ChatMessageFragment extends AbsConversationFragment { }); } - }).setStrings(Collections.singletonList("发起语音通话\n"+configBean.getMp3Price()+"钻/分钟")) + }).setStrings(Collections.singletonList("发起语音通话\n" + configBean.getMp3Price() + "钻/分钟")) .showDialog(); } @@ -323,8 +340,8 @@ public class ChatMessageFragment extends AbsConversationFragment { SendMessageManager.sendMessageForText(targetId, "图片信息", new OnSendMessageListener() { @Override - public void onSuccess(String token,SendConsumeBean bean) { - super.onSuccess(token,bean); + public void onSuccess(String token, SendConsumeBean bean) { + super.onSuccess(token, bean); ChatMessageFragment.this.token = token; if (isCamera) { cameraUtil.getImageByCamera(false); @@ -364,7 +381,7 @@ public class ChatMessageFragment extends AbsConversationFragment { if (data.getInfo().getName_auth() == 1) { listener.onError(0, ""); } else { - listener.onSuccess("",null); + listener.onSuccess("", null); } } @@ -419,8 +436,8 @@ public class ChatMessageFragment extends AbsConversationFragment { } @Override - public void onSuccess(String token,SendConsumeBean bean) { - super.onSuccess(token,bean); + public void onSuccess(String token, SendConsumeBean bean) { + super.onSuccess(token, bean); mEditText.setText(""); if (!SpUtil.getInstance().isExists("chat_msg_safe_tip_" + targetId)) { SpUtil.getInstance().setBooleanValue("chat_msg_safe_tip_" + targetId, true); @@ -544,8 +561,8 @@ public class ChatMessageFragment extends AbsConversationFragment { } else { sex.setImageResource(R.mipmap.ic_message_tab_woman); } - System.out.println("同性別:"+data.getUser().getSex()+"|"+IMLoginManager.get(mContext).getUserInfo().getSex()); - if(data.getUser().getSex()== IMLoginManager.get(mContext).getUserInfo().getSex()){ + System.out.println("同性別:" + data.getUser().getSex() + "|" + IMLoginManager.get(mContext).getUserInfo().getSex()); + if (data.getUser().getSex() == IMLoginManager.get(mContext).getUserInfo().getSex()) { call.setVisibility(View.GONE); video.setVisibility(View.GONE); } @@ -562,7 +579,7 @@ public class ChatMessageFragment extends AbsConversationFragment { if (data.getUser().isFollow()) { follow.setVisibility(View.GONE); } - if(data.getGiftNum()==0){ + if (data.getGiftNum() == 0) { call.setImageResource(R.mipmap.ic_msg_call_lock); video.setImageResource(R.mipmap.ic_msg_video_lock); call.setTag("true"); @@ -653,7 +670,7 @@ public class ChatMessageFragment extends AbsConversationFragment { for (LocalMedia item : selectList) { String mimeType = item.getMimeType(); if (mimeType.startsWith("image")) { - ImageMessage imageMessage=ImageMessage.obtain(Uri.parse(item.getPath()),sendOrigin); + ImageMessage imageMessage = ImageMessage.obtain(Uri.parse(item.getPath()), sendOrigin); Message message = Message.obtain(targetId, conversationType, imageMessage); message.setSenderUserId(CommonAppConfig.getInstance().getUid()); message.setObjectName("RC:ImgMsg"); @@ -693,12 +710,13 @@ public class ChatMessageFragment extends AbsConversationFragment { } } } - private void initPriceBean(){ + + private void initPriceBean() { OTONetManager.getInstance(mContext) .getMessageConsumeConfig(targetId, new HttpCallback() { @Override public void onSuccess(MessageConsumeConfigBean data) { - configBean=data; + configBean = data; } @Override @@ -707,4 +725,53 @@ public class ChatMessageFragment extends AbsConversationFragment { } }); } + + private void showRedPoint() { + OTONetManager.getInstance(mContext).getMessageSystemLists(new HttpCallback>() { + int point = 0; + + @Override + public void onSuccess(List data) { + for (OfficialNoticeBean datum : data) { + point += datum.getNum(); + } + RongIMClient.getInstance().getTotalUnreadCount(new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Integer integer) { + Integer tmp = integer + point; + if (tmp <= 0) { + numLayout.setVisibility(View.INVISIBLE); + return; + } + numLayout.setVisibility(View.VISIBLE); + num.setText(tmp + ""); + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + + } + }); + } + + @Override + public void onError(String error) { + + } + }); + } + + @Subscribe + public void event(MessageMsgBusEvent event) { + if (event.getType() == MessageMsgBusEvent.TYPE_UPDATE_SYSTEM) { + if (event.getNum() <= 0) { + numLayout.setVisibility(View.INVISIBLE); + return; + } + if (num.getVisibility() == View.GONE) { + numLayout.setVisibility(View.VISIBLE); + } + num.setText(event.getNum() + ""); + } + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgFriendFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgFriendFragment.java index 662d00a14..f22b3ee21 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgFriendFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgFriendFragment.java @@ -1,25 +1,242 @@ package com.shayu.onetoone.activity.fragments.message; +import android.graphics.Color; +import android.net.Uri; import android.os.Bundle; +import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.fastjson.JSONObject; import com.shayu.onetoone.R; import com.shayu.onetoone.activity.fragments.BaseFragment; +import com.shayu.onetoone.adapter.MsgMessageRecyclerViewAdapter; +import com.shayu.onetoone.bean.HomeItemBean; +import com.shayu.onetoone.bean.OfficialNoticeBean; +import com.shayu.onetoone.event.MessageMsgBusEvent; +import com.shayu.onetoone.manager.OTONetManager; +import com.yanzhenjie.recyclerview.OnItemClickListener; +import com.yanzhenjie.recyclerview.OnItemMenuClickListener; +import com.yanzhenjie.recyclerview.OnItemMenuStateListener; +import com.yanzhenjie.recyclerview.SwipeMenuBridge; +import com.yanzhenjie.recyclerview.SwipeMenuCreator; +import com.yanzhenjie.recyclerview.SwipeMenuItem; +import com.yanzhenjie.recyclerview.SwipeRecyclerView; +import com.yunbao.common.http.base.HttpCallback; +import com.yunbao.common.utils.Bus; +import com.yunbao.common.utils.DpUtil; +import com.yunbao.common.utils.StringUtil; + +import org.greenrobot.eventbus.Subscribe; + +import java.util.ArrayList; +import java.util.List; + +import io.rong.common.RLog; +import io.rong.imkit.config.ConversationListBehaviorListener; +import io.rong.imkit.config.RongConfigCenter; +import io.rong.imkit.conversationlist.model.BaseUiConversation; +import io.rong.imkit.conversationlist.model.GatheredConversation; +import io.rong.imkit.conversationlist.model.SingleConversation; +import io.rong.imkit.utils.RouteUtils; +import io.rong.imkit.widget.FixedLinearLayoutManager; +import io.rong.imkit.widget.adapter.BaseAdapter; +import io.rong.imkit.widget.adapter.ViewHolder; +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; +import io.rong.imlib.RongIMClient; +import io.rong.imlib.model.Conversation; +import io.rong.imlib.model.Message; +import io.rong.imlib.model.UserInfo; /** * 消息-好友 */ -public class MsgFriendFragment extends BaseFragment { +public class MsgFriendFragment extends BaseFragment implements BaseAdapter.OnItemClickListener { + SwipeRecyclerView mList; + SmartRefreshLayout mRefreshLayout; + MsgMessageRecyclerViewAdapter mAdapter; + List list; + private int page = 1; + private static final String TAG = MsgFriendFragment.class.getName(); + + @Override + public void onDestroy() { + super.onDestroy(); + Bus.getOff(this); + } @Override public void initView(View itemView) { + Bus.getOn(this); + mList = itemView.findViewById(R.id.recyclerView); + mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); + mAdapter = new MsgMessageRecyclerViewAdapter(mList); + mAdapter.setItemClickListener(this); + list = new ArrayList<>(); + mList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + //mList.setSwipeMenuCreator(initSwipeMenuCreator()); + mList.setHasFixedSize(true); + mList.setEmptyView(itemView.findViewById(R.id.view_empty)); + mList.setAutoMarginEnabled(true); + mList.setOnItemMenuClickListener(new OnItemMenuClickListener() { + @Override + public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition) { + } + }); + mList.setOnItemMenuStateListener(new OnItemMenuStateListener() { + + @Override + public void onMenuState(RecyclerView.ViewHolder viewHolder, int menuState) { + + } + }); + LinearLayoutManager layoutManager = new FixedLinearLayoutManager(this.getActivity()); + mList.setLayoutManager(layoutManager); + mList.setAdapter(this.mAdapter); + initRefreshView(); + initData(); + + } + + protected void initRefreshView() { + this.mRefreshLayout.setNestedScrollingEnabled(false); + this.mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext())); + this.mRefreshLayout.setRefreshFooter(new RongRefreshHeader(this.getContext())); + this.mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + page = 1; + initData(); + } + }); + this.mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + initData(); + } + }); } @Override public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_msg_friend, container, false); } + + private SwipeMenuCreator initSwipeMenuCreator() { + SwipeMenuCreator creator = (leftMenu, rightMenu, position) -> { + SwipeMenuItem top = new SwipeMenuItem(getContext()); + SwipeMenuItem del = new SwipeMenuItem(getContext()); + top.setBackgroundColor(Color.parseColor("#D9D9D9")); + del.setBackgroundColor(Color.parseColor("#FE5268")); + top.setText("置顶"); + del.setText("删除"); + top.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); + top.setWidth(DpUtil.dp2px(71)); + del.setHeight(ViewGroup.LayoutParams.MATCH_PARENT); + del.setWidth(DpUtil.dp2px(71)); + + rightMenu.addMenuItem(top); + rightMenu.addMenuItem(del); + + }; + return creator; + } + + private void initData() { + + OTONetManager.getInstance(mContext) + .getFriends(page, new HttpCallback>() { + @Override + public void onSuccess(List data) { + if (page == 1) { + list.clear(); + } + if (data.isEmpty()) { + mAdapter.setDataCollection(list); + mAdapter.notifyDataSetChanged(); + mRefreshLayout.finishRefresh(); + mRefreshLayout.finishLoadMore(); + return; + } + for (int i = 0; i < data.size(); i++) { + getNewData(data.get(i), i == data.size() - 1); + } + + } + + @Override + public void onError(String error) { + + } + + public synchronized void getNewData(HomeItemBean item, boolean over) { + RongIMClient.getInstance().getConversation(Conversation.ConversationType.PRIVATE, item.getId() + "", new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Conversation conversation) { + SingleConversation singleConversation = new SingleConversation(mContext, conversation); + if (StringUtil.isEmpty(singleConversation.mConversationContent.toString())) { + singleConversation.mConversationContent = new SpannableString("你们什么都没聊"); + } + list.add(singleConversation); + if (over) { + mAdapter.setDataCollection(list); + mAdapter.notifyDataSetChanged(); + mRefreshLayout.finishRefresh(); + mRefreshLayout.finishLoadMore(); + page++; + } + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + + } + }); + + } + }); + } + + @Override + public void onItemClick(View view, ViewHolder holder, int position) { + if (position >= 0 && position < this.mAdapter.getData().size()) { + BaseUiConversation baseUiConversation = (BaseUiConversation) this.mAdapter.getItem(position); + ConversationListBehaviorListener listBehaviorListener = RongConfigCenter.conversationListConfig().getListener(); + if (listBehaviorListener != null && listBehaviorListener.onConversationClick(view.getContext(), view, baseUiConversation)) { + RLog.d(TAG, "ConversationList item click event has been intercepted by App."); + } else { + if (baseUiConversation != null && baseUiConversation.mCore != null) { + if (baseUiConversation instanceof GatheredConversation) { + RouteUtils.routeToSubConversationListActivity(view.getContext(), ((GatheredConversation) baseUiConversation).mGatheredType, baseUiConversation.mCore.getConversationTitle()); + } else { + RouteUtils.routeToConversationActivity(view.getContext(), baseUiConversation.getConversationIdentifier()); + } + } else { + RLog.e(TAG, "invalid conversation."); + } + + } + } + } + + @Override + public boolean onItemLongClick(View view, ViewHolder holder, int position) { + return false; + } + + @Subscribe + public void event(MessageMsgBusEvent event) { + if (event.getType() == MessageMsgBusEvent.TYPE_UPDATE_SYSTEM) { + page = 1; + initData(); + } + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallAudioActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallAudioActivity.java index b3a22a144..3ae8bff15 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallAudioActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallAudioActivity.java @@ -1,5 +1,6 @@ package com.shayu.onetoone.activity.message; +import android.app.Dialog; import android.os.Bundle; import android.view.MotionEvent; import android.view.SurfaceView; @@ -12,19 +13,24 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.alibaba.android.arouter.facade.annotation.Route; +import com.alibaba.fastjson.JSONObject; import com.lxj.xpopup.XPopup; import com.lxj.xpopup.core.BasePopupView; import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.enums.ShowPattern; import com.lzf.easyfloat.interfaces.OnFloatCallbacks; +import com.lzf.easyfloat.interfaces.OnPermissionResult; +import com.lzf.easyfloat.permission.PermissionUtils; import com.makeramen.roundedimageview.RoundedImageView; import com.shayu.onetoone.R; import com.shayu.onetoone.activity.AbsOTOActivity; import com.shayu.onetoone.bean.FollowBean; import com.shayu.onetoone.bean.UserBean; import com.shayu.onetoone.dialog.GiftDialog; +import com.shayu.onetoone.dialog.TipsDialog; import com.shayu.onetoone.dialog.TipsTextDialog; import com.shayu.onetoone.listener.OnCallStatusListener; +import com.shayu.onetoone.listener.OnDialogClickListener; import com.shayu.onetoone.manager.CallClientManager; import com.shayu.onetoone.manager.OTONetManager; import com.shayu.onetoone.manager.RouteManager; @@ -143,7 +149,7 @@ public class CallAudioActivity extends AbsOTOActivity implements View.OnClickLis userName.setText(data.getUser().getUserNicename()); userInfo.setText(data.getUser().getSignature()); ImgLoader.display(mContext, data.getUser().getAvatar(), avatar); - ImgLoader.displayBlur(mContext, data.getUser().getAvatar(), vague, 50); + ImgLoader.displayBlur(mContext, data.getUser().getAvatar(), vague, 85); if (data.getUser().isFollow()) { follow.setVisibility(View.GONE); } else { @@ -188,6 +194,29 @@ public class CallAudioActivity extends AbsOTOActivity implements View.OnClickLis } private void showWindow(boolean toChatView) { + if(!PermissionUtils.checkPermission(this)){ + new TipsDialog(mContext) + .setTitle("请允许悬浮窗权限才能进行小窗") + .setApplyText("前往") + .setCancelText("取消") + .setOnDialogClickListener(new OnDialogClickListener() { + @Override + public void onApply(Dialog dialog) { + super.onApply(dialog); + PermissionUtils.requestPermission(CallAudioActivity.this, new OnPermissionResult() { + @Override + public void permissionResult(boolean b) { + if(b){ + showWindow(toChatView); + } + } + }); + + } + }) + .showDialog(); + return; + } ImageView icon = new ImageView(mContext); icon.setTag(getIntent().getExtras()); icon.setImageResource(io.rong.callkit.R.drawable.rc_voip_audio_answer_selector_new); @@ -256,12 +285,25 @@ public class CallAudioActivity extends AbsOTOActivity implements View.OnClickLis @Override public void onCallStart(String userId, SurfaceView surfaceView) { - gift.setVisibility(View.VISIBLE); - money.setVisibility(View.VISIBLE); + if (model.equals(CallClientManager.AUDIO_RECEIVED_CALL)) { + gift.setVisibility(View.INVISIBLE); + money.setVisibility(View.INVISIBLE); + } else { + gift.setVisibility(View.VISIBLE); + money.setVisibility(View.VISIBLE); + } } @Override public void onCallEnd() { + Bundle bundle = new Bundle(); + bundle.putString("model", CallClientManager.AUDIO_CALL); + bundle.putString("targetId", targetId); + bundle.putString("callId", targetId); + bundle.putString("user", JSONObject.toJSONString(userData)); + bundle.putString("time", callTime.getText().toString()); + bundle.putString("path", RouteManager.ACTIVITY_CALL_AUDIO); + RouteManager.forwardActivity(RouteManager.ACTIVITY_END_CALL, bundle); finish(); } @@ -292,6 +334,9 @@ public class CallAudioActivity extends AbsOTOActivity implements View.OnClickLis } void createShow(long msg) { + if (model.equals(CallClientManager.AUDIO_RECEIVED_CALL)) { + return; + } tipsDialog = new TipsTextDialog(mContext) .setTips("通话将在" + msg + "秒后断\n开,请及时充值") .setOnItemClickListener(new OnItemClickListener() { diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java index 34026a577..75cb35575 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/CallVideoActivity.java @@ -1,5 +1,6 @@ package com.shayu.onetoone.activity.message; +import android.app.Dialog; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -21,14 +22,18 @@ import com.lxj.xpopup.core.BasePopupView; import com.lzf.easyfloat.EasyFloat; import com.lzf.easyfloat.enums.ShowPattern; import com.lzf.easyfloat.interfaces.OnFloatCallbacks; +import com.lzf.easyfloat.interfaces.OnPermissionResult; +import com.lzf.easyfloat.permission.PermissionUtils; import com.makeramen.roundedimageview.RoundedImageView; import com.shayu.onetoone.R; import com.shayu.onetoone.activity.AbsOTOActivity; import com.shayu.onetoone.bean.FollowBean; import com.shayu.onetoone.bean.UserBean; import com.shayu.onetoone.dialog.GiftDialog; +import com.shayu.onetoone.dialog.TipsDialog; import com.shayu.onetoone.dialog.TipsTextDialog; import com.shayu.onetoone.listener.OnCallStatusListener; +import com.shayu.onetoone.listener.OnDialogClickListener; import com.shayu.onetoone.manager.CallClientManager; import com.shayu.onetoone.manager.OTONetManager; import com.shayu.onetoone.manager.RouteManager; @@ -187,6 +192,11 @@ public class CallVideoActivity extends AbsOTOActivity { callTime = itemView.findViewById(R.id.call_time); // 为所有View设置点击事件监听器 setClickListeners(); + + if(model.equals(CallClientManager.VIDEO_RECEIVED_CALL)){ + gift.setVisibility(View.INVISIBLE); + money.setVisibility(View.INVISIBLE); + } } private void setClickListeners() { @@ -233,6 +243,29 @@ public class CallVideoActivity extends AbsOTOActivity { } private void showWindow(boolean toChatView) { + if(!PermissionUtils.checkPermission(this)){ + new TipsDialog(mContext) + .setTitle("请允许悬浮窗权限才能进行小窗") + .setApplyText("前往") + .setCancelText("取消") + .setOnDialogClickListener(new OnDialogClickListener() { + @Override + public void onApply(Dialog dialog) { + super.onApply(dialog); + PermissionUtils.requestPermission(CallVideoActivity.this, new OnPermissionResult() { + @Override + public void permissionResult(boolean b) { + if(b){ + showWindow(toChatView); + } + } + }); + + } + }) + .showDialog(); + return; + } CallClientManager.getManager().getRemoteVideo().setTag(getIntent().getExtras()); myView.removeAllViews(); targetView.removeAllViews(); @@ -431,6 +464,9 @@ public class CallVideoActivity extends AbsOTOActivity { } void createShow(long msg) { + if(model.equals(CallClientManager.VIDEO_RECEIVED_CALL)){ + return; + } tipsDialog = new TipsTextDialog(mContext) .setTips("通话将在" + msg + "秒后断\n开,请及时充值") .setOnItemClickListener(new OnItemClickListener() { diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/ChatActivity.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/ChatActivity.java index 0e16ef3c5..897488667 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/message/ChatActivity.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/message/ChatActivity.java @@ -25,6 +25,7 @@ import com.shayu.onetoone.bean.SendConsumeBean; import com.shayu.onetoone.bean.SystemMessageBean; import com.shayu.onetoone.bean.UserBean; import com.shayu.onetoone.dialog.TipsDialog; +import com.shayu.onetoone.event.MessageMsgBusEvent; import com.shayu.onetoone.listener.OnDialogClickListener; import com.shayu.onetoone.manager.OTONetManager; import com.shayu.onetoone.manager.RouteManager; @@ -34,6 +35,8 @@ import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SpUtil; import com.yunbao.common.utils.StringUtil; +import org.greenrobot.eventbus.Subscribe; + import java.util.Set; import io.rong.imkit.conversation.ConversationFragment; @@ -136,5 +139,4 @@ public class ChatActivity extends AbsOTOActivity { } }); } - } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java index af3251557..a9393566c 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java @@ -93,6 +93,7 @@ public class HomeRecommendListAdapter extends RecyclerView.Adapter listener) { @@ -21,6 +25,16 @@ public class MsgChatMessageListAdapter extends MessageListAdapter { return super.onCreateViewHolder(parent, viewType); } + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + if(getData().get(position).getMessageDirection()== Message.MessageDirection.SEND) { + holder.setTextColor(R.id.rc_text, Color.WHITE); + }else{ + holder.setTextColor(R.id.rc_text, Color.parseColor("#555555")); + } + } + public int getPosition(int messageId) { for (int i = 0; i < getData().size(); i++) { if (getData().get(i).getMessageId() == messageId){ diff --git a/OneToOne/src/main/java/com/shayu/onetoone/event/HomeBusEvent.java b/OneToOne/src/main/java/com/shayu/onetoone/event/HomeBusEvent.java new file mode 100644 index 000000000..3fb35d9db --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/event/HomeBusEvent.java @@ -0,0 +1,23 @@ +package com.shayu.onetoone.event; + +public class HomeBusEvent extends AbsBusEvent { + public static final int TYPE_UPDATE_MATCHING = 0; + private int matching; + + public HomeBusEvent(int type) { + super(type); + } + + public HomeBusEvent(int type, int matching) { + super(type); + this.matching = matching; + } + + public int getMatching() { + return matching; + } + + public void setMatching(int matching) { + this.matching = matching; + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java b/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java index be5d32e14..ef2e6a810 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/event/MessageMsgBusEvent.java @@ -4,7 +4,22 @@ public class MessageMsgBusEvent extends AbsBusEvent { public static final int TYPE_ALL_READ = 0; public static final int TYPE_UPDATE_SYSTEM=1; + private int num; + + public MessageMsgBusEvent(int type, int num) { + super(type); + this.num = num; + } + public MessageMsgBusEvent(int type) { super(type); } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java index 411941382..3caeeb407 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/CallClientManager.java @@ -36,12 +36,12 @@ import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; public class CallClientManager { - public static final String VIDEO_RECEIVED_CALL = "receivedCall";//接听 - public static final String VIDEO_CALL = "call";//拨打 - public static final String VIDEO_FLOAT = "floatWindow";//浮窗 - public static final String AUDIO_RECEIVED_CALL = "receivedCall";//接听 - public static final String AUDIO_CALL = "call";//拨打 - public static final String AUDIO_FLOAT = "floatWindow";//浮窗 + public static final String VIDEO_RECEIVED_CALL = "receivedVideoCall";//接听 + public static final String VIDEO_CALL = "callVideo";//拨打 + public static final String VIDEO_FLOAT = "videoFloatWindow";//浮窗 + public static final String AUDIO_RECEIVED_CALL = "receivedAudioCall";//接听 + public static final String AUDIO_CALL = "callAudio";//拨打 + public static final String AUDIO_FLOAT = "audioFloatWindow";//浮窗 private static CallClientManager manager; private SurfaceView localVideo, remoteVideo; private List listeners; @@ -347,13 +347,14 @@ public class CallClientManager { @Override public void onReceivedCall(RongCallSession callSession) { Bundle bundle = new Bundle(); - bundle.putString("model", VIDEO_RECEIVED_CALL); bundle.putString("targetId", callSession.getTargetId()); bundle.putString("callId", callSession.getCallId()); bundle.putString("sessionId", callSession.getSessionId()); if (callSession.getMediaType() == RongCallCommon.CallMediaType.VIDEO) { + bundle.putString("model", VIDEO_RECEIVED_CALL); RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_VIDEO, bundle); } else { + bundle.putString("model", AUDIO_RECEIVED_CALL); RouteManager.forwardActivity(RouteManager.ACTIVITY_CALL_AUDIO, bundle); } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java index 1af8fa3ee..faf38f81b 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/manager/OTONetManager.java @@ -1197,4 +1197,21 @@ public class OTONetManager { } }).isDisposed(); } + public void getFriends(int page,HttpCallback> callback) { + API.get().otoApi(mContext). + getFriends(page+"") + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + if (listResponseModel.getData().getCode() == 0) { + callback.onSuccess(listResponseModel.getData().getInfo()); + } else { + callback.onError(listResponseModel.getData().getMsg()); + } + }, throwable -> { + if (callback != null) { + callback.onError(mContext.getString(com.yunbao.common.R.string.net_error)); + } + }).isDisposed(); + } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java index 7ba9f8b70..5e2b5eea2 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/network/OneToOneApi.java @@ -155,7 +155,7 @@ public interface OneToOneApi { @GET("/api/public/?service=Friendappmoney.info") Observable> getPurseInfo(); - @GET("/api/public/?service=Friendappuser.follow") + @GET("/api/public/?service=User.setAttents") Observable>> follow(@Query("touid") String toUid); /** @@ -305,6 +305,9 @@ public interface OneToOneApi { @GET("/api/public/?service=Friendappinfos.getSage") Observable> getBloggerInfo( ); + + @GET("/api/public/?service=Friendappuser.friend") + Observable>> getFriends(@Query("p")String p); } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java index 00716196b..fc6618822 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/view/MsgInputPanelForAudio.java @@ -3,6 +3,7 @@ package com.shayu.onetoone.view; import android.Manifest; import android.annotation.SuppressLint; import android.app.Dialog; +import android.os.SystemClock; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -35,6 +36,8 @@ public class MsgInputPanelForAudio extends AbsInputPanel { ImageView btnText; ImageView btnClose; private float mLastTouchY; + private long smStartRecTime; + private boolean mUpDirection; private String token; @@ -157,6 +160,7 @@ public class MsgInputPanelForAudio extends AbsInputPanel { } MsgInputPanelForAudio.this.mLastTouchY = mLastTouchY; MsgInputPanelForAudio.this.mUpDirection = false; + smStartRecTime = SystemClock.elapsedRealtime(); AudioRecordManager.getInstance().startRecord(v.getRootView(), mRongExtension.getConversationIdentifier()); return false; } diff --git a/OneToOne/src/main/res/drawable-xhdpi/rc_ic_bubble_right.9.png b/OneToOne/src/main/res/drawable-xhdpi/rc_ic_bubble_right.9.png new file mode 100644 index 000000000..b9aa74e3b Binary files /dev/null and b/OneToOne/src/main/res/drawable-xhdpi/rc_ic_bubble_right.9.png differ diff --git a/OneToOne/src/main/res/layout/dialog_end_call.xml b/OneToOne/src/main/res/layout/dialog_end_call.xml index b59059fa5..eab0ce5b2 100644 --- a/OneToOne/src/main/res/layout/dialog_end_call.xml +++ b/OneToOne/src/main/res/layout/dialog_end_call.xml @@ -28,7 +28,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_tip" - android:minWidth="256dp" + android:minWidth="289dp" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -38,9 +38,9 @@ + android:layout_marginEnd="25dp"> diff --git a/OneToOne/src/main/res/layout/fragment_msg_friend.xml b/OneToOne/src/main/res/layout/fragment_msg_friend.xml index c022094b3..446bc32d8 100644 --- a/OneToOne/src/main/res/layout/fragment_msg_friend.xml +++ b/OneToOne/src/main/res/layout/fragment_msg_friend.xml @@ -5,12 +5,29 @@ android:layout_width="match_parent" android:layout_height="match_parent"> -