Прокинут во всех экранах стейт скаффолда

This commit is contained in:
Michael Kits
2023-01-07 15:23:14 +03:00
parent df6d85786b
commit 2527cae931
15 changed files with 484 additions and 164 deletions
-17
View File
@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="2a40cdac1f0d7ece" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-01-05T19:44:17.771649600Z" />
</component>
</project>
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17_PREVIEW" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
+1
View File
@@ -66,4 +66,5 @@ dependencies {
implementation "androidx.compose.runtime:runtime-livedata:$compose_version" implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
implementation "androidx.compose.material:material-icons-extended:$compose_version" implementation "androidx.compose.material:material-icons-extended:$compose_version"
implementation "com.google.accompanist:accompanist-swiperefresh:0.23.0" implementation "com.google.accompanist:accompanist-swiperefresh:0.23.0"
implementation "com.google.accompanist:accompanist-navigation-animation:0.24.1-alpha"
} }
+1
View File
@@ -17,6 +17,7 @@
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:theme="@style/Theme.MyDnevnik" android:theme="@style/Theme.MyDnevnik"
android:screenOrientation="fullSensor"
android:windowSoftInputMode="adjustResize"> android:windowSoftInputMode="adjustResize">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@@ -5,12 +5,24 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.graphics.scale
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import ru.megboyzz.dnevnik.navigation.AppNavRoute
@Composable @Composable
fun Int.AsPainter() = painterResource(this) fun Int.AsPainter() = painterResource(this)
@@ -27,3 +39,66 @@ fun SpacerHeight(height: Dp) = Spacer(Modifier.height(height))
@Composable @Composable
fun Int.AsImageVector() = ImageVector.vectorResource(this) fun Int.AsImageVector() = ImageVector.vectorResource(this)
@Composable
fun NavController.navigate(to: AppNavRoute){
LaunchedEffect(Unit) {
navigate(to.route) {
popUpTo(to.route) { inclusive = true }
}
}
}
fun Modifier.drawColoredShadow(
color: Color = Color.Black,
alpha: Float = 0.07f,
borderRadius: Dp = 0.dp,
offsetX: Dp = 0.dp,
offsetY: Dp = 0.dp,
blurRadius: Dp = 7.dp,
spread: Dp = 0.dp,
enabled: Boolean = true,
) = if(enabled) {
this.drawBehind {
val transparentColor = color.copy(alpha = 0.0f).toArgb()
val shadowColor = color.copy(alpha = alpha).toArgb()
this.drawIntoCanvas {
val paint = Paint()
val frameworkPaint = paint.asFrameworkPaint()
frameworkPaint.color = transparentColor
frameworkPaint.setShadowLayer(
blurRadius.toPx(),
offsetX.toPx(),
offsetY.toPx(),
shadowColor
)
it.save()
if(spread.value > 0) {
fun calcSpreadScale(spread: Float, childSize: Float): Float {
return 1f + ((spread / childSize) * 2f)
}
it.scale(
calcSpreadScale(spread.toPx(), this.size.width),
calcSpreadScale(spread.toPx(), this.size.height),
this.center.x,
this.center.y
)
}
it.drawRoundRect(
0f,
0f,
this.size.width,
this.size.height,
borderRadius.toPx(),
borderRadius.toPx(),
paint
)
it.restore()
}
}
} else {
this
}
@@ -1,12 +1,25 @@
package ru.megboyzz.dnevnik.navigation package ru.megboyzz.dnevnik.navigation
import android.window.SplashScreen import android.window.SplashScreen
import androidx.compose.animation.*
import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.tween
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.IntOffset
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.animation.AnimatedNavHost
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import ru.megboyzz.dnevnik.screens.HomeWorkScreen
import ru.megboyzz.dnevnik.screens.LoginScreen
import ru.megboyzz.dnevnik.screens.MarksScreen
import ru.megboyzz.dnevnik.screens.ScheduleScreen
sealed class AppNavRoute(val route: String){ sealed class AppNavRoute(val route: String){
@@ -20,9 +33,9 @@ sealed class AppNavRoute(val route: String){
object Settings: AppNavRoute("settings_screen") object Settings: AppNavRoute("settings_screen")
} }
@OptIn(ExperimentalAnimationApi::class)
@Composable @Composable
fun AppNavHost(){ fun AppNavHost(){
val navController = rememberNavController()
/*val activity = LocalContext.current as MainActivity /*val activity = LocalContext.current as MainActivity
@@ -30,14 +43,19 @@ fun AppNavHost(){
val viewModel: AppViewModel = viewModel(factory = AppViewModelFactory(application))*/ val viewModel: AppViewModel = viewModel(factory = AppViewModelFactory(application))*/
val scaffoldState = rememberScaffoldState()
val navController = rememberAnimatedNavController()
NavHost( NavHost(
navController = navController, navController = navController,
startDestination = AppNavRoute.Splash.route startDestination = AppNavRoute.Login.route /* сделать проверку куки файлов */
){ ){
composable(AppNavRoute.Splash.route) { } composable(AppNavRoute.Splash.route) { }
composable(AppNavRoute.Marks.route) { } composable(AppNavRoute.Login.route) { LoginScreen(navController) }
composable(AppNavRoute.Schedule.route) { } composable(AppNavRoute.Marks.route) { MarksScreen(navController, scaffoldState) }
composable(AppNavRoute.HomeWorks.route) { } composable(AppNavRoute.Schedule.route) { ScheduleScreen(navController, scaffoldState) }
composable(AppNavRoute.HomeWorks.route) { HomeWorkScreen(navController, scaffoldState) }
composable(AppNavRoute.Settings.route) { } composable(AppNavRoute.Settings.route) { }
} }
} }
@@ -1,14 +1,12 @@
package ru.megboyzz.dnevnik.screens package ru.megboyzz.dnevnik.screens
import android.annotation.SuppressLint
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
import androidx.compose.animation.expandHorizontally import androidx.compose.animation.expandHorizontally
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideInHorizontally
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.*
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
@@ -22,6 +20,8 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.focus.onFocusChanged
@@ -33,6 +33,8 @@ import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.modifier.modifierLocalConsumer
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
@@ -42,9 +44,12 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.* import androidx.compose.ui.unit.*
import androidx.constraintlayout.compose.Visibility import androidx.constraintlayout.compose.Visibility
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import ru.megboyzz.dnevnik.* import ru.megboyzz.dnevnik.*
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.navigation.AppNavRoute
import ru.megboyzz.dnevnik.ui.theme.* import ru.megboyzz.dnevnik.ui.theme.*
@Composable @Composable
@@ -52,9 +57,10 @@ fun MainScaffold(
icon: Painter, icon: Painter,
title: String, title: String,
/* TODO viewModel */ /* TODO viewModel */
content: (@Composable (it: PaddingValues) -> Unit) navController: NavController,
scaffoldState: ScaffoldState,
content: (@Composable (it: PaddingValues) -> Unit),
) { ) {
val scaffoldState = rememberScaffoldState()
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
Scaffold( Scaffold(
scaffoldState = scaffoldState, scaffoldState = scaffoldState,
@@ -87,14 +93,146 @@ fun MainScaffold(
drawerBackgroundColor = mainBlue, drawerBackgroundColor = mainBlue,
drawerContentColor = white, drawerContentColor = white,
drawerShape = drawerShape, drawerShape = drawerShape,
drawerContent = { DrawerContent() } drawerContent = { DrawerContent(navController, scaffoldState) },
bottomBar = { BottomBar(navController) }
) )
} }
@Composable
fun BottomBar(navController: NavController) {
//Box(Modifier.fillMaxWidth().height(90.dp).shadow(8.dp))
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
val goToMarks = remember { mutableStateOf(false) }
val goToHw = remember { mutableStateOf(false) }
val goToSchedule = remember { mutableStateOf(false) }
if(goToMarks.value){
navController.navigate(AppNavRoute.Marks)
//goToMarks.value = false
}
if(goToHw.value){
navController.navigate(AppNavRoute.HomeWorks)
//goToHw.value = false
}
if(goToSchedule.value){
navController.navigate(AppNavRoute.Schedule)
//goToSchedule.value = false
}
Box(
modifier = Modifier
.fillMaxWidth()
.height(90.dp)
.background(white)
.padding(10.dp, 10.dp, 10.dp, 15.dp),
){
Box(
Modifier
.fillMaxSize()
.clip(RoundedCornerShape(20.dp))
.background(mainBlue)
){
Row(
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxSize()
) {
BottomNavButton(
icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString()
) { goToMarks.value = true }
BottomNavButton(
icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString()
) { goToHw.value = true }
BottomNavButton(
icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString()
) { goToSchedule.value = true }
}
}
}
}
@Composable @Composable
fun DrawerContent() { fun BottomNavButton(
icon: Painter,
text: String,
color: Color = white,
onClick: () -> Unit,
) {
Column(
Modifier
.clickable(onClick = onClick),
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = icon,
contentDescription = "",
modifier = Modifier.padding(5.dp)
)
Text(
text = text,
style = MainText,
color = color
)
}
}
@Preview
@Composable
fun BottomNavButtonPrev() {
Row(horizontalArrangement = Arrangement.spacedBy(20.dp)) {
BottomNavButton(
icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString()
) { /* TODO*/ }
BottomNavButton(
icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString()
) { /* TODO*/ }
BottomNavButton(
icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString()
) { /* TODO*/ }
}
}
@Preview
@Composable
fun BottomBarPrev() {
val navController = rememberNavController()
BottomBar(navController = navController)
}
@SuppressLint("CoroutineCreationDuringComposition")
@Composable
fun DrawerContent(
navController: NavController,
scaffoldState: ScaffoldState
) {
// УЖАСНЫЙ КОСТЫЛЬ ДЛЯ ПЕРЕХОДОВ С ПОМОЩЬЮ СТЕЙТОВ TODO - УБРАТЬ
val goToMarks = remember { mutableStateOf(false) }
val goToHw = remember { mutableStateOf(false) }
val goToSchedule = remember { mutableStateOf(false) }
val scope = rememberCoroutineScope()
if(goToMarks.value){
navController.navigate(AppNavRoute.Marks)
scope.launch { scaffoldState.drawerState.close() }
}
if(goToHw.value){
navController.navigate(AppNavRoute.HomeWorks)
scope.launch { scaffoldState.drawerState.close() }
}
if(goToSchedule.value){
navController.navigate(AppNavRoute.Schedule)
scope.launch { scaffoldState.drawerState.close() }
}
Column( Column(
modifier = Modifier modifier = Modifier
.width(260.dp) .width(260.dp)
@@ -114,15 +252,15 @@ fun DrawerContent() {
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_marks.AsPainter(), icon = R.drawable.ic_marks.AsPainter(),
text = R.string.title_marks.AsString() text = R.string.title_marks.AsString()
) { /* TODO */ } ) { goToMarks.value = true }
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_homework.AsPainter(), icon = R.drawable.ic_homework.AsPainter(),
text = R.string.title_hw.AsString() text = R.string.title_hw.AsString()
) { /* TODO */ } ) { goToHw.value = true }
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_schedule.AsPainter(), icon = R.drawable.ic_schedule.AsPainter(),
text = R.string.title_schedule.AsString() text = R.string.title_schedule.AsString()
) { /* TODO */ } ) { goToSchedule.value = true }
DrawerMainButton( DrawerMainButton(
icon = R.drawable.ic_settings.AsPainter(), icon = R.drawable.ic_settings.AsPainter(),
text = R.string.title_settings.AsString() text = R.string.title_settings.AsString()
@@ -232,7 +370,19 @@ fun LoginBackground() {
alignment = Alignment.TopStart alignment = Alignment.TopStart
) )
} }
}
@Composable
fun BigLoginBackground() {
val icon = R.drawable.header_big.AsPainter()
Column(Modifier.fillMaxWidth()) {
Image(
painter = icon,
contentDescription = "",
modifier = Modifier.fillMaxWidth(),
alignment = Alignment.TopStart
)
}
} }
@@ -300,7 +450,8 @@ fun MainTextField(
.onFocusChanged { .onFocusChanged {
if (it.isFocused) if (it.isFocused)
if (isError.value) isError.value = false if (isError.value) isError.value = false
}, }
.fillMaxWidth(),
) )
} }
@@ -352,28 +503,6 @@ fun ButtonPrev() {
) )
} }
@Preview
@Composable
fun DrawerPrev() {
Surface(
color = mainBlue
) {
DrawerContent()
}
}
@Preview
@Composable
fun MainScaffoldPrev() {
MainScaffold(
icon = R.drawable.ic_marks.AsPainter(),
title = R.string.title_marks.AsString()
) {
}
}
@Preview @Preview
@Composable @Composable
fun CheckBoxed() { fun CheckBoxed() {
@@ -417,7 +546,7 @@ fun MainCheckbox(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
size: Float = 24f, size: Float = 24f,
checkedColor: Color = mainBlue, checkedColor: Color = mainBlue,
uncheckedColor: Color = white, uncheckedColor: Color = lightGray,
checkmarkColor: Color = white, checkmarkColor: Color = white,
onValueChange: () -> Unit onValueChange: () -> Unit
) { ) {
@@ -492,3 +621,112 @@ fun MainButton(
) )
} }
} }
@Composable
fun LoginScreenContent(
login: MutableState<String>,
password: MutableState<String>,
isError: MutableState<Boolean>,
isRememberMe: MutableState<Boolean>,
onSignIn: () -> Unit,
onSignUp: () -> Unit,
onForgetPassword: () -> Unit
) {
val configuration = LocalConfiguration.current
val screenWidth = configuration.screenWidthDp
var defaultPadding = 65.dp
val isNormal = screenWidth < 500
Box(Modifier.fillMaxSize()) {
if(!isNormal) BigLoginBackground()
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxWidth()
) {
if (isNormal) LoginBackground()
else {
defaultPadding *= 4
}
Row(horizontalArrangement = Arrangement.Center) {
Text(
text = R.string.title_welcome.AsString(),
style = Big,
textAlign = TextAlign.Center,
modifier = Modifier.padding(defaultPadding, 20.dp, defaultPadding, 40.dp),
color = dark
)
}
Column(
modifier = Modifier.padding(defaultPadding, 0.dp)
) {
Column(Modifier.fillMaxWidth()) {
MainTextField(
value = login,
label = R.string.title_login.AsString(),
isError = isError
)
SpacerHeight(15.dp)
MainTextField(
value = password,
keyboardType = KeyboardType.Password,
label = R.string.title_password.AsString(),
isError = isError
)
}
SpacerHeight(5.dp)
Row(
modifier = Modifier
.fillMaxWidth()
.height(30.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier.fillMaxHeight(),
verticalAlignment = Alignment.CenterVertically
) {
MainCheckbox(isRememberMe) { }
SpacerWidth(5.dp)
Text(
text = R.string.title_remember_me.AsString(),
style = MainText,
color = dark
)
}
Text(
text = R.string.title_forget_password.AsString(),
style = MainText,
color = dark,
modifier = Modifier.clickable(onClick = onForgetPassword)
)
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(0.dp, 10.dp),
verticalArrangement = Arrangement.Center
) {
MainButton(
text = R.string.title_sign_in.AsString(),
onClick = onSignIn
)
SpacerHeight(5.dp)
Text(
text = R.string.title_sign_up.AsString(),
modifier = Modifier
.clickable(onClick = onSignUp)
.padding(5.dp)
.fillMaxWidth(),
textAlign = TextAlign.Center,
style = Mini,
color = dark
)
}
}
}
}
}
@@ -0,0 +1,23 @@
package ru.megboyzz.dnevnik.screens
import androidx.compose.material.ScaffoldState
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R
@Composable
fun HomeWorkScreen(
navController: NavController,
scaffoldState: ScaffoldState
) {
MainScaffold(
icon = R.drawable.ic_homework.AsPainter(),
title = R.string.title_hw.AsString(),
navController = navController,
scaffoldState = scaffoldState
) {
}
}
@@ -1,35 +1,28 @@
package ru.megboyzz.dnevnik.screens package ru.megboyzz.dnevnik.screens
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.modifier.modifierLocalOf
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.textInputServiceFactory
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsString import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.SpacerHeight import ru.megboyzz.dnevnik.SpacerHeight
import ru.megboyzz.dnevnik.SpacerWidth import ru.megboyzz.dnevnik.SpacerWidth
import ru.megboyzz.dnevnik.navigation.AppNavRoute
import ru.megboyzz.dnevnik.ui.theme.* import ru.megboyzz.dnevnik.ui.theme.*
@Composable @Composable
fun LoginScreen() { fun LoginScreen(navController: NavController) {
val login = remember { val login = remember {
mutableStateOf("") mutableStateOf("")
@@ -37,97 +30,20 @@ fun LoginScreen() {
val password = remember { val password = remember {
mutableStateOf("") mutableStateOf("")
} }
val isError = remember {
val configuration = LocalConfiguration.current mutableStateOf(false)
val screenHeight = configuration.screenHeightDp
val screenWidth = configuration.screenWidthDp
val defaultModifier = Modifier.width(500.dp)
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = defaultModifier
) {
if(screenWidth < 500)
LoginBackground()
else{
defaultModifier.then(Modifier.fillMaxWidth())
} }
Row(horizontalArrangement = Arrangement.Center) { val rememberMe = remember {
Text( mutableStateOf(false)
text = R.string.title_welcome.AsString(),
style = Big,
textAlign = TextAlign.Center,
modifier = Modifier.padding(65.dp, 20.dp, 65.dp, 40.dp)
)
}
MainTextField(
value = login,
label = R.string.title_login.AsString()
)
SpacerHeight(15.dp)
MainTextField(
value = password,
keyboardType = KeyboardType.Password,
label = R.string.title_password.AsString()
)
Row(
modifier = Modifier
.fillMaxWidth()
.padding(65.dp, 10.dp)
.height(30.dp),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Row(
modifier = Modifier.fillMaxHeight(),
verticalAlignment = Alignment.CenterVertically
) {
val checkedState = remember { mutableStateOf(true) }
MainCheckbox(checkedState) { /* TODO */ }
SpacerWidth(5.dp)
Text(
text = R.string.title_remember_me.AsString(),
style = MainText,
color = dark
)
}
Text(
text = R.string.title_forget_password.AsString(),
style = MainText,
color = dark,
modifier = Modifier.clickable{ /* TODO */ }
)
} }
Column( LoginScreenContent(
modifier = Modifier login = login,
.fillMaxSize() password = password,
.padding(65.dp, 10.dp), isError = isError,
verticalArrangement = Arrangement.Center isRememberMe = rememberMe,
) { onSignIn = { navController.navigate(AppNavRoute.Marks.route) },
MainButton(text = R.string.title_sign_in.AsString()) { onSignUp = { /*TODO*/ },
/* TODO */ onForgetPassword = { /* TODO */ }
}
SpacerHeight(5.dp)
Text(
text = R.string.title_sign_up.AsString(),
modifier = Modifier
.clickable {
/* TODO */
}
.padding(5.dp)
.fillMaxWidth(),
textAlign = TextAlign.Center,
style = Mini
) )
} }
}
}
@Preview
@Composable
fun LoginPagePrev() {
LoginScreen()
}
@@ -1,2 +1,24 @@
package ru.megboyzz.dnevnik.screens package ru.megboyzz.dnevnik.screens
import androidx.compose.material.ScaffoldState
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R
@Composable
fun MarksScreen(
navController: NavController,
scaffoldState: ScaffoldState
) {
MainScaffold(
icon = R.drawable.ic_marks.AsPainter(),
title = R.string.title_marks.AsString(),
navController = navController,
scaffoldState = scaffoldState
) {
}
}
@@ -1,2 +1,24 @@
package ru.megboyzz.dnevnik.screens package ru.megboyzz.dnevnik.screens
import androidx.compose.material.ScaffoldState
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import ru.megboyzz.dnevnik.AsPainter
import ru.megboyzz.dnevnik.AsString
import ru.megboyzz.dnevnik.R
import ru.megboyzz.dnevnik.navigation.AppNavRoute
@Composable
fun ScheduleScreen(
navController: NavController,
scaffoldState: ScaffoldState
) {
MainScaffold(
icon = R.drawable.ic_schedule.AsPainter(),
title = R.string.title_schedule.AsString(),
navController = navController,
scaffoldState = scaffoldState
) {
}
}
+16
View File
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="150dp"
android:height="150dp"
android:viewportWidth="150"
android:viewportHeight="150">
<path
android:pathData="M0,0H150V120C150,136.57 136.57,150 120,150H0V0Z"
android:fillColor="#3C95FF"/>
<group>
<clip-path
android:pathData="M35,35h80v80h-80z"/>
<path
android:pathData="M108.52,52.43L83.94,40.72C78.53,37.49 71.8,37.43 66.33,40.57L41.48,52.43C41.38,52.48 41.29,52.53 41.2,52.58C35.3,55.96 33.25,63.47 36.62,69.37C37.77,71.37 39.45,73.01 41.48,74.1L48.33,77.37V93.7C48.34,101 53.09,107.46 60.06,109.63C64.92,111.03 69.95,111.72 75,111.67C80.05,111.72 85.08,111.04 89.94,109.64C96.91,107.47 101.66,101.02 101.67,93.72V77.36L108.33,74.17V101.67C108.33,103.51 109.82,105 111.67,105C113.51,105 115,103.51 115,101.67V61.67C115.02,57.75 111.93,54.14 108.52,52.43ZM95,93.72C95,98.08 92.17,101.95 88,103.26C83.77,104.47 79.39,105.05 75,105C70.6,105.05 66.23,104.47 62,103.26C57.83,101.95 55,98.08 55,93.72V80.54L66.06,85.81C68.78,87.43 71.9,88.28 75.07,88.27C78.09,88.29 81.06,87.49 83.66,85.96L95,80.54V93.72ZM105.67,68.08L80.53,80.08C77.02,82.12 72.68,82.07 69.23,79.93L44.63,68.23C41.89,66.75 40.86,63.33 42.34,60.59C42.84,59.66 43.59,58.9 44.51,58.37L69.49,46.44C73,44.4 77.34,44.46 80.79,46.59L105.37,58.3C107.18,59.3 108.31,61.2 108.33,63.27C108.34,65.22 107.33,67.05 105.67,68.08Z"
android:fillColor="#ffffff"/>
</group>
</vector>
+4
View File
@@ -7,4 +7,8 @@
<color name="teal_700">#FF018786</color> <color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color> <color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="statusBlue">#3077CC</color>
<color name="backGround">#FFF4F4F4</color>
</resources> </resources>
+1 -1
View File
@@ -3,7 +3,7 @@
<string name="title_header">Добро пожаловать в дневник</string> <string name="title_header">Добро пожаловать в дневник</string>
<string name="title_marks">Оценки</string> <string name="title_marks">Оценки</string>
<string name="title_schedule">Расписание</string> <string name="title_schedule">Расписание</string>
<string name="title_hw">Домашнее занадние</string> <string name="title_hw">Домашнее задание</string>
<string name="title_settings">Настройки</string> <string name="title_settings">Настройки</string>
<string name="title_leave_from_acconut">Выйти из аккаунта</string> <string name="title_leave_from_acconut">Выйти из аккаунта</string>
<string name="title_welcome">Добро пожаловать в дневник</string> <string name="title_welcome">Добро пожаловать в дневник</string>
+2 -1
View File
@@ -2,6 +2,7 @@
<resources> <resources>
<style name="Theme.MyDnevnik" parent="android:Theme.Material.Light.NoActionBar"> <style name="Theme.MyDnevnik" parent="android:Theme.Material.Light.NoActionBar">
<item name="android:statusBarColor">@color/purple_700</item> <item name="android:statusBarColor">@color/statusBlue</item>
<item name="android:colorBackground">@color/backGround</item>
</style> </style>
</resources> </resources>