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 @@ -23,9 +23,9 @@ import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.search.FederatedSearchParser
import com.wire.kalium.logic.feature.search.IsFederationSearchAllowedUseCase
import com.wire.kalium.logic.feature.search.SearchByHandleUseCase
import com.wire.kalium.logic.feature.search.SearchUsersByHandleUseCase
import com.wire.kalium.logic.feature.search.SearchScope
import com.wire.kalium.logic.feature.search.SearchUsersUseCase
import com.wire.kalium.logic.feature.search.SearchUsersByNameUseCase
import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.Provides

Expand All @@ -39,10 +39,10 @@ class SearchModule {
): SearchScope = coreLogic.getSessionScope(currentAccount).search

@Provides
fun provideSearchUsersUseCase(searchScope: SearchScope): SearchUsersUseCase = searchScope.searchUsers
fun provideSearchUsersByNameUseCase(searchScope: SearchScope): SearchUsersByNameUseCase = searchScope.searchUsersByName

@Provides
fun provideSearchByHandleUseCase(searchScope: SearchScope): SearchByHandleUseCase = searchScope.searchByHandle
fun provideSearchUsersByHandleUseCase(searchScope: SearchScope): SearchUsersByHandleUseCase = searchScope.searchUsersByHandle

@Provides
fun provideFederatedSearchParser(searchScope: SearchScope): FederatedSearchParser = searchScope.federatedSearchParser
Expand Down
36 changes: 35 additions & 1 deletion app/src/main/kotlin/com/wire/android/navigation/MainNavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,16 @@ import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.generated.app.destinations.ConversationScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.NewLoginPasswordScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.NewLoginVerificationCodeScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.OtherUserProfileScreenDestination
import com.ramcosta.composedestinations.generated.app.navArgs
import com.ramcosta.composedestinations.generated.app.navgraphs.NewConversationGraph
import com.ramcosta.composedestinations.generated.app.navgraphs.PersonalToTeamMigrationGraph
import com.ramcosta.composedestinations.generated.cells.destinations.SearchScreenDestination
import com.ramcosta.composedestinations.generated.app.navgraphs.WireRootGraph
import com.ramcosta.composedestinations.generated.app.navtype.groupConversationDetailsNavBackArgsNavType
import com.ramcosta.composedestinations.generated.app.navtype.imagesPreviewNavBackArgsNavType
import com.ramcosta.composedestinations.generated.app.navtype.mediaGalleryNavBackArgsNavType
import com.ramcosta.composedestinations.generated.cells.destinations.SearchScreenDestination
import com.ramcosta.composedestinations.generated.meetings.navgraphs.NewMeetingGraph
import com.ramcosta.composedestinations.generated.sketch.destinations.DrawingCanvasScreenDestination
import com.ramcosta.composedestinations.generated.sketch.navtype.drawingCanvasNavBackArgsNavType
import com.ramcosta.composedestinations.manualcomposablecalls.composable
Expand All @@ -48,12 +50,15 @@ import com.ramcosta.composedestinations.scope.resultBackNavigator
import com.ramcosta.composedestinations.scope.resultRecipient
import com.ramcosta.composedestinations.spec.Direction
import com.wire.android.feature.cells.ui.cellViewModel
import com.wire.android.feature.meetings.navigation.MeetingNavigator
import com.wire.android.feature.meetings.ui.newMeetingViewModel
import com.wire.android.feature.sketch.model.DrawingCanvasNavBackArgs
import com.wire.android.navigation.transition.LocalSharedTransitionScope
import com.wire.android.ui.authentication.loginEmailViewModel
import com.wire.android.ui.home.conversations.ConversationScreen
import com.wire.android.ui.home.newConversationViewModel
import com.wire.android.ui.home.settings.teamMigrationViewModel
import com.wire.kalium.logic.data.user.UserId

