diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 507c413..0f66b8b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,10 +91,10 @@ dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.5.0-alpha04") implementation("androidx.navigation:navigation-compose:2.5.0-alpha03") implementation("androidx.constraintlayout:constraintlayout-compose:1.0.0") + implementation("androidx.compose.foundation:foundation:1.2.0-alpha05") //Accompanist implementation("com.google.accompanist:accompanist-systemuicontroller:0.24.2-alpha") - implementation("com.google.accompanist:accompanist-insets:0.24.2-alpha") implementation("com.google.accompanist:accompanist-flowlayout:0.24.2-alpha") //Tests diff --git a/app/src/main/java/ru/tech/firenote/MainActivity.kt b/app/src/main/java/ru/tech/firenote/MainActivity.kt index a315fd6..351b0c9 100644 --- a/app/src/main/java/ru/tech/firenote/MainActivity.kt +++ b/app/src/main/java/ru/tech/firenote/MainActivity.kt @@ -1,582 +1,34 @@ package ru.tech.firenote -import android.annotation.SuppressLint -import android.content.pm.ActivityInfo import android.os.Bundle -import android.widget.Toast.LENGTH_SHORT -import android.widget.Toast.makeText import androidx.activity.ComponentActivity -import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent -import androidx.activity.viewModels -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ExitToApp -import androidx.compose.material.icons.outlined.AddTask -import androidx.compose.material.icons.outlined.Edit -import androidx.compose.material.icons.outlined.Image -import androidx.compose.material.icons.rounded.ArrowBack -import androidx.compose.material.icons.rounded.Close -import androidx.compose.material.icons.rounded.Search -import androidx.compose.material.icons.twotone.FactCheck -import androidx.compose.material.icons.twotone.StickyNote2 -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.core.view.WindowCompat import androidx.navigation.compose.rememberNavController -import com.google.accompanist.insets.ProvideWindowInsets import dagger.hilt.android.AndroidEntryPoint -import ru.tech.firenote.ui.composable.navigation.Navigation -import ru.tech.firenote.ui.composable.provider.LocalSnackbarHost -import ru.tech.firenote.ui.composable.provider.LocalWindowSize -import ru.tech.firenote.ui.composable.screen.auth.AuthScreen -import ru.tech.firenote.ui.composable.screen.creation.GoalCreationScreen -import ru.tech.firenote.ui.composable.screen.creation.NoteCreationScreen -import ru.tech.firenote.ui.composable.single.MaterialDialog -import ru.tech.firenote.ui.composable.single.bar.* +import ru.tech.firenote.ui.composable.app.FirenoteApp import ru.tech.firenote.ui.composable.utils.WindowSize import ru.tech.firenote.ui.composable.utils.rememberWindowSizeClass -import ru.tech.firenote.ui.route.Screen -import ru.tech.firenote.ui.theme.FirenoteTheme -import ru.tech.firenote.viewModel.MainViewModel @AndroidEntryPoint class MainActivity : ComponentActivity() { - private val mainViewModel: MainViewModel by viewModels() - - @SuppressLint("SourceLockedOrientationActivity") - @OptIn(ExperimentalMaterial3Api::class) override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.Theme_Firenote) super.onCreate(savedInstanceState) - WindowCompat.setDecorFitsSystemWindows(window, false) + setContent { - val isScaffoldVisible by derivedStateOf { - !mainViewModel.showNoteCreation.currentState - || !mainViewModel.showNoteCreation.targetState - || !mainViewModel.showGoalCreation.currentState - || !mainViewModel.showGoalCreation.targetState - } val navController = rememberNavController() - val context = LocalContext.current - val windowSize = rememberWindowSizeClass() val splitScreen = windowSize != WindowSize.Compact - FirenoteTheme { - MaterialDialog( - showDialog = rememberSaveable { mutableStateOf(false) }, - icon = Icons.Filled.ExitToApp, - title = R.string.exitApp, - message = R.string.exitAppMessage, - confirmText = R.string.stay, - dismissText = R.string.close, - dismissAction = { finishAffinity() } - ) - if (mainViewModel.searchMode.value) BackHandler { - mainViewModel.searchMode.value = false - mainViewModel.searchString.value = "" - } - - ProvideWindowInsets { - val snackbarHostState = remember { SnackbarHostState() } - CompositionLocalProvider( - LocalSnackbarHost provides snackbarHostState, - LocalWindowSize provides windowSize - ) { - if (mainViewModel.isAuth.value) { - AuthScreen(mainViewModel.isAuth) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - } - else { - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - if (splitScreen) { - Row { - Scaffold( - topBar = { - AppBarWithInsets( - type = APP_BAR_CENTER, - navigationIcon = { - when (mainViewModel.selectedItem.value) { - 0 -> { - if (!mainViewModel.searchMode.value) { - IconButton(onClick = { - mainViewModel.searchMode - .value = true - mainViewModel.searchString.value = - "" - }) { - Icon(Icons.Rounded.Search, null) - } - } else { - IconButton(onClick = { - mainViewModel.searchMode - .value = false - mainViewModel.searchString.value = - "" - }) { - Icon( - Icons.Rounded.ArrowBack, - null - ) - } - } - } - 1 -> { - if (!mainViewModel.searchMode.value) { - IconButton(onClick = { - mainViewModel.searchMode - .value = true - mainViewModel.searchString.value = - "" - - }) { - Icon(Icons.Rounded.Search, null) - } - } else { - IconButton(onClick = { - mainViewModel.searchMode - .value = false - mainViewModel.searchString.value = - "" - }) { - Icon( - Icons.Rounded.ArrowBack, - null - ) - } - } - } - 2 -> { - IconButton(onClick = { - mainViewModel.showUsernameDialog.value = - true - }) { - Icon(Icons.Outlined.Edit, null) - } - } - } - }, - scrollBehavior = mainViewModel.scrollBehavior.value, - title = { - if (!mainViewModel.searchMode.value) { - Text( - text = if (mainViewModel.selectedItem.value == 2) mainViewModel.profileTitle.value - else stringResource(mainViewModel.title.value), - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } else { - val localFocusManager = - LocalFocusManager.current - BasicTextField( - modifier = Modifier.fillMaxWidth(), - value = mainViewModel.searchString.value, - textStyle = TextStyle( - fontSize = 22.sp, - color = MaterialTheme.colorScheme.onBackground, - textAlign = TextAlign.Start, - ), - keyboardActions = KeyboardActions( - onDone = { localFocusManager.clearFocus() } - ), - singleLine = true, - cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), - onValueChange = { - mainViewModel.searchString.value = - it - }) - if (mainViewModel.searchString.value.isEmpty()) { - Text( - text = stringResource(R.string.searchHere), - modifier = Modifier - .fillMaxWidth() - .padding(start = 12.dp), - style = TextStyle( - fontSize = 22.sp, - color = MaterialTheme.colorScheme.outline, - textAlign = TextAlign.Start, - ) - ) - } - } - }, - actions = { - if (!mainViewModel.searchMode.value) { - when (mainViewModel.selectedItem.value) { - 0 -> NoteActions(mainViewModel) - 1 -> GoalActions(mainViewModel) - 2 -> ProfileActions { - navController.navigate(Screen.NoteListScreen.route) { - navController.popBackStack() - launchSingleTop = true - } - makeText( - context, - R.string.seeYouAgain, - LENGTH_SHORT - ).show() - - mainViewModel.signOut() - } - } - } else { - IconButton(onClick = { - mainViewModel.searchString.value = "" - }) { - Icon(Icons.Rounded.Close, null) - } - } - } - ) - }, - floatingActionButton = { - ExtendedFloatingActionButton(onClick = { - when (mainViewModel.selectedItem.value) { - 0 -> { - mainViewModel.showNoteCreation.targetState = - true - mainViewModel.globalNote.value = null - - mainViewModel.showGoalCreation.targetState = - false - mainViewModel.globalGoal.value = null - } - 1 -> { - mainViewModel.showGoalCreation.targetState = - true - mainViewModel.globalGoal.value = null - - mainViewModel.showNoteCreation.targetState = - false - mainViewModel.globalNote.value = null - } - 2 -> mainViewModel.resultLauncher.value?.launch( - "image/*" - ) - } - }, icon = { - when (mainViewModel.selectedItem.value) { - 0 -> Icon(Icons.Outlined.Edit, null) - 1 -> Icon(Icons.Outlined.AddTask, null) - 2 -> Icon(Icons.Outlined.Image, null) - } - }, text = { - when (mainViewModel.selectedItem.value) { - 0 -> Text(stringResource(R.string.addNote)) - 1 -> Text(stringResource(R.string.makeGoal)) - 2 -> Text(stringResource(R.string.pickImage)) - } - }) - }, - bottomBar = { - BottomNavigationBar( - title = mainViewModel.title, - selectedItem = mainViewModel.selectedItem, - searchMode = mainViewModel.searchMode, - searchString = mainViewModel.searchString, - navController = navController, - items = listOf( - Screen.NoteListScreen, - Screen.GoalsScreen, - Screen.ProfileScreen - ), - alwaysShowLabel = false - ) - }, - snackbarHost = { SnackbarHost(LocalSnackbarHost.current) }, - modifier = Modifier - .nestedScroll(mainViewModel.scrollBehavior.value.nestedScrollConnection) - .weight(1f) - ) { contentPadding -> - Navigation(navController, contentPadding, mainViewModel) - } - Surface(modifier = Modifier.weight(1.5f)) { - Creation(mainViewModel, splitScreen) - } - } - } - else { - Scaffold( - topBar = { - AppBarWithInsets( - type = APP_BAR_CENTER, - navigationIcon = { - when (mainViewModel.selectedItem.value) { - 0 -> { - if (!mainViewModel.searchMode.value) { - IconButton(onClick = { - mainViewModel.searchMode - .value = true - mainViewModel.searchString.value = - "" - - }) { - Icon(Icons.Rounded.Search, null) - } - } else { - IconButton(onClick = { - mainViewModel.searchMode - .value = false - mainViewModel.searchString.value = - "" - }) { - Icon(Icons.Rounded.ArrowBack, null) - } - } - } - 1 -> { - if (!mainViewModel.searchMode.value) { - IconButton(onClick = { - mainViewModel.searchMode - .value = true - mainViewModel.searchString.value = - "" - - }) { - Icon(Icons.Rounded.Search, null) - } - } else { - IconButton(onClick = { - mainViewModel.searchMode - .value = false - mainViewModel.searchString.value = - "" - }) { - Icon(Icons.Rounded.ArrowBack, null) - } - } - } - 2 -> { - IconButton(onClick = { - mainViewModel.showUsernameDialog.value = - true - }) { - Icon(Icons.Outlined.Edit, null) - } - } - } - }, - scrollBehavior = mainViewModel.scrollBehavior.value, - title = { - if (!mainViewModel.searchMode.value) { - Text( - text = if (mainViewModel.selectedItem.value == 2) mainViewModel.profileTitle.value - else stringResource(mainViewModel.title.value), - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - } else { - val localFocusManager = - LocalFocusManager.current - BasicTextField( - modifier = Modifier.fillMaxWidth(), - value = mainViewModel.searchString.value, - textStyle = TextStyle( - fontSize = 22.sp, - color = MaterialTheme.colorScheme.onBackground, - textAlign = TextAlign.Start, - ), - keyboardActions = KeyboardActions( - onDone = { localFocusManager.clearFocus() } - ), - singleLine = true, - cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), - onValueChange = { - mainViewModel.searchString.value = it - }) - if (mainViewModel.searchString.value.isEmpty()) { - Text( - text = stringResource(R.string.searchHere), - modifier = Modifier - .fillMaxWidth() - .padding(start = 12.dp), - style = TextStyle( - fontSize = 22.sp, - color = MaterialTheme.colorScheme.outline, - textAlign = TextAlign.Start, - ) - ) - } - } - }, - actions = { - if (!mainViewModel.searchMode.value) { - when (mainViewModel.selectedItem.value) { - 0 -> NoteActions(mainViewModel) - 1 -> GoalActions(mainViewModel) - 2 -> ProfileActions { - navController.navigate(Screen.NoteListScreen.route) { - navController.popBackStack() - launchSingleTop = true - } - makeText( - context, - R.string.seeYouAgain, - LENGTH_SHORT - ).show() - - mainViewModel.signOut() - } - } - } else { - IconButton(onClick = { - mainViewModel.searchString.value = "" - }) { - Icon(Icons.Rounded.Close, null) - } - } - } - ) - }, - floatingActionButton = { - ExtendedFloatingActionButton(onClick = { - when (mainViewModel.selectedItem.value) { - 0 -> { - mainViewModel.showNoteCreation.targetState = - true - mainViewModel.globalNote.value = null - } - 1 -> { - mainViewModel.showGoalCreation.targetState = - true - mainViewModel.globalGoal.value = null - } - 2 -> mainViewModel.resultLauncher.value?.launch("image/*") - } - }, icon = { - when (mainViewModel.selectedItem.value) { - 0 -> Icon(Icons.Outlined.Edit, null) - 1 -> Icon(Icons.Outlined.AddTask, null) - 2 -> Icon(Icons.Outlined.Image, null) - } - }, text = { - when (mainViewModel.selectedItem.value) { - 0 -> Text(stringResource(R.string.addNote)) - 1 -> Text(stringResource(R.string.makeGoal)) - 2 -> Text(stringResource(R.string.pickImage)) - } - }) - }, - bottomBar = { - BottomNavigationBar( - title = mainViewModel.title, - selectedItem = mainViewModel.selectedItem, - searchMode = mainViewModel.searchMode, - searchString = mainViewModel.searchString, - navController = navController, - items = listOf( - Screen.NoteListScreen, - Screen.GoalsScreen, - Screen.ProfileScreen - ), - alwaysShowLabel = false - ) - }, - snackbarHost = { SnackbarHost(LocalSnackbarHost.current) }, - modifier = Modifier - .nestedScroll(mainViewModel.scrollBehavior.value.nestedScrollConnection) - .alpha(if (isScaffoldVisible) 1f else 0f) - ) { contentPadding -> - Navigation(navController, contentPadding, mainViewModel) - } - Creation(mainViewModel, splitScreen) - } - } - } - } - } - - } - } -} - -@Composable -fun Creation(mainViewModel: MainViewModel, splitScreen: Boolean) { - Box(Modifier.fillMaxSize()) { - if (!mainViewModel.showNoteCreation.currentState) { - mainViewModel.globalNote.value = null - if (splitScreen && mainViewModel.selectedItem.value == 0) { - Column( - modifier = Modifier - .fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon(Icons.TwoTone.StickyNote2, null, modifier = Modifier.fillMaxSize(0.3f)) - Text(stringResource(R.string.selectNote)) - } - } - } - if (!mainViewModel.showGoalCreation.currentState) { - mainViewModel.globalGoal.value = null - if (splitScreen && mainViewModel.selectedItem.value in 1..2) { - Column( - modifier = Modifier - .fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon(Icons.TwoTone.FactCheck, null, modifier = Modifier.fillMaxSize(0.3f)) - Text(stringResource(R.string.selectGoal)) - } - } - } - - AnimatedVisibility( - visibleState = mainViewModel.showNoteCreation, - enter = fadeIn(), - exit = fadeOut() - ) { - BackHandler { mainViewModel.showNoteCreation.targetState = false } - - NoteCreationScreen( - state = mainViewModel.showNoteCreation, - globalNote = mainViewModel.globalNote - ) - } - - AnimatedVisibility( - visibleState = mainViewModel.showGoalCreation, - enter = fadeIn(), - exit = fadeOut() - ) { - BackHandler { mainViewModel.showGoalCreation.targetState = false } - - GoalCreationScreen( - state = mainViewModel.showGoalCreation, - globalGoal = mainViewModel.globalGoal - ) - } - - if (splitScreen) { - Divider( - Modifier - .fillMaxHeight() - .width(1.dp) - .align(Alignment.CenterStart) + FirenoteApp( + context = this, + windowSize = windowSize, + splitScreen = splitScreen, + navController = navController ) } } diff --git a/app/src/main/java/ru/tech/firenote/di/AppModule.kt b/app/src/main/java/ru/tech/firenote/di/AppModule.kt index 516c693..1ca9e7e 100644 --- a/app/src/main/java/ru/tech/firenote/di/AppModule.kt +++ b/app/src/main/java/ru/tech/firenote/di/AppModule.kt @@ -29,7 +29,6 @@ object AppModule { fun provideNoteRepository( database: DatabaseReference, storage: StorageReference - ): NoteRepository = - NoteRepositoryImpl(database, storage) + ): NoteRepository = NoteRepositoryImpl(database, storage) } \ No newline at end of file diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/app/FirenoteApp.kt b/app/src/main/java/ru/tech/firenote/ui/composable/app/FirenoteApp.kt new file mode 100644 index 0000000..60abcf3 --- /dev/null +++ b/app/src/main/java/ru/tech/firenote/ui/composable/app/FirenoteApp.kt @@ -0,0 +1,99 @@ +package ru.tech.firenote.ui.composable.app + +import android.annotation.SuppressLint +import android.content.pm.ActivityInfo +import androidx.activity.ComponentActivity +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Row +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ExitToApp +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface +import androidx.compose.runtime.* +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavHostController +import ru.tech.firenote.R +import ru.tech.firenote.ui.composable.provider.LocalSnackbarHost +import ru.tech.firenote.ui.composable.provider.LocalWindowSize +import ru.tech.firenote.ui.composable.screen.auth.AuthScreen +import ru.tech.firenote.ui.composable.screen.creation.CreationContainer +import ru.tech.firenote.ui.composable.single.FirenoteScaffold +import ru.tech.firenote.ui.composable.single.MaterialDialog +import ru.tech.firenote.ui.composable.utils.WindowSize +import ru.tech.firenote.ui.theme.FirenoteTheme +import ru.tech.firenote.viewModel.MainViewModel + +@SuppressLint("SourceLockedOrientationActivity") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FirenoteApp( + context: ComponentActivity, + windowSize: WindowSize, + splitScreen: Boolean, + navController: NavHostController, + mainViewModel: MainViewModel = viewModel() +) { + + val isScaffoldVisible by derivedStateOf { + !mainViewModel.showNoteCreation.currentState + || !mainViewModel.showNoteCreation.targetState + || !mainViewModel.showGoalCreation.currentState + || !mainViewModel.showGoalCreation.targetState + } + + FirenoteTheme { + MaterialDialog( + showDialog = rememberSaveable { mutableStateOf(false) }, + icon = Icons.Filled.ExitToApp, + title = R.string.exitApp, + message = R.string.exitAppMessage, + confirmText = R.string.stay, + dismissText = R.string.close, + dismissAction = { context.finishAffinity() } + ) + if (mainViewModel.searchMode.value) BackHandler { + mainViewModel.searchMode.value = false + mainViewModel.searchString.value = "" + } + + + val snackbarHostState = remember { SnackbarHostState() } + CompositionLocalProvider( + LocalSnackbarHost provides snackbarHostState, + LocalWindowSize provides windowSize + ) { + if (mainViewModel.isAuth.value) { + AuthScreen(mainViewModel.isAuth) + context.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + } else { + context.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + if (splitScreen) { + Row { + FirenoteScaffold( + modifier = Modifier.weight(1f), + mainViewModel = mainViewModel, + navController = navController, + context = context + ) + Surface(modifier = Modifier.weight(1.5f)) { + CreationContainer(mainViewModel, splitScreen) + } + } + } else { + FirenoteScaffold( + modifier = Modifier.alpha(if (isScaffoldVisible) 1f else 0f), + mainViewModel = mainViewModel, + navController = navController, + context = context + ) + CreationContainer(mainViewModel, splitScreen) + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/CreationContainer.kt b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/CreationContainer.kt new file mode 100644 index 0000000..08e5510 --- /dev/null +++ b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/CreationContainer.kt @@ -0,0 +1,89 @@ +package ru.tech.firenote.ui.composable.screen.creation + +import androidx.activity.compose.BackHandler +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.foundation.layout.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.twotone.FactCheck +import androidx.compose.material.icons.twotone.StickyNote2 +import androidx.compose.material3.Divider +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import ru.tech.firenote.R +import ru.tech.firenote.viewModel.MainViewModel + +@Composable +fun CreationContainer(mainViewModel: MainViewModel, splitScreen: Boolean) { + Box(Modifier.fillMaxSize()) { + if (!mainViewModel.showNoteCreation.currentState) { + mainViewModel.globalNote.value = null + if (splitScreen && mainViewModel.selectedItem.value == 0) { + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon(Icons.TwoTone.StickyNote2, null, modifier = Modifier.fillMaxSize(0.3f)) + Text(stringResource(R.string.selectNote)) + } + } + } + if (!mainViewModel.showGoalCreation.currentState) { + mainViewModel.globalGoal.value = null + if (splitScreen && mainViewModel.selectedItem.value in 1..2) { + Column( + modifier = Modifier + .fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon(Icons.TwoTone.FactCheck, null, modifier = Modifier.fillMaxSize(0.3f)) + Text(stringResource(R.string.selectGoal)) + } + } + } + + AnimatedVisibility( + visibleState = mainViewModel.showNoteCreation, + enter = fadeIn(), + exit = fadeOut() + ) { + BackHandler { mainViewModel.showNoteCreation.targetState = false } + + NoteCreationScreen( + state = mainViewModel.showNoteCreation, + globalNote = mainViewModel.globalNote + ) + } + + AnimatedVisibility( + visibleState = mainViewModel.showGoalCreation, + enter = fadeIn(), + exit = fadeOut() + ) { + BackHandler { mainViewModel.showGoalCreation.targetState = false } + + GoalCreationScreen( + state = mainViewModel.showGoalCreation, + globalGoal = mainViewModel.globalGoal + ) + } + + if (splitScreen) { + Divider( + Modifier + .fillMaxHeight() + .width(1.dp) + .align(Alignment.CenterStart) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/GoalCreationScreen.kt b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/GoalCreationScreen.kt index 700d43a..06e0657 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/GoalCreationScreen.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/GoalCreationScreen.kt @@ -36,15 +36,14 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel -import com.google.accompanist.insets.navigationBarsPadding import kotlinx.coroutines.launch import ru.tech.firenote.R import ru.tech.firenote.model.Goal import ru.tech.firenote.model.GoalData -import ru.tech.firenote.ui.composable.single.bar.EditableAppBar import ru.tech.firenote.ui.composable.single.MaterialDialog +import ru.tech.firenote.ui.composable.single.bar.EditableAppBar import ru.tech.firenote.ui.theme.goalColors -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend import ru.tech.firenote.viewModel.GoalCreationViewModel @OptIn(ExperimentalMaterial3Api::class) @@ -298,7 +297,10 @@ fun GoalCreationScreen( .weight(1f) .padding(top = 12.dp) .clickable(remember { MutableInteractionSource() }, null) { - viewModel.updateDone(index, !(viewModel.goalContent.value[index].done ?: false)) + viewModel.updateDone( + index, + !(viewModel.goalContent.value[index].done ?: false) + ) }, style = TextStyle( fontSize = 22.sp, diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/NoteCreationScreen.kt b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/NoteCreationScreen.kt index 87ceda4..6845959 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/NoteCreationScreen.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/screen/creation/NoteCreationScreen.kt @@ -27,15 +27,14 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import com.google.accompanist.insets.navigationBarsPadding import kotlinx.coroutines.launch import ru.tech.firenote.R import ru.tech.firenote.model.Note -import ru.tech.firenote.ui.composable.single.text.EditText -import ru.tech.firenote.ui.composable.single.bar.EditableAppBar import ru.tech.firenote.ui.composable.single.MaterialDialog +import ru.tech.firenote.ui.composable.single.bar.EditableAppBar +import ru.tech.firenote.ui.composable.single.text.EditText import ru.tech.firenote.ui.theme.noteColors -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend import ru.tech.firenote.viewModel.NoteCreationViewModel @OptIn(ExperimentalMaterial3Api::class) diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/FirenoteScaffold.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/FirenoteScaffold.kt new file mode 100644 index 0000000..31a045d --- /dev/null +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/FirenoteScaffold.kt @@ -0,0 +1,224 @@ +package ru.tech.firenote.ui.composable.single + +import android.content.Context +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.AddTask +import androidx.compose.material.icons.outlined.Edit +import androidx.compose.material.icons.outlined.Image +import androidx.compose.material.icons.rounded.ArrowBack +import androidx.compose.material.icons.rounded.Close +import androidx.compose.material.icons.rounded.Search +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController +import ru.tech.firenote.R +import ru.tech.firenote.ui.composable.navigation.Navigation +import ru.tech.firenote.ui.composable.provider.LocalSnackbarHost +import ru.tech.firenote.ui.composable.single.bar.* +import ru.tech.firenote.ui.route.Screen +import ru.tech.firenote.viewModel.MainViewModel + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FirenoteScaffold( + modifier: Modifier = Modifier, + mainViewModel: MainViewModel, + navController: NavHostController, + context: Context +) { + Scaffold( + topBar = { + AppBarWithInsets( + type = APP_BAR_CENTER, + navigationIcon = { + when (mainViewModel.selectedItem.value) { + 0 -> { + if (!mainViewModel.searchMode.value) { + IconButton(onClick = { + mainViewModel.searchMode + .value = true + mainViewModel.searchString.value = + "" + + }) { + Icon(Icons.Rounded.Search, null) + } + } else { + IconButton(onClick = { + mainViewModel.searchMode + .value = false + mainViewModel.searchString.value = + "" + }) { + Icon(Icons.Rounded.ArrowBack, null) + } + } + } + 1 -> { + if (!mainViewModel.searchMode.value) { + IconButton(onClick = { + mainViewModel.searchMode + .value = true + mainViewModel.searchString.value = + "" + + }) { + Icon(Icons.Rounded.Search, null) + } + } else { + IconButton(onClick = { + mainViewModel.searchMode + .value = false + mainViewModel.searchString.value = + "" + }) { + Icon(Icons.Rounded.ArrowBack, null) + } + } + } + 2 -> { + IconButton(onClick = { + mainViewModel.showUsernameDialog.value = + true + }) { + Icon(Icons.Outlined.Edit, null) + } + } + } + }, + scrollBehavior = mainViewModel.scrollBehavior.value, + title = { + if (!mainViewModel.searchMode.value) { + Text( + text = if (mainViewModel.selectedItem.value == 2) mainViewModel.profileTitle.value + else stringResource(mainViewModel.title.value), + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } else { + val localFocusManager = + LocalFocusManager.current + BasicTextField( + modifier = Modifier.fillMaxWidth(), + value = mainViewModel.searchString.value, + textStyle = TextStyle( + fontSize = 22.sp, + color = MaterialTheme.colorScheme.onBackground, + textAlign = TextAlign.Start, + ), + keyboardActions = KeyboardActions( + onDone = { localFocusManager.clearFocus() } + ), + singleLine = true, + cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), + onValueChange = { + mainViewModel.searchString.value = it + }) + if (mainViewModel.searchString.value.isEmpty()) { + Text( + text = stringResource(R.string.searchHere), + modifier = Modifier + .fillMaxWidth() + .padding(start = 12.dp), + style = TextStyle( + fontSize = 22.sp, + color = MaterialTheme.colorScheme.outline, + textAlign = TextAlign.Start, + ) + ) + } + } + }, + actions = { + if (!mainViewModel.searchMode.value) { + when (mainViewModel.selectedItem.value) { + 0 -> NoteActions(mainViewModel) + 1 -> GoalActions(mainViewModel) + 2 -> ProfileActions { + navController.navigate(Screen.NoteListScreen.route) { + navController.popBackStack() + launchSingleTop = true + } + android.widget.Toast.makeText( + context, + R.string.seeYouAgain, + android.widget.Toast.LENGTH_SHORT + ).show() + + mainViewModel.signOut() + } + } + } else { + IconButton(onClick = { + mainViewModel.searchString.value = "" + }) { + Icon(Icons.Rounded.Close, null) + } + } + } + ) + }, + floatingActionButton = { + ExtendedFloatingActionButton(onClick = { + when (mainViewModel.selectedItem.value) { + 0 -> { + mainViewModel.showNoteCreation.targetState = + true + mainViewModel.globalNote.value = null + } + 1 -> { + mainViewModel.showGoalCreation.targetState = + true + mainViewModel.globalGoal.value = null + } + 2 -> mainViewModel.resultLauncher.value?.launch("image/*") + } + }, icon = { + when (mainViewModel.selectedItem.value) { + 0 -> Icon(Icons.Outlined.Edit, null) + 1 -> Icon(Icons.Outlined.AddTask, null) + 2 -> Icon(Icons.Outlined.Image, null) + } + }, text = { + when (mainViewModel.selectedItem.value) { + 0 -> Text(stringResource(R.string.addNote)) + 1 -> Text(stringResource(R.string.makeGoal)) + 2 -> Text(stringResource(R.string.pickImage)) + } + }) + }, + bottomBar = { + BottomNavigationBar( + title = mainViewModel.title, + selectedItem = mainViewModel.selectedItem, + searchMode = mainViewModel.searchMode, + searchString = mainViewModel.searchString, + navController = navController, + items = listOf( + Screen.NoteListScreen, + Screen.GoalsScreen, + Screen.ProfileScreen + ), + alwaysShowLabel = false + ) + }, + snackbarHost = { SnackbarHost(LocalSnackbarHost.current) }, + modifier = modifier.nestedScroll(mainViewModel.scrollBehavior.value.nestedScrollConnection) + ) { contentPadding -> + Navigation(navController, contentPadding, mainViewModel) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/MaterialDialog.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/MaterialDialog.kt index defbd49..ceee751 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/MaterialDialog.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/MaterialDialog.kt @@ -12,6 +12,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign @Composable fun MaterialDialog( @@ -28,9 +29,9 @@ fun MaterialDialog( ) { if (showDialog.value) { AlertDialog( - icon = { Icon(icon, contentDescription = null) }, + icon = { Icon(icon, null) }, title = { Text(title) }, - text = { Text(message) }, + text = { Text(message, textAlign = TextAlign.Center) }, confirmButton = { TextButton(onClick = { confirmAction() @@ -73,9 +74,9 @@ fun MaterialDialog( if (showDialog.value) { AlertDialog( - icon = { Icon(icon, contentDescription = null) }, + icon = { Icon(icon, null) }, title = { Text(stringResource(title)) }, - text = { Text(stringResource(message)) }, + text = { Text(stringResource(message), textAlign = TextAlign.Center) }, confirmButton = { TextButton(onClick = { confirmAction() diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarActions.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarActions.kt index 77ed801..452abfd 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarActions.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarActions.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import ru.tech.firenote.R import ru.tech.firenote.ui.composable.single.MaterialDialog -import ru.tech.firenote.utils.Utils.isOnline +import ru.tech.firenote.utils.GlobalUtils.isOnline import ru.tech.firenote.viewModel.MainViewModel @Composable diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarWithInsets.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarWithInsets.kt index 0c92165..95585ad 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarWithInsets.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/AppBarWithInsets.kt @@ -2,11 +2,11 @@ package ru.tech.firenote.ui.composable.single.bar import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import com.google.accompanist.insets.statusBarsPadding @Composable fun AppBarWithInsets( diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/BottomNavigationBar.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/BottomNavigationBar.kt index a37d249..f99f9e6 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/BottomNavigationBar.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/BottomNavigationBar.kt @@ -21,7 +21,6 @@ fun BottomNavigationBar( ) { Surface(color = TopAppBarDefaults.smallTopAppBarColors().containerColor(100f).value) { NavigationBar(modifier = Modifier.navigationBarsPadding()) { - items.forEachIndexed { index, screen -> selectedItem.value = diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/EditableAppBar.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/EditableAppBar.kt index b415568..9e69e7b 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/EditableAppBar.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/bar/EditableAppBar.kt @@ -2,6 +2,7 @@ package ru.tech.firenote.ui.composable.single.bar import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState @@ -9,7 +10,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb -import com.google.accompanist.insets.statusBarsPadding import ru.tech.firenote.ui.composable.single.text.EditText @Composable diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/NoteItem.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/NoteItem.kt index ad446ed..4de5eaf 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/NoteItem.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/NoteItem.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.unit.dp import ru.tech.firenote.model.Note import ru.tech.firenote.ui.composable.provider.LocalWindowSize import ru.tech.firenote.ui.composable.utils.WindowSize -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/ProfileNoteItem.kt b/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/ProfileNoteItem.kt index 1ab1556..866cc69 100644 --- a/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/ProfileNoteItem.kt +++ b/app/src/main/java/ru/tech/firenote/ui/composable/single/lazyitem/ProfileNoteItem.kt @@ -20,7 +20,7 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend @Composable fun ProfileNoteItem( diff --git a/app/src/main/java/ru/tech/firenote/ui/theme/Color.kt b/app/src/main/java/ru/tech/firenote/ui/theme/Color.kt index 1a9879a..bd87b04 100644 --- a/app/src/main/java/ru/tech/firenote/ui/theme/Color.kt +++ b/app/src/main/java/ru/tech/firenote/ui/theme/Color.kt @@ -109,59 +109,4 @@ val md_theme_dark_onSurfaceVariant = Color(0xFFd5c1c6) val md_theme_dark_outline = Color(0xFF9d8c90) val md_theme_dark_inverseOnSurface = Color(0xFF1f1a1b) val md_theme_dark_inverseSurface = Color(0xFFebdfe1) -val md_theme_dark_inversePrimary = Color(0xFF984065) - - -/* val md_theme_light_primary = Color(0xFF006e06) -val md_theme_light_onPrimary = Color(0xFFffffff) -val md_theme_light_primaryContainer = Color(0xFF6eff6a) -val md_theme_light_onPrimaryContainer = Color(0xFF002200) -val md_theme_light_secondary = Color(0xFF606200) -val md_theme_light_onSecondary = Color(0xFFffffff) -val md_theme_light_secondaryContainer = Color(0xFFe6e972) -val md_theme_light_onSecondaryContainer = Color(0xFF1c1d00) -val md_theme_light_tertiary = Color(0xFF006b5f) -val md_theme_light_onTertiary = Color(0xFFffffff) -val md_theme_light_tertiaryContainer = Color(0xFF75f8e4) -val md_theme_light_onTertiaryContainer = Color(0xFF00201b) -val md_theme_light_error = Color(0xFFB3261E) -val md_theme_light_errorContainer = Color(0xFFF9DEDC) -val md_theme_light_onError = Color(0xFFFFFFFF) -val md_theme_light_onErrorContainer = Color(0xFF410E0B) -val md_theme_light_background = Color(0xFFFFFBFE) -val md_theme_light_onBackground = Color(0xFF1C1B1F) -val md_theme_light_surface = Color(0xFFFFFBFE) -val md_theme_light_onSurface = Color(0xFF1C1B1F) -val md_theme_light_surfaceVariant = Color(0xFFE7E0EC) -val md_theme_light_onSurfaceVariant = Color(0xFF49454F) -val md_theme_light_outline = Color(0xFF79747E) -val md_theme_light_inverseOnSurface = Color(0xFFF4EFF4) -val md_theme_light_inverseSurface = Color(0xFF313033) -val md_theme_light_inversePrimary = Color(0xFF00e620) - -val md_theme_dark_primary = Color(0xFF00e620) -val md_theme_dark_onPrimary = Color(0xFF003a01) -val md_theme_dark_primaryContainer = Color(0xFF005303) -val md_theme_dark_onPrimaryContainer = Color(0xFF6eff6a) -val md_theme_dark_secondary = Color(0xFFcacd59) -val md_theme_dark_onSecondary = Color(0xFF313300) -val md_theme_dark_secondaryContainer = Color(0xFF474a00) -val md_theme_dark_onSecondaryContainer = Color(0xFFe6e972) -val md_theme_dark_tertiary = Color(0xFF54dbc8) -val md_theme_dark_onTertiary = Color(0xFF003730) -val md_theme_dark_tertiaryContainer = Color(0xFF005046) -val md_theme_dark_onTertiaryContainer = Color(0xFF75f8e4) -val md_theme_dark_error = Color(0xFFF2B8B5) -val md_theme_dark_errorContainer = Color(0xFF8C1D18) -val md_theme_dark_onError = Color(0xFF601410) -val md_theme_dark_onErrorContainer = Color(0xFFF9DEDC) -val md_theme_dark_background = Color(0xFF1C1B1F) -val md_theme_dark_onBackground = Color(0xFFE6E1E5) -val md_theme_dark_surface = Color(0xFF1C1B1F) -val md_theme_dark_onSurface = Color(0xFFE6E1E5) -val md_theme_dark_surfaceVariant = Color(0xFF49454F) -val md_theme_dark_onSurfaceVariant = Color(0xFFCAC4D0) -val md_theme_dark_outline = Color(0xFF938F99) -val md_theme_dark_inverseOnSurface = Color(0xFF1C1B1F) -val md_theme_dark_inverseSurface = Color(0xFFE6E1E5) -val md_theme_dark_inversePrimary = Color(0xFF006e06) */ \ No newline at end of file +val md_theme_dark_inversePrimary = Color(0xFF984065) \ No newline at end of file diff --git a/app/src/main/java/ru/tech/firenote/utils/Utils.kt b/app/src/main/java/ru/tech/firenote/utils/GlobalUtils.kt similarity index 98% rename from app/src/main/java/ru/tech/firenote/utils/Utils.kt rename to app/src/main/java/ru/tech/firenote/utils/GlobalUtils.kt index 934b575..f40b84e 100644 --- a/app/src/main/java/ru/tech/firenote/utils/Utils.kt +++ b/app/src/main/java/ru/tech/firenote/utils/GlobalUtils.kt @@ -7,7 +7,7 @@ import android.net.NetworkCapabilities import android.os.Build import androidx.core.graphics.ColorUtils -object Utils { +object GlobalUtils { fun Int.blend(ratio: Float = 0.2f, with: Int = 0x000000) = ColorUtils.blendARGB(this, with, ratio) diff --git a/app/src/main/java/ru/tech/firenote/viewModel/GoalCreationViewModel.kt b/app/src/main/java/ru/tech/firenote/viewModel/GoalCreationViewModel.kt index 2dc37dc..cdbb4f0 100644 --- a/app/src/main/java/ru/tech/firenote/viewModel/GoalCreationViewModel.kt +++ b/app/src/main/java/ru/tech/firenote/viewModel/GoalCreationViewModel.kt @@ -11,7 +11,7 @@ import ru.tech.firenote.model.GoalData import ru.tech.firenote.repository.NoteRepository import ru.tech.firenote.ui.theme.GoalGreen import ru.tech.firenote.ui.theme.NoteYellow -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/java/ru/tech/firenote/viewModel/NoteCreationViewModel.kt b/app/src/main/java/ru/tech/firenote/viewModel/NoteCreationViewModel.kt index a9e3945..e8d32bf 100644 --- a/app/src/main/java/ru/tech/firenote/viewModel/NoteCreationViewModel.kt +++ b/app/src/main/java/ru/tech/firenote/viewModel/NoteCreationViewModel.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.launch import ru.tech.firenote.model.Note import ru.tech.firenote.repository.NoteRepository import ru.tech.firenote.ui.theme.NoteYellow -import ru.tech.firenote.utils.Utils.blend +import ru.tech.firenote.utils.GlobalUtils.blend import javax.inject.Inject @HiltViewModel diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index bae700f..20c5aad 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -70,7 +70,7 @@ Введите заголовок Добавить подзадачу Введите подзадачу - Прохождение + Выполненность Ищите тут Ничего не найдено по вашему запросу \ No newline at end of file