mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-22 13:09:46 +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
|
targetSdkVersion 28
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
versionCode 112
|
versionCode 113
|
||||||
versionName "7.0.0beta4"
|
versionName "7.0.0beta5"
|
||||||
|
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
renderscriptTargetApi 19
|
renderscriptTargetApi 19
|
||||||
@ -212,7 +212,7 @@ dependencies {
|
|||||||
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
|
implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0'
|
||||||
implementation 'org.apache.commons:commons-lang3:3.9'
|
implementation 'org.apache.commons:commons-lang3:3.9'
|
||||||
implementation 'com.github.wooplr:Spotlight:1.3'
|
implementation 'com.github.wooplr:Spotlight:1.3'
|
||||||
implementation('com.github.mario:chatkit:fb4dc970f7', {
|
implementation('com.github.mario:chatkit:a7c4f3c9ea', {
|
||||||
exclude group: 'com.facebook.fresco'
|
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.MagicOutcomingTextMessageViewHolder;
|
||||||
import com.nextcloud.talk.adapters.messages.MagicPreviewMessageViewHolder;
|
import com.nextcloud.talk.adapters.messages.MagicPreviewMessageViewHolder;
|
||||||
import com.nextcloud.talk.adapters.messages.MagicSystemMessageViewHolder;
|
import com.nextcloud.talk.adapters.messages.MagicSystemMessageViewHolder;
|
||||||
|
import com.nextcloud.talk.adapters.messages.MagicUnreadNoticeMessageViewHolder;
|
||||||
import com.nextcloud.talk.api.NcApi;
|
import com.nextcloud.talk.api.NcApi;
|
||||||
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
import com.nextcloud.talk.application.NextcloudTalkApplication;
|
||||||
import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
|
import com.nextcloud.talk.callbacks.MentionAutocompleteCallback;
|
||||||
@ -158,6 +159,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
MessagesListAdapter.Formatter<Date>, MessagesListAdapter.OnMessageLongClickListener, MessageHolders.ContentChecker {
|
MessagesListAdapter.Formatter<Date>, MessagesListAdapter.OnMessageLongClickListener, MessageHolders.ContentChecker {
|
||||||
private static final String TAG = "ChatController";
|
private static final String TAG = "ChatController";
|
||||||
private static final byte CONTENT_TYPE_SYSTEM_MESSAGE = 1;
|
private static final byte CONTENT_TYPE_SYSTEM_MESSAGE = 1;
|
||||||
|
private static final byte CONTENT_TYPE_UNREAD_NOTICE_MESSAGE = 2;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
NcApi ncApi;
|
NcApi ncApi;
|
||||||
@Inject
|
@Inject
|
||||||
@ -411,6 +414,10 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message,
|
R.layout.item_system_message, MagicSystemMessageViewHolder.class, R.layout.item_system_message,
|
||||||
this);
|
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() {
|
adapter = new MessagesListAdapter<>(conversationUser.getUserId(), messageHolders, new ImageLoader() {
|
||||||
@Override
|
@Override
|
||||||
public void loadImage(SimpleDraweeView imageView, @androidx.annotation.Nullable String url, @androidx.annotation.Nullable Object payload) {
|
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.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
messagesListView.setAdapter(adapter);
|
messagesListView.setAdapter(adapter);
|
||||||
adapter.setLoadMoreListener(this);
|
adapter.setLoadMoreListener(this);
|
||||||
adapter.setDateHeadersFormatter(this::format);
|
adapter.setDateHeadersFormatter(this::format);
|
||||||
@ -991,12 +997,12 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
Map<String, Integer> fieldMap = new HashMap<>();
|
Map<String, Integer> fieldMap = new HashMap<>();
|
||||||
fieldMap.put("includeLastKnown", 0);
|
fieldMap.put("includeLastKnown", 0);
|
||||||
|
|
||||||
if (lookIntoFuture > 0) {
|
int timeout = 30;
|
||||||
int timeout = 30;
|
if (!lookingIntoFuture ) {
|
||||||
if (!lookingIntoFuture ) {
|
timeout = 0;
|
||||||
timeout = 0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
if (lookIntoFuture > 0) {
|
||||||
lookingIntoFuture = true;
|
lookingIntoFuture = true;
|
||||||
fieldMap.put("timeout", timeout);
|
fieldMap.put("timeout", timeout);
|
||||||
} else if (isFirstMessagesProcessing) {
|
} else if (isFirstMessagesProcessing) {
|
||||||
@ -1020,6 +1026,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
|
|
||||||
if (!wasDetached) {
|
if (!wasDetached) {
|
||||||
if (lookIntoFuture > 0) {
|
if (lookIntoFuture > 0) {
|
||||||
|
int finalTimeout = timeout;
|
||||||
ncApi.pullChatMessages(credentials, ApiUtils.getUrlForChat(conversationUser.getBaseUrl(),
|
ncApi.pullChatMessages(credentials, ApiUtils.getUrlForChat(conversationUser.getBaseUrl(),
|
||||||
roomToken),
|
roomToken),
|
||||||
fieldMap)
|
fieldMap)
|
||||||
@ -1034,7 +1041,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(Response response) {
|
public void onNext(Response response) {
|
||||||
processMessages(response, true);
|
processMessages(response, true, finalTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1065,7 +1072,7 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNext(Response response) {
|
public void onNext(Response response) {
|
||||||
processMessages(response, false);
|
processMessages(response, false, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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) {
|
if (response.code() == 200) {
|
||||||
ChatOverall chatOverall = (ChatOverall) response.body();
|
ChatOverall chatOverall = (ChatOverall) response.body();
|
||||||
List<ChatMessage> chatMessageList = chatOverall.getOcs().getData();
|
List<ChatMessage> chatMessageList = chatOverall.getOcs().getData();
|
||||||
@ -1143,6 +1150,19 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
|
|
||||||
ChatMessage chatMessage;
|
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++) {
|
for (int i = 0; i < chatMessageList.size(); i++) {
|
||||||
chatMessage = chatMessageList.get(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);
|
(adapter != null && adapter.getItemCount() == 0);
|
||||||
|
|
||||||
if (!shouldScroll && popupBubble != null) {
|
if (!shouldAddNewMessagesNotice && !shouldScroll && popupBubble != null) {
|
||||||
if (!popupBubble.isShown()) {
|
if (!popupBubble.isShown()) {
|
||||||
newMessagesCount = 1;
|
newMessagesCount = 1;
|
||||||
popupBubble.show();
|
popupBubble.show();
|
||||||
@ -1337,6 +1358,8 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case CONTENT_TYPE_SYSTEM_MESSAGE:
|
case CONTENT_TYPE_SYSTEM_MESSAGE:
|
||||||
return !TextUtils.isEmpty(message.getSystemMessage());
|
return !TextUtils.isEmpty(message.getSystemMessage());
|
||||||
|
case CONTENT_TYPE_UNREAD_NOTICE_MESSAGE:
|
||||||
|
return message.getId().equals("-1");
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user