diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/BetCreationScreen.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/BetCreationScreen.kt index ed5dfeb..928d086 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/BetCreationScreen.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/BetCreationScreen.kt @@ -1,5 +1,6 @@ package fr.iut.alldev.allin.ui.betcreation +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding @@ -26,12 +27,12 @@ import java.time.ZonedDateTime fun BetCreationScreen( ) { + val interactionSource = remember { MutableInteractionSource() } + var theme by remember{ mutableStateOf("") } var phrase by remember{ mutableStateOf("") } val (registerDate, setRegisterDate) = remember { mutableStateOf(ZonedDateTime.now()) } - val (registerTime, setRegisterTime) = remember { mutableStateOf(ZonedDateTime.now()) } val (betDate, setBetDate) = remember { mutableStateOf(ZonedDateTime.now()) } - val (betTime, setBetTime) = remember { mutableStateOf(ZonedDateTime.now()) } var isPublic by remember{ mutableStateOf(true) } val betTypes = remember { BetType.values().toList() } val selectedFriends = remember { mutableListOf() } @@ -86,12 +87,11 @@ fun BetCreationScreen( selectedFriends = selectedFriends, registerDate = registerDate, betDate = betDate, - registerTime = registerTime, - betTime = betTime, setRegisterDateDialog = { setRegisterDatePicker(it) }, setEndDateDialog = { setEndDatePicker(it) }, setRegisterTimeDialog = { setRegisterTimePicker(it) }, setEndTimeDialog = { setEndTimePicker(it) }, + interactionSource = interactionSource, modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) @@ -122,14 +122,20 @@ fun BetCreationScreen( ) } if (showRegisterDatePicker || showEndDatePicker) { + val dateToEdit = if(showRegisterDatePicker) registerDate else betDate AllInDatePicker( currentDate = if(showRegisterDatePicker) registerDate else betDate, onSelectDate = { date -> val selectedDate = ZonedDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneId.systemDefault()) + val newDate = dateToEdit + .withYear(selectedDate.year) + .withMonth(selectedDate.month.value) + .withDayOfMonth(selectedDate.dayOfMonth) + .withDayOfYear(selectedDate.dayOfYear) if(showRegisterDatePicker) { - setRegisterDate(selectedDate) + setRegisterDate(newDate) } else { - setBetDate(selectedDate) + setBetDate(newDate) } setRegisterDatePicker(false) setEndDatePicker(false) @@ -141,7 +147,7 @@ fun BetCreationScreen( ) } if (showRegisterTimePicker || showEndTimePicker) { - val timeToEdit = if(showRegisterTimePicker) registerTime else betTime + val timeToEdit = if(showRegisterTimePicker) registerDate else betDate AllInTimePicker( hour = timeToEdit.hour, minutes = timeToEdit.minute, @@ -149,10 +155,10 @@ fun BetCreationScreen( val time = (timeToEdit) .withHour(hour) .withMinute(min) - if(showRegisterDatePicker) { - setRegisterTime(time) + if(showRegisterTimePicker) { + setRegisterDate(time) } else { - setBetTime(time) + setBetDate(time) } setRegisterTimePicker(false) setEndTimePicker(false) diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/BetCreationScreenQuestionTab.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/BetCreationScreenQuestionTab.kt index ef04d3c..ec66911 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/BetCreationScreenQuestionTab.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/BetCreationScreenQuestionTab.kt @@ -1,6 +1,7 @@ package fr.iut.alldev.allin.ui.betcreation.tabs import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.relocation.BringIntoViewRequester import androidx.compose.runtime.* @@ -26,13 +27,12 @@ fun BetCreationScreenQuestionTab( setIsPublic: (Boolean)->Unit, registerDate: ZonedDateTime, betDate: ZonedDateTime, - registerTime: ZonedDateTime, - betTime: ZonedDateTime, selectedFriends: MutableList, setRegisterDateDialog: (Boolean)->Unit, setEndDateDialog: (Boolean)->Unit, setRegisterTimeDialog: (Boolean)->Unit, - setEndTimeDialog: (Boolean)->Unit + setEndTimeDialog: (Boolean)->Unit, + interactionSource: MutableInteractionSource ) { val bringIntoViewRequester = remember { BringIntoViewRequester() } Column(modifier){ @@ -41,25 +41,28 @@ fun BetCreationScreenQuestionTab( setBetTheme = setBetTheme, betPhrase = betPhrase, setBetPhrase = setBetPhrase, - bringIntoViewRequester = bringIntoViewRequester + bringIntoViewRequester = bringIntoViewRequester, + interactionSource = interactionSource ) Spacer(modifier = Modifier.height(35.dp)) QuestionTabDateTimeSection( registerDate = registerDate.formatToMediumDate(), - registerTime = registerTime.formatToTime(), + registerTime = registerDate.formatToTime(), endDate = betDate.formatToMediumDate(), - endTime = betTime.formatToTime(), + endTime = betDate.formatToTime(), setEndDateDialog = setEndDateDialog, setRegisterDateDialog = setRegisterDateDialog, setRegisterTimeDialog = setRegisterTimeDialog, - setEndTimeDialog = setEndTimeDialog + setEndTimeDialog = setEndTimeDialog, + interactionSource = interactionSource, ) Spacer(modifier = Modifier.height(35.dp)) QuestionTabPrivacySection( isPublic = isPublic, setIsPublic = setIsPublic, nbFriends = nbFriends, - selectedFriends = selectedFriends + selectedFriends = selectedFriends, + interactionSource = interactionSource ) } } \ No newline at end of file diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabDateTimeSection.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabDateTimeSection.kt index 0f0a9da..71cf773 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabDateTimeSection.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabDateTimeSection.kt @@ -1,5 +1,6 @@ package fr.iut.alldev.allin.ui.betcreation.tabs.sections +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -22,13 +23,15 @@ internal fun QuestionTabDateTimeSection( registerDate: String, registerTime: String, endDate: String, - endTime: String + endTime: String, + interactionSource: MutableInteractionSource ) { AllInTitleInfo( text = stringResource(id = R.string.End_registration_date), icon = Icons.AutoMirrored.Outlined.HelpOutline, modifier = Modifier.padding(start = 11.dp, bottom = 8.dp), - tooltipText = "Bonjour" + tooltipText = stringResource(id = R.string.Register_tooltip), + interactionSource = interactionSource ) BetCreationScreenDateTimeRow( date = registerDate, @@ -41,7 +44,8 @@ internal fun QuestionTabDateTimeSection( text = stringResource(id = R.string.End_bet_date), icon = Icons.AutoMirrored.Outlined.HelpOutline, modifier = Modifier.padding(start = 11.dp, bottom = 8.dp), - tooltipText = "Bonjour" + tooltipText = stringResource(id = R.string.BetEnd_tooltip), + interactionSource = interactionSource ) BetCreationScreenDateTimeRow( date = endDate, diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabPrivacySection.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabPrivacySection.kt index 4154586..fe57b88 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabPrivacySection.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabPrivacySection.kt @@ -1,5 +1,6 @@ package fr.iut.alldev.allin.ui.betcreation.tabs.sections +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons @@ -24,13 +25,15 @@ fun QuestionTabPrivacySection( isPublic: Boolean, setIsPublic: (Boolean)->Unit, nbFriends: Int, - selectedFriends: MutableList + selectedFriends: MutableList, + interactionSource: MutableInteractionSource ) { AllInTitleInfo( text = stringResource(id = R.string.Bet_privacy), icon = Icons.AutoMirrored.Outlined.HelpOutline, modifier = Modifier.padding(start = 11.dp, bottom = 8.dp), - tooltipText = "Généralement une question qui sera répondu par les utilisateurs." + tooltipText = stringResource(id = R.string.Privacy_tooltip), + interactionSource = interactionSource ) Row( modifier = Modifier.padding(bottom = 10.dp), diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabThemePhraseSection.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabThemePhraseSection.kt index 4465ec3..06fa74f 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabThemePhraseSection.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/betcreation/tabs/sections/QuestionTabThemePhraseSection.kt @@ -1,6 +1,7 @@ package fr.iut.alldev.allin.ui.betcreation.tabs.sections import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -14,8 +15,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import fr.iut.alldev.allin.R -import fr.iut.alldev.allin.ui.core.AllInTitleInfo import fr.iut.alldev.allin.ui.core.AllInTextField +import fr.iut.alldev.allin.ui.core.AllInTitleInfo import fr.iut.alldev.allin.ui.theme.AllInTheme @OptIn(ExperimentalFoundationApi::class) @@ -25,13 +26,15 @@ internal fun QuestionTabThemePhraseSection( setBetTheme: (String)->Unit, betPhrase: String, setBetPhrase: (String)->Unit, - bringIntoViewRequester: BringIntoViewRequester + bringIntoViewRequester: BringIntoViewRequester, + interactionSource: MutableInteractionSource ) { AllInTitleInfo( text = stringResource(id = R.string.Theme), icon = Icons.AutoMirrored.Outlined.HelpOutline, modifier = Modifier.padding(start = 11.dp, bottom = 8.dp), - tooltipText = "Bonjour" + tooltipText = stringResource(id = R.string.Theme_tooltip), + interactionSource = interactionSource ) AllInTextField( placeholder = stringResource(id = R.string.Theme_placeholder), @@ -48,7 +51,8 @@ internal fun QuestionTabThemePhraseSection( text = stringResource(id = R.string.Bet_Phrase), icon = Icons.AutoMirrored.Outlined.HelpOutline, modifier = Modifier.padding(start = 11.dp, bottom = 8.dp), - tooltipText = "Généralement une question qui sera répondu par les utilisateurs." + tooltipText = stringResource(id = R.string.Phrase_tooltip), + interactionSource = interactionSource ) AllInTextField( placeholder = stringResource(id = R.string.Bet_Phrase_placeholder), diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInSections.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInSections.kt index c9091e4..3f72698 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInSections.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInSections.kt @@ -54,6 +54,8 @@ fun AllInSections( ) } } + + HorizontalPager(state = pagerState) { page -> LaunchedEffect(key1 = page){ onLoadSection() diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTextField.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTextField.kt index 6da5187..bfd577b 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTextField.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTextField.kt @@ -44,7 +44,10 @@ fun AllInTextField( visualTransformation: VisualTransformation = VisualTransformation.None, keyboardType: KeyboardType = KeyboardType.Text, keyboardActions: KeyboardActions = KeyboardActions.Default, - borderColor: Color = AllInTheme.colors.allIn_LightGrey300 + borderColor: Color = AllInTheme.themeColors.on_background_2, + containerColor: Color = AllInTheme.themeColors.background, + textColor: Color = AllInTheme.themeColors.on_main_surface, + placeholderColor: Color = AllInTheme.themeColors.on_background_2 ) { val scope = rememberCoroutineScope() var hasFocus by remember { mutableStateOf(false) } @@ -81,7 +84,7 @@ fun AllInTextField( text = placeholder, fontSize = placeholderFontSize, style = AllInTheme.typography.r, - color = AllInTheme.colors.allIn_LightGrey300, + color = placeholderColor, maxLines = if(multiLine) 3 else 1, overflow = TextOverflow.Ellipsis ) @@ -101,13 +104,13 @@ fun AllInTextField( keyboardActions = keyboardActions, shape = AbsoluteSmoothCornerShape(10.dp, 100), colors = OutlinedTextFieldDefaults.colors( - cursorColor = AllInTheme.colors.allIn_Dark, + cursorColor = textColor, focusedBorderColor = borderColor, unfocusedBorderColor = borderColor, - focusedTextColor = AllInTheme.colors.allIn_Dark, - unfocusedTextColor = AllInTheme.colors.allIn_Dark, - focusedContainerColor = AllInTheme.colors.white, - unfocusedContainerColor = AllInTheme.colors.white + focusedTextColor = textColor, + unfocusedTextColor = textColor, + focusedContainerColor = containerColor, + unfocusedContainerColor = containerColor ) ) } diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTimePicker.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTimePicker.kt index 10eb531..4965cd8 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTimePicker.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTimePicker.kt @@ -24,7 +24,8 @@ fun AllInTimePicker( initialMinute = minutes ?: calendar.get(Calendar.MINUTE) ) - DatePickerDialog( + + AlertDialog( onDismissRequest = onDismiss, confirmButton = { TextButton( @@ -49,18 +50,21 @@ fun AllInTimePicker( ) } }, - colors = DatePickerDefaults.colors( - containerColor = AllInTheme.themeColors.main_surface - ) - ){ - TimePicker( - state = timePickerState, - colors = TimePickerDefaults.colors( - selectorColor = AllInTheme.colors.allIn_Pink, - containerColor = AllInTheme.themeColors.background, + text = { + TimePicker( + state = timePickerState, + colors = TimePickerDefaults.colors( + selectorColor = AllInTheme.colors.allIn_Purple, + containerColor = AllInTheme.themeColors.background, + clockDialColor = AllInTheme.themeColors.background_2, + clockDialUnselectedContentColor = AllInTheme.themeColors.on_main_surface, + clockDialSelectedContentColor = AllInTheme.themeColors.background_2, + + ) ) - ) - } + }, + containerColor = AllInTheme.themeColors.main_surface + ) } @Preview diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTitleInfo.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTitleInfo.kt index 8c0ab31..503d968 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTitleInfo.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/core/AllInTitleInfo.kt @@ -1,7 +1,8 @@ package fr.iut.alldev.allin.ui.core import android.content.res.Configuration -import androidx.compose.foundation.clickable +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -22,33 +23,37 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import fr.iut.alldev.allin.ui.theme.AllInTheme +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -@OptIn(ExperimentalMaterial3Api::class) +private fun launchTooltip( + scope: CoroutineScope, + tooltipState: TooltipState +){ + scope.launch { + tooltipState.show() + } +} + +@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable fun AllInTitleInfo( text: String, tooltipText: String, icon: ImageVector, - tooltipState: TooltipState = rememberTooltipState(), - modifier: Modifier = Modifier + tooltipState: TooltipState = rememberTooltipState(isPersistent = true), + modifier: Modifier = Modifier, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } ) { val scope = rememberCoroutineScope() - val interactionSource = remember { MutableInteractionSource() } Row( modifier = modifier - .clickable( + .combinedClickable( interactionSource = interactionSource, indication = null, - onClick = { - scope.launch { - if(tooltipState.isVisible){ - tooltipState.dismiss() - }else{ - tooltipState.show() - } - } - } + onClick = { launchTooltip(scope, tooltipState) }, + onDoubleClick = { launchTooltip(scope, tooltipState) }, + onLongClick = { launchTooltip(scope, tooltipState) }, ), verticalAlignment = Alignment.CenterVertically ) { diff --git a/src/app/src/main/java/fr/iut/alldev/allin/ui/navigation/drawer/Drawer.kt b/src/app/src/main/java/fr/iut/alldev/allin/ui/navigation/drawer/Drawer.kt index 50afb6f..c588bb6 100644 --- a/src/app/src/main/java/fr/iut/alldev/allin/ui/navigation/drawer/Drawer.kt +++ b/src/app/src/main/java/fr/iut/alldev/allin/ui/navigation/drawer/Drawer.kt @@ -1,5 +1,6 @@ package fr.iut.alldev.allin.ui.navigation.drawer +import androidx.activity.compose.BackHandler import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons @@ -153,6 +154,14 @@ fun AllInDrawer( } } } + + BackHandler( + enabled = drawerState.isOpen + ) { + scope.launch { + drawerState.close() + } + } } diff --git a/src/app/src/main/res/values-fr/strings.xml b/src/app/src/main/res/values-fr/strings.xml index 26e4b1a..2d04fbf 100644 --- a/src/app/src/main/res/values-fr/strings.xml +++ b/src/app/src/main/res/values-fr/strings.xml @@ -37,6 +37,11 @@ Te revoilà ! Bon retour parmis nous tu nous as manqué ! + Le sujet du bet. + Généralement la question à laquelle les participants devront répondre. + Après cette date, plus personne ne pourra s\'inscrire. + Après cette date, les résultats seront annoncés. + Détermine qui pourra voir le bet. Question Réponse Publier le bet diff --git a/src/app/src/main/res/values/strings.xml b/src/app/src/main/res/values/strings.xml index 400596b..cc235c7 100644 --- a/src/app/src/main/res/values/strings.xml +++ b/src/app/src/main/res/values/strings.xml @@ -44,6 +44,11 @@ Question Answer Publish the bet + The subject of the bet. + Generally the question the participants will answer to. + After this date, nobody will be able to register anymore. + After this date, the result will be announced. + Determines who will be able to see the bet. Theme Studies, sports, party… Bet phrase