mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-21 12:39:58 +01:00
First scroll to new messages
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
f686bf9057
commit
4d9781fbe2
@ -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'
|
||||
})
|
||||
|
||||
|
@ -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() {
|
||||
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user