فهرست منبع

增加IM聊天会话置顶和双击聊天滚动未读消息会话处

Pq 1 سال پیش
والد
کامیت
1ac15e4cc4

+ 22 - 0
TUIKit/TIMCommon/timcommon/src/main/java/com/tencent/qcloud/tuikit/timcommon/classicui/widget/message/TopSmoothScroller.java

@@ -0,0 +1,22 @@
+package com.tencent.qcloud.tuikit.timcommon.classicui.widget.message;
+
+import android.content.Context;
+
+import androidx.recyclerview.widget.LinearSmoothScroller;
+
+/**
+ * Author by pq, Date on 2022/11/11.
+ */
+public class TopSmoothScroller extends LinearSmoothScroller {
+    public TopSmoothScroller(Context context) {
+        super(context);
+    }
+    @Override
+    protected int getHorizontalSnapPreference() {
+        return SNAP_TO_START;//具体见源码注释
+    }
+    @Override
+    protected int getVerticalSnapPreference() {
+        return SNAP_TO_START;//具体见源码注释
+    }
+}

+ 22 - 1
TUIKit/TUIConversation/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIConversationFragment.java

@@ -206,6 +206,21 @@ public class TUIConversationFragment extends BaseFragment {
         mConversationPopActions.add(action);
     }
 
