diff --git a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java index ef148d31b..329f01d2a 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/AppContext.java @@ -1,8 +1,6 @@ package com.shayu.onetoone; - - import android.os.Handler; import android.os.Looper; import android.os.Process; @@ -12,16 +10,22 @@ import com.alibaba.android.arouter.launcher.ARouter; import com.facebook.FacebookSdk; import com.shayu.onetoone.activity.fragments.message.ChatMessageFragment; import com.shayu.onetoone.activity.message.ChatActivity; +import com.shayu.onetoone.bean.MessageChatTipsContent; import com.shayu.onetoone.provider.CustomConversationProvider; +import com.shayu.onetoone.provider.MessageChatTipsItemProvider; import com.shayu.onetoone.utils.NeverCrashUtils; import com.yunbao.common.BuildConfig; import com.yunbao.common.CommonAppContext; +import com.yunbao.common.manager.imrongcloud.InstructorSendReward; import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider; +import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.AppManager; import com.yunbao.common.utils.L; import com.yunbao.common.utils.ToastUtil; +import java.util.ArrayList; + import io.rong.imkit.RongIM; import io.rong.imkit.config.RongConfigCenter; import io.rong.imkit.conversationlist.model.BaseUiConversation; @@ -65,26 +69,35 @@ public class AppContext extends CommonAppContext { ARouter.printStackTrace(); ARouter.init(this); + + ProviderManager providerManager = RongConfigCenter.conversationListConfig().getProviderManager(); + providerManager.replaceProvider(PrivateConversationProvider.class, new CustomConversationProvider()); + + + ArrayList> myMessages = new ArrayList<>(); + myMessages.add(MessageChatTipsContent.class); + RongIMClient.registerMessageType(myMessages); + + RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext())); + RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatTipsItemProvider(getApplicationContext())); + String appKey = "pvxdm17jpd3hr"; boolean enablePush = true; RongIM.init(this, appKey, enablePush); RongIM.setConnectionStatusListener(new RongIMClient.ConnectionStatusListener() { @Override public void onChanged(ConnectionStatus status) { - Log.i("融云", "onChanged: "+status.getMessage()); + Log.i("融云", "onChanged: " + status.getMessage()); } }); - ProviderManager providerManager = RongConfigCenter.conversationListConfig().getProviderManager(); - providerManager.replaceProvider(PrivateConversationProvider.class,new CustomConversationProvider()); RongcloudIMManager.initRongIM(this); - RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext())); RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() { @Override public boolean onReceived(Message message, int left, boolean hasPackage, boolean offline) { TextMessage content = (TextMessage) message.getContent(); - ToastUtil.show("收到:"+content.getContent()); + ToastUtil.show("收到:" + content.getContent()); return false; } }); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/FriendsFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/FriendsFragment.java index cd810cbc4..0b274110f 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/FriendsFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/FriendsFragment.java @@ -6,15 +6,47 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.angcyo.tablayout.DslTabLayout; +import com.angcyo.tablayout.delegate2.ViewPager2Delegate; import com.shayu.onetoone.R; +import com.shayu.onetoone.activity.fragments.home.HotFragment; +import com.shayu.onetoone.activity.fragments.home.RecommendFragment; +import com.shayu.onetoone.activity.fragments.message.MsgFriendFragment; +import com.shayu.onetoone.activity.fragments.message.MsgMessageFragment; + +import java.util.ArrayList; +import java.util.List; /** * 交友主页面 */ public class FriendsFragment extends BaseFragment { + List fragments = new ArrayList<>(); @Override public void initView(View itemView) { + ViewPager2 viewPager2 = itemView.findViewById(R.id.viewPager); + DslTabLayout tabLayout = itemView.findViewById(R.id.dslTabLayout); + ViewPager2Delegate.Companion.install(viewPager2, tabLayout, false); + fragments.add(new RecommendFragment());//消息 - 消息 + fragments.add(new HotFragment()); //消息 - 好友 + viewPager2.setAdapter(new FragmentStateAdapter(this) { + @NonNull + @Override + public Fragment createFragment(int position) { + return fragments.get(position); + } + + @Override + public int getItemCount() { + return fragments.size(); + } + }); } @Override diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java index 0104f7bc6..04862d311 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/home/HotFragment.java @@ -5,27 +5,52 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; + import com.shayu.onetoone.R; -import com.yunbao.common.fragment.BaseFragment; +import com.shayu.onetoone.activity.fragments.BaseFragment; +import com.shayu.onetoone.adapter.HomeHotListAdapter; +import com.yanzhenjie.recyclerview.SwipeRecyclerView; + +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 HotFragment extends BaseFragment { + SmartRefreshLayout mRefreshLayout; + SwipeRecyclerView recyclerView; + HomeHotListAdapter adapter; + @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public void initView(View itemView) { + recyclerView = itemView.findViewById(R.id.recyclerView); + mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); + adapter=new HomeHotListAdapter(getContext()); + recyclerView.setAdapter(adapter); + mRefreshLayout.setNestedScrollingEnabled(false); + mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext())); + mRefreshLayout.setRefreshFooter(new RongRefreshHeader(this.getContext())); + mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + onConversationListRefresh(refreshLayout); + } + }); + this.mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + onConversationListLoadMore(); + } + }); + } + private void onConversationListLoadMore() { + } + + private void onConversationListRefresh(RefreshLayout refreshLayout) { + + } + @Override + public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_hot, container, false); } - - @Override - protected void initVariables(Bundle bundle) { - - } - - @Override - protected void initViews(Bundle savedInstanceState, View contentView) { - - } - - @Override - protected void loadData() { - - } } 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 7a767b04d..3f5dfe8e9 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 @@ -5,27 +5,54 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.NonNull; + import com.shayu.onetoone.R; -import com.yunbao.common.fragment.BaseFragment; +import com.shayu.onetoone.activity.fragments.BaseFragment; +import com.shayu.onetoone.adapter.HomeRecommendListAdapter; +import com.yanzhenjie.recyclerview.SwipeRecyclerView; + +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 RecommendFragment extends BaseFragment { + SmartRefreshLayout mRefreshLayout; + SwipeRecyclerView recyclerView; + HomeRecommendListAdapter adapter; + @Override - public View createView(LayoutInflater inflater, ViewGroup container) { + public void initView(View itemView) { + recyclerView = itemView.findViewById(R.id.recyclerView); + mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); + adapter=new HomeRecommendListAdapter(getContext()); + recyclerView.setAdapter(adapter); + mRefreshLayout.setNestedScrollingEnabled(false); + mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext())); + mRefreshLayout.setRefreshFooter(new RongRefreshHeader(this.getContext())); + mRefreshLayout.setOnRefreshListener(new OnRefreshListener() { + public void onRefresh(@NonNull RefreshLayout refreshLayout) { + onConversationListRefresh(refreshLayout); + } + }); + this.mRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + public void onLoadMore(@NonNull RefreshLayout refreshLayout) { + onConversationListLoadMore(); + } + }); + } + + private void onConversationListLoadMore() { + } + + private void onConversationListRefresh(RefreshLayout refreshLayout) { + + } + + @Override + public View createView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_recommend, container, false); } - - @Override - protected void initVariables(Bundle bundle) { - - } - - @Override - protected void initViews(Bundle savedInstanceState, View contentView) { - - } - - @Override - protected void loadData() { - - } } 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 71ce4d376..508f73882 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 @@ -8,11 +8,10 @@ import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.content.FileProvider; import com.shayu.onetoone.R; +import com.shayu.onetoone.bean.MessageChatTipsContent; import com.yunbao.common.CommonAppConfig; -import com.yunbao.common.Constants; import com.yunbao.common.interfaces.ImageResultCallback; import com.yunbao.common.utils.ProcessImageUtil; import com.yunbao.common.utils.ToastUtil; @@ -24,7 +23,6 @@ import java.util.Date; import io.rong.imkit.IMCenter; import io.rong.imkit.conversation.ConversationFragment; import io.rong.imlib.IRongCallback; -import io.rong.imlib.ISendMessageCallback; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.Message; @@ -49,6 +47,27 @@ public class ChatMessageFragment extends ConversationFragment { cameraUtil = new ProcessImageUtil(getActivity(), "com.shayu.onetoone.fileprovider"); mSendBtn.setOnClickListener(v -> sendText()); img.setOnClickListener(v -> cameraUtil.getImageByCamera()); + initCamera(); + + call.setOnClickListener(v -> { + MessageChatTipsContent bean= MessageChatTipsContent.obtain("【安全提示】為保障您的權益,慶提高警惕,不要輕易添加或提供第三方聯繫方式"); + IMCenter.getInstance().insertOutgoingMessage(conversationType, targetId, Message.SentStatus.SENT, bean, System.currentTimeMillis(), new RongIMClient.ResultCallback() { + @Override + public void onSuccess(Message message) { + ToastUtil.show("成功"); + } + + @Override + public void onError(RongIMClient.ErrorCode e) { + ToastUtil.show("失败:"+e.getMessage()); + System.out.println("失败:"+e.getMessage()); + + } + }); + }); + } + + private void initCamera() { cameraUtil.setImageResultCallback(new ImageResultCallback() { @Override public void beforeCamera() { diff --git a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java index d9889c879..07a2179ae 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/activity/fragments/message/MsgMessageFragment.java @@ -9,7 +9,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -17,21 +16,17 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.shayu.onetoone.R; import com.shayu.onetoone.activity.fragments.BaseFragment; import com.shayu.onetoone.adapter.MsgMessageRecyclerViewAdapter; import com.shayu.onetoone.bean.MsgMessageBean; -import com.shayu.onetoone.manager.RouteManager; -import com.yanzhenjie.recyclerview.OnItemClickListener; import com.yanzhenjie.recyclerview.OnItemMenuClickListener; import com.yanzhenjie.recyclerview.SwipeMenuBridge; import com.yanzhenjie.recyclerview.SwipeMenuCreator; import com.yanzhenjie.recyclerview.SwipeMenuItem; import com.yanzhenjie.recyclerview.SwipeRecyclerView; import com.yunbao.common.utils.DpUtil; -import com.yunbao.common.utils.ToastUtil; import java.util.ArrayList; import java.util.List; @@ -41,7 +36,6 @@ import io.rong.imkit.IMCenter; import io.rong.imkit.config.ConversationListBehaviorListener; import io.rong.imkit.config.RongConfigCenter; 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.GatheredConversation; import io.rong.imkit.conversationlist.viewmodel.ConversationListViewModel; @@ -51,7 +45,6 @@ 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.dialog.OptionsPopupDialog; import io.rong.imkit.widget.refresh.SmartRefreshLayout; import io.rong.imkit.widget.refresh.api.RefreshLayout; import io.rong.imkit.widget.refresh.constant.RefreshState; @@ -69,7 +62,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt private static final String TAG = MsgMessageFragment.class.getSimpleName(); SwipeRecyclerView mList; SmartRefreshLayout mRefreshLayout; - ConversationListAdapter mAdapter; + MsgMessageRecyclerViewAdapter mAdapter; List list; protected View mNoticeContainerView; @@ -83,7 +76,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt public void initView(View itemView) { mList = itemView.findViewById(R.id.recyclerView); mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout); - mAdapter = new ConversationListAdapter(); + mAdapter = new MsgMessageRecyclerViewAdapter(); list = new ArrayList<>(); initData(); mList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java new file mode 100644 index 000000000..81ddce790 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeHotListAdapter.java @@ -0,0 +1,43 @@ +package com.shayu.onetoone.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.shayu.onetoone.R; + +public class HomeHotListAdapter extends RecyclerView.Adapter{ + private Context mContext; + + public HomeHotListAdapter(Context mContext) { + this.mContext = mContext; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_home_hot,parent,false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + } + + @Override + public int getItemCount() { + return 10; + } + + public class ViewHolder extends RecyclerView.ViewHolder{ + + + public ViewHolder(@NonNull View itemView) { + super(itemView); + } + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java new file mode 100644 index 000000000..d728ebc4a --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/HomeRecommendListAdapter.java @@ -0,0 +1,43 @@ +package com.shayu.onetoone.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.shayu.onetoone.R; + +public class HomeRecommendListAdapter extends RecyclerView.Adapter{ + private Context mContext; + + public HomeRecommendListAdapter(Context mContext) { + this.mContext = mContext; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_home_recommend,parent,false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + } + + @Override + public int getItemCount() { + return 10; + } + + public class ViewHolder extends RecyclerView.ViewHolder{ + + + public ViewHolder(@NonNull View itemView) { + super(itemView); + } + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java b/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java index f36303e04..6a7831027 100644 --- a/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java +++ b/OneToOne/src/main/java/com/shayu/onetoone/adapter/MsgMessageRecyclerViewAdapter.java @@ -1,6 +1,7 @@ package com.shayu.onetoone.adapter; import android.content.Context; +import android.text.SpannableString; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,69 +17,29 @@ import com.yunbao.common.glide.ImgLoader; import java.util.List; +import io.rong.imkit.conversationlist.ConversationListAdapter; +import io.rong.imkit.conversationlist.model.BaseUiConversation; +import io.rong.imkit.conversationlist.model.SingleConversation; +import io.rong.imkit.widget.adapter.ViewHolder; +import io.rong.imlib.model.Conversation; + /** * 聊天列表适配器 */ -public class MsgMessageRecyclerViewAdapter extends RecyclerView.Adapter { - List list; - Context mContext; - - public MsgMessageRecyclerViewAdapter(Context mContext) { - this.mContext = mContext; - } - - public void setList(List list) { - this.list = list; - notifyDataSetChanged(); - } - - public List getList() { - return list; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.rc_conversationlist_item, parent, false)); - } - +public class MsgMessageRecyclerViewAdapter extends ConversationListAdapter { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - holder.setData(list.get(position), position); - } - - @Override - public int getItemCount() { - return list.size(); - } - - public class ViewHolder extends RecyclerView.ViewHolder { - ImageView avatar; - TextView name; - TextView content; - TextView time; - TextView read; - - public ViewHolder(@NonNull View itemView) { - super(itemView); - /* avatar = itemView.findViewById(R.id.msg_message_avatar); - name = itemView.findViewById(R.id.msg_message_title); - content = itemView.findViewById(R.id.msg_message_content); - time = itemView.findViewById(R.id.msg_message_content_time); - read = itemView.findViewById(R.id.msg_message_content_not_read);*/ - } - - public void setData(MsgMessageBean bean, int position) { - if (bean.isNotRead()) { - read.setVisibility(View.VISIBLE); - read.setText(bean.getNotReadNum() + ""); + BaseUiConversation uiConversation = mDataList.get(position); + if (uiConversation.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) { + SingleConversation conversation = (SingleConversation) uiConversation; + if (conversation.mConversationContent.length() >= 6) { + conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString().substring(0, 6) + "...·"); } else { - read.setVisibility(View.GONE); + conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString() + " ·"); } - ImgLoader.display(mContext, bean.getAvatar(), avatar); - name.setText(bean.getNickname()); - content.setText(bean.getContent()); - time.setText(String.format("·%s", bean.getTime())); + } else if (uiConversation.mCore.getConversationType() == Conversation.ConversationType.GROUP) { + mDataList.remove(position); } + super.onBindViewHolder(holder, position); } } diff --git a/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageChatTipsContent.java b/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageChatTipsContent.java new file mode 100644 index 000000000..b5285533a --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/bean/MessageChatTipsContent.java @@ -0,0 +1,123 @@ +package com.shayu.onetoone.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + + + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; + +import io.rong.common.ParcelUtils; +import io.rong.imlib.MessageTag; +import io.rong.imlib.model.MessageContent; + +@MessageTag(value = "MessageChatTipsContent", flag = MessageTag.ISPERSISTED) +public class MessageChatTipsContent extends MessageContent implements Parcelable { + private String content; + + private MessageChatTipsContent() { + } + public MessageChatTipsContent(byte[] data) { + if (data == null) { + return; + } + String jsonStr = null; + try { + jsonStr = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + } + if (jsonStr == null) { + return; + } + + try { + JSONObject jsonObj = new JSONObject(jsonStr); + // 消息携带用户信息时, 自定义消息需添加下面代码 + if (jsonObj.has("user")) { + setUserInfo(parseJsonToUserInfo(jsonObj.getJSONObject("user"))); + } + // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 + if (jsonObj.has("mentionedInfo")) { + setMentionedInfo(parseJsonToMentionInfo(jsonObj.getJSONObject("mentionedInfo"))); + } + // 将所有自定义变量从收到的 json 解析并赋值 + if (jsonObj.has("content")) { + content = jsonObj.optString("content"); + } + } catch (JSONException e) { + } + } + + public MessageChatTipsContent setContent(String content) { + this.content = content; + return this; + } + + public String getContent() { + return content; + } + + protected MessageChatTipsContent(Parcel in) { + setExtra(ParcelUtils.readFromParcel(in)); + setContent(ParcelUtils.readFromParcel(in)); + } + // 快速构建消息对象方法 + public static MessageChatTipsContent obtain(String content) { + MessageChatTipsContent msg = new MessageChatTipsContent(); + msg.content = content; + return msg; + } + + + public static final Creator CREATOR = new Creator() { + @Override + public MessageChatTipsContent createFromParcel(Parcel in) { + return new MessageChatTipsContent(in); + } + + @Override + public MessageChatTipsContent[] newArray(int size) { + return new MessageChatTipsContent[size]; + } + }; + + @Override + public byte[] encode() { + JSONObject jsonObj = new JSONObject(); + try { + // 消息携带用户信息时, 自定义消息需添加下面代码 + if (getJSONUserInfo() != null) { + jsonObj.putOpt("user", getJSONUserInfo()); + } + // 用于群组聊天, 消息携带 @ 人信息时, 自定义消息需添加下面代码 + if (getJsonMentionInfo() != null) { + jsonObj.putOpt("mentionedInfo", getJsonMentionInfo()); + } + // 将所有自定义消息的内容,都序列化至 json 对象中 + jsonObj.put("content", this.content); + } catch (JSONException e) { + } + + try { + return jsonObj.toString().getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + } + return null; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + ParcelUtils.writeToParcel(dest, getExtra()); + ParcelUtils.writeToParcel(dest, content); + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java new file mode 100644 index 000000000..361ea9f11 --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipHandler.java @@ -0,0 +1,23 @@ +package com.shayu.onetoone.provider; + +import android.content.Context; + +import io.rong.imlib.model.Message; +import io.rong.imlib.model.MessageContent; +import io.rong.message.MessageHandler; + +public class MessageChatTipHandler extends MessageHandler { + public MessageChatTipHandler(Context context) { + super(context); + } + + @Override + public void decodeMessage(Message message, MessageContent content) { + + } + + @Override + public void encodeMessage(Message message) { + + } +} diff --git a/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java new file mode 100644 index 000000000..8d7ac2d2a --- /dev/null +++ b/OneToOne/src/main/java/com/shayu/onetoone/provider/MessageChatTipsItemProvider.java @@ -0,0 +1,53 @@ +package com.shayu.onetoone.provider; + +import android.content.Context; +import android.text.Spannable; +import android.view.ViewGroup; + +import com.shayu.onetoone.R; +import com.shayu.onetoone.bean.MessageChatTipsContent; + +import java.util.List; + +import io.rong.imkit.conversation.messgelist.provider.BaseMessageItemProvider; +import io.rong.imkit.model.UiMessage; +import io.rong.imkit.widget.adapter.IViewProviderListener; +import io.rong.imkit.widget.adapter.ViewHolder; +import io.rong.imlib.model.MessageContent; + +public class MessageChatTipsItemProvider extends BaseMessageItemProvider { + private Context mContext; + + public MessageChatTipsItemProvider(Context mContext) { + this.mContext = mContext; + mConfig.showPortrait = false; + mConfig.showSummaryWithName = false; + mConfig.showContentBubble = false; + mConfig.centerInHorizontal = true; + } + + @Override + protected ViewHolder onCreateMessageContentViewHolder(ViewGroup parent, int viewType) { + return ViewHolder.createViewHolder(mContext, parent, R.layout.view_message_chat_tip); + } + + @Override + protected void bindMessageContentViewHolder(ViewHolder holder, ViewHolder parentHolder, MessageChatTipsContent messageChatTipsContent, UiMessage uiMessage, int position, List list, IViewProviderListener listener) { + holder.setText(R.id.tips, messageChatTipsContent.getContent()); + } + + @Override + protected boolean onItemClick(ViewHolder holder, MessageChatTipsContent messageChatTipsContent, UiMessage uiMessage, int position, List list, IViewProviderListener listener) { + return false; + } + + @Override + protected boolean isMessageViewType(MessageContent messageContent) { + return messageContent instanceof MessageChatTipsContent; + } + + @Override + public Spannable getSummarySpannable(Context context, MessageChatTipsContent messageChatTipsContent) { + return null; + } +} diff --git a/OneToOne/src/main/res/drawable/bg_home_hot_sex.xml b/OneToOne/src/main/res/drawable/bg_home_hot_sex.xml new file mode 100644 index 000000000..ef405cd0b --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_home_hot_sex.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_home_recommend_star_sign.xml b/OneToOne/src/main/res/drawable/bg_home_recommend_star_sign.xml new file mode 100644 index 000000000..924c09efd --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_home_recommend_star_sign.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_home_recommend_tag.xml b/OneToOne/src/main/res/drawable/bg_home_recommend_tag.xml new file mode 100644 index 000000000..96c497d20 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_home_recommend_tag.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_message_chat_tip.xml b/OneToOne/src/main/res/drawable/bg_message_chat_tip.xml new file mode 100644 index 000000000..11a91ca2a --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_message_chat_tip.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_message_msg_bar_follow.xml b/OneToOne/src/main/res/drawable/bg_message_msg_bar_follow.xml new file mode 100644 index 000000000..f87fe49b1 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_message_msg_bar_follow.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_message_msg_bar_home.xml b/OneToOne/src/main/res/drawable/bg_message_msg_bar_home.xml new file mode 100644 index 000000000..b5af0ab98 --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_message_msg_bar_home.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/bg_message_msg_bar_read_num.xml b/OneToOne/src/main/res/drawable/bg_message_msg_bar_read_num.xml new file mode 100644 index 000000000..0e06ca80d --- /dev/null +++ b/OneToOne/src/main/res/drawable/bg_message_msg_bar_read_num.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/drawable/ic_message_msg_bar_decorate.xml b/OneToOne/src/main/res/drawable/ic_message_msg_bar_decorate.xml new file mode 100644 index 000000000..c25946141 --- /dev/null +++ b/OneToOne/src/main/res/drawable/ic_message_msg_bar_decorate.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/activity_msg_chat.xml b/OneToOne/src/main/res/layout/activity_msg_chat.xml index d4acda0b1..6fdb9437d 100644 --- a/OneToOne/src/main/res/layout/activity_msg_chat.xml +++ b/OneToOne/src/main/res/layout/activity_msg_chat.xml @@ -2,8 +2,18 @@ + + + app:layout_constraintTop_toBottomOf="@+id/include2" /> \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/fragment_hot.xml b/OneToOne/src/main/res/layout/fragment_hot.xml index 3f06e53ce..9a94a2fef 100644 --- a/OneToOne/src/main/res/layout/fragment_hot.xml +++ b/OneToOne/src/main/res/layout/fragment_hot.xml @@ -4,18 +4,24 @@ android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> + + android:layout_height="match_parent" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" + app:spanCount="2" + tools:listitem="@layout/item_home_hot" /> \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/fragment_msg.xml b/OneToOne/src/main/res/layout/fragment_msg.xml index 3580cd463..3198858ff 100644 --- a/OneToOne/src/main/res/layout/fragment_msg.xml +++ b/OneToOne/src/main/res/layout/fragment_msg.xml @@ -2,6 +2,7 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent"> + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + android:layout_height="match_parent" + tools:listitem="@layout/item_home_recommend" /> + + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="167dp" + android:layout_marginTop="16dp" + android:layout_height="167dp" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/item_home_recommend.xml b/OneToOne/src/main/res/layout/item_home_recommend.xml index 3c49432eb..b96dffe9f 100644 --- a/OneToOne/src/main/res/layout/item_home_recommend.xml +++ b/OneToOne/src/main/res/layout/item_home_recommend.xml @@ -1,11 +1,11 @@ - + android:background="@drawable/bg_home_recommend_item"> + android:text="TextView" + android:textColor="#333333" + android:textSize="16sp" + android:textStyle="bold" /> + + + + + + + + diff --git a/OneToOne/src/main/res/layout/view_message_chat_tip.xml b/OneToOne/src/main/res/layout/view_message_chat_tip.xml new file mode 100644 index 000000000..a34373cb1 --- /dev/null +++ b/OneToOne/src/main/res/layout/view_message_chat_tip.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/OneToOne/src/main/res/layout/view_message_msg_bar.xml b/OneToOne/src/main/res/layout/view_message_msg_bar.xml new file mode 100644 index 000000000..d8d2ec709 --- /dev/null +++ b/OneToOne/src/main/res/layout/view_message_msg_bar.xml @@ -0,0 +1,197 @@ + + + + + + + +