Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2018-05-09 18:15:16 +02:00
parent b3ea73f6a9
commit 43f5f16ab2

View File

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