fix FAB not shriking

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java | 34 
src/main/java/eu/siacs/conversations/ui/ExtendedFabSizeChanger.java        | 14 
2 files changed, 29 insertions(+), 19 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java 🔗

@@ -378,15 +378,17 @@ public class ConversationsOverviewFragment extends XmppFragment {
         if (this.binding == null) {
             return null;
         }
-        LinearLayoutManager layoutManager =
-                (LinearLayoutManager) this.binding.list.getLayoutManager();
-        int position = layoutManager.findFirstVisibleItemPosition();
-        final View view = this.binding.list.getChildAt(0);
-        if (view != null) {
-            return new ScrollState(position, view.getTop());
-        } else {
-            return new ScrollState(position, 0);
+        if (this.binding.list.getLayoutManager()
+                instanceof LinearLayoutManager linearLayoutManager) {
+            final int position = linearLayoutManager.findFirstVisibleItemPosition();
+            final View view = this.binding.list.getChildAt(0);
+            if (view != null) {
+                return new ScrollState(position, view.getTop());
+            } else {
+                return new ScrollState(position, 0);
+            }
         }
+        return null;
     }
 
     @Override
@@ -473,18 +475,22 @@ public class ConversationsOverviewFragment extends XmppFragment {
             }
         }
         this.conversationsAdapter.notifyDataSetChanged();
-        ScrollState scrollState = pendingScrollState.pop();
+        final var scrollState = pendingScrollState.pop();
         if (scrollState != null) {
             setScrollPosition(scrollState);
         }
     }
 
-    private void setScrollPosition(ScrollState scrollPosition) {
-        if (scrollPosition != null) {
-            LinearLayoutManager layoutManager =
-                    (LinearLayoutManager) binding.list.getLayoutManager();
-            layoutManager.scrollToPositionWithOffset(
+    private void setScrollPosition(@NonNull final ScrollState scrollPosition) {
+        if (binding.list.getLayoutManager() instanceof LinearLayoutManager linearLayoutManager) {
+            linearLayoutManager.scrollToPositionWithOffset(
                     scrollPosition.position, scrollPosition.offset);
+            if (scrollPosition.position > 0) {
+                binding.fab.shrink();
+            } else {
+                binding.fab.extend();
+            }
+            binding.fab.clearAnimation();
         }
     }
 }

src/main/java/eu/siacs/conversations/ui/ExtendedFabSizeChanger.java 🔗

@@ -16,11 +16,15 @@ public class ExtendedFabSizeChanger extends RecyclerView.OnScrollListener {
     @Override
     public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
         super.onScrolled(recyclerView, dx, dy);
-        if (RecyclerViews.findFirstVisibleItemPosition(recyclerView) > 0) {
-            extendedFloatingActionButton.shrink();
-        } else {
-            extendedFloatingActionButton.extend();
-        }
+        final var firstVisibleItem = RecyclerViews.findFirstVisibleItemPosition(recyclerView);
+        recyclerView.post(
+                () -> {
+                    if (firstVisibleItem > 0) {
+                        extendedFloatingActionButton.shrink();
+                    } else {
+                        extendedFloatingActionButton.extend();
+                    }
+                });
     }
 
     public static RecyclerView.OnScrollListener of(final ExtendedFloatingActionButton fab) {