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