浏览代码

First scroll to new messages

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 5 年之前
父节点
当前提交
4d9781fbe2

+ 3 - 3
app/build.gradle

@@ -38,8 +38,8 @@ android {
         targetSdkVersion 28
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 
-        versionCode 112
-        versionName "7.0.0beta4"
+        versionCode 113
+        versionName "7.0.0beta5"
 
         flavorDimensions "default"
         renderscriptTargetApi 19
@@ -212,7 +212,7 @@ dependencies {
     implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
     implementation 'org.apache.commons:commons-lang3:3.9'
     implementation 'com.github.wooplr:Spotlight:1.3'
-    implementation('com.github.mario:chatkit:fb4dc970f7', {
+    implementation('com.github.mario:chatkit:a7c4f3c9ea', {
         exclude group: 'com.facebook.fresco'
     })
 

+ 52 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/MagicUnreadNoticeMessageViewHolder.java

@@ -0,0 +1,52 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.talk.adapters.messages;
+
+import android.view.View;
+
+import com.nextcloud.talk.models.json.chat.ChatMessage;
+import com.stfalcon.chatkit.commons.ViewHolder;
+import com.stfalcon.chatkit.messages.MessageHolders;
+
+public class MagicUnreadNoticeMessageViewHolder extends MessageHolders.SystemMessageViewHolder<ChatMessage> {
+
+    public MagicUnreadNoticeMessageViewHolder(View itemView) {
+        super(itemView);
+    }
+
+    public MagicUnreadNoticeMessageViewHolder(View itemView, Object payload) {
+        super(itemView, payload);
+    }
+
+    @Override
+    public void viewDetached() {
+        messagesListAdapter.deleteById("-1");
+    }
+
+    @Override
+    public void viewAttached() {
+    }
+
+    @Override
+    public void viewRecycled() {
+
+    }
+}

+ 34 - 11
app/src/main/java/com/nextcloud/talk/controllers/ChatController.java

@@ -75,6 +75,7 @@ import com.nextcloud.talk.adapters.messages.MagicIncomingTextMessageViewHolder;
 import com.nextcloud.talk.adapters.messages.MagicOutcomingTextMessageViewHolder;
 import com.nextcloud.talk.adapters.messages.MagicPreviewMessageViewHolder;
 import com.nextcloud.talk.adapters.messages.MagicSystemMessageViewHolder;
+import com.nextcloud.talk.adapters.messages.MagicUnreadNoticeMessageViewHolder;
 import com.nextcloud.talk.api.NcApi;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
 import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
@@ -158,6 +159,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
         MessagesListAdapter.Formatter<Date>, MessagesListAdapter.OnMessageLongClickListener, MessageHolders.ContentChecker {
     private static final String TAG = "ChatController";
     private static final byte CONTENT_TYPE_SYSTEM_MESSAGE = 1;
+    private static final byte CONTENT_TYPE_UNREAD_NOTICE_MESSAGE = 2;
+
     @Inject
     NcApi ncApi;
     @Inject
@@ -411,6 +414,10 @@ public class ChatController extends BaseController implements MessagesListAdapte
                     R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message,
                     this);
 
+            messageHolders.registerContentType(CONTENT_TYPE_UNREAD_NOTICE_MESSAGE,
+                    MagicUnreadNoticeMessageViewHolder.class, R.layout.item_date_header,
+                    MagicUnreadNoticeMessageViewHolder.class, R.layout.item_date_header, this);
+
             adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() {
                 @Override
                 public void loadImage(SimpleDraweeView imageView, @androidx.annotation.Nullable String url, @androidx.annotation.Nullable Object payload) {
@@ -427,7 +434,6 @@ public class ChatController extends BaseController implements MessagesListAdapte
             messagesListView.setVisibility(View.VISIBLE);
         }
 
-
         messagesListView.setAdapter(adapter);
         adapter.setLoadMoreListener(this);
         adapter.setDateHeadersFormatter(this::format);
@@ -991,12 +997,12 @@ public class ChatController extends BaseController implements MessagesListAdapte
         Map<String, Integer> fieldMap = new HashMap<>();
         fieldMap.put("includeLastKnown", 0);
 
-        if (lookIntoFuture > 0) {
-            int timeout = 30;
-            if (!lookingIntoFuture ) {
-                timeout = 0;
-            }
+        int timeout = 30;
+        if (!lookingIntoFuture ) {
+            timeout = 0;
+        }
 
+        if (lookIntoFuture > 0) {
             lookingIntoFuture = true;
             fieldMap.put("timeout", timeout);
         } else if (isFirstMessagesProcessing) {
@@ -1020,6 +1026,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
 
         if (!wasDetached) {
             if (lookIntoFuture > 0) {
+                int finalTimeout = timeout;
                 ncApi.pullChatMessages(credentials, ApiUtils.getUrlForChat(conversationUser.getBaseUrl(),
                         roomToken),
                         fieldMap)
@@ -1034,7 +1041,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
 
                             @Override
                             public void onNext(Response response) {
-                                processMessages(response, true);
+                                processMessages(response, true, finalTimeout);
                             }
 
                             @Override
@@ -1065,7 +1072,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
 
                             @Override
                             public void onNext(Response response) {
-                                processMessages(response, false);
+                                processMessages(response, false, 0);
                             }
 
                             @Override
@@ -1082,7 +1089,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
         }
     }
 
-    private void processMessages(Response response, boolean isFromTheFuture) {
+    private void processMessages(Response response, boolean isFromTheFuture, int timeout) {
         if (response.code() == 200) {
             ChatOverall chatOverall = (ChatOverall) response.body();
             List<ChatMessage> chatMessageList = chatOverall.getOcs().getData();
@@ -1143,6 +1150,19 @@ public class ChatController extends BaseController implements MessagesListAdapte
 
                 ChatMessage chatMessage;
 
+                boolean shouldAddNewMessagesNotice =
+                        timeout == 0 && adapter.getItemCount() > 0 && chatMessageList.size() > 0;
+
+                if (shouldAddNewMessagesNotice) {
+                    ChatMessage unreadChatMessage = new ChatMessage();
+                    unreadChatMessage.setJsonMessageId(-1);
+                    unreadChatMessage.setActorId("-1");
+                    unreadChatMessage.setTimestamp(chatMessageList.get(0).getTimestamp());
+                    unreadChatMessage.setMessage(context.getString(R.string.nc_new_messages));
+                    adapter.addToStart(unreadChatMessage, false);
+                    layoutManager.scrollToPosition(chatMessageList.size() - 1);
+                }
+
                 for (int i = 0; i < chatMessageList.size(); i++) {
                     chatMessage = chatMessageList.get(i);
 
@@ -1157,10 +1177,11 @@ public class ChatController extends BaseController implements MessagesListAdapte
                         }
                     }
 
-                    boolean shouldScroll = layoutManager.findFirstVisibleItemPosition() == 0 ||
+                    boolean shouldScroll =
+                            !shouldAddNewMessagesNotice && layoutManager.findFirstVisibleItemPosition() == 0 ||
                             (adapter != null && adapter.getItemCount() == 0);
 
-                    if (!shouldScroll && popupBubble != null) {
+                    if (!shouldAddNewMessagesNotice && !shouldScroll && popupBubble != null) {
                         if (!popupBubble.isShown()) {
                             newMessagesCount = 1;
                             popupBubble.show();
@@ -1337,6 +1358,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
         switch (type) {
             case CONTENT_TYPE_SYSTEM_MESSAGE:
                 return !TextUtils.isEmpty(message.getSystemMessage());
+            case CONTENT_TYPE_UNREAD_NOTICE_MESSAGE:
+                return message.getId().equals("-1");
         }
 
         return false;