Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import com.wire.android.ui.home.appLock.AppLockNavigation3Actions
import com.wire.android.ui.home.appLock.AppLockNavigation3Contribution
import com.wire.android.ui.home.conversations.ConversationAuxNavigation3Actions
import com.wire.android.ui.home.conversations.ConversationAuxNavigation3Contribution
import com.wire.android.ui.home.conversations.ConversationNavigation3Actions
import com.wire.android.ui.home.conversations.ConversationEntryNavigation3Actions
import com.wire.android.ui.home.conversations.ConversationNavigation3Contribution
import com.wire.android.ui.home.conversations.details.ConversationDetailsNavigation3Actions
import com.wire.android.ui.home.conversations.details.ConversationDetailsNavigation3Contribution
Expand All @@ -50,9 +50,9 @@ import com.wire.android.ui.userprofile.teammigration.TeamMigrationNavigation3Con
/**
* The one host boundary required by every currently migrated Navigation 3 contribution.
*
* [HomeNavigation3Actions] deliberately exposes its existing nested callback bundles for the
* Conversations and Cells top-level content. Its top-level and settings interfaces, however, are
* this same host contract, avoiding a second action implementation with subtly different state.
* [HomeNavigation3Actions] exposes one aggregate of feature-owned top-level contracts. This
* composite supplies entry-coupled host interfaces directly. Framework-neutral Home-root action
* bundles remain explicit properties implemented once by the production host.
*/
internal interface WireNavigation3CompositeActions :
AuthenticationNavigation3Actions,
Expand All @@ -63,7 +63,7 @@ internal interface WireNavigation3CompositeActions :
DeviceE2EINavigation3Actions,
UserProfileNavigation3Actions,
TeamMigrationNavigation3Actions,
ConversationNavigation3Actions,
ConversationEntryNavigation3Actions,
ConversationAuxNavigation3Actions,
ConversationDetailsNavigation3Actions,
MediaNavigation3Actions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.wire.android.feature.cells.navigation.ConversationFilesRoute
import com.wire.android.feature.cells.navigation.PublicLinkRoute
import com.wire.android.feature.cells.navigation.SearchRoute
import com.wire.android.feature.cells.navigation.VideoPlayerRoute
import com.wire.android.feature.meetings.ui.MeetingsHomeNavigationActions
import com.wire.android.feature.meetings.ui.create.MeetingParticipantId
import com.wire.android.feature.meetings.ui.create.NewMeetingDetailsRoute
import com.wire.android.navigation.LoginTypeSelector
Expand Down Expand Up @@ -60,13 +61,14 @@ import com.wire.android.ui.home.conversations.AddMembersSearchRoute
import com.wire.android.ui.home.conversations.toNavigation3
import com.wire.android.ui.home.conversations.details.ConversationDetailsId
import com.wire.android.ui.home.conversations.details.participants.model.UIParticipant
import com.wire.android.ui.home.conversationslist.ConversationsNavigationActions
import com.wire.android.ui.home.conversationslist.ConversationListNavigationActions
import com.wire.android.ui.home.newconversation.NewConversationSearchPeopleRoute
import com.wire.android.ui.home.settings.AboutThisAppRoute
import com.wire.android.ui.home.settings.AppSettingsRoute
import com.wire.android.ui.home.settings.MyAccountRoute
import com.wire.android.ui.home.settings.SettingsNavigation3Destination
import com.wire.android.ui.home.whatsnew.WhatsNewNavigation3Target
import com.wire.android.ui.home.whatsnew.WhatsNewNavigationActions
import com.wire.android.ui.home.whatsnew.WhatsNewNavigationTarget
import com.wire.android.ui.settings.devices.DeviceDetailsRoute
import com.wire.android.ui.settings.devices.DeviceTargetUserId
import com.wire.android.ui.settings.devices.SelfDevicesRoute
Expand All @@ -80,7 +82,6 @@ import com.wire.android.ui.userprofile.self.SelfUserProfileRoute
import com.wire.android.ui.userprofile.service.ServiceDetailsRoute
import com.wire.android.ui.userprofile.service.ServiceProfileTarget
import com.wire.android.ui.userprofile.teammigration.TeamMigrationTeamPlanRoute
import com.wire.android.feature.meetings.ui.create.NewMeetingType
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.id.QualifiedID
Expand Down Expand Up @@ -196,10 +197,10 @@ internal class WireNavigation3ProductionActions(
)
},
)
override val conversations: ConversationsNavigationActions = ConversationsNavigationActions(
override val conversationList: ConversationListNavigationActions = ConversationListNavigationActions(
openConversation = { openConversation(it.toProfileId()) },
openUserProfile = { openUserProfile(it.value, it.domain) },
startConversation = ::openNewConversation,
startConversation = { navigate(NewConversationSearchPeopleRoute.start(requireSession())) },
browseChannels = { navigate(BrowseChannelsRoute(requireSession())) },
openConversationFolders = {},
promoteAdmin = { args ->
Expand All @@ -213,6 +214,23 @@ internal class WireNavigation3ProductionActions(
},
openDebugMenu = { navigate(DebugConversationRoute(requireSession(), it.conversationId.toAuxId())) },
)
override val meetings: MeetingsHomeNavigationActions = MeetingsHomeNavigationActions(
openNewMeeting = { type ->
navigate(NewMeetingDetailsRoute.start(requireSession(), type))
},
)
override val whatsNew: WhatsNewNavigationActions = WhatsNewNavigationActions(
openWhatsNew = { target ->
when (target) {
WhatsNewNavigationTarget.Welcome ->
activity.openIntent(WireNavigation3ExternalIntent.WELCOME_ANDROID)
WhatsNewNavigationTarget.AllAndroidReleaseNotes ->
activity.openIntent(WireNavigation3ExternalIntent.ANDROID_RELEASE_NOTES)
is WhatsNewNavigationTarget.ExternalReleaseNote ->
activity.openUrl(target.url)
}
},
)

override fun canUseNewLogin() = loginTypeSelector.canUseNewLogin()
override fun exitAuthentication() = activity.finish()
Expand All @@ -223,9 +241,6 @@ internal class WireNavigation3ProductionActions(
override fun onRequirement(requirement: HomeRequirement) =
authenticationRouter.homeRequirement(requirement, currentSessionId()).let { Unit }

override fun openNewConversation() =
navigate(NewConversationSearchPeopleRoute.start(requireSession()))

override fun openSelfProfile() = navigate(SelfUserProfileRoute(requireSession()))

override fun openExternal(destination: HomeExternalDestination) =
Expand All @@ -236,18 +251,6 @@ internal class WireNavigation3ProductionActions(
}
)

override fun openWhatsNew(target: WhatsNewNavigation3Target) =
when (target) {
WhatsNewNavigation3Target.Welcome ->
activity.openIntent(WireNavigation3ExternalIntent.WELCOME_ANDROID)
WhatsNewNavigation3Target.AllAndroidReleaseNotes ->
activity.openIntent(WireNavigation3ExternalIntent.ANDROID_RELEASE_NOTES)
is WhatsNewNavigation3Target.ExternalReleaseNote ->
activity.openUrl(target.url)
}
override fun openNewMeeting(type: NewMeetingType) =
navigate(NewMeetingDetailsRoute.start(requireSession(), type))

override fun exitFlow() = activity.finish()
override fun openUserProfile(userIdValue: String, userIdDomain: String) =
navigate(OtherUserProfileRoute(requireSession(), UserProfileQualifiedId(userIdValue, userIdDomain)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ import com.wire.android.ui.home.conversations.ConversationRouteId
import com.wire.android.ui.home.drawer.HomeDrawerViewModel
import com.wire.android.ui.home.conversations.PermissionPermanentlyDeniedDialogState
import com.wire.android.ui.home.conversationslist.filter.toTopBarTitle
import com.wire.android.ui.home.conversationslist.ConversationsNavigationActions
import com.wire.android.ui.home.conversationslist.all.AllConversationsContent
import com.wire.android.ui.analyticsUsageViewModel
import com.wire.android.util.ui.LazyListStateProvider
Expand Down Expand Up @@ -146,14 +145,13 @@ internal fun HomeTopLevelDestination.backDestination(): HomeTopLevelDestination?
* The typed boundary between the Home shell and children that are migrated independently.
*
* No generated direction or NavController crosses this API. A child can therefore move to a typed
* route without changing the drawer/top-bar owner.
* route without changing the drawer/top-bar owner. Home-owned shell and chrome actions stay here;
* child-specific navigation is available only through [topLevel].
*/
internal interface HomeNavigation3Actions {
val conversations: ConversationsNavigationActions
val topLevel: HomeTopLevelNavigation3Actions

fun onRequirement(requirement: HomeRequirement)
fun openNewConversation()
fun openSelfProfile()
fun openExternal(destination: HomeExternalDestination)
}
Expand Down Expand Up @@ -282,8 +280,10 @@ private fun HomeNavigation3Entry(
}
}

val conversationsNavigationActions = remember(route.sessionId, runtime, actions.conversations) {
actions.conversations.copy(
val baseTopLevelActions = actions.topLevel
val baseConversationListActions = baseTopLevelActions.conversationList
val conversationListNavigationActions = remember(route.sessionId, runtime, baseConversationListActions) {
baseConversationListActions.copy(
openConversation = { conversationId ->
val requestId = runtime.navigateForResult(
destination = ConversationRoute(
Expand All @@ -293,7 +293,7 @@ private fun HomeNavigation3Entry(
resultType = ConversationCompletionNavigation3ResultType,
)
if (requestId == null) {
actions.conversations.openConversation(conversationId)
baseConversationListActions.openConversation(conversationId)
} else {
conversationRequestIdValue = requestId.value
}
Expand All @@ -307,7 +307,7 @@ private fun HomeNavigation3Entry(
resultType = ConnectionRequestIgnoredNavigation3ResultType,
)
if (requestId == null) {
actions.conversations.openUserProfile(userId)
baseConversationListActions.openUserProfile(userId)
} else {
userProfileRequestIdValue = requestId.value
}
Expand All @@ -328,6 +328,11 @@ private fun HomeNavigation3Entry(
},
)
}
val topLevelActions = remember(baseTopLevelActions, conversationListNavigationActions) {
object : HomeTopLevelNavigation3Actions by baseTopLevelActions {
override val conversationList = conversationListNavigationActions
}
}

if (analyticsUsageViewModel.state.shouldDisplayDialog) {
AnalyticsUsageDialog(
Expand All @@ -340,7 +345,7 @@ private fun HomeNavigation3Entry(
homeState = homeViewModel.homeState,
homeDrawerState = homeDrawerViewModel.drawerState,
homeStateHolder = shellState,
onNewConversationClick = actions::openNewConversation,
onNewConversationClick = topLevelActions.conversationList.startConversation,
onSelfUserClick = actions::openSelfProfile,
onNavigateToHomeItem = { item ->
when (val target = item.toNavigation3Target()) {
Expand All @@ -352,16 +357,15 @@ private fun HomeNavigation3Entry(
when (shellState.selectedDestination) {
HomeTopLevelDestination.CONVERSATIONS -> AllConversationsContent(
homeShellState = shellState,
navigationActions = conversationsNavigationActions,
navigationActions = topLevelActions.conversationList,
)

else -> HomeNavigation3TopLevelContent(
destination = shellState.selectedDestination,
shellState = shellState,
sessionId = route.sessionId,
runtime = runtime,
actions = actions.topLevel,
conversationsNavigationActions = conversationsNavigationActions,
actions = topLevelActions,
)
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,40 +25,34 @@ import com.wire.android.feature.cells.ui.AllFilesNavigationActions
import com.wire.android.feature.cells.ui.CellFilesNavArgs
import com.wire.android.feature.cells.ui.CellViewModel
import com.wire.android.feature.cells.ui.cellViewModel
import com.wire.android.feature.meetings.ui.create.NewMeetingType
import com.wire.android.feature.meetings.ui.MeetingsHomeNavigationActions
import com.wire.android.navigation.HomeDestination
import com.wire.android.navigation.navigation3.WireNavigation3Runtime
import com.wire.android.ui.home.archive.ArchiveScreen
import com.wire.android.ui.home.cell.GlobalCellsScreen
import com.wire.android.ui.home.conversationslist.ConversationsNavigationActions
import com.wire.android.ui.home.conversationslist.ConversationListNavigationActions
import com.wire.android.ui.home.meetings.MeetingsScreen
import com.wire.android.ui.home.settings.SettingsNavigation3Actions
import com.wire.android.ui.home.settings.SettingsNavigation3Root
import com.wire.android.ui.home.vault.VaultScreen
import com.wire.android.ui.home.whatsnew.WhatsNewNavigation3Target
import com.wire.android.ui.home.whatsnew.WhatsNewNavigationActions
import com.wire.android.ui.home.whatsnew.WhatsNewScreen
import com.wire.navigation.WireSessionId

/**
* Cross-batch actions emitted by Home top-level children.
* Single composition contract for navigation emitted by Home top-level children.
*
* Generated directions and a Nav2 controller are intentionally excluded. The production host can
* map these actions to typed feature routes as each owning batch lands.
* Each interactive child exposes one feature-owned semantic contract as a property here. Do not
* add feature-specific flat functions to this aggregate. Children without navigation actions need
* no property, while roots sharing the same action surface reuse one contract (Archive reuses
* Conversations).
*/
internal interface HomeTopLevelNavigation3Actions {
val conversationList: ConversationListNavigationActions
val settings: SettingsNavigation3Actions

/**
* Temporary semantic boundary for Cells details whose typed contracts are owned by the Cells
* migration: Search, Public Link, Add/Remove Tags, Image Viewer and Video Player.
*/
val cells: AllFilesNavigationActions

/** Welcome/release-note detail contracts are migrated by the What's New detail batch. */
fun openWhatsNew(target: WhatsNewNavigation3Target)

/** New Meeting is owned by the Meetings feature graph and is migrated with that graph. */
fun openNewMeeting(type: NewMeetingType)
val whatsNew: WhatsNewNavigationActions
val meetings: MeetingsHomeNavigationActions
}

/**
Expand All @@ -74,7 +68,6 @@ internal fun HomeNavigation3TopLevelContent(
sessionId: WireSessionId,
runtime: WireNavigation3Runtime,
actions: HomeTopLevelNavigation3Actions,
conversationsNavigationActions: ConversationsNavigationActions,
) {
when (destination) {
HomeTopLevelDestination.CONVERSATIONS ->
Expand All @@ -91,19 +84,19 @@ internal fun HomeNavigation3TopLevelContent(

HomeTopLevelDestination.ARCHIVE -> ArchiveScreen(
homeShellState = shellState,
navigationActions = conversationsNavigationActions,
navigationActions = actions.conversationList,
)

HomeTopLevelDestination.WHATS_NEW -> WhatsNewScreen(
homeShellState = shellState,
onOpenTarget = actions::openWhatsNew,
navigationActions = actions.whatsNew,
)

HomeTopLevelDestination.CELLS -> Navigation3GlobalCells(actions.cells)

HomeTopLevelDestination.MEETINGS -> MeetingsScreen(
homeShellState = shellState,
onOpenNewMeeting = actions::openNewMeeting,
navigationActions = actions.meetings,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import com.wire.android.navigation.HomeDestination
import com.wire.android.ui.common.search.rememberSearchbarState
import com.wire.android.ui.home.HomeShellState
import com.wire.android.ui.home.conversationslist.ConversationListViewModelPreview
import com.wire.android.ui.home.conversationslist.ConversationsNavigationActions
import com.wire.android.ui.home.conversationslist.ConversationListNavigationActions
import com.wire.android.ui.home.conversationslist.ConversationsScreenContent
import com.wire.android.ui.home.conversationslist.common.previewConversationItemsFlow
import com.wire.android.ui.home.conversationslist.model.ConversationsSource
Expand All @@ -34,7 +34,7 @@ import com.wire.android.util.ui.PreviewMultipleThemes
@Composable
internal fun ArchiveScreen(
homeShellState: HomeShellState,
navigationActions: ConversationsNavigationActions,
navigationActions: ConversationListNavigationActions,
) {
with(homeShellState) {
ConversationsScreenContent(
Expand All @@ -54,7 +54,7 @@ internal fun ArchiveScreen(
@Composable
fun PreviewArchiveEmptyScreen() = WireTheme {
ConversationsScreenContent(
navigationActions = previewConversationsNavigationActions(),
navigationActions = previewConversationListNavigationActions(),
searchBarState = rememberSearchbarState(),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
Expand All @@ -66,7 +66,7 @@ fun PreviewArchiveEmptyScreen() = WireTheme {
@Composable
fun PreviewArchiveEmptySearchScreen() = WireTheme {
ConversationsScreenContent(
navigationActions = previewConversationsNavigationActions(),
navigationActions = previewConversationListNavigationActions(),
searchBarState = rememberSearchbarState(initialIsSearchActive = true, searchQueryTextState = TextFieldState(initialText = "er")),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
Expand All @@ -78,15 +78,15 @@ fun PreviewArchiveEmptySearchScreen() = WireTheme {
@Composable
fun PreviewArchiveScreen() = WireTheme {
ConversationsScreenContent(
navigationActions = previewConversationsNavigationActions(),
navigationActions = previewConversationListNavigationActions(),
searchBarState = rememberSearchbarState(initialIsSearchActive = true, searchQueryTextState = TextFieldState(initialText = "er")),
conversationsSource = ConversationsSource.ARCHIVE,
emptyListContent = { ArchiveEmptyContent() },
conversationListViewModel = ConversationListViewModelPreview(previewConversationItemsFlow(searchQuery = "er")),
)
}

private fun previewConversationsNavigationActions() = ConversationsNavigationActions(
private fun previewConversationListNavigationActions() = ConversationListNavigationActions(
openConversation = {},
openUserProfile = {},
startConversation = {},
Expand Down
Loading
Loading