diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 6fb5d765b1..2cf881399c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -492,7 +492,6 @@ public class ConversationListFragment extends MainFragment implements Conversati initializeSearchListener(); initializeFilterListener(); - itemAnimator.disable(); SpoilerAnnotation.resetRevealedSpoilers(); if (mainToolbarViewModel.getState().getValue().getMode() != MainToolbarMode.SEARCH && list.getAdapter() != defaultAdapter) { @@ -550,7 +549,6 @@ public class ConversationListFragment extends MainFragment implements Conversati public void onStart() { super.onStart(); AppForegroundObserver.addListener(appForegroundObserver); - itemAnimator.disable(); } @Override @@ -1576,6 +1574,34 @@ public class ConversationListFragment extends MainFragment implements Conversati chatFolderList.getLayoutManager().startSmoothScroll(smoothScroller); } + // Manage change animations so we don't animate the list when switching folders + itemAnimator.disableChangeAnimations(); + defaultAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + defaultAdapter.unregisterAdapterDataObserver(this); + itemAnimator.enableChangeAnimations(); + } + + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + defaultAdapter.unregisterAdapterDataObserver(this); + itemAnimator.enableChangeAnimations(); + } + + @Override + public void onItemRangeChanged(int positionStart, int itemCount) { + defaultAdapter.unregisterAdapterDataObserver(this); + itemAnimator.enableChangeAnimations(); + } + + @Override + public void onItemRangeRemoved(int positionStart, int itemCount) { + defaultAdapter.unregisterAdapterDataObserver(this); + itemAnimator.enableChangeAnimations(); + } + }); + viewModel.select(chatFolder); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator.java index e477fb41f0..13a9fbe40a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator.java @@ -16,9 +16,9 @@ public class ConversationListItemAnimator extends DefaultItemAnimator { private boolean shouldDisable; public ConversationListItemAnimator() { - setSupportsChangeAnimations(false); setMoveDuration(0); setAddDuration(0); + setChangeDuration(ANIMATION_DURATION); } @MainThread @@ -32,6 +32,16 @@ public class ConversationListItemAnimator extends DefaultItemAnimator { setMoveDuration(0); } + @MainThread + public void disableChangeAnimations() { + setChangeDuration(0); + } + + @MainThread + public void enableChangeAnimations() { + setChangeDuration(ANIMATION_DURATION); + } + /** * We need to reasonably ensure that the animation has started before we disable things here, so we add a slight delay.