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 a62041f8db8..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 @@ -19,11 +19,14 @@ package com.wire.android.ui.home.meetings import androidx.compose.foundation.layout.PaddingValues 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.navigation.HomeDestination import com.wire.android.navigation.annotation.app.WireHomeDestination import com.wire.android.ui.common.dimensions +import com.wire.android.feature.meetings.ui.create.NewMeetingType +import com.wire.android.navigation.NavigationCommand import com.wire.android.ui.home.HomeStateHolder @WireHomeDestination @@ -37,10 +40,14 @@ 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..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,11 @@ 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.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 +39,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 +75,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/NewMeetingNavGraph.kt b/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/NewMeetingNavGraph.kt new file mode 100644 index 00000000000..7ad58a68290 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/navigation/NewMeetingNavGraph.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/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/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..69a6ac095f5 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingScreen.kt @@ -0,0 +1,165 @@ +/* + * 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.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 +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 meetingListViewModel: NewMeetingViewModel = when { + LocalInspectionMode.current -> NewMeetingViewModelPreview(navArgs.type) + else -> newMeetingViewModel(navArgs.type) + } + NewMeetingContent( + type = navArgs.type, + onBackPressed = navigator::navigateBack, + titleState = meetingListViewModel.titleTextState, + ) +} + +@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 = {}, + ) +} + +@PreviewMultipleThemes +@Composable +fun PreviewNewMeetingScreen_Schedule() = WireTheme { + NewMeetingContent( + titleState = rememberTextFieldState(), + type = NewMeetingType.Schedule, + 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..48144e10203 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/feature/meetings/ui/create/NewMeetingViewModel.kt @@ -0,0 +1,38 @@ +/* + * 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 type: NewMeetingType + val titleTextState: TextFieldState +} + +class NewMeetingViewModelPreview( + override val type: NewMeetingType +) : NewMeetingViewModel { + override val titleTextState: TextFieldState = TextFieldState() +} + +class NewMeetingViewModelImpl( + override val type: NewMeetingType, +) : ViewModel(), NewMeetingViewModel { + override val titleTextState: TextFieldState = TextFieldState() +} diff --git a/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireNewMeetingDestination.kt b/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireNewMeetingDestination.kt new file mode 100644 index 00000000000..dbf94556b39 --- /dev/null +++ b/features/meetings/src/main/java/com/wire/android/navigation/annotation/features/meetings/WireNewMeetingDestination.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