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

View File

@ -121,7 +121,7 @@
android:name=".activity.MainActivity"
android:exported="false" />
<activity
android:name=".activity.message.MsgMoreConfigActivity"
android:name=".activity.message.MsgMoreGreetConfigActivity"
android:exported="false" />
<activity
android:name=".activity.message.ChatActivity"

View File

@ -16,6 +16,7 @@ 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.IMLoginManager;
import com.yunbao.common.manager.imrongcloud.InstructorSendReward;
import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider;
import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom;
@ -96,15 +97,15 @@ public class AppContext extends CommonAppContext {
RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() {
@Override
public boolean onReceived(Message message, int left, boolean hasPackage, boolean offline) {
System.out.println("初始化IM消息:"+message.getContent());
if (message.getContent() instanceof TextMessage) {
TextMessage content = (TextMessage) message.getContent();
ToastUtil.show("收到:" + content.getContent());
}
return false;
}
});
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, ChatActivity.class);
IMLoginManager.get(this).setLanguage(false);
}
}

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() {

View File

@ -2,10 +2,14 @@ package com.shayu.onetoone.adapter;
import android.text.SpannableString;
import com.yanzhenjie.recyclerview.SwipeRecyclerView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -14,6 +18,7 @@ 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.imkit.widget.refresh.SmartRefreshLayout;
import io.rong.imlib.model.Conversation;
/**
@ -21,42 +26,65 @@ import io.rong.imlib.model.Conversation;
*/
public class MsgMessageRecyclerViewAdapter extends ConversationListAdapter {
List<BaseUiConversation> conversationList = null;
Map<BaseUiConversation, Integer> map = new HashMap<>();
Map<Integer,BaseUiConversation> map = new HashMap<>();
SwipeRecyclerView mList;
public MsgMessageRecyclerViewAdapter(SwipeRecyclerView mList) {
this.mList = mList;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String targetId = getData().get(position).mCore.getTargetId();
try {
int type=Integer.parseInt(targetId);
mList.setSwipeItemMenuEnabled(position, type > 100);
}catch (Exception e){
e.printStackTrace();
}
super.onBindViewHolder(holder, position);
}
@Override
public void setDataCollection(List<BaseUiConversation> data) {
List<BaseUiConversation> tmp = new ArrayList<>();
if(conversationList!=null) {
tmp.addAll(conversationList);
}
conversationList = new ArrayList<>(data);
List<BaseUiConversation> top = new ArrayList<>();
List<BaseUiConversation> data2 = new ArrayList<>();
for (BaseUiConversation datum : data) {
if (datum.mCore.getConversationType() == Conversation.ConversationType.PRIVATE) {
SingleConversation conversation = (SingleConversation) datum;
if (conversation.mConversationContent.length() >= 6) {
conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString().substring(0, 6) + "...·");
if (datum.mCore.getConversationType() == Conversation.ConversationType.PRIVATE || datum.mCore.getConversationType() == Conversation.ConversationType.SYSTEM) {
if (datum.mCore.isTop()) {
top.add(datum);
} else {
conversation.mConversationContent = new SpannableString(conversation.mConversationContent.toString() + "·");
data2.add(datum);
}
tmp.add(datum);
}
}
for (BaseUiConversation conversation : map.keySet()) {
if ( map.get(conversation) >= tmp.size()) {
tmp.add(conversation);
}else{
tmp.add(map.get(conversation),conversation);
}
}
super.setDataCollection(tmp);
List<BaseUiConversation> list = new ArrayList<>(top);
data2.addAll(map.values());
Collections.sort(data2,new ListComparator());
list.addAll(data2);
super.setDataCollection(list);
}
public void add(SingleConversation item, int position) {
map.put(item, position);
map.put(position,item);
}
public void clearSystemNotification(){
for (BaseUiConversation conversation : map.values()) {
conversation.mCore.setUnreadMessageCount(0);
}
}
private class ListComparator implements Comparator<BaseUiConversation> {
@Override
public int compare(BaseUiConversation baseUiConversation, BaseUiConversation t1) {
System.out.println(" "+t1.mCore.getSentTime()+"|"+baseUiConversation.mCore.getSentTime()+" "+baseUiConversation.mCore.getConversationTitle()+"|"+t1.mCore.getConversationTitle());
return (int) (t1.mCore.getSentTime()-baseUiConversation.mCore.getSentTime());
}
}
}

View File

@ -0,0 +1,81 @@
package com.shayu.onetoone.bean;
import com.yunbao.common.bean.BaseModel;
public class OfficialNoticeBean extends BaseModel {
String title;
String image;
String new_image;
String content;
long addtime;
int num;
String link;
int type;
public OfficialNoticeBean() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getNew_image() {
return new_image;
}
public void setNew_image(String new_image) {
this.new_image = new_image;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public long getAddtime() {
return addtime;
}
public void setAddtime(long addtime) {
this.addtime = addtime;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}

View File

@ -2,6 +2,7 @@ package com.shayu.onetoone.event;
public class MessageMsgBusEvent extends AbsBusEvent {
public static final int TYPE_ALL_READ = 0;
public static final int TYPE_UPDATE_SYSTEM=1;
public MessageMsgBusEvent(int type) {
super(type);

View File

@ -1,11 +1,13 @@
package com.shayu.onetoone.manager;
import android.content.Context;
import android.net.Uri;
import android.util.Log;
import com.shayu.onetoone.bean.AvatarBean;
import com.shayu.onetoone.bean.GreetBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.UserBean;
import com.shayu.onetoone.network.API;
import com.yunbao.common.CommonAppConfig;
@ -14,6 +16,7 @@ import com.yunbao.common.bean.HttpCallbackModel;
import com.yunbao.common.bean.IMLoginModel;
import com.yunbao.common.http.ResponseModel;
import com.yunbao.common.http.base.HttpCallback;
import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.MD5Util;
import java.io.File;
@ -22,6 +25,8 @@ import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import io.rong.imkit.userinfo.RongUserInfoManager;
import io.rong.imlib.model.UserInfo;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
@ -80,6 +85,9 @@ public class OTONetManager {
@Override
public void accept(ResponseModel<UserBean> liveGiftBeanResponseModel) throws Exception {
if (callback != null) {
IMLoginModel userInfo = liveGiftBeanResponseModel.getData().getInfo().getUser();
UserInfo info = new UserInfo(userInfo.getId() + "", userInfo.getUserNicename(), Uri.parse(userInfo.getAvatar()));
RongUserInfoManager.getInstance().refreshUserInfoCache(info);
callback.onSuccess(liveGiftBeanResponseModel.getData().getInfo());
}
}
@ -346,8 +354,9 @@ public class OTONetManager {
public void updateFile(File file, HttpCallback<AvatarBean> callback) {
MultipartBody.Part uploadFile = createUploadFile(file);
IMLoginModel userInfo = IMLoginManager.get(mContext).getUserInfo();
API.get().otoApi(mContext)
.updateFile(uploadFile)
.updateFile(uploadFile,userInfo.getId()+"",userInfo.getToken())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<AvatarBean>>() {
@ -367,6 +376,28 @@ public class OTONetManager {
}
}).isDisposed();
}
public void getMessageSystemLists(HttpCallback<List<OfficialNoticeBean>> callback) {
API.get().otoApi(mContext)
.getLists()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseModel<List<OfficialNoticeBean>>>() {
@Override
public void accept(ResponseModel<List<OfficialNoticeBean>> model) throws Exception {
if (callback != null) {
callback.onSuccess(model.getData().getInfo());
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(TAG, "accept: ", throwable);
if (callback != null) {
callback.onError(mContext.getString(com.yunbao.common.R.string.net_error));
}
}
}).isDisposed();
}
private MultipartBody.Part createUploadFile(File file) {
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);

View File

@ -3,6 +3,7 @@ package com.shayu.onetoone.network;
import com.shayu.onetoone.bean.AvatarBean;
import com.shayu.onetoone.bean.GreetBean;
import com.shayu.onetoone.bean.JoinAnchorBean;
import com.shayu.onetoone.bean.OfficialNoticeBean;
import com.shayu.onetoone.bean.UserBean;
import com.yunbao.common.bean.BaseModel;
import com.yunbao.common.bean.IMLoginModel;
@ -82,10 +83,13 @@ public interface OneToOneApi {
Observable<ResponseModel<Integer>> getGreetConfigStatus();
@GET("/api/public/?service=Friendappinfos.setTextStatus")
Observable<ResponseModel<BaseModel>> setGreetConfigGreet( @Query("id")String id, @Query("status")String status);
@POST("/api/public/?service=Friendappinfos.updateAvatar")
@Multipart
Observable<ResponseModel<AvatarBean>> updateFile(@Part MultipartBody.Part file);
@POST("/api/public/?service=Friendappinfos.updateAvatar")
Observable<ResponseModel<AvatarBean>> updateFile(@Part MultipartBody.Part file,@Query("uid")String uid,@Query("token")String token);
@GET("/api/public/?service=Message.getLists")
Observable<ResponseModel<List<OfficialNoticeBean>>> getLists();
}

View File

@ -1,6 +1,8 @@
package com.shayu.onetoone.provider;
import android.text.SpannableString;
import android.view.View;
import android.widget.TextView;
import com.alibaba.fastjson.JSONObject;
import com.shayu.onetoone.R;
@ -25,12 +27,15 @@ public class CustomConversationProvider extends BaseConversationProvider {
public void bindViewHolder(ViewHolder holder, BaseUiConversation uiConversation, int position, List<BaseUiConversation> list, IViewProviderListener<BaseUiConversation> listener) {
String targetId = uiConversation.mCore.getTargetId();
UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(targetId);
if(userInfo!=null){
JSONObject json=JSONObject.parseObject(userInfo.getExtra());
if(json.getInteger("sex")==0){
holder.setImageResource(R.id.sex,R.mipmap.ic_message_tab_woman);
}else{
holder.setImageResource(R.id.sex,R.mipmap.ic_message_tab_man);
if (userInfo != null) {
JSONObject json = JSONObject.parseObject(userInfo.getExtra());
holder.getView(R.id.sex).setVisibility(View.VISIBLE);
if (json.getInteger("sex") == -1) {
holder.getView(R.id.sex).setVisibility(View.GONE);
} else if (json.getInteger("sex") == 0) {
holder.setImageResource(R.id.sex, R.mipmap.ic_message_tab_woman);
} else {
holder.setImageResource(R.id.sex, R.mipmap.ic_message_tab_man);
}
}
super.bindViewHolder(holder, uiConversation, position, list, listener);

View File

@ -24,6 +24,12 @@
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:tab_draw_badge="true"
app:tab_badge_offset_x="40dp"
app:tab_badge_offset_y="15dp"
app:tab_badge_text="2"
app:tab_badge_text_size="10sp"
app:tab_badge_gravity="right"
app:layout_constraintStart_toStartOf="parent"
app:tab_draw_indicator="false"
app:tab_item_is_equ_width="true">
@ -46,7 +52,7 @@
android:layout_height="wrap_content"
android:textSize="10sp"
android:gravity="center"
android:text="交友" />
android:text="@string/home_label_friends" />
</LinearLayout>
<LinearLayout
@ -66,7 +72,7 @@
android:layout_height="wrap_content"
android:textSize="10sp"
android:gravity="center"
android:text="动态" />
android:text="@string/home_label_dynamic" />
</LinearLayout>
<LinearLayout
@ -86,7 +92,7 @@
android:layout_height="wrap_content"
android:textSize="10sp"
android:gravity="center"
android:text="消息" />
android:text="@string/home_label_chat" />
</LinearLayout>
<LinearLayout
@ -106,7 +112,7 @@
android:layout_height="wrap_content"
android:textSize="10sp"
android:gravity="center"
android:text="我的" />
android:text="@string/home_label_my" />
</LinearLayout>
</com.angcyo.tablayout.DslTabLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -7,6 +7,7 @@
<include
android:id="@+id/include"
android:layout_marginTop="@dimen/activity_top"
layout="@layout/view_activity_title"
android:layout_width="match_parent"
android:layout_height="71dp"
@ -31,7 +32,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="21dp"
android:text="打招呼文案"
android:text="@string/greet_switch_title"
android:textColor="#999999"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
@ -89,7 +90,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="9dp"
android:text="上传图片(非必選)"
android:text="@string/greet_upload_img"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView5"
app:layout_constraintTop_toTopOf="parent" />
@ -119,7 +120,7 @@
android:layout_height="42dp"
android:layout_marginEnd="14dp"
android:background="@drawable/bg_msg_greet_config_btn_cancel"
android:text="清除设置"
android:text="@string/greet_clear_config"
android:textColor="#FFFFFF"
android:textSize="16sp" />
@ -128,7 +129,7 @@
android:layout_width="118dp"
android:layout_height="42dp"
android:background="@drawable/bg_msg_greet_config_btn_apply"
android:text="保存设置"
android:text="@string/greet_save_config"
android:textColor="#FFFFFF"
android:textSize="16sp" />

View File

@ -1,18 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="110dp"
android:layout_height="80dp"
android:background="@mipmap/bg_msg_more"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_config"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="start"
android:layout_marginStart="14dp"
android:layout_marginTop="20dp"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<ImageView
@ -35,11 +36,12 @@
<LinearLayout
android:id="@+id/ll_read"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="start"
android:layout_marginStart="14dp"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<ImageView

View File

@ -2,11 +2,12 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="#F7F7F7"
android:layout_width="match_parent"
android:layout_marginEnd="16dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_height="wrap_content">
android:layout_marginEnd="16dp"
android:layout_marginBottom="20dp"
android:background="#F7F7F7">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
@ -54,20 +55,31 @@
<TextView
android:id="@+id/rc_conversation_content"
android:layout_width="wrap_content"
android:layout_width="100dp"
android:layout_height="20dp"
android:layout_marginStart="8dp"
android:singleLine="true"
android:ellipsize="end"
android:lines="6"
app:layout_constraintBottom_toBottomOf="@+id/constraintLayout"
app:layout_constraintStart_toEndOf="@+id/constraintLayout"
tools:text="@tools:sample/lorem[4:10]" />
<TextView
android:id="@+id/separator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="·"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_content" />
<TextView
android:id="@+id/rc_conversation_date"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginStart="5dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/rc_conversation_content"
app:layout_constraintStart_toEndOf="@+id/separator"
tools:text="@tools:sample/date/hhmm" />
<androidx.constraintlayout.widget.ConstraintLayout

View File

@ -1,4 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">1v1</string>
<string name="title_activity_tag_selection">选择活动</string>
<string name="message_chat_tip1">【安全提示】為保障您的權益,慶提高警惕,不要輕易添加或提供第三方聯繫方式</string>
<string name="system_tip_success">成功</string>
<string name="system_tip_failure">失败</string>
<string name="system_tip_error">错误</string>
<string name="home_label_friends">交友</string>
<string name="home_label_dynamic">动态</string>
<string name="home_label_chat">消息</string>
<string name="home_label_my">我的</string>
<string name="greet_switch_title">打招呼文案</string>
<string name="greet_upload_img">上传图片(非必選)</string>
<string name="greet_clear_config">清除设置</string>
<string name="greet_save_config">保存设置</string>
</resources>

View File

@ -1,4 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">1v1</string>
<string name="title_activity_tag_selection">选择活动</string>
<string name="message_chat_tip1">【安全提示】為保障您的權益,慶提高警惕,不要輕易添加或提供第三方聯繫方式</string>
<string name="system_tip_success">成功</string>
<string name="system_tip_failure">失败</string>
<string name="system_tip_error">错误</string>
<string name="home_label_friends">交友</string>
<string name="home_label_dynamic">动态</string>
<string name="home_label_chat">消息</string>
<string name="home_label_my">我的</string>
<string name="greet_switch_title">打招呼文案</string>
<string name="greet_upload_img">上传图片(非必選)</string>
<string name="greet_clear_config">清除设置</string>
<string name="greet_save_config">保存设置</string>
</resources>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="activity_top">42dp</dimen>
</resources>

View File

@ -1,4 +1,17 @@
<resources>
<string name="app_name">1v1</string>
<string name="title_activity_tag_selection">TagSelection_Activity</string>
<string name="message_chat_tip1">[Safety Tips]</string>
<string name="system_tip_success">success</string>
<string name="system_tip_failure">failure</string>
<string name="system_tip_error">error</string>
<string name="home_label_friends">Friends</string>
<string name="home_label_dynamic">Dynamic</string>
<string name="home_label_chat">Message</string>
<string name="home_label_my">My</string>
<string name="greet_switch_title">Greeting copy</string>
<string name="greet_upload_img">Upload a picture (not required)</string>
<string name="greet_clear_config">Clear Settings</string>
<string name="greet_save_config">Save Settings</string>
</resources>

View File

@ -8,14 +8,14 @@ import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.RouteUtil;
import okhttp3.FormBody;
import okhttp3.MultipartBody;
import okhttp3.Request;
public class PostRequestParams implements IRequestParam {
@Override
public Request getRequest(boolean isNeedUid,boolean isNeedToken, Request request, Context context) {
if (request.body() instanceof FormBody) {
public Request getRequest(boolean isNeedUid, boolean isNeedToken, Request request, Context context) {
if (request.body() instanceof FormBody) {
FormBody.Builder bodyBuilder = new FormBody.Builder();
FormBody formBody = (FormBody) request.body();
for (int i = 0; i < formBody.size(); i++) {
@ -32,7 +32,7 @@ public class PostRequestParams implements IRequestParam {
if (isNeedUid) {
bodyBuilder.addEncoded("uid", String.valueOf(model.getId()));
}
if(isNeedToken) {
if (isNeedToken) {
bodyBuilder.addEncoded("token", model.getToken());
}
formBody = bodyBuilder.build();

View File

@ -101,7 +101,11 @@ public class ProcessImageUtil extends ProcessResultUtil {
mAlumbResultCallback = new ActivityResultCallback() {
@Override
public void onSuccess(Intent intent) {
crop(intent.getData());
if(mNeedCrop) {
crop(intent.getData());
}else{
mResultCallback.onSuccess(new File(intent.getData().toString()));
}
}
@Override
@ -143,6 +147,10 @@ public class ProcessImageUtil extends ProcessResultUtil {
* 相册获取图片
*/
public void getImageByAlumb() {
getImageByAlumb(true);
}
public void getImageByAlumb(boolean needCrop) {
mNeedCrop = needCrop;
requestPermissions(mAlumbPermissions, mAlumbPermissionCallback);
}