diff --git a/app/src/main/java/com/mango/moshen/ui/im/ImInitHelper.java b/app/src/main/java/com/mango/moshen/ui/im/ImInitHelper.java index 98dea393c..6c30952a0 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/ImInitHelper.java +++ b/app/src/main/java/com/mango/moshen/ui/im/ImInitHelper.java @@ -2,6 +2,8 @@ package com.mango.moshen.ui.im; import android.content.Context; +import com.mango.core.im.custom.bean.UserCardAttachment; +import com.mango.moshen.ui.im.chat.MsgViewHolderUserCard; import com.netease.nim.uikit.api.NimUIKit; import com.netease.nim.uikit.api.model.contact.ContactEventListener; import com.netease.nim.uikit.api.model.session.SessionCustomization; @@ -133,6 +135,7 @@ public class ImInitHelper { NimUIKit.registerMsgItemViewHolder(NoticeAttachment.class, MsgViewHolderContent.class); NimUIKit.registerMsgItemViewHolder(RedPacketAttachment.class, MsgViewHolderRedPacket.class); NimUIKit.registerMsgItemViewHolder(NewbieHelloAttachment.class, MsgViewHolderHello.class); + NimUIKit.registerMsgItemViewHolder(UserCardAttachment.class, MsgViewHolderUserCard.class); NimUIKit.registerMsgItemViewHolder(LotteryAttachment.class, MsgViewHolderLottery.class); NimUIKit.registerMsgItemViewHolder(NobleAttachment.class, MsgViewHolderText.class); NimUIKit.registerMsgItemViewHolder(CarAttachment.class, MsgViewHolderText.class); diff --git a/app/src/main/java/com/mango/moshen/ui/im/MessageListPanelEx.java b/app/src/main/java/com/mango/moshen/ui/im/MessageListPanelEx.java index f7ca26651..b67f5cfa0 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/MessageListPanelEx.java +++ b/app/src/main/java/com/mango/moshen/ui/im/MessageListPanelEx.java @@ -17,7 +17,9 @@ import androidx.recyclerview.widget.RecyclerView; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.mango.core.im.custom.bean.UserCardAttachment; import com.mango.core.room.event.MessageSizeEvent; +import com.mango.core.utils.CurrentTimeUtils; import com.mango.xchat_android_library.utils.SingleToastUtil; import com.netease.nim.uikit.R; import com.netease.nim.uikit.api.NimUIKit; @@ -85,8 +87,6 @@ public class MessageListPanelEx { private static final int REQUEST_CODE_FORWARD_PERSON = 0x01; private static final int REQUEST_CODE_FORWARD_TEAM = 0x02; - // 背景图片缓存 - private static Pair background; private static final Comparator comp = new Comparator() { @Override @@ -95,26 +95,19 @@ public class MessageListPanelEx { return time == 0 ? 0 : (time < 0 ? -1 : 1); } }; - // container - private Container container; + // 背景图片缓存 + private static Pair background; private final View rootView; - // message list view - private RecyclerView messageListView; - private List items; - private MsgAdapter adapter; - private ImageView listviewBk; - // 新消息到达提醒 - private IncomingMsgPrompt incomingMsgPrompt; - private Handler uiHandler; // 仅显示消息记录,不接收和发送消息 private final boolean recordOnly; // 从服务器拉取消息记录 private final boolean remote; - // 语音转文字 - private VoiceTrans voiceTrans; - // 待转发消息 - private IMMessage forwardMessage; - private CountDownTimer countDownTimer; + // container + private Container container; + // message list view + private RecyclerView messageListView; + private List items; + private MsgAdapter adapter; private final OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(IRecyclerView adapter, View view, int position) { @@ -217,13 +210,17 @@ public class MessageListPanelEx { deleteItem(message, false); } }; + private ImageView listviewBk; + // 新消息到达提醒 + private IncomingMsgPrompt incomingMsgPrompt; + private Handler uiHandler; + // 语音转文字 + private VoiceTrans voiceTrans; + // 待转发消息 + private IMMessage forwardMessage; private UserInfoObserver uinfoObserver; private OnMessageFilterListener onMessageFilterListener; - public MessageListPanelEx(Container container, View rootView, boolean recordOnly, boolean remote) { - this(container, rootView, null, recordOnly, remote); - } - public MessageListPanelEx(Container container, View rootView, IMMessage anchor, boolean recordOnly, boolean remote) { this.container = container; this.rootView = rootView; @@ -243,16 +240,10 @@ public class MessageListPanelEx { public void onDestroy() { registerObservers(false); - if (countDownTimer != null) { - countDownTimer.cancel(); - } } public boolean onBackPressed() { uiHandler.removeCallbacks(null); - if (countDownTimer != null) { - countDownTimer.cancel(); - } MessageAudioControl.getInstance(container.activity).stopAudio(); // 界面返回,停止语音播放 if (voiceTrans != null && voiceTrans.isShow()) { voiceTrans.hide(); @@ -730,12 +721,9 @@ public class MessageListPanelEx { private class MessageLoader implements BaseFetchLoadAdapter.RequestLoadMoreListener, BaseFetchLoadAdapter.RequestFetchMoreListener { private final int loadMsgCount = NimUIKitImpl.getOptions().messageCountLoadOnce; - - private QueryDirectionEnum direction = null; - private final IMMessage anchor; private final boolean remote; - + private QueryDirectionEnum direction = null; private boolean firstLoad = true; private final RequestCallback> callback = new RequestCallbackWrapper>() { @Override @@ -875,6 +863,9 @@ public class MessageListPanelEx { } else { // 顶部加载 if (noMoreMessage) { + IMMessage imMessage = MessageBuilder.createCustomMessage(container.account, container.sessionType, new UserCardAttachment()); + imMessage.setStatus(MsgStatusEnum.draft); + messages.add(0, imMessage); adapter.fetchMoreEnd(messages, true); } else { adapter.fetchMoreComplete(messages); @@ -1070,18 +1061,11 @@ public class MessageListPanelEx { } private boolean enableRevokeButton(IMMessage selectedItem) { - if (selectedItem.getStatus() == MsgStatusEnum.success - && NimUIKitImpl.getMsgRevokeFilter() != null - && !NimUIKitImpl.getMsgRevokeFilter().shouldIgnore(selectedItem) - && !recordOnly) { - if (selectedItem.getDirect() == MsgDirectionEnum.Out) { - return true; - } else if (NimUIKit.getOptions().enableTeamManagerRevokeMsg && selectedItem.getSessionType() == SessionTypeEnum.Team) { - TeamMember member = NimUIKit.getTeamProvider().getTeamMember(selectedItem.getSessionId(), NimUIKit.getAccount()); - return member != null && member.getType() == TeamMemberType.Owner || member.getType() == TeamMemberType.Manager; - } - } - return false; + return selectedItem.getStatus() == MsgStatusEnum.success + && selectedItem.getMsgType() == MsgTypeEnum.text + && !recordOnly + && selectedItem.getDirect() == MsgDirectionEnum.Out + && CurrentTimeUtils.getCurrentTime() - selectedItem.getTime() < 2 * 60 * 1000; } // 长按菜单项--重发 diff --git a/app/src/main/java/com/mango/moshen/ui/im/avtivity/AddBlackListActivity.java b/app/src/main/java/com/mango/moshen/ui/im/avtivity/AddBlackListActivity.java index 8669659d2..6859bcd65 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/avtivity/AddBlackListActivity.java +++ b/app/src/main/java/com/mango/moshen/ui/im/avtivity/AddBlackListActivity.java @@ -52,6 +52,9 @@ public class AddBlackListActivity extends BaseMvpActivity blackListAccount = NimFriendModel.get().getMyBlackListAccount(); - if (blackListAccount != null) - changeText(blackListAccount.contains(account)); + if (blackListAccount != null) changeText(blackListAccount.contains(account)); initTarget(); } void changeText(boolean contains) { tvAddBlackList.setText(contains ? "移除黑名单" : "加入黑名单"); - initWhiteTitleBar(contains ? "移除黑名单" : "加入黑名单"); } /** diff --git a/app/src/main/java/com/mango/moshen/ui/im/avtivity/NimP2PMessageActivity.java b/app/src/main/java/com/mango/moshen/ui/im/avtivity/NimP2PMessageActivity.java index 6f0862faf..f9b2e1284 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/avtivity/NimP2PMessageActivity.java +++ b/app/src/main/java/com/mango/moshen/ui/im/avtivity/NimP2PMessageActivity.java @@ -295,6 +295,7 @@ public class NimP2PMessageActivity extends NewBaseMessageActivity { tvAddBlackTip.setVisibility(contains ? View.VISIBLE : View.GONE); } +/* if (!SystemUidUtil.isSystemUid(sessionId)) { View clUserDetails = findViewById(R.id.cl_user_details); UserModel.get().getUserInfoDetail(Long.parseLong(sessionId)) @@ -330,6 +331,7 @@ public class NimP2PMessageActivity extends NewBaseMessageActivity { } }); } +*/ } private void registerObservers(boolean register) { diff --git a/app/src/main/java/com/mango/moshen/ui/im/chat/MsgViewHolderUserCard.java b/app/src/main/java/com/mango/moshen/ui/im/chat/MsgViewHolderUserCard.java new file mode 100644 index 000000000..3821304de --- /dev/null +++ b/app/src/main/java/com/mango/moshen/ui/im/chat/MsgViewHolderUserCard.java @@ -0,0 +1,217 @@ +package com.mango.moshen.ui.im.chat; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.mango.core.user.UserModel; +import com.mango.core.user.bean.UserPhoto; +import com.mango.core.utils.StarUtils; +import com.mango.core.utils.StringExtensionKt; +import com.mango.core.utils.net.RxHelper; +import com.mango.moshen.R; +import com.mango.moshen.common.widget.CircleImageView; +import com.mango.moshen.skill.activity.SkillHomeActivity; +import com.mango.moshen.skill.repository.SkillModel; +import com.mango.moshen.ui.user.ShowPhotoActivity; +import com.mango.moshen.ui.user.UserInfoActivity; +import com.mango.moshen.ui.utils.ImageLoadUtils; +import com.mango.xchat_android_library.utils.JavaUtil; +import com.mango.xchat_android_library.utils.ListUtils; +import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; +import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; +import com.netease.nim.uikit.common.util.sys.ScreenUtil; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * Created by chenran on 2018/1/2. + */ + +public class MsgViewHolderUserCard extends MsgViewHolderBase { + + private BaseQuickAdapter photoAdapter; + private LinearLayout llSkill; + private ImageView ivSkill0; + private ImageView ivSkill1; + private ImageView ivSkill2; + private View flSkill1; + private View flSkill2; + private CircleImageView ivAvatar; + private TextView tvNick; + private ImageView ivGender; + private TextView tvConstellation; + private TextView tvDesc; + private RecyclerView rvPhotos; + + public MsgViewHolderUserCard(BaseMultiItemFetchLoadAdapter adapter) { + super(adapter); + } + + @Override + protected int getContentResId() { + return R.layout.layout_p2p_user_card; + } + + @Override + protected void inflateContentView() { + llSkill = findViewById(R.id.ll_skill); + ivSkill0 = findViewById(R.id.iv_skill_0); + ivSkill1 = findViewById(R.id.iv_skill_1); + ivSkill2 = findViewById(R.id.iv_skill_2); + flSkill1 = findViewById(R.id.fl_skill_1); + flSkill2 = findViewById(R.id.fl_skill_2); + ivAvatar = findViewById(R.id.iv_avatar); + tvNick = findViewById(R.id.tv_nick); + ivGender = findViewById(R.id.iv_gender); + tvConstellation = findViewById(R.id.tv_constellation); + tvDesc = findViewById(R.id.tv_desc); + rvPhotos = findViewById(R.id.rv_photos); + if (photoAdapter == null) { + photoAdapter = new BaseQuickAdapter(R.layout.item_p2p_user_photo) { + @Override + protected void convert(@NonNull BaseViewHolder helper, UserPhoto item) { + ImageLoadUtils.loadRectImage( + context, + item.getPhotoUrl(), + (ImageView) helper.itemView, + R.drawable.default_cover, + ScreenUtil.dip2px(8) + ); + helper.itemView.setOnClickListener(v -> showUserPhoto(helper.getAdapterPosition())); + } + }; + rvPhotos.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)); + rvPhotos.setAdapter(photoAdapter); + loadData(); + } + } + + + private void showUserPhoto(int position) { + //创建一个集合拿来做用户所有照片信息 + ArrayList userPhotos = new ArrayList<>(); + List realmList = photoAdapter.getData(); + for (UserPhoto photo : realmList) { + UserPhoto newPhoto = new UserPhoto(); + newPhoto.setPid(photo.getPid()); + newPhoto.setPhotoUrl(photo.getPhotoUrl()); + userPhotos.add(newPhoto); + } + Intent intent = new Intent(context, ShowPhotoActivity.class); + intent.putExtra("position", position); + intent.putExtra("photoList", userPhotos); + context.startActivity(intent); + } + + @SuppressLint("CheckResult") + private void loadData() { + long uid = JavaUtil.str2long(message.getSessionId()); + ivAvatar.setOnClickListener(v -> UserInfoActivity.Companion.start(context, uid)); + UserModel.get().getUserInfo(uid) + .compose(RxHelper.bindContext(context)) + .subscribe(userInfo -> { + ImageLoadUtils.loadAvatar(userInfo.getAvatar(), ivAvatar); + tvNick.setText(StringExtensionKt.subAndReplaceDot(userInfo.getNick(), 7)); + ivGender.setImageResource(userInfo.getGender() == 1 ? R.drawable.ic_gender_male : R.drawable.ic_gender_female); + tvDesc.setText(userInfo.getUserDesc() != null ? userInfo.getUserDesc() : context.getResources().getString(R.string.msg_no_user_desc)); + //设置星座 + String star = StarUtils.getConstellation(new Date(userInfo.getBirth())); + if (null == star) { + tvConstellation.setVisibility(View.GONE); + } else { + tvConstellation.setText(star); + tvConstellation.setVisibility(View.VISIBLE); + } + photoAdapter.setNewData(userInfo.getPrivatePhoto()); + }); + + SkillModel.Companion + .getInstance() + .getUserAllSkillCardDetail(uid) + .compose(RxHelper.bindContext(context)) + .subscribe(entities -> { + if (ListUtils.isListEmpty(entities)) { + llSkill.setVisibility(View.GONE); + } else { + llSkill.setVisibility(View.VISIBLE); + llSkill.setOnClickListener(v -> + SkillHomeActivity.Companion.start( + context, + SkillHomeActivity.PAGE_TYPE_CUSTOM, + uid + ) + ); + + ImageLoadUtils.loadImage(context, entities.get(0).getIcon(), ivSkill0); + if (entities.size() == 1) return; + + ImageLoadUtils.loadImage(context, entities.get(1).getIcon(), ivSkill1); + flSkill1.setVisibility(View.VISIBLE); + if (entities.size() == 2) return; + + ImageLoadUtils.loadImage(context, entities.get(2).getIcon(), ivSkill2); + flSkill2.setVisibility(View.VISIBLE); + } + + }); + + } + + @Override + protected void bindContentView() { + + } + + // 内容区域点击事件响应处理。 + protected void onItemClick() { + + } + + // 内容区域长按事件响应处理。该接口的优先级比adapter中有长按事件的处理监听高,当该接口返回为true时,adapter的长按事件监听不会被调用到。 + protected boolean onItemLongClick() { + return true; + } + + // 当是接收到的消息时,内容区域背景的drawable id + protected int leftBackground() { + return 0; + } + + // 当是发送出去的消息时,内容区域背景的drawable id + protected int rightBackground() { + return 0; + } + + // 返回该消息是不是居中显示 + protected boolean isMiddleItem() { + return true; + } + + // 是否显示头像,默认为显示 + protected boolean isShowHeadImage() { + return false; + } + + // 是否显示气泡背景,默认为显示 + protected boolean isShowBubble() { + return false; + } + + // 是否显示已读,默认为显示 + protected boolean shouldDisplayReceipt() { + return false; + } + +} diff --git a/app/src/main/java/com/mango/moshen/ui/im/recent/RecentContactsFragment.java b/app/src/main/java/com/mango/moshen/ui/im/recent/RecentContactsFragment.java index 0208760b3..780e38dc9 100644 --- a/app/src/main/java/com/mango/moshen/ui/im/recent/RecentContactsFragment.java +++ b/app/src/main/java/com/mango/moshen/ui/im/recent/RecentContactsFragment.java @@ -427,30 +427,6 @@ public class RecentContactsFragment extends TFragment { refreshMessages(false); } }); - - alertDialog.addItem("删除该聊天(仅服务器)", new onSeparateItemClickListener() { - @Override - public void onClick() { - NIMClient.getService(MsgService.class) - .deleteRoamingRecentContact(recent.getContactId(), recent.getSessionType()) - .setCallback(new RequestCallback() { - @Override - public void onSuccess(Void param) { - SingleToastUtil.showToastShort("delete success"); - } - - @Override - public void onFailed(int code) { - SingleToastUtil.showToastShort("delete failed, code:" + code); - } - - @Override - public void onException(Throwable exception) { - - } - }); - } - }); alertDialog.show(); } diff --git a/app/src/main/res/drawable/shape_8ad4ff_to_45bbff.xml b/app/src/main/res/drawable/shape_8ad4ff_to_45bbff.xml new file mode 100644 index 000000000..8bdaf05c1 --- /dev/null +++ b/app/src/main/res/drawable/shape_8ad4ff_to_45bbff.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_f8f8fd.xml b/app/src/main/res/drawable/shape_circle_f8f8fd.xml new file mode 100644 index 000000000..84ecadf38 --- /dev/null +++ b/app/src/main/res/drawable/shape_circle_f8f8fd.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_nim_add_black_list.xml b/app/src/main/res/layout/activity_nim_add_black_list.xml index 0ae851b9d..0399d65d1 100644 --- a/app/src/main/res/layout/activity_nim_add_black_list.xml +++ b/app/src/main/res/layout/activity_nim_add_black_list.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/bg_normal_1c1b22" + android:background="@color/white" android:orientation="vertical"> - + android:layout_height="match_parent" + android:background="@color/bg_normal_1c1b22"> - - - + android:layout_marginStart="15dp" + android:layout_marginTop="12dp" + android:layout_marginEnd="15dp" + android:background="@drawable/shape_white_8dp_round" + android:orientation="vertical"> - + - + - + - + - + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_p2p_message.xml b/app/src/main/res/layout/activity_p2p_message.xml index ce9a0c773..fe725999b 100644 --- a/app/src/main/res/layout/activity_p2p_message.xml +++ b/app/src/main/res/layout/activity_p2p_message.xml @@ -127,71 +127,6 @@ android:src="@mipmap/common_ic_close_red" /> - - - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_p2p_user_card.xml b/app/src/main/res/layout/layout_p2p_user_card.xml new file mode 100644 index 000000000..28312fe7d --- /dev/null +++ b/app/src/main/res/layout/layout_p2p_user_card.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/main/java/com/mango/core/im/custom/bean/UserCardAttachment.java b/core/src/main/java/com/mango/core/im/custom/bean/UserCardAttachment.java new file mode 100644 index 000000000..65f752aee --- /dev/null +++ b/core/src/main/java/com/mango/core/im/custom/bean/UserCardAttachment.java @@ -0,0 +1,31 @@ +package com.mango.core.im.custom.bean; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.mango.core.newbie.NewbieHelloInfo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class UserCardAttachment extends CustomAttachment { + private long uid; + + public UserCardAttachment() { + super(0, 0); + } + + @Override + protected void parseData(JSONObject data) { + uid = data.getLongValue("uid"); + } + + @Override + protected JSONObject packData() { + return null; + } +} diff --git a/nim_uikit/res/layout/nim_message_item.xml b/nim_uikit/res/layout/nim_message_item.xml index 05bad8156..02d1ea46e 100644 --- a/nim_uikit/res/layout/nim_message_item.xml +++ b/nim_uikit/res/layout/nim_message_item.xml @@ -30,7 +30,7 @@ android:layout_below="@id/message_item_time" android:layout_marginEnd="11dp" android:visibility="gone" - tools:visibility="visible" /> + />