Remove ConversationListTabs enum.

This commit is contained in:
Alex Hart
2025-03-31 10:10:23 -03:00
committed by Greyson Parrelli
parent 0b315220ee
commit eb190f5f00
10 changed files with 43 additions and 49 deletions

View File

@@ -38,11 +38,11 @@ import org.thoughtcrime.securesms.conversationlist.RestoreCompleteBottomSheetDia
import org.thoughtcrime.securesms.devicetransfer.olddevice.OldDeviceExitActivity
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.main.MainActivityListHostFragment
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.main.MainNavigationDetailLocation
import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor
import org.thoughtcrime.securesms.notifications.VitalsViewModel
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabRepository
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsFragment
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel
@@ -68,7 +68,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
@JvmStatic
fun clearTopAndOpenTab(context: Context, startingTab: ConversationListTab): Intent {
fun clearTopAndOpenTab(context: Context, startingTab: MainNavigationDestination): Intent {
return clearTop(context).putExtra(KEY_STARTING_TAB, startingTab)
}
}
@@ -83,8 +83,8 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
get() = mediaController
private val conversationListTabsViewModel: ConversationListTabsViewModel by viewModel {
val startingTab = intent.extras?.getSerializableCompat(KEY_STARTING_TAB, ConversationListTab::class.java)
ConversationListTabsViewModel(startingTab ?: ConversationListTab.CHATS, ConversationListTabRepository())
val startingTab = intent.extras?.getSerializableCompat(KEY_STARTING_TAB, MainNavigationDestination::class.java)
ConversationListTabsViewModel(startingTab ?: MainNavigationDestination.CHATS, ConversationListTabRepository())
}
private val vitalsViewModel: VitalsViewModel by viewModel {
@@ -165,12 +165,12 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
handleDeepLinkIntent(intent)
val extras = intent.extras ?: return
val startingTab = extras.getSerializableCompat(KEY_STARTING_TAB, ConversationListTab::class.java)
val startingTab = extras.getSerializableCompat(KEY_STARTING_TAB, MainNavigationDestination::class.java)
when (startingTab) {
ConversationListTab.CHATS -> conversationListTabsViewModel.onChatsSelected()
ConversationListTab.CALLS -> conversationListTabsViewModel.onCallsSelected()
ConversationListTab.STORIES -> {
MainNavigationDestination.CHATS -> conversationListTabsViewModel.onChatsSelected()
MainNavigationDestination.CALLS -> conversationListTabsViewModel.onCallsSelected()
MainNavigationDestination.STORIES -> {
if (Stories.isFeatureEnabled()) {
conversationListTabsViewModel.onStoriesSelected()
}

View File

@@ -50,11 +50,11 @@ import org.thoughtcrime.securesms.conversationlist.chatfilter.FilterLerp
import org.thoughtcrime.securesms.conversationlist.chatfilter.FilterPullState
import org.thoughtcrime.securesms.databinding.CallLogFragmentBinding
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.main.MainToolbarMode
import org.thoughtcrime.securesms.main.MainToolbarViewModel
import org.thoughtcrime.securesms.main.Material3OnScrollHelperBinder
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel
import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.ViewUtil
@@ -226,7 +226,7 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal
private fun initializeTapToScrollToTop(scrollToPositionDelegate: ScrollToPositionDelegate) {
disposables += tabsViewModel.tabClickEvents
.filter { it == ConversationListTab.CALLS }
.filter { it == MainNavigationDestination.CALLS }
.subscribeBy(onNext = {
scrollToPositionDelegate.resetScrollPosition()
})

View File

@@ -254,6 +254,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.linkpreview.LinkPreview
import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModelV2
import org.thoughtcrime.securesms.longmessage.LongMessageFragment
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity
import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory
import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity
@@ -300,7 +301,6 @@ import org.thoughtcrime.securesms.stickers.StickerManagementActivity
import org.thoughtcrime.securesms.stickers.StickerPackInstallEvent
import org.thoughtcrime.securesms.stickers.StickerPackPreviewActivity
import org.thoughtcrime.securesms.stories.StoryViewerArgs
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab
import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity
import org.thoughtcrime.securesms.util.BottomSheetUtil
import org.thoughtcrime.securesms.util.BubbleUtil
@@ -3031,7 +3031,7 @@ class ConversationFragment :
} else if ("username_edit" == action) {
startActivity(EditProfileActivity.getIntentForUsernameEdit(requireContext()))
} else if ("calls_tab" == action) {
startActivity(MainActivity.clearTopAndOpenTab(requireContext(), ConversationListTab.CALLS))
startActivity(MainActivity.clearTopAndOpenTab(requireContext(), MainNavigationDestination.CALLS))
} else if ("chat_folder" == action) {
startActivity(AppSettingsActivity.chatFolders(requireContext()))
}

View File

@@ -143,6 +143,7 @@ import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob;
import org.thoughtcrime.securesms.keyvalue.AccountValues;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.lock.v2.CreateSvrPinActivity;
import org.thoughtcrime.securesms.main.MainNavigationDestination;
import org.thoughtcrime.securesms.main.MainToolbarMode;
import org.thoughtcrime.securesms.main.MainToolbarViewModel;
import org.thoughtcrime.securesms.main.Material3OnScrollHelperBinder;
@@ -161,7 +162,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.search.MessageResult;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab;
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel;
import org.thoughtcrime.securesms.util.AppForegroundObserver;
import org.thoughtcrime.securesms.util.AppStartup;
@@ -446,7 +446,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
conversationListTabsViewModel = new ViewModelProvider(requireActivity()).get(ConversationListTabsViewModel.class);
lifecycleDisposable.bindTo(getViewLifecycleOwner());
lifecycleDisposable.add(conversationListTabsViewModel.getTabClickEvents().filter(tab -> tab == ConversationListTab.CHATS)
lifecycleDisposable.add(conversationListTabsViewModel.getTabClickEvents().filter(tab -> tab == MainNavigationDestination.CHATS)
.subscribe(unused -> {
LinearLayoutManager layoutManager = (LinearLayoutManager) list.getLayoutManager();
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();

View File

@@ -38,7 +38,6 @@ import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfiles
import org.thoughtcrime.securesms.service.KeyCachingService
import org.thoughtcrime.securesms.stories.settings.StorySettingsActivity
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsState
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel
import org.thoughtcrime.securesms.util.BottomSheetUtil
@@ -190,7 +189,7 @@ class MainActivityListHostFragment : Fragment(R.layout.main_activity_list_host_f
}
private fun goToStateFromConversationList(state: ConversationListTabsState, navController: NavController) {
if (state.tab == ConversationListTab.CHATS) {
if (state.tab == MainNavigationDestination.CHATS) {
return
} else {
val cameraFab = requireView().findViewById<View?>(R.id.camera_fab)
@@ -210,7 +209,7 @@ class MainActivityListHostFragment : Fragment(R.layout.main_activity_list_host_f
else -> null
}
val destination = if (state.tab == ConversationListTab.STORIES) {
val destination = if (state.tab == MainNavigationDestination.STORIES) {
R.id.action_conversationListFragment_to_storiesLandingFragment
} else {
R.id.action_conversationListFragment_to_callLogFragment
@@ -227,17 +226,17 @@ class MainActivityListHostFragment : Fragment(R.layout.main_activity_list_host_f
private fun goToStateFromCalling(state: ConversationListTabsState, navController: NavController) {
when (state.tab) {
ConversationListTab.CALLS -> return
ConversationListTab.CHATS -> navController.popBackStack(R.id.conversationListFragment, false)
ConversationListTab.STORIES -> navController.navigate(R.id.action_callLogFragment_to_storiesLandingFragment)
MainNavigationDestination.CALLS -> return
MainNavigationDestination.CHATS -> navController.popBackStack(R.id.conversationListFragment, false)
MainNavigationDestination.STORIES -> navController.navigate(R.id.action_callLogFragment_to_storiesLandingFragment)
}
}
private fun goToStateFromStories(state: ConversationListTabsState, navController: NavController) {
when (state.tab) {
ConversationListTab.STORIES -> return
ConversationListTab.CHATS -> navController.popBackStack(R.id.conversationListFragment, false)
ConversationListTab.CALLS -> navController.navigate(R.id.action_storiesLandingFragment_to_callLogFragment)
MainNavigationDestination.STORIES -> return
MainNavigationDestination.CHATS -> navController.popBackStack(R.id.conversationListFragment, false)
MainNavigationDestination.CALLS -> navController.navigate(R.id.action_storiesLandingFragment_to_callLogFragment)
}
}

View File

@@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectFor
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.database.model.StoryViewState
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.main.MainToolbarMode
import org.thoughtcrime.securesms.main.MainToolbarViewModel
import org.thoughtcrime.securesms.main.Material3OnScrollHelperBinder
@@ -51,7 +52,6 @@ import org.thoughtcrime.securesms.stories.StoryViewerArgs
import org.thoughtcrime.securesms.stories.dialogs.StoryContextMenu
import org.thoughtcrime.securesms.stories.dialogs.StoryDialogs
import org.thoughtcrime.securesms.stories.my.MyStoriesActivity
import org.thoughtcrime.securesms.stories.tabs.ConversationListTab
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel
import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity
import org.thoughtcrime.securesms.util.ViewUtil
@@ -213,7 +213,7 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l
)
lifecycleDisposable += tabsViewModel.tabClickEvents
.filter { it == ConversationListTab.STORIES }
.filter { it == MainNavigationDestination.STORIES }
.subscribeBy(onNext = {
val layoutManager = recyclerView?.layoutManager as? LinearLayoutManager ?: return@subscribeBy
if (layoutManager.findFirstVisibleItemPosition() <= LIST_SMOOTH_SCROLL_TO_TOP_THRESHOLD) {

View File

@@ -1,7 +0,0 @@
package org.thoughtcrime.securesms.stories.tabs
enum class ConversationListTab {
CHATS,
CALLS,
STORIES
}

View File

@@ -31,9 +31,9 @@ class ConversationListTabsFragment : ComposeFragment() {
storiesCount = state.unreadStoriesCount.toInt(),
storyFailure = state.hasFailedStory,
selectedDestination = when (state.tab) {
ConversationListTab.CHATS -> MainNavigationDestination.CHATS
ConversationListTab.CALLS -> MainNavigationDestination.CALLS
ConversationListTab.STORIES -> MainNavigationDestination.STORIES
MainNavigationDestination.CHATS -> MainNavigationDestination.CHATS
MainNavigationDestination.CALLS -> MainNavigationDestination.CALLS
MainNavigationDestination.STORIES -> MainNavigationDestination.STORIES
},
compact = state.compact
)

View File

@@ -1,10 +1,11 @@
package org.thoughtcrime.securesms.stories.tabs
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.main.MainNavigationDestination
data class ConversationListTabsState(
val tab: ConversationListTab = ConversationListTab.CHATS,
val prevTab: ConversationListTab = if (tab == ConversationListTab.CHATS) ConversationListTab.STORIES else ConversationListTab.CHATS,
val tab: MainNavigationDestination = MainNavigationDestination.CHATS,
val prevTab: MainNavigationDestination = if (tab == MainNavigationDestination.CHATS) MainNavigationDestination.STORIES else MainNavigationDestination.CHATS,
val unreadMessagesCount: Long = 0L,
val unreadCallsCount: Long = 0L,
val unreadStoriesCount: Long = 0L,

View File

@@ -12,11 +12,12 @@ import io.reactivex.rxjava3.subjects.PublishSubject
import io.reactivex.rxjava3.subjects.Subject
import org.thoughtcrime.securesms.components.settings.app.notifications.profiles.NotificationProfilesRepository
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.util.rx.RxStore
class ConversationListTabsViewModel(startingTab: ConversationListTab, repository: ConversationListTabRepository) : ViewModel() {
class ConversationListTabsViewModel(startingTab: MainNavigationDestination, repository: ConversationListTabRepository) : ViewModel() {
private val notificationProfilesRepository: NotificationProfilesRepository = NotificationProfilesRepository()
@@ -28,8 +29,8 @@ class ConversationListTabsViewModel(startingTab: ConversationListTab, repository
val state: Flowable<ConversationListTabsState> = store.stateFlowable.distinctUntilChanged().observeOn(AndroidSchedulers.mainThread())
val disposables = CompositeDisposable()
private val internalTabClickEvents: Subject<ConversationListTab> = PublishSubject.create()
val tabClickEvents: Observable<ConversationListTab> = internalTabClickEvents.filter { Stories.isFeatureEnabled() }
private val internalTabClickEvents: Subject<MainNavigationDestination> = PublishSubject.create()
val tabClickEvents: Observable<MainNavigationDestination> = internalTabClickEvents.filter { Stories.isFeatureEnabled() }
init {
disposables += performStoreUpdate(repository.getNumberOfUnreadMessages()) { unreadChats, state ->
@@ -63,18 +64,18 @@ class ConversationListTabsViewModel(startingTab: ConversationListTab, repository
}
fun onChatsSelected() {
internalTabClickEvents.onNext(ConversationListTab.CHATS)
performStoreUpdate { it.copy(tab = ConversationListTab.CHATS) }
internalTabClickEvents.onNext(MainNavigationDestination.CHATS)
performStoreUpdate { it.copy(tab = MainNavigationDestination.CHATS) }
}
fun onCallsSelected() {
internalTabClickEvents.onNext(ConversationListTab.CALLS)
performStoreUpdate { it.copy(tab = ConversationListTab.CALLS) }
internalTabClickEvents.onNext(MainNavigationDestination.CALLS)
performStoreUpdate { it.copy(tab = MainNavigationDestination.CALLS) }
}
fun onStoriesSelected() {
internalTabClickEvents.onNext(ConversationListTab.STORIES)
performStoreUpdate { it.copy(tab = ConversationListTab.STORIES) }
internalTabClickEvents.onNext(MainNavigationDestination.STORIES)
performStoreUpdate { it.copy(tab = MainNavigationDestination.STORIES) }
}
fun onSearchOpened() {
@@ -113,10 +114,10 @@ class ConversationListTabsViewModel(startingTab: ConversationListTab, repository
}
}
class Factory(private val startingTab: ConversationListTab?, private val repository: ConversationListTabRepository) : ViewModelProvider.Factory {
class Factory(private val startingTab: MainNavigationDestination?, private val repository: ConversationListTabRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val tab = if (startingTab == null || (startingTab == ConversationListTab.STORIES && !Stories.isFeatureEnabled())) {
ConversationListTab.CHATS
val tab = if (startingTab == null || (startingTab == MainNavigationDestination.STORIES && !Stories.isFeatureEnabled())) {
MainNavigationDestination.CHATS
} else {
startingTab
}