+    private void addTopMenuAction() {
+        PopMenuAction action = new PopMenuAction();
+        action.setActionClickListener(new PopActionClickListener() {
+            @Override
+            public void onActionClick(int index, Object data) {
+                if (data instanceof ConversationInfo) {
+                    mConversationLayout.setConversationTop((ConversationInfo) data, null);
+                }
+            }
+        });
+        action.setActionName(getResources().getString(R.string.chat_top));
+        action.setWeight(700);
+        mConversationPopActions.add(action);
+    }
+
     /**
      * 长按会话item弹框
      * @param view 长按 view
@@ -226,7 +241,7 @@ public class TUIConversationFragment extends BaseFragment {
             }
 
             addDeletePopMenuAction();
-
+            addTopMenuAction();
             mConversationPopActions.addAll(addMoreConversationAction(conversationInfo));
             Collections.sort(mConversationPopActions, new Comparator<PopMenuAction>() {
                 @Override
@@ -332,6 +347,12 @@ public class TUIConversationFragment extends BaseFragment {
         }
     }
 
+    public void onFindConversationUnRead() {
+        if (mConversationLayout != null) {
+            mConversationLayout.findUnReadConversation();
+        }
+    }
+
     @Override
     public void onDestroy() {
         super.onDestroy();

+ 43 - 0
TUIKit/TUIConversation/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationLayout.java

@@ -2,8 +2,10 @@ package com.tencent.qcloud.tuikit.tuiconversation.classicui.widget;
 
 import android.content.Context;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.widget.RelativeLayout;
 
+import com.tencent.qcloud.tuikit.timcommon.classicui.widget.message.TopSmoothScroller;
 import com.tencent.qcloud.tuikit.timcommon.component.TitleBarLayout;
 import com.tencent.qcloud.tuikit.timcommon.component.interfaces.IUIKitCallback;
 import com.tencent.qcloud.tuikit.tuiconversation.R;
@@ -12,6 +14,8 @@ import com.tencent.qcloud.tuikit.tuiconversation.classicui.interfaces.IConversat
 import com.tencent.qcloud.tuikit.tuiconversation.interfaces.IConversationListAdapter;
 import com.tencent.qcloud.tuikit.tuiconversation.presenter.ConversationPresenter;
 
+import androidx.recyclerview.widget.RecyclerView;
+
 public class ConversationLayout extends RelativeLayout implements IConversationLayout {
     private ConversationListLayout mConversationList;
     private ConversationPresenter presenter;
@@ -129,6 +133,45 @@ public class ConversationLayout extends RelativeLayout implements IConversationL
         }
     }
 
+    public void findUnReadConversation() {
+        ConversationListAdapter adapter = mConversationList.getAdapter();
+        int itemCount = adapter.getItemCount();
+        if (itemCount > 0) {
+            int firstUnreadPos = -1;
+            for (int i = 0; i < itemCount; i++) {
+                ConversationInfo item = adapter.getItem(i);
+                if (item != null) {
+                    boolean markUnread = item.isMarkUnread();
+                    if(markUnread || item.getUnRead() > 0){
+                        firstUnreadPos = i;
+                        break;
+                    }
+                }
+            }
+
+            if (firstUnreadPos == -1) {
+                firstUnreadPos = 0;
+            }
+            scrollToPosition(firstUnreadPos);
+        }
+    }
+
+    private void scrollToPosition(int pos) {
+        if (mConversationList != null) {
+            RecyclerView.LayoutManager layoutManager = mConversationList.getLayoutManager();
+            ConversationListAdapter adapter = mConversationList.getAdapter();
+            if (adapter != null && adapter.getItemCount() > 0 && layoutManager != null) {
+                if (pos < 0 || pos >= adapter.getItemCount()) {
+                    pos = 0;
+                }
+                Log.i("pq", "result pos:" + pos);
+                final TopSmoothScroller mScroller = new TopSmoothScroller(getContext());
+                mScroller.setTargetPosition(pos);
+                layoutManager.startSmoothScroll(mScroller);
+            }
+        }
+    }
+
     @Override
     public TitleBarLayout getTitleBar() {
         return null;

+ 9 - 2
chatModule/src/main/java/com/cooleshow/chatmodule/ui/ChatFragment.java

@@ -40,6 +40,7 @@ public class ChatFragment extends BaseFragment<TcFragmentChatLayoutBinding> impl
             onCountChanged(totalUnreadCount);
         }
     };
+    private ConversationListFragment mConversationListFragment;
 
 
     @Override
@@ -100,11 +101,11 @@ public class ChatFragment extends BaseFragment<TcFragmentChatLayoutBinding> impl
             }
         });
         initListener();
-        ConversationListFragment conversationListFragment = new ConversationListFragment();
+        mConversationListFragment = new ConversationListFragment();
         ContactRoomListFragment contactRoomListFragment = new ContactRoomListFragment();
         ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
         contactPersonListFragment.setParentTopView(mViewBinding.viewTopBg);
-        fragments.add(conversationListFragment);
+        fragments.add(mConversationListFragment);
         fragments.add(contactRoomListFragment);
         fragments.add(contactPersonListFragment);
         MessagePagerAdapter messagePagerAdapter = new MessagePagerAdapter(this);
@@ -154,6 +155,12 @@ public class ChatFragment extends BaseFragment<TcFragmentChatLayoutBinding> impl
         }
     }
 
+    public void onFindConversationUnRead() {
+        if (mConversationListFragment != null) {
+            mConversationListFragment.onFindConversationUnRead();
+        }
+    }
+
     @Override
     public void onDestroy() {
         super.onDestroy();

+ 6 - 0
chatModule/src/main/java/com/cooleshow/chatmodule/ui/ConversationListFragment.java

@@ -63,6 +63,12 @@ public class ConversationListFragment extends BaseFragment<TcFragmentConversatio
         }
     }
 
+    public void onFindConversationUnRead() {
+        if (mTuiConversationFragment != null) {
+            mTuiConversationFragment.onFindConversationUnRead();
+        }
+    }
+
     @Override
     public void onDestroy() {
         TUICore.unRegisterEvent(TUIConstants.TUILogin.EVENT_LOGIN_STATE_CHANGED,

+ 3 - 3
teacher/src/main/java/com/cooleshow/teacher/ui/main/MainActivity.java

@@ -291,9 +291,9 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         if (id == R.id.view_chat) {
             if (UiUtils.isFastClick(200)) {
                 //双击操作
-//                if (mChatFragment != null) {
-//                    mChatFragment.onFindConversationUnRead();
-//                }
+                if (mChatFragment != null) {
+                    mChatFragment.onFindConversationUnRead();
+                }
                 return;
             }
             lastCurrentItemPosition = 2;