mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
parent
b3ea73f6a9
commit
43f5f16ab2
@ -29,9 +29,9 @@ import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.LinearSmoothScroller;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.view.LayoutInflater;
|
||||
@ -41,6 +41,7 @@ import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.widget.AbsListView;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.bluelinelabs.conductor.RouterTransaction;
|
||||
@ -65,6 +66,7 @@ import com.nextcloud.talk.models.json.generic.GenericOverall;
|
||||
import com.nextcloud.talk.models.json.mention.Mention;
|
||||
import com.nextcloud.talk.presenters.MentionAutocompletePresenter;
|
||||
import com.nextcloud.talk.utils.ApiUtils;
|
||||
import com.nextcloud.talk.utils.KeyboardUtils;
|
||||
import com.nextcloud.talk.utils.bundle.BundleKeys;
|
||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||
import com.nextcloud.talk.utils.glide.GlideApp;
|
||||
@ -100,7 +102,7 @@ import retrofit2.Response;
|
||||
|
||||
@AutoInjector(NextcloudTalkApplication.class)
|
||||
public class ChatController extends BaseController implements MessagesListAdapter.OnLoadMoreListener,
|
||||
MessagesListAdapter.Formatter<Date>, MessagesListAdapter.OnMessageLongClickListener {
|
||||
MessagesListAdapter.Formatter<Date>, MessagesListAdapter.OnMessageLongClickListener{
|
||||
private static final String TAG = "ChatController";
|
||||
|
||||
@Inject
|
||||
@ -127,8 +129,11 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
private MessagesListAdapter<ChatMessage> adapter;
|
||||
private Menu globalMenu;
|
||||
|
||||
private RecyclerView.SmoothScroller smoothScroller;
|
||||
private Autocomplete mentionAutocomplete;
|
||||
private LinearLayoutManager layoutManager;
|
||||
|
||||
private int newMessagesCount = 0;
|
||||
|
||||
/*
|
||||
TODO:
|
||||
- check push notifications
|
||||
@ -155,15 +160,6 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
|
||||
boolean adapterWasNull = false;
|
||||
|
||||
if (getActivity() != null) {
|
||||
smoothScroller = new LinearSmoothScroller(getActivity()) {
|
||||
@Override
|
||||
protected int getVerticalSnapPreference() {
|
||||
return LinearSmoothScroller.SNAP_TO_START;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
if (adapter == null) {
|
||||
|
||||
adapterWasNull = true;
|
||||
@ -189,13 +185,41 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
messagesList.setAdapter(adapter);
|
||||
adapter.setLoadMoreListener(this);
|
||||
adapter.setDateHeadersFormatter(this::format);
|
||||
adapter.setOnMessageLongClickListener(this);
|
||||
|
||||
layoutManager = (LinearLayoutManager) messagesList.getLayoutManager();
|
||||
|
||||
popupBubble.setRecyclerView(messagesList);
|
||||
|
||||
popupBubble.setPopupBubbleListener(context -> {
|
||||
if (newMessagesCount != 0) {
|
||||
new Handler().postDelayed(() -> messagesList.smoothScrollToPosition(newMessagesCount - 1), 200);
|
||||
}
|
||||
});
|
||||
|
||||
messagesList.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
|
||||
super.onScrollStateChanged(recyclerView, newState);
|
||||
|
||||
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
|
||||
if (newMessagesCount != 0) {
|
||||
if (layoutManager.findFirstCompletelyVisibleItemPosition() < newMessagesCount) {
|
||||
newMessagesCount = 0;
|
||||
|
||||
if (popupBubble.isShown()) {
|
||||
popupBubble.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
setupMentionAutocomplete();
|
||||
|
||||
messageInput.getInputEditText().setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
|
||||
@ -235,6 +259,9 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
mentionAutocomplete.dismissPopup();
|
||||
}
|
||||
|
||||
if (getActivity() != null) {
|
||||
new KeyboardUtils(getActivity(), getView());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -327,14 +354,11 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
|
||||
@Override
|
||||
public void onNext(GenericOverall genericOverall) {
|
||||
LinearLayoutManager layoutManager = (LinearLayoutManager) messagesList.getLayoutManager();
|
||||
|
||||
if (popupBubble.isShown()) {
|
||||
popupBubble.hide();
|
||||
}
|
||||
|
||||
smoothScroller.setTargetPosition(0);
|
||||
layoutManager.startSmoothScroll(smoothScroller);
|
||||
|
||||
messagesList.smoothScrollToPosition(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -452,17 +476,22 @@ public class ChatController extends BaseController implements MessagesListAdapte
|
||||
adapter.addToEnd(chatMessageList, false);
|
||||
|
||||
} else {
|
||||
LinearLayoutManager layoutManager = (LinearLayoutManager) messagesList.getLayoutManager();
|
||||
for (int i = 0; i < chatMessageList.size(); i++) {
|
||||
chatMessageList.get(i).setBaseUrl(currentUser.getBaseUrl());
|
||||
boolean shouldScroll = layoutManager.findFirstVisibleItemPosition() == 0;
|
||||
|
||||
if (!shouldScroll && !popupBubble.isShown()) {
|
||||
popupBubble.show();
|
||||
if (!shouldScroll) {
|
||||
if (!popupBubble.isShown()) {
|
||||
newMessagesCount = 1;
|
||||
popupBubble.show();
|
||||
} else if (popupBubble.isShown()) {
|
||||
newMessagesCount++;
|
||||
}
|
||||
} else {
|
||||
newMessagesCount = 0;
|
||||
}
|
||||
|
||||
adapter.addToStart(chatMessageList.get(i), shouldScroll);
|
||||
|
||||
}
|
||||
|
||||
globalLastKnownFutureMessageId = Integer.parseInt(response.headers().get("X-Chat-Last-Given"));
|
||||
|
Loading…
Reference in New Issue
Block a user