From 12e9985cd929cf89ed1d9d4bfd83d0a82a52fa21 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Fri, 17 Sep 2021 13:31:02 +0200 Subject: [PATCH] add unread mentions popup-bubble in conversations list Signed-off-by: Marcel Hibbe --- .../ConversationsListController.java | 46 +++++++++++++++++-- .../layout/controller_conversations_rv.xml | 13 ++++++ app/src/main/res/values/strings.xml | 3 ++ scripts/analysis/lint-results.txt | 2 +- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java index 049425250..5519f193f 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationsListController.java @@ -92,6 +92,7 @@ import com.nextcloud.talk.utils.UriUtils; import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.preferences.AppPreferences; +import com.webianks.library.PopupBubble; import com.yarolegovich.lovelydialog.LovelySaveStateHandler; import com.yarolegovich.lovelydialog.LovelyStandardDialog; @@ -99,11 +100,13 @@ import org.apache.commons.lang3.builder.CompareToBuilder; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; import org.parceler.Parcels; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import javax.inject.Inject; @@ -136,6 +139,7 @@ public class ConversationsListController extends BaseController implements Searc public static final String TAG = "ConvListController"; public static final int ID_DELETE_CONVERSATION_DIALOG = 0; + public static final int UNREAD_BUBBLE_DELAY = 2500; private static final String KEY_SEARCH_QUERY = "ContactsController.searchQuery"; private final Bundle bundle; @Inject @@ -168,6 +172,9 @@ public class ConversationsListController extends BaseController implements Searc @BindView(R.id.floatingActionButton) FloatingActionButton floatingActionButton; + @BindView(R.id.newMentionPopupBubble) + PopupBubble newMentionPopupBubble; + private UserEntity currentUser; private Disposable roomsQueryDisposable; private FlexibleAdapter adapter; @@ -201,6 +208,8 @@ public class ConversationsListController extends BaseController implements Searc private boolean forwardMessage = false; + private SmoothScrollLinearLayoutManager layoutManager; + public ConversationsListController(Bundle bundle) { super(); setHasOptionsMenu(true); @@ -517,6 +526,7 @@ public class ConversationsListController extends BaseController implements Searc } adapter.updateDataSet(callItems, false); + new Handler().postDelayed(this::checkToShowUnreadBubble, UNREAD_BUBBLE_DELAY); if (swipeRefreshLayout != null) { swipeRefreshLayout.setRefreshing(false); @@ -566,12 +576,19 @@ public class ConversationsListController extends BaseController implements Searc } private void prepareViews() { - SmoothScrollLinearLayoutManager layoutManager = - new SmoothScrollLinearLayoutManager(getActivity()); + layoutManager = new SmoothScrollLinearLayoutManager(Objects.requireNonNull(getActivity())); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); - recyclerView.setAdapter(adapter); + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NotNull RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + checkToShowUnreadBubble(); + } + } + }); swipeRefreshLayout.setOnRefreshListener(() -> fetchData(false)); swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary); @@ -598,6 +615,29 @@ public class ConversationsListController extends BaseController implements Searc } }); } + + newMentionPopupBubble.hide(); + newMentionPopupBubble.setPopupBubbleListener(new PopupBubble.PopupBubbleClickListener() { + @Override + public void bubbleClicked(Context context) { + recyclerView.smoothScrollToPosition(callItems.size()); + } + }); + } + + private void checkToShowUnreadBubble() { + int lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition(); + for (AbstractFlexibleItem flexItem : callItems) { + Conversation conversationItem = ((ConversationItem) flexItem).getModel(); + int position = adapter.getGlobalPositionOf(flexItem); + if (conversationItem.unreadMention && position > lastVisibleItem) { + if(!newMentionPopupBubble.isShown()){ + newMentionPopupBubble.show(); + } + return; + } + } + newMentionPopupBubble.hide(); } private void showNewConversationsScreen() { diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index 3cf94b490..62b263c5c 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -122,4 +122,17 @@ app:srcCompat="@drawable/ic_add_white_24px" app:tint="@color/white" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f35a4b8f..eef004e35 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -264,6 +264,9 @@ Remove group and members Pin: %1$s + + More mentions + Enter a message… Yesterday diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 175eec368..35f4757d0 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 3 errors and 266 warnings + Lint Report: 3 errors and 267 warnings