From bbec24b6af37b2840716d46764a96525fa7267e4 Mon Sep 17 00:00:00 2001 From: dasha Date: Sat, 9 Dec 2023 19:31:38 +0400 Subject: [PATCH] lw2 --- .idea/codeStyles/Project.xml | 123 ---------- .idea/codeStyles/codeStyleConfig.xml | 5 - .idea/inspectionProfiles/Project_Default.xml | 41 ++++ .idea/vcs.xml | 6 + app/build.gradle.kts | 16 +- app/src/images/photo.jpg | Bin 0 -> 31567 bytes app/src/main/AndroidManifest.xml | 6 +- .../com/example/myapplication/MainActivity.kt | 43 ---- .../myapplication/MainComposeActivity.kt | 60 +++++ .../cinema/composeui/CinemaList.kt | 88 +++++++ .../cinema/composeui/CinemaView.kt | 169 +++++++++++++ .../myapplication/cinema/model/Cinema.kt | 20 ++ .../example/myapplication/composeui/Cart.kt | 168 +++++++++++++ .../composeui/navigation/MainNavbar.kt | 230 ++++++++++++++++++ .../composeui/navigation/Screen.kt | 57 +++++ .../datastore/DataStoreManager.kt | 24 ++ .../myapplication/datastore/SettingData.kt | 5 + .../order/composeui/OrderList.kt | 76 ++++++ .../order/composeui/OrderView.kt | 96 ++++++++ .../myapplication/order/model/Order.kt | 20 ++ .../session/composeui/SessionList.kt | 108 ++++++++ .../myapplication/session/model/Session.kt | 26 ++ .../example/myapplication/ui.theme/Color.kt | 11 + .../{ui/theme => ui.theme}/Theme.kt | 40 +-- .../{ui/theme => ui.theme}/Type.kt | 16 +- .../example/myapplication/ui/theme/Color.kt | 11 - .../user/composeui/UserProfile.kt | 176 ++++++++++++++ .../example/myapplication/user/model/User.kt | 15 ++ app/src/main/res/drawable/minus.xml | 8 + app/src/main/res/drawable/photo.jpg | Bin 0 -> 31567 bytes app/src/main/res/drawable/ticket.xml | 25 ++ app/src/main/res/values/strings.xml | 13 +- app/src/main/res/values/themes.xml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 1 + 35 files changed, 1490 insertions(+), 217 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/vcs.xml create mode 100644 app/src/images/photo.jpg delete mode 100644 app/src/main/java/com/example/myapplication/MainActivity.kt create mode 100644 app/src/main/java/com/example/myapplication/MainComposeActivity.kt create mode 100644 app/src/main/java/com/example/myapplication/cinema/composeui/CinemaList.kt create mode 100644 app/src/main/java/com/example/myapplication/cinema/composeui/CinemaView.kt create mode 100644 app/src/main/java/com/example/myapplication/cinema/model/Cinema.kt create mode 100644 app/src/main/java/com/example/myapplication/composeui/Cart.kt create mode 100644 app/src/main/java/com/example/myapplication/composeui/navigation/MainNavbar.kt create mode 100644 app/src/main/java/com/example/myapplication/composeui/navigation/Screen.kt create mode 100644 app/src/main/java/com/example/myapplication/datastore/DataStoreManager.kt create mode 100644 app/src/main/java/com/example/myapplication/datastore/SettingData.kt create mode 100644 app/src/main/java/com/example/myapplication/order/composeui/OrderList.kt create mode 100644 app/src/main/java/com/example/myapplication/order/composeui/OrderView.kt create mode 100644 app/src/main/java/com/example/myapplication/order/model/Order.kt create mode 100644 app/src/main/java/com/example/myapplication/session/composeui/SessionList.kt create mode 100644 app/src/main/java/com/example/myapplication/session/model/Session.kt create mode 100644 app/src/main/java/com/example/myapplication/ui.theme/Color.kt rename app/src/main/java/com/example/myapplication/{ui/theme => ui.theme}/Theme.kt (71%) rename app/src/main/java/com/example/myapplication/{ui/theme => ui.theme}/Type.kt (71%) delete mode 100644 app/src/main/java/com/example/myapplication/ui/theme/Color.kt create mode 100644 app/src/main/java/com/example/myapplication/user/composeui/UserProfile.kt create mode 100644 app/src/main/java/com/example/myapplication/user/model/User.kt create mode 100644 app/src/main/res/drawable/minus.xml create mode 100644 app/src/main/res/drawable/photo.jpg create mode 100644 app/src/main/res/drawable/ticket.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 7643783..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..44ca2d9 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,41 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b2ff921..80591b8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,15 +15,15 @@ android { versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables { - useSupportLibrary = true - } } buildTypes { release { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } compileOptions { @@ -49,13 +49,17 @@ android { dependencies { implementation("androidx.core:core-ktx:1.9.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose:1.7.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + implementation("androidx.activity:activity-compose:1.7.2") implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.navigation:navigation-compose:2.6.0") implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") + implementation("com.jakewharton.threetenabp:threetenabp:1.2.1") + implementation("androidx.datastore:datastore-preferences:1.0.0") + testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") diff --git a/app/src/images/photo.jpg b/app/src/images/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9fb88cf01ba39e610afd4378d070e7263d9097e2 GIT binary patch literal 31567 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 DtcxF{ literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e013846..2900ac3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,13 +10,13 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.MyApplication" + android:theme="@style/Theme.Pmudemo" tools:targetApi="31"> + android:theme="@style/Theme.Pmudemo"> diff --git a/app/src/main/java/com/example/myapplication/MainActivity.kt b/app/src/main/java/com/example/myapplication/MainActivity.kt deleted file mode 100644 index 34bce68..0000000 --- a/app/src/main/java/com/example/myapplication/MainActivity.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.example.myapplication - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.example.myapplication.ui.theme.MyApplicationTheme - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - MyApplicationTheme { - // A surface container using the 'background' color from the theme - Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { - Greeting("Android") - } - } - } - } -} - -@Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - MyApplicationTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/MainComposeActivity.kt b/app/src/main/java/com/example/myapplication/MainComposeActivity.kt new file mode 100644 index 0000000..a68d190 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/MainComposeActivity.kt @@ -0,0 +1,60 @@ +package com.example.myapplication + +import android.content.res.Configuration +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import com.example.myapplication.composeui.navigation.MainNavbar +import com.example.myapplication.datastore.DataStoreManager +import com.example.myapplication.ui.theme.PmudemoTheme + +class MainComposeActivity : ComponentActivity() { + private val dataStoreManager = DataStoreManager(this) + private val isDarkTheme = mutableStateOf(true) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + PmudemoTheme(darkTheme = isDarkTheme.value) { + LaunchedEffect(key1 = true) { + dataStoreManager.getSettings().collect { setting -> + isDarkTheme.value = setting.isDarkTheme + } + } + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainNavbar( + isDarkTheme = isDarkTheme, + dataStoreManager = dataStoreManager + ) + } + } + } + + } +} +/* +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun MainNavbarPreview() { + val dataStoreManager = DataStoreManager(MainComposeActivity) + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + MainNavbar(remember { mutableStateOf(true) }) + } + } +}*/ diff --git a/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaList.kt b/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaList.kt new file mode 100644 index 0000000..bf14b2b --- /dev/null +++ b/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaList.kt @@ -0,0 +1,88 @@ +package com.example.myapplication.cinema.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.content.ContextCompat +import androidx.navigation.NavController +import com.example.myapplication.R +import com.example.myapplication.cinema.model.getCinemas +import com.example.myapplication.composeui.navigation.Screen +import com.example.myapplication.ui.theme.Gray +import com.example.myapplication.ui.theme.PmudemoTheme + +@Composable +fun CinemaList(navController: NavController?) { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(all = 10.dp) + ) { + items(getCinemas().indices.toList()) { index -> + val cinema = getCinemas()[index] + val cinemaId = Screen.CinemaView.route.replace("{id}", index.toString()) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(all = 10.dp) + .clickable { navController?.navigate(cinemaId) } + .background( + color = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp) + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Image( + painter = painterResource(id = cinema.image), + contentDescription = null, + modifier = Modifier.size(90.dp) + ) + + Text("${cinema.name}, ${cinema.year}", color = MaterialTheme.colorScheme.onSecondary) + } + } + } + } +} + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun CinemaListPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + CinemaList(navController = null) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaView.kt b/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaView.kt new file mode 100644 index 0000000..4ca55f2 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/cinema/composeui/CinemaView.kt @@ -0,0 +1,169 @@ +package com.example.myapplication.cinema.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ShoppingCart +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.myapplication.cinema.model.getCinemas +import com.example.myapplication.session.model.getSessions +import com.example.myapplication.ui.theme.PmudemoTheme +import org.threeten.bp.format.DateTimeFormatter + +@Composable +fun CinemaView(id: Int) { + val cinema = getCinemas()[id] + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(16.dp) + ) { + item { + Box( + modifier = Modifier + .fillMaxSize() + .background( + color = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp) + ) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .background(color = MaterialTheme.colorScheme.secondary), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = "${cinema.name}, ${cinema.year}", + style = TextStyle( + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + color = MaterialTheme.colorScheme.onSecondary + ), + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 8.dp) + ) + + Image( + painter = painterResource(id = cinema.image), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .height(200.dp) + ) + + Text(text = cinema.description, color = MaterialTheme.colorScheme.onSecondary) + } + } + } + item { + Text( + text = "Сеансы", + style = TextStyle( + fontWeight = FontWeight.Bold, + fontSize = 18.sp, + color = MaterialTheme.colorScheme.onBackground + ), + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp, bottom = 8.dp), + ) + } + + + items(getSessions(cinema)) { session -> + val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + val formattedDate = dateFormatter.format(session.dateTime) + Text( + text = formattedDate, + color = MaterialTheme.colorScheme.onBackground, + ) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.secondary) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Image( + painter = painterResource(id = session.cinema.image), + contentDescription = null, + modifier = Modifier.size(90.dp) + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = "${session.currentCount}/${session.maxCount}", + color = MaterialTheme.colorScheme.onSecondary + ) + } + } + + Icon( + imageVector = Icons.Filled.ShoppingCart, + contentDescription = null, + modifier = Modifier + .padding(10.dp) + .size(24.dp) + .clickable {} + .align(Alignment.CenterEnd), + tint = MaterialTheme.colorScheme.onSecondary + ) + } + } + } +} + + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun CinemaViewPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + CinemaView(id = 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/cinema/model/Cinema.kt b/app/src/main/java/com/example/myapplication/cinema/model/Cinema.kt new file mode 100644 index 0000000..e9dbeb7 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/cinema/model/Cinema.kt @@ -0,0 +1,20 @@ +package com.example.myapplication.cinema.model + +import com.example.myapplication.R +import com.example.myapplication.session.model.Session +import com.example.myapplication.session.model.getSessions +import java.io.Serializable + +data class Cinema( + val name: String, + val description: String, + val image: Int, + val year: Long +) : Serializable + +fun getCinemas(): List { + return listOf( + Cinema("First1", "new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema new cinema ", R.drawable.photo, 2023), + Cinema("First2", "new cinema 123", R.drawable.photo, 2024) + ) +} diff --git a/app/src/main/java/com/example/myapplication/composeui/Cart.kt b/app/src/main/java/com/example/myapplication/composeui/Cart.kt new file mode 100644 index 0000000..7205777 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/composeui/Cart.kt @@ -0,0 +1,168 @@ +package com.example.myapplication.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.Button +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.myapplication.R +import com.example.myapplication.session.model.getSessions +import com.example.myapplication.ui.theme.DarkGray +import com.example.myapplication.ui.theme.Gray +import com.example.myapplication.ui.theme.PmudemoTheme +import org.threeten.bp.format.DateTimeFormatter + +@Composable +fun Cart() { + val sessions = getSessions() + + LazyColumn( + modifier = Modifier + .padding(all = 10.dp) + ) { + itemsIndexed(sessions) { index, session -> + var currentCount by remember { mutableStateOf(session.currentCount) } + + val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + val formattedDate = dateFormatter.format(session.dateTime) + + Text( + text = formattedDate, + color = MaterialTheme.colorScheme.onBackground, + ) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.secondary) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Image( + painter = painterResource(id = session.cinema.image), + contentDescription = null, + modifier = Modifier.size(90.dp) + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text(text = "${session.cinema.name}, ${session.cinema.year}\n" + + "$currentCount/${session.maxCount}", color = MaterialTheme.colorScheme.onSecondary) + } + + Box( + modifier = Modifier + .background(color = MaterialTheme.colorScheme.background, shape = RoundedCornerShape(10.dp)) // Задаем фон для кнопок + ) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + IconButton( + onClick = { + if (currentCount > 0) { + currentCount-- + } + } + ) { + Icon( + imageVector = ImageVector.vectorResource(id = R.drawable.minus), + contentDescription = "Уменьшить", + tint = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.size(10.dp) + ) + } + + Text( + text = "$currentCount", + color = MaterialTheme.colorScheme.onBackground + ) + + IconButton( + onClick = { + if (currentCount < session.maxCount) { + currentCount++ + } + } + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = "Увеличить", + tint = MaterialTheme.colorScheme.onBackground, + modifier = Modifier.size(10.dp) + ) + } + } + } + } + } + } + } + Column() { + Spacer(modifier = Modifier.weight(1f)) + + Button( + onClick = { }, + modifier = Modifier + .padding(16.dp) + .fillMaxWidth() + ) { Text("Купить") } + } +} + + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun CartPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + Cart() + } + } +} diff --git a/app/src/main/java/com/example/myapplication/composeui/navigation/MainNavbar.kt b/app/src/main/java/com/example/myapplication/composeui/navigation/MainNavbar.kt new file mode 100644 index 0000000..a3d075e --- /dev/null +++ b/app/src/main/java/com/example/myapplication/composeui/navigation/MainNavbar.kt @@ -0,0 +1,230 @@ +package com.example.myapplication.composeui.navigation + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import com.example.myapplication.cinema.composeui.CinemaList +import com.example.myapplication.cinema.composeui.CinemaView +import com.example.myapplication.composeui.Cart +import com.example.myapplication.datastore.DataStoreManager +import com.example.myapplication.order.composeui.OrderList +import com.example.myapplication.order.composeui.OrderView +import com.example.myapplication.session.composeui.SessionList +import com.example.myapplication.ui.theme.DarkGray +import com.example.myapplication.ui.theme.PmudemoTheme +import com.example.myapplication.user.composeui.UserProfile + +@Composable +fun Topbar( + navController: NavHostController, + currentScreen: Screen? +) { + var searchQuery by remember { mutableStateOf("") } + Box( + modifier = Modifier + .fillMaxWidth() + .background(color = MaterialTheme.colorScheme.primary) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + if ( + navController.previousBackStackEntry != null + && (currentScreen == null || !currentScreen.showInBottomBar) + ) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = null, + modifier = Modifier + .size(30.dp) + .clickable { navController.navigateUp() }, + tint = MaterialTheme.colorScheme.secondary + ) + } else + Icon( + imageVector = Icons.Default.Person, + contentDescription = null, + modifier = Modifier + .size(30.dp) + .clickable { navController.navigate(Screen.UserProfile.route) }, + tint = MaterialTheme.colorScheme.secondary + ) + + Spacer(modifier = Modifier.width(16.dp)) + + BasicTextField( + value = searchQuery, + onValueChange = { newValue -> searchQuery = newValue }, + modifier = Modifier + .weight(1f) + .height(36.dp) + .background(color = MaterialTheme.colorScheme.onPrimary, RoundedCornerShape(18.dp)) + .padding(start = 13.dp, top = 8.dp), + keyboardOptions = KeyboardOptions.Default.copy( + imeAction = androidx.compose.ui.text.input.ImeAction.Search + ), + keyboardActions = KeyboardActions( + onSearch = { } + ) + ) + + Spacer(modifier = Modifier.width(16.dp)) + + Icon( + imageVector = Icons.Default.Search, + contentDescription = null, + modifier = Modifier + .size(30.dp) + .clickable { }, + tint = MaterialTheme.colorScheme.secondary + ) + } + } +} + +@Composable +fun Navbar( + navController: NavHostController, + currentDestination: NavDestination?, + modifier: Modifier = Modifier +) { + NavigationBar(modifier = modifier, containerColor = MaterialTheme.colorScheme.primary) { + Screen.bottomBarItems.forEach { screen -> + NavigationBarItem( + icon = { Icon(screen.icon, contentDescription = null, tint = MaterialTheme.colorScheme.secondary) }, + label = { Text(stringResource(screen.resourceId)) }, + selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true, + onClick = { + navController.navigate(screen.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + ) + } + } +} + +@Composable +fun Navhost( + navController: NavHostController, + innerPadding: PaddingValues, + isDarkTheme: MutableState, + dataStore: DataStoreManager, + modifier: Modifier = Modifier, +) { + NavHost( + navController, + startDestination = Screen.CinemaList.route, + modifier.padding(innerPadding) + ) { + composable(Screen.CinemaList.route) { CinemaList(navController) } + composable(Screen.OrderList.route) { OrderList(navController) } + composable(Screen.Cart.route) { Cart() } + composable(Screen.UserProfile.route) { UserProfile(navController, isDarkTheme, dataStore) } + composable(Screen.SessionList.route) { SessionList() } + composable( + Screen.CinemaView.route, + arguments = listOf(navArgument("id") { type = NavType.IntType }) + ) { backStackEntry -> + backStackEntry.arguments?.let { CinemaView(it.getInt("id")) } + } + composable( + Screen.OrderView.route, + arguments = listOf(navArgument("id") { type = NavType.IntType }) + ) { backStackEntry -> + backStackEntry.arguments?.let { OrderView(it.getInt("id")) } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainNavbar( + isDarkTheme: MutableState, + dataStoreManager: DataStoreManager +) { + val navController = rememberNavController() + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentDestination = navBackStackEntry?.destination + val currentScreen = currentDestination?.route?.let { Screen.getItem(it) } + + Scaffold( + topBar = { + Topbar(navController, currentScreen) + }, + bottomBar = { + if (currentScreen == null || currentScreen.showInBottomBar) { + Navbar(navController, currentDestination) + } + } + ) { innerPadding -> + Navhost(navController, innerPadding, isDarkTheme, dataStoreManager) + } +} +/* +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun MainNavbarPreview() { + PmudemoTheme() { + Surface( + color = MaterialTheme.colorScheme.background + ) { + MainNavbar(remember { mutableStateOf(true) }, DataStoreManager) + } + } +}*/ diff --git a/app/src/main/java/com/example/myapplication/composeui/navigation/Screen.kt b/app/src/main/java/com/example/myapplication/composeui/navigation/Screen.kt new file mode 100644 index 0000000..ade816d --- /dev/null +++ b/app/src/main/java/com/example/myapplication/composeui/navigation/Screen.kt @@ -0,0 +1,57 @@ +package com.example.myapplication.composeui.navigation + +import androidx.annotation.StringRes +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Favorite +import androidx.compose.material.icons.filled.Home +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.List +import androidx.compose.material.icons.filled.ShoppingCart +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.vectorResource +import com.example.myapplication.R + +enum class Screen( + val route: String, + @StringRes val resourceId: Int, + val icon: ImageVector = Icons.Filled.Favorite, + val showInBottomBar: Boolean = true +) { + CinemaList( + "Cinema-list", R.string.Cinema_main_title, Icons.Filled.Home + ), + SessionList( + "Session-list", R.string.Sessions_title, showInBottomBar = false + ), + Cart( + "cart", R.string.Cart_title, Icons.Filled.ShoppingCart + ), + OrderList( + "Order-list", R.string.Order_title, Icons.Filled.List + ), + CinemaView( + "Cinema-view/{id}", R.string.Cinema_view_title, showInBottomBar = false + ), + OrderView( + "Order-view/{id}", R.string.Order_view_title, showInBottomBar = false + ), + UserProfile( + "User-profile", R.string.Profile_title, showInBottomBar = false + ); + + companion object { + val bottomBarItems = listOf( + CinemaList, + Cart, + OrderList + ) + + fun getItem(route: String): Screen? { + val findRoute = route.split("/").first() + return values().find { value -> value.route.startsWith(findRoute) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/datastore/DataStoreManager.kt b/app/src/main/java/com/example/myapplication/datastore/DataStoreManager.kt new file mode 100644 index 0000000..09b6c76 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/datastore/DataStoreManager.kt @@ -0,0 +1,24 @@ +package com.example.myapplication.datastore + +import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.map + +private val Context.dataStore: DataStore by preferencesDataStore("data_store") + +class DataStoreManager(private val context : Context) { + suspend fun saveSettings(settingData: SettingData) { + context.dataStore.edit { pref -> + pref[booleanPreferencesKey("isDarkTheme")] = settingData.isDarkTheme + } + } + fun getSettings() = context.dataStore.data.map { pref -> + return@map SettingData( + pref[booleanPreferencesKey("isDarkTheme")] ?: true + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/datastore/SettingData.kt b/app/src/main/java/com/example/myapplication/datastore/SettingData.kt new file mode 100644 index 0000000..f74f0cb --- /dev/null +++ b/app/src/main/java/com/example/myapplication/datastore/SettingData.kt @@ -0,0 +1,5 @@ +package com.example.myapplication.datastore + +data class SettingData( + val isDarkTheme: Boolean +) \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/order/composeui/OrderList.kt b/app/src/main/java/com/example/myapplication/order/composeui/OrderList.kt new file mode 100644 index 0000000..5379056 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/order/composeui/OrderList.kt @@ -0,0 +1,76 @@ +package com.example.myapplication.order.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +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.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.composeui.navigation.Screen +import com.example.myapplication.order.model.getOrders +import com.example.myapplication.ui.theme.Gray +import com.example.myapplication.ui.theme.PmudemoTheme + +@Composable +fun OrderList(navController: NavController?) { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding(all = 10.dp) + ) { + items(getOrders().indices.toList()) { index -> + val orderId = Screen.OrderView.route.replace("{id}", index.toString()) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(all = 10.dp) + .clickable { navController?.navigate(orderId) } + .background( + color = MaterialTheme.colorScheme.secondary, + shape = RoundedCornerShape(16.dp) + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text("Заказ №${index}", color = MaterialTheme.colorScheme.onSecondary) + } + } + } + } +} + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun OrderListPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + OrderList(navController = null) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/order/composeui/OrderView.kt b/app/src/main/java/com/example/myapplication/order/composeui/OrderView.kt new file mode 100644 index 0000000..3d88571 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/order/composeui/OrderView.kt @@ -0,0 +1,96 @@ +package com.example.myapplication.order.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.myapplication.order.model.getOrders +import com.example.myapplication.ui.theme.PmudemoTheme +import org.threeten.bp.format.DateTimeFormatter + +@Composable +fun OrderView(id: Int) { + val order = getOrders()[id] + LazyColumn( + modifier = Modifier + .padding(10.dp) + ) { + items(order.sessions) { pair -> + val session = pair.first + val count = pair.second + val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + val formattedDate = dateFormatter.format(session.dateTime) + + Text( + text = formattedDate, + color = MaterialTheme.colorScheme.onBackground, + ) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.secondary) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Image( + painter = painterResource(id = session.cinema.image), + contentDescription = null, + modifier = Modifier.size(90.dp) + ) + + Column( + modifier = Modifier + .weight(1f) + .padding(start = 8.dp), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = "${session.cinema.name}, ${session.cinema.year}\n" + + "Количество: $count", + color = MaterialTheme.colorScheme.onSecondary + ) + } + } + } + } + } +} + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun OrderViewPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + OrderView(id = 0) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/order/model/Order.kt b/app/src/main/java/com/example/myapplication/order/model/Order.kt new file mode 100644 index 0000000..b53cf04 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/order/model/Order.kt @@ -0,0 +1,20 @@ +package com.example.myapplication.order.model + +import com.example.myapplication.cinema.model.Cinema +import com.example.myapplication.cinema.model.getCinemas +import com.example.myapplication.session.model.Session +import com.example.myapplication.session.model.getSessions +import org.threeten.bp.LocalDateTime +import java.io.Serializable + +data class Order( + val sessions: List> +) : Serializable + +fun getOrders(): List { + return listOf( + Order(listOf(Pair(getSessions()[0], 5), Pair(getSessions()[1], 2))), + Order(listOf(Pair(getSessions()[0], 1), Pair(getSessions()[1], 4))), + Order(listOf(Pair(getSessions()[0], 1), Pair(getSessions()[1], 7))) + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/session/composeui/SessionList.kt b/app/src/main/java/com/example/myapplication/session/composeui/SessionList.kt new file mode 100644 index 0000000..c246fe7 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/session/composeui/SessionList.kt @@ -0,0 +1,108 @@ +package com.example.myapplication.session.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ShoppingCart +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.session.model.getSessions +import com.example.myapplication.ui.theme.Gray +import com.example.myapplication.ui.theme.PmudemoTheme +import org.threeten.bp.format.DateTimeFormatter + +@Composable +fun SessionList() { + LazyColumn( + modifier = Modifier.padding(all = 10.dp) + ) { + items(getSessions()) { session -> + val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm") + val formattedDate = dateFormatter.format(session.dateTime) + + Text( + text = formattedDate, + color = MaterialTheme.colorScheme.onBackground, + ) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(10.dp) + .clip(RoundedCornerShape(16.dp)) + .background(MaterialTheme.colorScheme.secondary) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Image( + painter = painterResource(id = session.cinema.image), + contentDescription = null, + modifier = Modifier.size(90.dp) + ) + + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = "${session.cinema.name}, ${session.cinema.year}\n" + + "${session.currentCount}/${session.maxCount}", + color = MaterialTheme.colorScheme.onSecondary + ) + } + } + + Icon( + imageVector = Icons.Filled.ShoppingCart, + contentDescription = null, + modifier = Modifier + .padding(10.dp) + .size(24.dp) + .clickable {} + .align(Alignment.CenterEnd), + tint = MaterialTheme.colorScheme.onSecondary + ) + } + } + } +} + +@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun SessionListPreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + SessionList() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/session/model/Session.kt b/app/src/main/java/com/example/myapplication/session/model/Session.kt new file mode 100644 index 0000000..22cc323 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/session/model/Session.kt @@ -0,0 +1,26 @@ +package com.example.myapplication.session.model + +import com.example.myapplication.cinema.model.Cinema +import com.example.myapplication.cinema.model.getCinemas +import java.io.Serializable +import org.threeten.bp.LocalDateTime; +import kotlin.streams.toList + +data class Session( + val dateTime: LocalDateTime, + val cinema: Cinema, + val currentCount: Int, + val maxCount: Int + ) + +fun getSessions(cinema: Cinema): List { + return getSessions().stream().filter{ value -> value.cinema == cinema }.toList(); +} + +fun getSessions(): List { + return listOf( + Session(LocalDateTime.of(2023, 10, 10, 18, 30), getCinemas()[0], 50, 120), + Session(LocalDateTime.of(2027, 10, 10, 18, 30), getCinemas()[0], 20, 120), + Session(LocalDateTime.of(2025, 10, 10, 18, 30), getCinemas()[1], 10, 120), + ) +} diff --git a/app/src/main/java/com/example/myapplication/ui.theme/Color.kt b/app/src/main/java/com/example/myapplication/ui.theme/Color.kt new file mode 100644 index 0000000..38003a8 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/ui.theme/Color.kt @@ -0,0 +1,11 @@ +package com.example.myapplication.ui.theme + +import androidx.compose.ui.graphics.Color + +val LightGray = Color(0xFFB2CCD6) +val LightBlueGray = Color(0xFF70A3B2) +val LightBgGray = Color(0xFFCED6DC) + +val Gray = Color(0xFFD6D6D6) +val DarkGray = Color(0xFF191A1F) +val BgGray = Color(0xFF2A2D32) \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt b/app/src/main/java/com/example/myapplication/ui.theme/Theme.kt similarity index 71% rename from app/src/main/java/com/example/myapplication/ui/theme/Theme.kt rename to app/src/main/java/com/example/myapplication/ui.theme/Theme.kt index 111ec67..8c4e3dc 100644 --- a/app/src/main/java/com/example/myapplication/ui/theme/Theme.kt +++ b/app/src/main/java/com/example/myapplication/ui.theme/Theme.kt @@ -10,23 +10,33 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 + primary = DarkGray, + onPrimary = Color.White, + + secondary = Gray, + onSecondary = Color.Black, + + background = BgGray, + onBackground = Color.White, ) private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 + primary = LightBlueGray, + onPrimary = Color.White, - /* Other default colors to override + secondary = LightGray, + onSecondary = Color.Black, + + onBackground = Color.Black, + + /* Other default colors to override background = Color(0xFFFFFBFE), surface = Color(0xFFFFFBFE), onPrimary = Color.White, @@ -38,11 +48,11 @@ private val LightColorScheme = lightColorScheme( ) @Composable -fun MyApplicationTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, - content: @Composable () -> Unit +fun PmudemoTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = false, + content: @Composable () -> Unit ) { val colorScheme = when { dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { @@ -63,8 +73,8 @@ fun MyApplicationTheme( } MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content + colorScheme = colorScheme, + typography = Typography, + content = content ) } \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Type.kt b/app/src/main/java/com/example/myapplication/ui.theme/Type.kt similarity index 71% rename from app/src/main/java/com/example/myapplication/ui/theme/Type.kt rename to app/src/main/java/com/example/myapplication/ui.theme/Type.kt index 5335f88..64846a0 100644 --- a/app/src/main/java/com/example/myapplication/ui/theme/Type.kt +++ b/app/src/main/java/com/example/myapplication/ui.theme/Type.kt @@ -8,14 +8,14 @@ import androidx.compose.ui.unit.sp // Set of Material typography styles to start with val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) - /* Other default text styles to override + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, diff --git a/app/src/main/java/com/example/myapplication/ui/theme/Color.kt b/app/src/main/java/com/example/myapplication/ui/theme/Color.kt deleted file mode 100644 index 1ce3e5d..0000000 --- a/app/src/main/java/com/example/myapplication/ui/theme/Color.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.myapplication.ui.theme - -import androidx.compose.ui.graphics.Color - -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) - -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/app/src/main/java/com/example/myapplication/user/composeui/UserProfile.kt b/app/src/main/java/com/example/myapplication/user/composeui/UserProfile.kt new file mode 100644 index 0000000..692eaef --- /dev/null +++ b/app/src/main/java/com/example/myapplication/user/composeui/UserProfile.kt @@ -0,0 +1,176 @@ +package com.example.myapplication.user.composeui + +import android.content.res.Configuration +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.myapplication.composeui.navigation.Screen +import com.example.myapplication.datastore.DataStoreManager +import com.example.myapplication.datastore.SettingData +import com.example.myapplication.session.composeui.SessionList +import com.example.myapplication.ui.theme.Gray +import com.example.myapplication.ui.theme.PmudemoTheme +import kotlinx.coroutines.launch + +@Composable +fun UserProfile(navController: NavController?, isDarkTheme: MutableState, dataStoreManager: DataStoreManager) { + var username by remember { mutableStateOf("") } + var password by remember { mutableStateOf("") } + var isRegistration by remember { mutableStateOf(false) } + + LazyColumn() { + item { + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + Text( + text = "Логин", + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + BasicTextField( + value = username, + onValueChange = { newValue -> username = newValue }, + modifier = Modifier + .fillMaxWidth() + .size(36.dp) + .background(MaterialTheme.colorScheme.secondary, RoundedCornerShape(18.dp)) + .padding(start = 13.dp, top = 8.dp) + ) + + Text( + text = "Пароль", + modifier = Modifier.align(Alignment.CenterHorizontally) + ) + BasicTextField( + value = password, + onValueChange = { newValue -> password = newValue }, + modifier = Modifier + .fillMaxWidth() + .size(36.dp) + .background(MaterialTheme.colorScheme.secondary, RoundedCornerShape(18.dp)) + .padding(start = 13.dp, top = 8.dp), + visualTransformation = PasswordVisualTransformation() + ) + + if (isRegistration) { + Button( + onClick = { }, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + ) { + Text("Регистрация") + } + Text( + text = "Уже есть аккаунт? Войти", + modifier = Modifier + .clickable { + isRegistration = false + } + .align(Alignment.CenterHorizontally), + color = MaterialTheme.colorScheme.onBackground + ) + } else { + Button( + onClick = { }, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + ) { + Text("Вход") + } + Text( + text = "Нет аккаунта? Зарегистрироваться", + modifier = Modifier + .clickable { + isRegistration = true + } + .align(Alignment.CenterHorizontally), + color = MaterialTheme.colorScheme.onBackground + ) + } + val switchColors = SwitchDefaults.colors( + checkedThumbColor = MaterialTheme.colorScheme.primary, // Change the color when the switch is checked + checkedTrackColor = MaterialTheme.colorScheme.secondary, // Change the color of the track when the switch is checked + uncheckedThumbColor = MaterialTheme.colorScheme.primary, // Change the color when the switch is unchecked + uncheckedTrackColor = MaterialTheme.colorScheme.onPrimary // Change the color of the track when the switch is unchecked + ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalArrangement = Arrangement.End + ) { + Text( + "Темная тема", modifier = Modifier + .align(Alignment.CenterVertically) + .padding(5.dp) + ) + + val coroutine = rememberCoroutineScope() + + Switch( + checked = isDarkTheme.value, + onCheckedChange = { + isDarkTheme.value = !isDarkTheme.value + coroutine.launch { + dataStoreManager.saveSettings(SettingData(isDarkTheme = isDarkTheme.value)) + } + }, + colors = switchColors + ) + } + } + } + } +} + +/*@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +fun UserProfilePreview() { + PmudemoTheme { + Surface( + color = MaterialTheme.colorScheme.background + ) { + UserProfile(navController = null, isDarkTheme = remember { mutableStateOf(true) }) + } + } +}*/ diff --git a/app/src/main/java/com/example/myapplication/user/model/User.kt b/app/src/main/java/com/example/myapplication/user/model/User.kt new file mode 100644 index 0000000..b5bedb2 --- /dev/null +++ b/app/src/main/java/com/example/myapplication/user/model/User.kt @@ -0,0 +1,15 @@ +package com.example.myapplication.user.model + +import java.io.Serializable + +data class User( + val login: String, + val password: String +) : Serializable + +fun getUsers(): List { + return listOf( + User("login123", "password123"), + User("login321", "password321"), + ) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/minus.xml b/app/src/main/res/drawable/minus.xml new file mode 100644 index 0000000..0ff475a --- /dev/null +++ b/app/src/main/res/drawable/minus.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/photo.jpg b/app/src/main/res/drawable/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9fb88cf01ba39e610afd4378d070e7263d9097e2 GIT binary patch literal 31567 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 DtcxF{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ticket.xml b/app/src/main/res/drawable/ticket.xml new file mode 100644 index 0000000..9e5fe53 --- /dev/null +++ b/app/src/main/res/drawable/ticket.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3de1a39..2c381a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,14 @@ - My Application + pmu-demo + Фильмы + Фильм + Заказ + Название + Год + Описание + Изображение + Корзина + Мои заказы + Профиль + Сеансы \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index e48770a..bf6a6ee 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,5 +1,5 @@ -