Browse Source

Fix #167 and fix #164

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 7 years ago
parent
commit
43f5f16ab2
1 changed files with 50 additions and 21 deletions
  1. 50 21
      app/src/main/java/com/nextcloud/talk/controllers/ChatController.java

+ 50 - 21
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.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);
-                        layoutManager.startSmoothScroll(smoothScroller);
+
+                        messagesList.smoothScrollToPosition(0);
                     }
                     }
 
 
                     @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()) {
-                        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);
                     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"));