This commit is contained in:
2023-10-08 22:36:18 +08:00
parent e4cd95951c
commit 05d4f84844
25 changed files with 498 additions and 106 deletions

View File

@@ -16,6 +16,8 @@ import androidx.appcompat.app.AppCompatActivity;
import com.shayu.onetoone.R;
import com.yunbao.common.manager.IMLoginManager;
import java.util.Locale;
/**
* Activity基类
*/
@@ -28,6 +30,9 @@ public abstract class AbsOTOActivity extends AppCompatActivity {
Configuration config = new Configuration();
config.setToDefaults();
config.locale = IMLoginManager.get(this).getLocaleLanguage();
if(config.locale== Locale.SIMPLIFIED_CHINESE){
config.locale=Locale.TRADITIONAL_CHINESE;
}
res.updateConfiguration(config, res.getDisplayMetrics());
return res;
}

View File

@@ -63,6 +63,7 @@ import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
/**
* 启动Activity

View File

@@ -19,19 +19,29 @@ import com.shayu.onetoone.activity.fragments.DynamicFragment;
import com.shayu.onetoone.activity.fragments.FriendsFragment;
import com.shayu.onetoone.activity.fragments.MessageFragment;
import com.shayu.onetoone.activity.fragments.MyFragment;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.event.MessageMsgBusEvent;
import com.shayu.onetoone.manager.OTONetManager;
import com.shayu.onetoone.manager.RouteManager;
import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
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.ArrayList;
import java.util.List;
import io.rong.imkit.RongIM;
import io.rong.imkit.manager.UnReadMessageManager;
import io.rong.imkit.userinfo.RongUserInfoManager;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.UserInfo;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
@@ -46,8 +56,15 @@ public class MainActivity extends AbsOTOActivity {
private ViewPager2 viewPager;
private DslTabLayout dslTabLayout;
@Override
protected void onDestroy() {
super.onDestroy();
Bus.getOff(this);
}
@Override
protected void main(Bundle savedInstanceState) {
Bus.getOn(this);
fragments.add(new FriendsFragment());
fragments.add(new DynamicFragment());
fragments.add(new MessageFragment());
@@ -87,13 +104,70 @@ public class MainActivity extends AbsOTOActivity {
}
});
RongcloudIMManager.connectIM(mContext);
IMLoginModel userInfo = IMLoginManager.get(this).getUserInfo();
UserInfo info = new UserInfo(userInfo.getId() + "", userInfo.getUserNicename(), Uri.parse(userInfo.getAvatar()));
RongUserInfoManager.getInstance().refreshUserInfoCache(info);
showRedPoint(-1);
UnReadMessageManager.getInstance().addObserver(new Conversation.ConversationType[]{Conversation.ConversationType.SYSTEM, Conversation.ConversationType.PRIVATE}, new UnReadMessageManager.IUnReadMessageObserver() {
@Override
public void onCountChanged(int count) {
showRedPoint(count);
Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_UPDATE_SYSTEM));
}
});
}
private void showRedPoint(int count) {
OTONetManager.getInstance(mContext)
.getMessageSystemLists(new HttpCallback<List<OfficialNoticeBean>>() {
int point = 0;
@Override
public void onSuccess(List<OfficialNoticeBean> data) {
for (OfficialNoticeBean datum : data) {
point += datum.getNum();
}
//大于0则是通过会话未读监听器获取到的数则不用再调用获取未读数接口了
if (count >= 0) {
updateUnreadCount(point + count);
return;
}
RongIMClient.getInstance().getTotalUnreadCount(new RongIMClient.ResultCallback<Integer>() {
@Override
public void onSuccess(Integer integer) {
updateUnreadCount(point + integer);
}
@Override
public void onError(RongIMClient.ErrorCode e) {
}
});
}
@Override
public void onError(String error) {
}
});
}
private void updateUnreadCount(int count) {
if(count==0){
dslTabLayout.setDrawBadge(false);
}else {
dslTabLayout.setDrawBadge(true);
}
dslTabLayout.updateTabBadge(2, count + "");
}
@Override
protected int getLayoutId() {
return R.layout.activity_main;
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void busEvent(MessageMsgBusEvent event) {
if (event.getType() == MessageMsgBusEvent.TYPE_ALL_READ) {
updateUnreadCount(0);
}
}
}

View File

@@ -22,11 +22,13 @@ public class RecommendFragment extends BaseFragment {
SmartRefreshLayout mRefreshLayout;
SwipeRecyclerView recyclerView;
HomeRecommendListAdapter adapter;
View top;
@Override
public void initView(View itemView) {
recyclerView = itemView.findViewById(R.id.recyclerView);
mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout);
top=itemView.findViewById(R.id.btn_top_list);
adapter=new HomeRecommendListAdapter(getContext());
recyclerView.setAdapter(adapter);
mRefreshLayout.setNestedScrollingEnabled(false);
@@ -42,6 +44,9 @@ public class RecommendFragment extends BaseFragment {
onConversationListLoadMore();
}
});
top.setOnClickListener(view -> {
recyclerView.scrollToPosition(0);
});
}
private void onConversationListLoadMore() {

View File

@@ -15,6 +15,7 @@ import com.yunbao.common.CommonAppConfig;
import com.yunbao.common.interfaces.ImageResultCallback;
import com.yunbao.common.utils.ProcessImageUtil;
import com.yunbao.common.utils.ToastUtil;
import com.yunbao.common.utils.WordUtil;
import java.io.File;
import java.lang.reflect.Field;
@@ -50,16 +51,16 @@ public class ChatMessageFragment extends ConversationFragment {
initCamera();
call.setOnClickListener(v -> {
MessageChatTipsContent bean= MessageChatTipsContent.obtain("【安全提示】為保障您的權益,慶提高警惕,不要輕易添加或提供第三方聯繫方式");
MessageChatTipsContent bean= MessageChatTipsContent.obtain(WordUtil.getString(R.string.message_chat_tip1));
IMCenter.getInstance().insertOutgoingMessage(conversationType, targetId, Message.SentStatus.SENT, bean, System.currentTimeMillis(), new RongIMClient.ResultCallback<Message>() {
@Override
public void onSuccess(Message message) {
ToastUtil.show("成功");
ToastUtil.show(R.string.system_tip_success);
}
@Override
public void onError(RongIMClient.ErrorCode e) {
ToastUtil.show("失败:"+e.getMessage());
ToastUtil.show(R.string.system_tip_failure);
System.out.println("失败:"+e.getMessage());
}
@@ -145,7 +146,7 @@ public class ChatMessageFragment extends ConversationFragment {
@Override
public void onError(Message message, RongIMClient.ErrorCode errorCode) {
ToastUtil.show("发送失败");
ToastUtil.show(R.string.system_tip_failure);
System.out.println("发送失败:" + errorCode.getMessage());
}
});

View File

@@ -1,6 +1,5 @@
package com.shayu.onetoone.activity.fragments.message;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.net.Uri;
@@ -14,33 +13,28 @@ 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;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
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.MsgMessageBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.event.MessageMsgBusEvent;
import com.shayu.onetoone.manager.OTONetManager;
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.CommonAppConfig;
import com.yunbao.common.glide.ImgLoader;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.utils.Bus;
import com.yunbao.common.utils.DialogUitl;
import com.yunbao.common.utils.DpUtil;
import com.yunbao.common.utils.RandomUtil;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.common.utils.ToastUtil;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -48,6 +42,12 @@ import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import io.rong.common.RLog;
import io.rong.imkit.GlideKitImageEngine;
import io.rong.imkit.IMCenter;
@@ -64,7 +64,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;
@@ -76,6 +75,7 @@ import io.rong.imlib.IRongCoreEnum;
import io.rong.imlib.RongCoreClient;
import io.rong.imlib.RongIMClient;
import io.rong.imlib.model.Conversation;
import io.rong.imlib.model.Message;
import io.rong.imlib.model.UserInfo;
/**
@@ -96,7 +96,6 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
protected Handler mHandler = new Handler(Looper.getMainLooper());
protected boolean delayRefresh = false;
View notification, interaction, system;
@Override
public void onDestroy() {
@@ -121,10 +120,12 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
Bus.getOn(this);
mList = itemView.findViewById(R.id.recyclerView);
mRefreshLayout = itemView.findViewById(R.id.swipeRefreshLayout);
mAdapter = new MsgMessageRecyclerViewAdapter();
mAdapter = new MsgMessageRecyclerViewAdapter(mList);
list = new ArrayList<>();
mList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
mList.setSwipeMenuCreator(initSwipeMenuCreator());
mList.setHasFixedSize(true);
mList.setAutoMarginEnabled(true);
mList.setOnItemMenuClickListener(new OnItemMenuClickListener() {
@Override
public void onItemClick(SwipeMenuBridge menuBridge, int adapterPosition) {
@@ -141,19 +142,15 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
BaseUiConversation conversation = mAdapter.getData().get(swipeRunnable.adapterPosition);
if (swipeRunnable.menuPosition == 0) {
topItem(conversation, swipeRunnable.adapterPosition);
// ToastUtil.showDebug("置顶:" + mAdapter.getList().get(adapterPosition).getNickname());
} else {
removeItem(conversation, swipeRunnable.adapterPosition);
// ToastUtil.showDebug("删除:" + mAdapter.getList().get(adapterPosition).getNickname());
//mAdapter.getData().remove(adapterPosition);
//mAdapter.notifyDataSetChanged();
}
swipeRunnable = null;
}, 100);
}
}
});
initListTop();
initSystemNotice();
initUserInfo(0);
initRongConfig();
}
@@ -199,37 +196,67 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
}
private void initListTop() {
private void initSystemNotice() {
mAdapter.add(setTopData("官方通知", "测试", "12:00", null, 5), 0);
mAdapter.add(setTopData("互动消息", "测试2", "13:00", null, 0), 1);
mAdapter.add(setTopData("系统消息", "测试3", "14:00", null, 15), 2);
OTONetManager.getInstance(mContext)
.getMessageSystemLists(new HttpCallback<List<OfficialNoticeBean>>() {
@Override
public void onSuccess(List<OfficialNoticeBean> data) {
for (OfficialNoticeBean datum : data) {
if (datum.getType() == 3) {
continue;
}
mAdapter.add(setTopData(datum.getTitle(), datum.getContent(), datum.getAddtime()*1000, datum.getNew_image(), datum.getNum(), datum.getType()), datum.getType());
}
onConversationListRefresh(mRefreshLayout);
mAdapter.notifyDataSetChanged();
}
@Override
public void onError(String error) {
}
});
}
private SingleConversation setTopData(String title, String content, String time, String avatar, int num) {
private SingleConversation setTopData(String title, String content, long time, String avatar, int num, int id) {
SingleConversation conversation = new SingleConversation(getContext(), new Conversation());
conversation.mCore.setConversationType(Conversation.ConversationType.PRIVATE);
conversation.mCore.setSenderUserName(title);
conversation.mCore.setConversationTitle(title + "?");
conversation.mCore.setConversationTitle(title);
conversation.mCore.setSentTime(time);
conversation.mCore.setSentStatus(Message.SentStatus.SENT);
conversation.mConversationContent = new SpannableString(content);
conversation.mCore.setSentTime(System.currentTimeMillis());
conversation.mCore.setUnreadMessageCount(num);
conversation.mCore.setTargetId("10000");
conversation.mCore.setTargetId(id + "");
UserInfo info = new UserInfo(id + "", title, Uri.parse(avatar));
JSONObject json = new JSONObject();
json.put("sex", -1);
json.put("age", -1);
info.setExtra(json.toJSONString());
RongUserInfoManager.getInstance().refreshUserInfoCache(info);
return conversation;
}
private void clearTopData() {
mAdapter.clearSystemNotification();
mAdapter.notifyDataSetChanged();
}
/**
* 全部标记已读
*/
public void allRead() {
clearTopData();
RongCoreClient.getInstance().getUnreadConversationList(new IRongCoreCallback.ResultCallback<List<Conversation>>() {
@Override
public void onSuccess(List<Conversation> conversations) {
for (Conversation conversation : conversations) {
Log.i(TAG, "onSuccess: " + conversation.getTargetId());
if (conversation.getConversationType() != Conversation.ConversationType.PRIVATE) {
continue;
}
@@ -238,6 +265,8 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
new RongIMClient.ResultCallback<Boolean>() {
@Override
public void onSuccess(Boolean aBoolean) {
onConversationListRefresh(mRefreshLayout);
Bus.get().post(new MessageMsgBusEvent(MessageMsgBusEvent.TYPE_ALL_READ));
}
@Override
@@ -265,8 +294,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
@Override
public void onSuccess(Boolean aBoolean) {
Log.i(TAG, "置顶 onSuccess: " + aBoolean);
mList.requestLayout();
mList.invalidate();
onConversationListRefresh(mRefreshLayout);
}
@Override
@@ -286,7 +314,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
@Override
public void onSuccess(Boolean aBoolean) {
Log.i(TAG, "删除 onSuccess: " + aBoolean);
//mRefreshLayout.postInvalidate();
onConversationListRefresh(null);
}
@Override
@@ -340,7 +368,7 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
protected void initRefreshView() {
if (this.mRefreshLayout == null) {
RLog.d(this.TAG, "initRefreshView null");
RLog.d(TAG, "initRefreshView null");
} else {
this.mRefreshLayout.setNestedScrollingEnabled(false);
this.mRefreshLayout.setRefreshHeader(new RongRefreshHeader(this.getContext()));
@@ -363,12 +391,11 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
this.mConversationListViewModel.getConversationList(false, false, 0L);
this.mConversationListViewModel.getConversationListLiveData().observe(this.getViewLifecycleOwner(), new Observer<List<BaseUiConversation>>() {
public void onChanged(List<BaseUiConversation> uiConversations) {
RLog.d(MsgMessageFragment.this.TAG, "conversation list onChanged.");
if (MsgMessageFragment.this.mNewState == 0) {
MsgMessageFragment.this.mAdapter.setDataCollection(uiConversations);
} else {
RLog.d(TAG, "conversation list onChanged. |" + MsgMessageFragment.this.mNewState);
if (MsgMessageFragment.this.mNewState == 1) {
MsgMessageFragment.this.delayRefresh = true;
}
MsgMessageFragment.this.mAdapter.setDataCollection(uiConversations);
}
});
@@ -410,7 +437,6 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
if (this.mConversationListViewModel != null) {
this.mConversationListViewModel.getConversationList(false, true, 0L);
}
}
protected void onConversationListLoadMore() {
@@ -439,6 +465,16 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
public void onItemClick(View view, ViewHolder holder, int position) {
if (position >= 0 && position < this.mAdapter.getData().size()) {
BaseUiConversation baseUiConversation = (BaseUiConversation) this.mAdapter.getItem(position);
String targetId = baseUiConversation.mCore.getTargetId();
try {
long type=Integer.parseInt(targetId);
if(type<100){
ToastUtil.showDebug("还没做");
return;
}
}catch (Exception e){
e.printStackTrace();
}
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.");
@@ -459,6 +495,51 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
@Override
public boolean onItemLongClick(View view, ViewHolder holder, int position) {
/*if (position >= 0 && position < this.mAdapter.getData().size()) {
final BaseUiConversation baseUiConversation = (BaseUiConversation) this.mAdapter.getItem(position);
ConversationListBehaviorListener listBehaviorListener = RongConfigCenter.conversationListConfig().getListener();
if (listBehaviorListener != null && listBehaviorListener.onConversationLongClick(view.getContext(), view, baseUiConversation)) {
RLog.d(this.TAG, "ConversationList item click event has been intercepted by App.");
return true;
} else {
final ArrayList<String> items = new ArrayList();
final String removeItem = view.getContext().getResources().getString(io.rong.imkit.R.string.rc_conversation_list_dialog_remove);
final String setTopItem = view.getContext().getResources().getString(io.rong.imkit.R.string.rc_conversation_list_dialog_set_top);
final String cancelTopItem = view.getContext().getResources().getString(io.rong.imkit.R.string.rc_conversation_list_dialog_cancel_top);
if (!(baseUiConversation instanceof GatheredConversation)) {
if (baseUiConversation.mCore.isTop()) {
items.add(cancelTopItem);
} else {
items.add(setTopItem);
}
}
items.add(removeItem);
int size = items.size();
OptionsPopupDialog.newInstance(view.getContext(), (String[]) items.toArray(new String[size])).setOptionsPopupDialogListener(new OptionsPopupDialog.OnOptionsItemClickedListener() {
public void onOptionsItemClicked(final int which) {
if (!((String) items.get(which)).equals(setTopItem) && !((String) items.get(which)).equals(cancelTopItem)) {
if (((String) items.get(which)).equals(removeItem)) {
IMCenter.getInstance().removeConversation(baseUiConversation.mCore.getConversationType(), baseUiConversation.mCore.getTargetId(), (RongIMClient.ResultCallback) null);
}
} else {
IMCenter.getInstance().setConversationToTop(baseUiConversation.getConversationIdentifier(), !baseUiConversation.mCore.isTop(), false, new RongIMClient.ResultCallback<Boolean>() {
public void onSuccess(Boolean value) {
Toast.makeText(view.getContext(), (CharSequence) items.get(which), Toast.LENGTH_SHORT).show();
}
public void onError(RongIMClient.ErrorCode errorCode) {
}
});
}
}
}).show();
return true;
}
} else {
return false;
}*/
return false;
}
@@ -487,6 +568,8 @@ public class MsgMessageFragment extends BaseFragment implements BaseAdapter.OnIt
public void busEvent(MessageMsgBusEvent event) {
if (event.getType() == MessageMsgBusEvent.TYPE_ALL_READ) {
allRead();
}else if(event.getType()==MessageMsgBusEvent.TYPE_UPDATE_SYSTEM){
initSystemNotice();
}
}
}

View File

@@ -35,7 +35,7 @@ import java.util.List;
* 打招呼设置界面
*/
@Route(path = RouteManager.ACTIVITY_MSG_MORE_CONFIG_ACTIVITY)
public class MsgMoreConfigActivity extends AbsOTOActivity {
public class MsgMoreGreetConfigActivity extends AbsOTOActivity {
List<GreetBean> deleteList = new ArrayList<>();
RecyclerView recyclerView;
MsgGreetConfigAdapter adapter;
@@ -93,7 +93,7 @@ public class MsgMoreConfigActivity extends AbsOTOActivity {
cancel.setOnClickListener(v -> clearGreet());
recyclerView.setOnClickListener(v -> adapter.notifyDataSetChanged());
findViewById(R.id.upload_img).setOnClickListener(v -> {
imageUtil.getImageByAlumb();
imageUtil.getImageByAlumb(false);
});
initData();
imageUtil.setImageResultCallback(new ImageResultCallback() {