From 3fc09da5c7490d428585c48282459d0b9dbd0d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Wed, 3 Jun 2026 16:03:15 +0200 Subject: [PATCH 1/7] navigation and base layout --- .../com/wire/android/navigation/Navigator.kt | 2 + .../android/navigation/WireRootNavGraph.kt | 2 + .../ui/home/meetings/MeetingsScreen.kt | 12 +- .../wire/android/navigation/WireNavigator.kt | 3 + .../ui/common/bottomsheet/WireDragHandle.kt | 17 +- .../ui-common/src/main/res/values/strings.xml | 1 + .../meetings/navigation/MeetingsNavGraph.kt | 26 +++ .../meetings/ui/NewMeetingBottomSheet.kt | 4 +- .../meetings/ui/create/NewMeetingNavArgs.kt | 47 ++++++ .../meetings/ui/create/NewMeetingScreen.kt | 150 ++++++++++++++++++ .../meetings/ui/create/NewMeetingViewModel.kt | 33 ++++ .../meetings/WireMeetingsDestination.kt | 36 +++++ .../src/main/res/values-ru/strings.xml | 2 - .../meetings/src/main/res/values/strings.xml | 9 +- 14 files changed, 333 insertions(+), 11 deletions(-) create mode 100644 features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt create mode 100644 features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingNavArgs.kt create mode 100644 features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt create mode 100644 features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt create mode 100644 features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt diff --git a/app/src/main/kotlin/com/wire/android/navigation/Navigator.kt b/app/src/main/kotlin/com/wire/android/navigation/Navigator.kt index 82b9fe501dc..dade697530d 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/Navigator.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/Navigator.kt @@ -18,11 +18,13 @@ package com.wire.android.navigation import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import androidx.navigation.NavHostController import com.ramcosta.composedestinations.generated.app.navgraphs.WireRootGraph import com.ramcosta.composedestinations.utils.findDestination +@Stable class Navigator( val finish: () -> Unit, val navController: NavHostController, diff --git a/app/src/main/kotlin/com/wire/android/navigation/WireRootNavGraph.kt b/app/src/main/kotlin/com/wire/android/navigation/WireRootNavGraph.kt index fc0a92438a8..3f922382fd9 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/WireRootNavGraph.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/WireRootNavGraph.kt @@ -20,6 +20,7 @@ package com.wire.android.navigation import com.ramcosta.composedestinations.annotation.ExternalNavGraph import com.ramcosta.composedestinations.annotation.NavHostGraph import com.ramcosta.composedestinations.generated.cells.navgraphs.CellsGraph +import com.ramcosta.composedestinations.generated.meetings.navgraphs.NewMeetingGraph import com.ramcosta.composedestinations.generated.sketch.navgraphs.SketchGraph import com.wire.android.navigation.style.DefaultRootNavGraphAnimations @@ -27,5 +28,6 @@ import com.wire.android.navigation.style.DefaultRootNavGraphAnimations annotation class WireRootNavGraph { @ExternalNavGraph @ExternalNavGraph + @ExternalNavGraph companion object Includes } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt index f0a6db38279..26a8e67c234 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt @@ -19,8 +19,11 @@ package com.wire.android.ui.home.meetings import com.wire.android.navigation.annotation.app.WireHomeDestination import androidx.compose.runtime.Composable +import com.ramcosta.composedestinations.generated.meetings.destinations.NewMeetingScreenDestination import com.wire.android.feature.meetings.ui.AllMeetingsScreen import com.wire.android.feature.meetings.ui.NewMeetingBottomSheet +import com.wire.android.feature.meetings.ui.create.NewMeetingType +import com.wire.android.navigation.NavigationCommand import com.wire.android.ui.home.HomeStateHolder @WireHomeDestination @@ -31,10 +34,15 @@ fun MeetingsScreen(homeStateHolder: HomeStateHolder) { NewMeetingBottomSheet( sheetState = homeStateHolder.newMeetingBottomSheetState, onMeetNowClick = { - // TODO to be implemented later + homeStateHolder.newMeetingBottomSheetState.hide { + homeStateHolder.navigator.navigate(NavigationCommand(NewMeetingScreenDestination(NewMeetingType.MeetNow))) + } + }, onScheduleClick = { - // TODO to be implemented later + homeStateHolder.newMeetingBottomSheetState.hide { + homeStateHolder.navigator.navigate(NavigationCommand(NewMeetingScreenDestination(NewMeetingType.Schedule))) + } } ) } diff --git a/core/navigation/src/main/kotlin/com/wire/android/navigation/WireNavigator.kt b/core/navigation/src/main/kotlin/com/wire/android/navigation/WireNavigator.kt index e5c34f0d8fa..b3d530de4b5 100644 --- a/core/navigation/src/main/kotlin/com/wire/android/navigation/WireNavigator.kt +++ b/core/navigation/src/main/kotlin/com/wire/android/navigation/WireNavigator.kt @@ -17,6 +17,9 @@ */ package com.wire.android.navigation +import androidx.compose.runtime.Stable + +@Stable interface WireNavigator { fun navigate(navigationCommand: NavigationCommand) fun navigateBack() diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt index dc1b25b5f9d..c8f229a4ffd 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt @@ -27,7 +27,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.util.lerp +import com.wire.android.ui.common.R import com.wire.android.ui.common.colorsScheme import com.wire.android.ui.common.dimensions import com.wire.android.ui.theme.WireTheme @@ -35,7 +40,7 @@ import com.wire.android.util.PreviewMultipleThemes @Composable fun WireDragHandle( - modifier: Modifier = Modifier, + modifier: Modifier = defaultDragHandleModifier(), progress: Float = 0f, // 0f: line, 1f: arrow color: Color = colorsScheme().secondaryText ) { @@ -71,10 +76,18 @@ fun WireDragHandle( } } +@Composable +private fun defaultDragHandleModifier(): Modifier { + val defaultContentDescription = stringResource(R.string.content_description_drag_handle) + return Modifier.semantics { + this.contentDescription = defaultContentDescription + } +} + @PreviewMultipleThemes @Composable fun WireDragHandlePreview_Line() = WireTheme { - WireDragHandle(progress = 0f) + WireDragHandle(progress = 0f) } @PreviewMultipleThemes diff --git a/core/ui-common/src/main/res/values/strings.xml b/core/ui-common/src/main/res/values/strings.xml index 7e0cbd260ca..93f1526aa1a 100644 --- a/core/ui-common/src/main/res/values/strings.xml +++ b/core/ui-common/src/main/res/values/strings.xml @@ -70,5 +70,6 @@ Search icon Search input Clear content + Drag handle diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt new file mode 100644 index 00000000000..7ad58a68290 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt @@ -0,0 +1,26 @@ +/* + * Wire + * Copyright (C) 2024 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.feature.meetings.navigation + +import com.ramcosta.composedestinations.annotation.ExternalModuleGraph +import com.ramcosta.composedestinations.annotation.NavGraph + +@NavGraph +annotation class NewMeetingNavGraph( + val start: Boolean = false +) diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/NewMeetingBottomSheet.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/NewMeetingBottomSheet.kt index bc31a52a63f..315030a8932 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/NewMeetingBottomSheet.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/NewMeetingBottomSheet.kt @@ -47,7 +47,7 @@ fun NewMeetingBottomSheet( MenuItemIcon( id = com.wire.android.ui.common.R.drawable.ic_video_call, tint = colorsScheme().onSurface, - contentDescription = stringResource(R.string.content_description_new_meeting_now_icon), + contentDescription = null, // no separate content description as the title already describes the action ) }, onItemClick = onMeetNowClick, @@ -60,7 +60,7 @@ fun NewMeetingBottomSheet( MenuItemIcon( id = com.wire.android.ui.common.R.drawable.ic_calendar, tint = colorsScheme().onSurface, - contentDescription = stringResource(R.string.content_description_new_meeting_schedule_icon), + contentDescription = null, // no separate content description as the title already describes the action ) }, onItemClick = onScheduleClick, diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingNavArgs.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingNavArgs.kt new file mode 100644 index 00000000000..363a410d0f5 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingNavArgs.kt @@ -0,0 +1,47 @@ +/* + * Wire + * Copyright (C) 2025 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.feature.meetings.ui.create + +import android.os.Parcelable +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import com.wire.android.feature.meetings.R +import kotlinx.parcelize.Parcelize +import com.wire.android.ui.common.R as CommonUiR + +data class NewMeetingNavArgs( + val type: NewMeetingType +) + +@Parcelize +enum class NewMeetingType( + @StringRes val title: Int, + @StringRes val action: Int, + @DrawableRes val icon: Int, +) : Parcelable { + MeetNow( + title = R.string.new_meeting_now, + action = R.string.new_meeting_action_start, + icon = CommonUiR.drawable.ic_video_call, + ), + Schedule( + title = R.string.new_meeting_schedule, + action = R.string.new_meeting_action_schedule, + icon = CommonUiR.drawable.ic_calendar, + ) +} diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt new file mode 100644 index 00000000000..3c06297698d --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt @@ -0,0 +1,150 @@ +/* + * Wire + * Copyright (C) 2026 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.feature.meetings.ui.create + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.foundation.text.input.rememberTextFieldState +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import com.wire.android.feature.meetings.R +import com.wire.android.feature.meetings.ui.util.PreviewMultipleThemes +import com.wire.android.navigation.WireNavigator +import com.wire.android.navigation.annotation.features.meetings.WireNewMeetingDestination +import com.wire.android.navigation.style.PopUpNavigationAnimation +import com.wire.android.ui.common.button.WireButtonState +import com.wire.android.ui.common.button.WirePrimaryButton +import com.wire.android.ui.common.dimensions +import com.wire.android.ui.common.scaffold.WireScaffold +import com.wire.android.ui.common.textfield.DefaultEmailDone +import com.wire.android.ui.common.textfield.WireTextField +import com.wire.android.ui.common.topappbar.NavigationIconType +import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar +import com.wire.android.ui.theme.WireTheme +import com.wire.android.ui.theme.wireColorScheme +import com.wire.android.ui.theme.wireDimensions + +@WireNewMeetingDestination( + start = true, + navArgs = NewMeetingNavArgs::class, + style = PopUpNavigationAnimation::class, +) +@Composable +fun NewMeetingScreen( + navigator: WireNavigator, + navArgs: NewMeetingNavArgs, +) { + val viewModel = + NewMeetingContent( + type = navArgs.type, + onBackPressed = navigator::navigateBack, + titleState = rememberTextFieldState(), // TODO + ) +} + +@Composable +fun NewMeetingContent( + titleState: TextFieldState, + type: NewMeetingType, + onBackPressed: () -> Unit, + modifier: Modifier = Modifier, +) { + WireScaffold( + modifier = modifier, + topBar = { + WireCenterAlignedTopAppBar( + elevation = dimensions().spacing0x, + title = stringResource(type.title), + onNavigationPressed = onBackPressed, + navigationIconType = NavigationIconType.Back( + contentDescription = R.string.contnt_description_new_meeting_back_icon + ), + ) + }, + content = { internalPadding -> + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .padding(internalPadding) + .padding( + top = dimensions().spacing24x, + start = dimensions().spacing16x, + end = dimensions().spacing16x, + ) + ) { + TitleInput(titleState = titleState) + } + }, + bottomBar = { + Surface( + shadowElevation = MaterialTheme.wireDimensions.bottomNavigationShadowElevation, + color = MaterialTheme.wireColorScheme.background, + modifier = Modifier.fillMaxWidth(), + ) { + WirePrimaryButton( + text = stringResource(type.action), + leadingIcon = { + Icon( + painter = painterResource(type.icon), + contentDescription = null, // no separate content description as the text already describes the action + modifier = Modifier.padding(dimensions().spacing4x), + ) + }, + state = WireButtonState.Disabled, // TODO + onClick = { /*TODO*/ }, + modifier = Modifier + .fillMaxWidth() + .padding(dimensions().spacing16x), + ) + } + } + ) +} + +@Composable +private fun TitleInput( + titleState: TextFieldState, +) { + WireTextField( + textState = titleState, + placeholderText = stringResource(R.string.new_meeting_title_input_placeholder), + labelText = stringResource(R.string.new_meeting_title_input_label).uppercase(), + semanticDescription = stringResource(R.string.new_meeting_title_input_placeholder), + keyboardOptions = KeyboardOptions.DefaultEmailDone, + testTag = "titleInput", + ) +} + +@PreviewMultipleThemes +@Composable +fun PreviewNewMeetingScreen_MeetNow() = WireTheme { + NewMeetingContent( + titleState = rememberTextFieldState(), + type = NewMeetingType.MeetNow, + onBackPressed = {}, + ) +} diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt new file mode 100644 index 00000000000..8b112190299 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt @@ -0,0 +1,33 @@ +/* + * Wire + * Copyright (C) 2026 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.feature.meetings.ui.create + +import androidx.compose.foundation.text.input.TextFieldState +import androidx.lifecycle.ViewModel + +interface NewMeetingViewModel { + val titleTextState: TextFieldState +} + +object NewMeetingViewModelPreview : NewMeetingViewModel { + override val titleTextState: TextFieldState = TextFieldState() +} + +class NewMeetingViewModelImpl() : ViewModel(), NewMeetingViewModel { + override val titleTextState: TextFieldState = TextFieldState() +} diff --git a/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt b/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt new file mode 100644 index 00000000000..dbf94556b39 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt @@ -0,0 +1,36 @@ +/* + * Wire + * Copyright (C) 2025 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.navigation.annotation.features.meetings + +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.Destination.Companion.COMPOSABLE_NAME +import com.ramcosta.composedestinations.spec.DestinationStyle +import com.wire.android.feature.meetings.navigation.NewMeetingNavGraph +import com.wire.android.navigation.wrapper.TabletDialogWrapper +import com.wire.android.navigation.wrapper.WaitUntilTransitionEndsWrapper +import kotlin.reflect.KClass + +@Destination( + wrappers = [WaitUntilTransitionEndsWrapper::class, TabletDialogWrapper::class], +) +internal annotation class WireNewMeetingDestination( + val route: String = COMPOSABLE_NAME, + val start: Boolean = false, + val navArgs: KClass<*> = Nothing::class, + val style: KClass = DestinationStyle.Default::class, +) diff --git a/features/meetings/src/main/res/values-ru/strings.xml b/features/meetings/src/main/res/values-ru/strings.xml index a7c0b27775a..6a7333432f2 100644 --- a/features/meetings/src/main/res/values-ru/strings.xml +++ b/features/meetings/src/main/res/values-ru/strings.xml @@ -54,6 +54,4 @@ Новая встреча Встречи сейчас Запланировать встречу - Значок встреч сейчас - Значок планирования встречи diff --git a/features/meetings/src/main/res/values/strings.xml b/features/meetings/src/main/res/values/strings.xml index 86083d43a7e..dbacfd53044 100644 --- a/features/meetings/src/main/res/values/strings.xml +++ b/features/meetings/src/main/res/values/strings.xml @@ -52,7 +52,10 @@ Previous meetings will be listed here. New Meeting Meet Now - Schedule a Meeting - Meet now icon - Schedule a Meeting icon + Schedule a Meetingv + Start Meeting + Schedule + Title + Enter meeting title + Close new meeting view From c8c11d8db72c0fa4797f788f63c01537f00384f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Wed, 3 Jun 2026 16:18:55 +0200 Subject: [PATCH 2/7] clean-up --- .../com/wire/android/ui/common/bottomsheet/WireDragHandle.kt | 1 - .../wire/android/feature/meetings/ui/create/NewMeetingScreen.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt index c8f229a4ffd..7c9a01e6d8e 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/WireDragHandle.kt @@ -27,7 +27,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt index 3c06297698d..19c6de12e20 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt @@ -58,7 +58,6 @@ fun NewMeetingScreen( navigator: WireNavigator, navArgs: NewMeetingNavArgs, ) { - val viewModel = NewMeetingContent( type = navArgs.type, onBackPressed = navigator::navigateBack, From 975303c3f8dbf8f225da90fae47f197d3951b3da Mon Sep 17 00:00:00 2001 From: ohassine Date: Wed, 3 Jun 2026 17:44:22 +0100 Subject: [PATCH 3/7] chore: kalium --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index c86db860bb3..8c34c92d181 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit c86db860bb35c8ba3011ce35852ae36fa6d1e21f +Subproject commit 8c34c92d181398c459f15be7006787bb7286594a From a604d7abd739e73fc90476eed8e787550845c09a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Wed, 3 Jun 2026 20:07:44 +0200 Subject: [PATCH 4/7] setup viewmodel --- .../feature/meetings/ui/MeetingsViewModelFactory.kt | 4 ++++ .../feature/meetings/ui/MeetingsViewModelGraph.kt | 9 +++++++++ .../feature/meetings/ui/create/NewMeetingScreen.kt | 8 +++++++- .../feature/meetings/ui/create/NewMeetingViewModel.kt | 9 +++++++-- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt index 89b3dc99616..2eea2ce185b 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelFactory.kt @@ -17,6 +17,8 @@ */ package com.wire.android.feature.meetings.ui +import com.wire.android.feature.meetings.ui.create.NewMeetingType +import com.wire.android.feature.meetings.ui.create.NewMeetingViewModelImpl import com.wire.android.feature.meetings.ui.list.MeetingListViewModelImpl import com.wire.android.feature.meetings.ui.options.MeetingOptionsMenuViewModelImpl import com.wire.android.feature.meetings.ui.usecase.GetMeetingUseCase @@ -39,4 +41,6 @@ class MeetingsViewModelFactory @Inject constructor( ) internal fun meetingOptionsMenuViewModel() = MeetingOptionsMenuViewModelImpl(getMeeting = getMeeting) + + internal fun newMeetingViewModel(type: NewMeetingType) = NewMeetingViewModelImpl(type) } diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelGraph.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelGraph.kt index 00f014b6648..9ec129e9630 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelGraph.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/MeetingsViewModelGraph.kt @@ -20,6 +20,9 @@ package com.wire.android.feature.meetings.ui import androidx.compose.runtime.Composable import com.wire.android.di.metro.MetroViewModelGraph import com.wire.android.di.metro.metroViewModel +import com.wire.android.feature.meetings.ui.create.NewMeetingType +import com.wire.android.feature.meetings.ui.create.NewMeetingViewModel +import com.wire.android.feature.meetings.ui.create.NewMeetingViewModelImpl import com.wire.android.feature.meetings.ui.list.MeetingListViewModel import com.wire.android.feature.meetings.ui.list.MeetingListViewModelImpl import com.wire.android.feature.meetings.ui.options.MeetingOptionsMenuViewModel @@ -40,3 +43,9 @@ fun meetingOptionsMenuListViewModel(): MeetingOptionsMenuViewModel = metroViewModel { meetingsViewModelFactory.meetingOptionsMenuViewModel() } + +@Composable +fun newMeetingViewModel(type: NewMeetingType): NewMeetingViewModel = + metroViewModel(key = "new_meeting_${type.name}") { + meetingsViewModelFactory.newMeetingViewModel(type) + } diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt index 19c6de12e20..2d32b144ce8 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt @@ -29,9 +29,11 @@ import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import com.wire.android.feature.meetings.R +import com.wire.android.feature.meetings.ui.newMeetingViewModel import com.wire.android.feature.meetings.ui.util.PreviewMultipleThemes import com.wire.android.navigation.WireNavigator import com.wire.android.navigation.annotation.features.meetings.WireNewMeetingDestination @@ -58,10 +60,14 @@ fun NewMeetingScreen( navigator: WireNavigator, navArgs: NewMeetingNavArgs, ) { + val meetingListViewModel: NewMeetingViewModel = when { + LocalInspectionMode.current -> NewMeetingViewModelPreview(navArgs.type) + else -> newMeetingViewModel(navArgs.type) + } NewMeetingContent( type = navArgs.type, onBackPressed = navigator::navigateBack, - titleState = rememberTextFieldState(), // TODO + titleState = meetingListViewModel.titleTextState, ) } diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt index 8b112190299..48144e10203 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt @@ -21,13 +21,18 @@ import androidx.compose.foundation.text.input.TextFieldState import androidx.lifecycle.ViewModel interface NewMeetingViewModel { + val type: NewMeetingType val titleTextState: TextFieldState } -object NewMeetingViewModelPreview : NewMeetingViewModel { +class NewMeetingViewModelPreview( + override val type: NewMeetingType +) : NewMeetingViewModel { override val titleTextState: TextFieldState = TextFieldState() } -class NewMeetingViewModelImpl() : ViewModel(), NewMeetingViewModel { +class NewMeetingViewModelImpl( + override val type: NewMeetingType, +) : ViewModel(), NewMeetingViewModel { override val titleTextState: TextFieldState = TextFieldState() } From c31f58b223717ad6d8d1b2bd23f4a0e5645785ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Thu, 4 Jun 2026 10:31:09 +0200 Subject: [PATCH 5/7] add another preview --- .../feature/meetings/ui/create/NewMeetingScreen.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt index 2d32b144ce8..69a6ac095f5 100644 --- a/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt @@ -153,3 +153,13 @@ fun PreviewNewMeetingScreen_MeetNow() = WireTheme { onBackPressed = {}, ) } + +@PreviewMultipleThemes +@Composable +fun PreviewNewMeetingScreen_Schedule() = WireTheme { + NewMeetingContent( + titleState = rememberTextFieldState(), + type = NewMeetingType.Schedule, + onBackPressed = {}, + ) +} From 9376a4e56b0fe523457ae63cfeefcef4f71ab7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Thu, 4 Jun 2026 10:34:21 +0200 Subject: [PATCH 6/7] Revert "chore: kalium" This reverts commit 975303c3f8dbf8f225da90fae47f197d3951b3da. --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index 8c34c92d181..c86db860bb3 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 8c34c92d181398c459f15be7006787bb7286594a +Subproject commit c86db860bb35c8ba3011ce35852ae36fa6d1e21f From 8e52a5de2ab79b34f42eca75b13dafbfe03238da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Saleniuk?= Date: Thu, 4 Jun 2026 10:49:51 +0200 Subject: [PATCH 7/7] detekt --- .../kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt | 1 - .../navigation/{MeetingsNavGraph.kt => NewMeetingNavGraph.kt} | 0 .../{WireMeetingsDestination.kt => WireNewMeetingDestination.kt} | 0 3 files changed, 1 deletion(-) rename features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/{MeetingsNavGraph.kt => NewMeetingNavGraph.kt} (100%) rename features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/{WireMeetingsDestination.kt => WireNewMeetingDestination.kt} (100%) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt index 937a60caae8..ac99d0ffd7d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/meetings/MeetingsScreen.kt @@ -43,7 +43,6 @@ fun MeetingsScreen(homeStateHolder: HomeStateHolder) { homeStateHolder.newMeetingBottomSheetState.hide { homeStateHolder.navigator.navigate(NavigationCommand(NewMeetingScreenDestination(NewMeetingType.MeetNow))) } - }, onScheduleClick = { homeStateHolder.newMeetingBottomSheetState.hide { diff --git a/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/NewMeetingNavGraph.kt similarity index 100% rename from features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/MeetingsNavGraph.kt rename to features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/NewMeetingNavGraph.kt diff --git a/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt b/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireNewMeetingDestination.kt similarity index 100% rename from features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireMeetingsDestination.kt rename to features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireNewMeetingDestination.kt