@OptIn(ExperimentalAnimationApi::class, ExperimentalSharedTransitionApi::class)
@Composable
Expand All @@ -64,6 +69,14 @@ fun MainNavHost(
modifier: Modifier = Modifier,
) {
val navHostEngine = rememberWireNavHostEngine(Alignment.Center)
val meetingNavigator = remember(navigator) {
MeetingNavigator(
navigator = navigator,
navigateToProfile = { userId: UserId ->
navigator.navigate(NavigationCommand(OtherUserProfileScreenDestination(userId = userId)))
}
)
}
SharedTransitionLayout(modifier = modifier) {
CompositionLocalProvider(LocalSharedTransitionScope provides this) {
DestinationsNavHost(
Expand All @@ -80,6 +93,17 @@ fun MainNavHost(
// 👇 To make LoginTypeSelector available to all destinations as a non-navigation parameter if provided
if (loginTypeSelector != null) dependency(loginTypeSelector)

// 👇 To tie NewConversationViewModel to nested NewConversationGraph,
// making it shared between all screens that belong to it
navGraph(NewConversationGraph) {
val parentEntry = remember(navBackStackEntry) {
navController.getBackStackEntry(NewConversationGraph.route)
}
dependency(
newConversationViewModel(parentEntry)
)
}

// 👇 To reuse LoginEmailViewModel from NewLoginPasswordScreen on NewLoginVerificationCodeScreen
destination(NewLoginVerificationCodeScreenDestination) {
val loginPasswordEntry = remember(navBackStackEntry) {
Expand Down Expand Up @@ -118,6 +142,16 @@ fun MainNavHost(
}
dependency(teamMigrationViewModel(parentEntry))
}

// 👇 To tie NewMeetingViewModel to nested NewMeetingGraph, making it shared between all screens that belong to it
// Also, make MeetingNavigator available to all destinations from NewMeetingGraph as a non-navigation parameter
navGraph(NewMeetingGraph) {
val parentEntry = remember(navBackStackEntry) {
navController.getBackStackEntry(NewMeetingGraph.route)
}
dependency(newMeetingViewModel(parentEntry))
dependency(meetingNavigator)
}
Comment thread
saleniuk marked this conversation as resolved.
},
manualComposableCallsBuilder = {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,20 @@
*/
package com.wire.android.ui.home.newconversation.channelhistory

import com.wire.android.navigation.annotation.app.WireNewConversationDestination
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.ramcosta.composedestinations.generated.app.destinations.ChannelHistoryCustomScreenDestination
import com.ramcosta.composedestinations.result.NavResult
import com.ramcosta.composedestinations.result.ResultRecipient
import com.wire.android.R
import com.wire.android.model.Clickable
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.Navigator
import com.wire.android.navigation.annotation.app.WireNewConversationDestination
import com.wire.android.navigation.style.SlideNavigationAnimation
import com.wire.android.ui.common.WirePromotionCard
import com.wire.android.ui.common.colorsScheme
Expand All @@ -38,7 +39,6 @@ import com.wire.android.ui.common.scaffold.WireScaffold
import com.wire.android.ui.common.topappbar.NavigationIconType
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.typography
import com.ramcosta.composedestinations.generated.app.destinations.ChannelHistoryCustomScreenDestination
import com.wire.android.ui.home.conversations.details.options.ArrowType
import com.wire.android.ui.home.conversations.details.options.GroupConversationOptionsItem
import com.wire.android.ui.home.newconversation.NewConversationViewModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

package com.wire.android.ui.home.newconversation.groupOptions

import com.wire.android.navigation.annotation.app.WireNewConversationDestination
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
Expand All @@ -36,12 +35,18 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import com.ramcosta.composedestinations.generated.app.destinations.ChannelAccessOnCreateScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ChannelHistoryScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ConversationScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.HomeScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.NewGroupConversationSearchPeopleScreenDestination
import com.wire.android.BuildConfig
import com.wire.android.R
import com.wire.android.model.Clickable
import com.wire.android.navigation.BackStackMode
import com.wire.android.navigation.NavigationCommand
import com.wire.android.navigation.Navigator
import com.wire.android.navigation.annotation.app.WireNewConversationDestination
import com.wire.android.ui.common.TextWithLinkSuffix
import com.wire.android.ui.common.WireDialog
import com.wire.android.ui.common.WireDialogButtonProperties
Expand All @@ -55,17 +60,12 @@ import com.wire.android.ui.common.topappbar.NavigationIconType
import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.typography
import com.wire.android.ui.common.upgradetoapps.UpgradeToGetAppsBanner
import com.ramcosta.composedestinations.generated.app.destinations.ChannelAccessOnCreateScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ChannelHistoryScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.ConversationScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.HomeScreenDestination
import com.ramcosta.composedestinations.generated.app.destinations.NewGroupConversationSearchPeopleScreenDestination
import com.wire.android.ui.home.conversations.details.options.ArrowType
import com.wire.android.ui.home.conversations.details.options.GroupConversationOptionsItem
import com.wire.android.ui.home.newconversation.NewConversationViewModel
import com.wire.android.ui.home.newconversation.channelaccess.ChannelAccessType
import com.wire.android.ui.home.newconversation.channelhistory.ChannelHistoryType
import com.wire.android.ui.home.newconversation.channelhistory.name
import com.wire.android.ui.home.newconversation.NewConversationViewModel
import com.wire.android.ui.home.newconversation.common.CreateGroupErrorDialog
import com.wire.android.ui.home.newconversation.common.CreateGroupState
import com.wire.android.ui.home.settings.SwitchState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,12 @@ interface ScopedArgs {
@Stable
interface PreviewProvider {
val previews: List<Any> get() = emptyList()

companion object {
fun of(vararg previews: Any) = object : PreviewProvider {
override val previews: List<Any> = previews.toList()
}
}
}
object EmptyPreviewProvider : PreviewProvider

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
key: String? = null,
previewProvider: PreviewProvider = EmptyPreviewProvider,
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"

Check failure on line 62 in core/di/src/main/kotlin/com/wire/android/di/metro/MetroViewModelGraph.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Define a constant instead of duplicating this literal "No ViewModelStoreOwner was provided via LocalViewModelStoreOwner" 4 times.

See more on https://sonarcloud.io/project/issues?id=wireapp_wire-android&issues=AZ68TQXt1DtpJMMGAZq1&open=AZ68TQXt1DtpJMMGAZq1&pullRequest=4962
},
): VM where VM : ViewModel = previewProvider.findPreviewOr {
metroViewModel(
Expand Down Expand Up @@ -112,9 +112,13 @@
inline fun <reified VM, reified Factory> sessionKeyedAssistedMetroViewModel(
key: String? = null,
previewProvider: PreviewProvider = EmptyPreviewProvider,
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
crossinline createViewModel: Factory.() -> VM,
): VM where VM : ViewModel, Factory : ManualViewModelAssistedFactory = previewProvider.findPreviewOr {
assistedMetroViewModel<VM, Factory>(
viewModelStoreOwner = viewModelStoreOwner,
key = sessionKeyedMetroViewModelKey(
defaultKey = VM::class.qualifiedName,
key = key,
Expand All @@ -137,9 +141,13 @@
inline fun <reified VM, reified S, reified Factory> sessionKeyedAssistedMetroViewModelAs(
key: String? = null,
previewProvider: PreviewProvider = EmptyPreviewProvider,
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
crossinline createViewModel: Factory.() -> VM,
): S where VM : ViewModel, VM : S, Factory : ManualViewModelAssistedFactory = previewProvider.findPreviewOr {
assistedMetroViewModel<VM, Factory>(
viewModelStoreOwner = viewModelStoreOwner,
key = sessionKeyedMetroViewModelKey(
defaultKey = VM::class.qualifiedName,
key = key,
Expand Down
10 changes: 6 additions & 4 deletions core/di/stability/di-debug.stability
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,23 @@ internal fun com.wire.android.di.manualScopedViewModelFactory(create: @[Extensio
- create: STABLE (function type)

@Composable
public fun com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel(key: kotlin.String?, previewProvider: com.wire.android.di.PreviewProvider, createViewModel: @[ExtensionFunctionType] kotlin.Function1<Factory of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel, VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel>): VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel
skippable: true
public fun com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel(key: kotlin.String?, previewProvider: com.wire.android.di.PreviewProvider, viewModelStoreOwner: androidx.lifecycle.ViewModelStoreOwner, createViewModel: @[ExtensionFunctionType] kotlin.Function1<Factory of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel, VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel>): VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModel
skippable: false
restartable: true
params:
- key: STABLE (class with no mutable properties)
- previewProvider: STABLE (marked @Stable or @Immutable)
- viewModelStoreOwner: RUNTIME (requires runtime check)
- createViewModel: STABLE (function type)

@Composable
public fun com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs(key: kotlin.String?, previewProvider: com.wire.android.di.PreviewProvider, createViewModel: @[ExtensionFunctionType] kotlin.Function1<Factory of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs, VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs>): S of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs
skippable: true
public fun com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs(key: kotlin.String?, previewProvider: com.wire.android.di.PreviewProvider, viewModelStoreOwner: androidx.lifecycle.ViewModelStoreOwner, createViewModel: @[ExtensionFunctionType] kotlin.Function1<Factory of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs, VM of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs>): S of com.wire.android.di.metro.sessionKeyedAssistedMetroViewModelAs
skippable: false
restartable: true
params:
- key: STABLE (class with no mutable properties)
- previewProvider: STABLE (marked @Stable or @Immutable)
- viewModelStoreOwner: RUNTIME (requires runtime check)
- createViewModel: STABLE (function type)

@Composable
Expand Down
2 changes: 2 additions & 0 deletions core/search/src/main/kotlin/com/wire/android/model/Contact.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
*/
package com.wire.android.model

import androidx.compose.runtime.Stable
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.kalium.logic.data.user.ConnectionState

@Stable
data class Contact(
val id: String,
val domain: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
@ManualViewModelAssistedFactoryKey(SearchManualViewModelFactory::class)
fun searchManualViewModelFactory(factory: SearchViewModelFactory): ManualViewModelAssistedFactory =
object : SearchManualViewModelFactory {
override fun searchUserViewModel(conversationId: ConversationId?): SearchUserViewModel =
factory.searchUserViewModel(conversationId)
override fun searchUserViewModel(conversationId: ConversationId?, onlyConnectedContacts: Boolean): SearchUserViewModel =
factory.searchUserViewModel(conversationId, onlyConnectedContacts)

Check warning on line 39 in core/search/src/main/kotlin/com/wire/android/search/SearchMetroViewModelBindings.kt

View check run for this annotation

Codecov / codecov/patch

core/search/src/main/kotlin/com/wire/android/search/SearchMetroViewModelBindings.kt#L39

Added line #L39 was not covered by tests

override fun searchAppsViewModel(protocolInfo: Conversation.ProtocolInfo?): SearchAppsViewModel =
factory.searchAppsViewModel(protocolInfo)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar
import com.wire.android.ui.common.topappbar.search.SearchTopBar
import com.wire.android.util.ui.UIText
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
import kotlinx.collections.immutable.ImmutableSet
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.coroutines.launch
Expand All @@ -83,19 +84,21 @@ fun SearchUsersAndAppsScreen(
searchTitle: String,
selectedContacts: ImmutableSet<Contact>,
onContactChecked: (Boolean, Contact) -> Unit,
onOpenUserProfile: (Contact) -> Unit,
onAppClicked: (Contact) -> Unit,
onClose: () -> Unit,
navigationIconType: NavigationIconType,
itemActionType: ItemActionType,
modifier: Modifier = Modifier,
conversationId: ConversationId? = null,
onlyConnectedContacts: Boolean = false,
shouldHideBottomActionForSearch: Boolean = false,
shouldHideBottomActionForServices: Boolean = false,
isAppsTabVisible: Boolean = false,
isConversationAppsEnabled: Boolean = true,
initialPage: SearchPeopleTabItem = SearchPeopleTabItem.PEOPLE,
conversationProtocol: Conversation.ProtocolInfo? = null,
peopleBottomActions: (@Composable (FocusRequester) -> Unit)? = null,
onOpenUserProfile: (Contact) -> Unit = {},
onAppClicked: (Contact) -> Unit = {},
) {
val searchBarState = rememberSearchbarState()
val scope = rememberCoroutineScope()
Expand Down Expand Up @@ -211,6 +214,8 @@ fun SearchUsersAndAppsScreen(
when (tabs[pageIndex]) {
SearchPeopleTabItem.PEOPLE -> {
SearchAllPeopleOrContactsScreen(
conversationId = conversationId,
onlyConnectedContacts = onlyConnectedContacts,
searchQuery = searchBarState.searchQueryTextState.text.toString(),
contactsSelected = selectedContacts,
onOpenUserProfile = onOpenUserProfile,
Expand Down Expand Up @@ -268,7 +273,9 @@ private fun SearchAllPeopleOrContactsScreen(
actionType: ItemActionType,
onOpenUserProfile: (Contact) -> Unit,
onContactChecked: (Boolean, Contact) -> Unit,
searchUserViewModel: SearchUserViewModel = searchUserViewModel(),
conversationId: ConversationId? = null,
onlyConnectedContacts: Boolean = false,
searchUserViewModel: SearchUserViewModel = searchUserViewModel(conversationId, onlyConnectedContacts),
lazyListState: LazyListState = rememberLazyListState(),
firstContactFocusRequester: FocusRequester? = null,
nextFocusRequester: FocusRequester? = null,
Expand Down
Loading
Loading