From 43f5f16ab2120a8038bf887ee8749918decff1dc Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 9 May 2018 18:15:16 +0200 Subject: [PATCH] Fix #167 and fix #164 Signed-off-by: Mario Danic --- .../talk/controllers/ChatController.java | 71 +++++++++++++------ 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index f6dec5020..e430b60d1 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -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, MessagesListAdapter.OnMessageLongClickListener { + MessagesListAdapter.Formatter, MessagesListAdapter.OnMessageLongClickListener{ private static final String TAG = "ChatController"; @Inject @@ -127,8 +129,11 @@ public class ChatController extends BaseController implements MessagesListAdapte private MessagesListAdapter 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"));