First scroll to new messages

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-09-09 18:11:09 +02:00
parent f686bf9057
commit 4d9781fbe2
3 changed files with 89 additions and 14 deletions

View File

@ -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'
})

View File

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

View File

@ -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;