From ca79bdb16b3e31a7067ca17ef97ab0ab988a3448 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 6 Apr 2022 10:34:06 -0300 Subject: [PATCH] Preserve tab state between configuration changes. --- .../tabs/ConversationListTabsFragment.kt | 23 ++++++++++++++----- .../tabs/ConversationListTabsViewModel.kt | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt index e08eaef165..0c4dbfb62b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt @@ -63,10 +63,12 @@ class ConversationListTabsFragment : Fragment(R.layout.conversation_list_tabs) { viewModel.onStoriesSelected() } - viewModel.state.observe(viewLifecycleOwner, this::update) + update(viewModel.stateSnapshot, true) + + viewModel.state.observe(viewLifecycleOwner) { update(it, false) } } - private fun update(state: ConversationListTabsState) { + private fun update(state: ConversationListTabsState, immediate: Boolean) { val wasChatSelected = chatsIcon.isSelected chatsIcon.isSelected = state.tab == ConversationListTab.CHATS @@ -75,9 +77,18 @@ class ConversationListTabsFragment : Fragment(R.layout.conversation_list_tabs) { chatsPill.isSelected = chatsIcon.isSelected storiesPill.isSelected = storiesIcon.isSelected - if (chatsIcon.isSelected xor wasChatSelected) { + val hasStateChange = chatsIcon.isSelected xor wasChatSelected + if (immediate) { + chatsIcon.pauseAnimation() + storiesIcon.pauseAnimation() + + chatsIcon.progress = if (chatsIcon.isSelected) 1f else 0f + storiesIcon.progress = if (storiesIcon.isSelected) 1f else 0f + + runPillAnimation(0, chatsPill, storiesPill) + } else if (hasStateChange) { runLottieAnimations(chatsIcon, storiesIcon) - runPillAnimation(chatsPill, storiesPill) + runPillAnimation(150, chatsPill, storiesPill) } chatsUnreadIndicator.visible = state.unreadChatsCount > 0 @@ -103,12 +114,12 @@ class ConversationListTabsFragment : Fragment(R.layout.conversation_list_tabs) { } } - private fun runPillAnimation(vararg toAnimate: ImageView) { + private fun runPillAnimation(duration: Long, vararg toAnimate: ImageView) { val (selected, unselected) = toAnimate.partition { it.isSelected } pillAnimator?.cancel() pillAnimator = AnimatorSet().apply { - duration = 150 + this.duration = duration interpolator = PathInterpolatorCompat.create(0.17f, 0.17f, 0f, 1f) playTogether( selected.map { view -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt index edb18d0ebc..2109ce4b74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt @@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.util.livedata.Store class ConversationListTabsViewModel(repository: ConversationListTabRepository) : ViewModel() { private val store = Store(ConversationListTabsState()) + val stateSnapshot: ConversationListTabsState = store.state val state: LiveData = store.stateLiveData val disposables = CompositeDisposable()