Remove ConversationTabs* and migrate to MainActivity.

This commit is contained in:
Alex Hart
2025-04-14 14:28:26 -03:00
committed by Cody Henthorne
parent 462fcdce16
commit 54191433e0
18 changed files with 276 additions and 458 deletions

View File

@@ -84,8 +84,10 @@ import org.thoughtcrime.securesms.main.MainBottomChrome
import org.thoughtcrime.securesms.main.MainBottomChromeCallback
import org.thoughtcrime.securesms.main.MainBottomChromeState
import org.thoughtcrime.securesms.main.MainMegaphoneState
import org.thoughtcrime.securesms.main.MainNavigationDestination
import org.thoughtcrime.securesms.main.MainNavigationBar
import org.thoughtcrime.securesms.main.MainNavigationDetailLocation
import org.thoughtcrime.securesms.main.MainNavigationListLocation
import org.thoughtcrime.securesms.main.MainNavigationRail
import org.thoughtcrime.securesms.main.MainNavigationViewModel
import org.thoughtcrime.securesms.main.MainToolbar
import org.thoughtcrime.securesms.main.MainToolbarCallback
@@ -104,9 +106,6 @@ import org.thoughtcrime.securesms.profiles.manage.UsernameEditFragment
import org.thoughtcrime.securesms.service.KeyCachingService
import org.thoughtcrime.securesms.stories.Stories
import org.thoughtcrime.securesms.stories.settings.StorySettingsActivity
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabRepository
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsFragment
import org.thoughtcrime.securesms.stories.tabs.ConversationListTabsViewModel
import org.thoughtcrime.securesms.util.AppForegroundObserver
import org.thoughtcrime.securesms.util.AppStartup
import org.thoughtcrime.securesms.util.CachedInflater
@@ -131,23 +130,23 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
@JvmStatic
fun clearTopAndOpenTab(context: Context, startingTab: MainNavigationDestination): Intent {
fun clearTopAndOpenTab(context: Context, startingTab: MainNavigationListLocation): Intent {
return clearTop(context).putExtra(KEY_STARTING_TAB, startingTab)
}
}
private val dynamicTheme = DynamicNoActionBarTheme()
private val navigator = MainNavigator(this)
private val lifecycleDisposable = LifecycleDisposable()
private lateinit var mediaController: VoiceNoteMediaController
private lateinit var navigator: MainNavigator
override val voiceNoteMediaController: VoiceNoteMediaController
get() = mediaController
private val conversationListTabsViewModel: ConversationListTabsViewModel by viewModel {
val startingTab = intent.extras?.getSerializableCompat(KEY_STARTING_TAB, MainNavigationDestination::class.java)
ConversationListTabsViewModel(startingTab ?: MainNavigationDestination.CHATS, ConversationListTabRepository())
private val mainNavigationViewModel: MainNavigationViewModel by viewModel {
val startingTab = intent.extras?.getSerializableCompat(KEY_STARTING_TAB, MainNavigationListLocation::class.java)
MainNavigationViewModel(startingTab ?: MainNavigationListLocation.CHATS)
}
private val vitalsViewModel: VitalsViewModel by viewModel {
@@ -169,6 +168,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
private val mainBottomChromeCallback = BottomChromeCallback()
private val megaphoneActionController = MainMegaphoneActionController()
private val mainNavigationCallback = MainNavigationCallback()
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
return motionEventRelay.offer(ev) || super.dispatchTouchEvent(ev)
@@ -186,20 +186,21 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
)
conversationListTabsViewModel
super.onCreate(savedInstanceState, ready)
navigator = MainNavigator(this, mainNavigationViewModel)
AppForegroundObserver.addListener(object : AppForegroundObserver.Listener {
override fun onForeground() {
navigator.viewModel.getNextMegaphone()
mainNavigationViewModel.getNextMegaphone()
}
})
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
navigator.viewModel.navigationEvents.collectLatest {
mainNavigationViewModel.navigationEvents.collectLatest {
when (it) {
MainNavigationViewModel.NavigationEvent.STORY_CAMERA_FIRST -> {
mainBottomChromeCallback.onCameraClick(MainNavigationDestination.STORIES)
mainBottomChromeCallback.onCameraClick(MainNavigationListLocation.STORIES)
}
}
}
@@ -207,12 +208,16 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
setContent {
val navState = rememberFragmentState()
val listHostState = rememberFragmentState()
val detailLocation by navigator.viewModel.detailLocation.collectAsStateWithLifecycle(MainNavigationDetailLocation.Empty)
val snackbar by navigator.viewModel.snackbar.collectAsStateWithLifecycle()
val detailLocation by mainNavigationViewModel.detailLocation.collectAsStateWithLifecycle(MainNavigationDetailLocation.Empty)
val snackbar by mainNavigationViewModel.snackbar.collectAsStateWithLifecycle()
val mainToolbarState by toolbarViewModel.state.collectAsStateWithLifecycle()
val megaphone by navigator.viewModel.megaphone.collectAsStateWithLifecycle()
val megaphone by mainNavigationViewModel.megaphone.collectAsStateWithLifecycle()
val mainNavigationState by mainNavigationViewModel.mainNavigationState.collectAsStateWithLifecycle()
val isNavigationVisible = remember(mainToolbarState.mode) {
mainToolbarState.mode == MainToolbarMode.FULL
}
val mainBottomChromeState = remember(mainToolbarState.destination, snackbar, mainToolbarState.mode, megaphone) {
MainBottomChromeState(
@@ -251,16 +256,20 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
AppScaffold(
navigator = scaffoldNavigator,
bottomNavContent = {
AndroidFragment(
clazz = ConversationListTabsFragment::class.java,
fragmentState = navState
)
if (isNavigationVisible) {
MainNavigationBar(
state = mainNavigationState,
onDestinationSelected = mainNavigationCallback
)
}
},
navRailContent = {
AndroidFragment(
clazz = ConversationListTabsFragment::class.java,
fragmentState = navState
)
if (isNavigationVisible) {
MainNavigationRail(
state = mainNavigationState,
onDestinationSelected = mainNavigationCallback
)
}
},
listContent = {
val listContainerColor = if (windowSizeClass.isMedium()) {
@@ -376,14 +385,14 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
handleDeepLinkIntent(intent)
val extras = intent.extras ?: return
val startingTab = extras.getSerializableCompat(KEY_STARTING_TAB, MainNavigationDestination::class.java)
val startingTab = extras.getSerializableCompat(KEY_STARTING_TAB, MainNavigationListLocation::class.java)
when (startingTab) {
MainNavigationDestination.CHATS -> conversationListTabsViewModel.onChatsSelected()
MainNavigationDestination.CALLS -> conversationListTabsViewModel.onCallsSelected()
MainNavigationDestination.STORIES -> {
MainNavigationListLocation.CHATS -> mainNavigationViewModel.onChatsSelected()
MainNavigationListLocation.CALLS -> mainNavigationViewModel.onCallsSelected()
MainNavigationListLocation.STORIES -> {
if (Stories.isFeatureEnabled()) {
conversationListTabsViewModel.onStoriesSelected()
mainNavigationViewModel.onStoriesSelected()
}
}
@@ -422,6 +431,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
vitalsViewModel.checkSlowNotificationHeuristics()
mainNavigationViewModel.refreshNavigationBarState()
}
override fun onStop() {
@@ -440,13 +450,13 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
if (resultCode == RESULT_OK && requestCode == CreateSvrPinActivity.REQUEST_NEW_PIN) {
getNavigator().getViewModel().setSnackbar(SnackbarState(message = getString(R.string.ConfirmKbsPinFragment__pin_created)))
getNavigator().getViewModel().onMegaphoneCompleted(Megaphones.Event.PINS_FOR_ALL)
mainNavigationViewModel.setSnackbar(SnackbarState(message = getString(R.string.ConfirmKbsPinFragment__pin_created)))
mainNavigationViewModel.onMegaphoneCompleted(Megaphones.Event.PINS_FOR_ALL)
}
if (resultCode == RESULT_OK && requestCode == UsernameEditFragment.REQUEST_CODE) {
val snackbarString = getString(R.string.ConversationListFragment_username_recovered_toast, SignalStore.account.username)
getNavigator().getViewModel().setSnackbar(
mainNavigationViewModel.setSnackbar(
SnackbarState(
message = snackbarString
)
@@ -605,12 +615,12 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
startActivity(NewCallActivity.createIntent(this@MainActivity))
}
override fun onCameraClick(destination: MainNavigationDestination) {
override fun onCameraClick(destination: MainNavigationListLocation) {
val onGranted = {
startActivity(
MediaSelectionActivity.camera(
context = this@MainActivity,
isStory = destination == MainNavigationDestination.STORIES
isStory = destination == MainNavigationListLocation.STORIES
)
)
}
@@ -636,11 +646,11 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
override fun onMegaphoneVisible(megaphone: Megaphone) {
navigator.viewModel.onMegaphoneVisible(megaphone)
mainNavigationViewModel.onMegaphoneVisible(megaphone)
}
override fun onSnackbarDismissed() {
navigator.viewModel.setSnackbar(null)
mainNavigationViewModel.setSnackbar(null)
}
}
@@ -654,7 +664,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
override fun onMegaphoneToastRequested(string: String) {
getNavigator().viewModel.setSnackbar(
mainNavigationViewModel.setSnackbar(
SnackbarState(
message = string
)
@@ -666,15 +676,25 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner
}
override fun onMegaphoneSnooze(event: Megaphones.Event) {
getNavigator().viewModel.onMegaphoneSnoozed(event)
mainNavigationViewModel.onMegaphoneSnoozed(event)
}
override fun onMegaphoneCompleted(event: Megaphones.Event) {
getNavigator().viewModel.onMegaphoneCompleted(event)
mainNavigationViewModel.onMegaphoneCompleted(event)
}
override fun onMegaphoneDialogFragmentRequested(dialogFragment: DialogFragment) {
dialogFragment.show(supportFragmentManager, "megaphone_dialog")
}
}
private inner class MainNavigationCallback : (MainNavigationListLocation) -> Unit {
override fun invoke(location: MainNavigationListLocation) {
when (location) {
MainNavigationListLocation.CHATS -> mainNavigationViewModel.onChatsSelected()
MainNavigationListLocation.CALLS -> mainNavigationViewModel.onCallsSelected()
MainNavigationListLocation.STORIES -> mainNavigationViewModel.onStoriesSelected()
}
}
}
}