From cf83e2259a8d0eaa8be227fed895ffa03197a570 Mon Sep 17 00:00:00 2001 From: Satyam Thakur Date: Sat, 3 Jun 2023 21:48:29 +0530 Subject: [PATCH 01/19] Setting up libraries gradle dependencies --- .idea/kotlinc.xml | 2 +- .idea/misc.xml | 2 +- app/build.gradle | 31 +++++++++++++++++++++++++++++++ build.gradle | 2 ++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index e1eea1d..69e8615 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9f71c83..0ad17cb 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 6a88d1f..65444be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -64,4 +64,35 @@ dependencies { androidTestImplementation 'androidx.compose.ui:ui-test-junit4' debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' + + // Sys UI Controller - Navigation Animation + def accompanistVersion = "0.31.2-alpha" + implementation "com.google.accompanist:accompanist-systemuicontroller:$accompanistVersion" + implementation "com.google.accompanist:accompanist-navigation-animation:$accompanistVersion" + + // Logging Interceptor + implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" + + // Icons + implementation "androidx.compose.material:material-icons-extended" + + // Koin + implementation "io.insert-koin:koin-android:3.4.1" + + // Retrofit + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + + // ViewModel - Lifecycle + def lifecycleVersion = "2.6.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion" + implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion" + implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycleVersion" + + // Coroutines + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" + + // Coil + implementation "io.coil-kt:coil:2.4.0" } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4314313..e14ce88 100644 --- a/build.gradle +++ b/build.gradle @@ -3,4 +3,6 @@ plugins { id 'com.android.application' version '8.0.2' apply false id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.20' apply false + // For build.gradle (Groovy DSL) + id "org.jetbrains.kotlin.jvm" version "1.8.20" } \ No newline at end of file From e8849cefa61df5ec2150c9cb3b70e4b9ec9371f0 Mon Sep 17 00:00:00 2001 From: LeleStacia Date: Sun, 4 Jun 2023 02:19:10 +0700 Subject: [PATCH 02/19] DashboardScreen WIP(1) --- .gitignore | 1 + .idea/misc.xml | 1 - app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 2 + .../satyamthakur/silver/domain/model/Movie.kt | 131 +++++++++++++++ .../ui/component/HorizontalMovieItem.kt | 110 +++++++++++++ .../ui/screen/dashboard/DashboardScreen.kt | 152 ++++++++++++++++++ .../com/satyamthakur/silver/ui/theme/Color.kt | 4 +- .../satyamthakur/silver/utility/Resource.kt | 8 + app/src/main/res/values/url.xml | 5 + 10 files changed, 415 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/satyamthakur/silver/domain/model/Movie.kt create mode 100644 app/src/main/java/com/satyamthakur/silver/ui/component/HorizontalMovieItem.kt create mode 100644 app/src/main/java/com/satyamthakur/silver/ui/screen/dashboard/DashboardScreen.kt create mode 100644 app/src/main/java/com/satyamthakur/silver/utility/Resource.kt create mode 100644 app/src/main/res/values/url.xml diff --git a/.gitignore b/.gitignore index aa724b7..2ac6c96 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .gradle /local.properties /.idea/caches +/.idea/misc.xml /.idea/libraries /.idea/modules.xml /.idea/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/build.gradle b/app/build.gradle index 65444be..7bf4391 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { compose true } composeOptions { - kotlinCompilerExtensionVersion '1.3.2' + kotlinCompilerExtensionVersion '1.4.6' } packagingOptions { resources { @@ -71,7 +71,7 @@ dependencies { implementation "com.google.accompanist:accompanist-navigation-animation:$accompanistVersion" // Logging Interceptor - implementation "com.squareup.okhttp3:logging-interceptor:4.11.0" + implementation "com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.6" // Icons implementation "androidx.compose.material:material-icons-extended" @@ -94,5 +94,5 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1" // Coil - implementation "io.coil-kt:coil:2.4.0" + implementation "io.coil-kt:coil-compose:2.4.0" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 241c4a3..65ef033 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + = listOf( + Movie( + adult = false, + id = 603692, + originalLanguage = "en", + originalTitle = "John Wick: Chapter 4", + overview = "With the price on his head ever increasing, John Wick uncovers a path to defeating The High Table. But before he can earn his freedom, Wick must face off against a new enemy with powerful alliances across the globe and forces that turn old friends into foes.", + popularity = 5688.839, + posterPath = "/vZloFAK7NmvMGKE7VkF5UHaz0I.jpg", + releaseDate = "2023-03-22", + title = "John Wick: Chapter 4", + video = false, + voteAverage = 8.toDouble(), + voteCount = 2480 + ), + Movie( + adult = false, + id = 502356, + originalLanguage = "en", + originalTitle = "The Super Mario Bros. Movie", + overview = "While working underground to fix a water main, Brooklyn plumbers—and brothers—Mario and Luigi are transported down a mysterious pipe and wander into a magical new world. But when the brothers are separated, Mario embarks on an epic quest to find Luigi.", + popularity = 3859.926, + posterPath = "/qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg", + releaseDate = "2023-04-05", + title = "The Super Mario Bros. Movie", + video = false, + voteAverage = 7.8, + voteCount = 3982 + ), + Movie( + adult = false, + id = 385687, + originalLanguage = "en", + originalTitle = "Fast X", + overview = "Over many missions and against impossible odds, Dom Toretto and his family have outsmarted, out-nerved and outdriven every foe in their path. Now, they confront the most lethal opponent they've ever faced: A terrifying threat emerging from the shadows of the past who's fueled by blood revenge, and who is determined to shatter this family and destroy everything—and everyone—that Dom loves, forever.", + popularity = 2649.217, + posterPath = "/1E5baAaEse26fej7uHcjOgEE2t2.jpg", + releaseDate = "2023-05-17", + title = "Fast X", + video = false, + voteAverage = 7.toDouble(), + voteCount = 729 + ), + Movie( + adult = false, + id = 447277, + originalLanguage = "en", + originalTitle = "The Little Mermaid", + overview = "The youngest of King Triton’s daughters, and the most defiant, Ariel longs to find out more about the world beyond the sea, and while visiting the surface, falls for the dashing Prince Eric. With mermaids forbidden to interact with humans, Ariel makes a deal with the evil sea witch, Ursula, which gives her a chance to experience life on land, but ultimately places her life – and her father’s crown – in jeopardy.", + popularity = 1877.361, + posterPath = "/ym1dxyOk4jFcSl4Q2zmRrA5BEEN.jpg", + releaseDate = "2023-05-18", + title = "The Little Mermaid", + video = false, + voteAverage = 6.toDouble(), + voteCount = 395 + ), + Movie( + adult = false, + id = 640146, + originalLanguage = "en", + originalTitle = "Ant-Man and the Wasp: Quantumania", + overview = "Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible.", + popularity = 1365.483, + posterPath = "/qnqGbB22YJ7dSs4o6M7exTpNxPz.jpg", + releaseDate = "2023-02-15", + title = "Ant-Man and the Wasp: Quantumania", + video = false, + voteAverage = 6.5, + voteCount = 3086 + ), + Movie( + adult = false, + id = 840326, + originalLanguage = "fi", + originalTitle = "Sisu", + overview = "Deep in the wilderness of Lapland, Aatami Korpi is searching for gold but after he stumbles upon Nazi patrol, a breathtaking and gold-hungry chase through the destroyed and mined Lapland wilderness begins.", + popularity = 1619.855, + posterPath = "/ygO9lowFMXWymATCrhoQXd6gCEh.jpg", + releaseDate = "2023-01-27", + title = "Sisu", + video = false, + voteAverage = 7.4, + voteCount = 542 + ), + Movie( + adult = false, + id = 569094, + originalLanguage = "en", + originalTitle = "Spider-Man: Across the Spider-Verse", + overview = "After reuniting with Gwen Stacy, Brooklyn’s full-time, friendly neighborhood Spider-Man is catapulted across the Multiverse, where he encounters the Spider Society, a team of Spider-People charged with protecting the Multiverse’s very existence. But when the heroes clash on how to handle a new threat, Miles finds himself pitted against the other Spiders and must set out on his own to save those he loves most.", + popularity = 1402.307, + posterPath = "/8Vt6mWEReuy4Of61Lnj5Xj704m8.jpg", + releaseDate = "2023-05-31", + title = "Spider-Man: Across the Spider-Verse", + video = false, + voteAverage = 8.8, + voteCount = 189 + ), + Movie( + adult = false, + id = 713704, + originalLanguage = "en", + originalTitle = "Evil Dead Rise", + overview = "Three siblings find an ancient vinyl that gives birth to bloodthirsty demons that run amok in a Los Angeles apartment building and thrusts them into a primal battle for survival as they face the most nightmarish version of family imaginable.", + popularity = 1389.476, + posterPath = "/5ik4ATKmNtmJU6AYD0bLm56BCVM.jpg", + releaseDate = "2023-04-12", + title = "Evil Dead Rise", + video = false, + voteAverage = 7.1, + voteCount = 1465 + ) +) \ No newline at end of file diff --git a/app/src/main/java/com/satyamthakur/silver/ui/component/HorizontalMovieItem.kt b/app/src/main/java/com/satyamthakur/silver/ui/component/HorizontalMovieItem.kt new file mode 100644 index 0000000..ffc9f44 --- /dev/null +++ b/app/src/main/java/com/satyamthakur/silver/ui/component/HorizontalMovieItem.kt @@ -0,0 +1,110 @@ +package com.satyamthakur.silver.ui.component + +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.aspectRatio +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Star +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.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage +import com.satyamthakur.silver.R +import com.satyamthakur.silver.domain.model.Movie +import com.satyamthakur.silver.domain.model.PopularMovies +import com.satyamthakur.silver.ui.theme.SilverTheme +import com.satyamthakur.silver.ui.theme.StarColor + +@Composable +fun HorizontalMovieItem( + movie: Movie, + onCLicked: (Movie) -> Unit +) { + Surface( + modifier = Modifier + .clip(RoundedCornerShape(4.dp)) + .clickable { onCLicked.invoke(movie) } + ) { + Column( + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + AsyncImage( + model = stringResource(id = R.string.w_original_poster, movie.posterPath), + contentDescription = "Poster for ${movie.title}", + contentScale = ContentScale.Crop, + alignment = Alignment.Center, + modifier = Modifier + .width(150.dp) + .aspectRatio(3 / 5F) + .clip(RoundedCornerShape(4.dp)) + ) + Column( + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = movie.title, + style = MaterialTheme.typography.titleMedium.copy( + fontSize = 14.sp, + lineHeight = 16.sp + ), + overflow = TextOverflow.Ellipsis, + maxLines = 1, + modifier = Modifier.width(150.dp) + ) + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Default.Star, + contentDescription = null, + tint = StarColor, + modifier = Modifier.size(12.dp) + ) + Text( + text = "${movie.voteAverage}/10 IMDb", + style = MaterialTheme.typography.titleMedium.copy( + color = MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.5F + ), + fontSize = 12.sp + ) + ) + } + } + } + } +} + +@Preview +@Composable +fun PreviewHorizontalMovieItem() { + val movie by remember { + mutableStateOf(PopularMovies[0]) + } + SilverTheme { + HorizontalMovieItem( + movie = movie, + onCLicked = {} + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/satyamthakur/silver/ui/screen/dashboard/DashboardScreen.kt b/app/src/main/java/com/satyamthakur/silver/ui/screen/dashboard/DashboardScreen.kt new file mode 100644 index 0000000..dcd9c74 --- /dev/null +++ b/app/src/main/java/com/satyamthakur/silver/ui/screen/dashboard/DashboardScreen.kt @@ -0,0 +1,152 @@ +package com.satyamthakur.silver.ui.screen.dashboard + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +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.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AssistChip +import androidx.compose.material3.AssistChipDefaults +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +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.satyamthakur.silver.R +import com.satyamthakur.silver.domain.model.Movie +import com.satyamthakur.silver.domain.model.PopularMovies +import com.satyamthakur.silver.ui.component.HorizontalMovieItem +import com.satyamthakur.silver.ui.theme.SilverTheme +import com.satyamthakur.silver.utility.Resource + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DashboardScreen( + popularMovies: Resource>, + onMovieClicked: (Movie) -> Unit, + onSeeMorePopularMoviesClicked: () -> Unit +) { + Scaffold(topBar = { + CenterAlignedTopAppBar(title = { + Text( + text = stringResource(id = R.string.app_name), + style = MaterialTheme.typography.titleMedium.copy( + fontWeight = FontWeight.Black, fontSize = 16.sp + ) + ) + }) + }) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .verticalScroll(rememberScrollState()) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding( + horizontal = 24.dp + ) + ) { + Text( + text = "Popular", + style = MaterialTheme.typography.titleMedium.copy( + fontWeight = FontWeight.Black, + fontSize = 18.sp + ) + ) + Spacer(modifier = Modifier.weight(1f)) + AssistChip( + onClick = onSeeMorePopularMoviesClicked::invoke, + shape = RoundedCornerShape(100.dp), + label = { + Text( + text = "See More", + style = MaterialTheme.typography.bodyMedium.copy( + fontSize = 12.sp, + ), + ) + }, + border = AssistChipDefaults.assistChipBorder( + borderColor = MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.5F + ), + borderWidth = 1.dp + ), + colors = AssistChipDefaults.assistChipColors( + labelColor = MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.5F + ) + ) + ) + } + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(16.dp) + ) + LazyRow( + horizontalArrangement = Arrangement.spacedBy(16.dp), + contentPadding = PaddingValues( + horizontal = 24.dp + ) + ) { + when (popularMovies) { + is Resource.Error -> Unit + Resource.Loading -> Unit + Resource.None -> Unit + is Resource.Success -> { + items( + items = popularMovies.data ?: emptyList(), + key = { movie -> + movie.id + }, + ) { movie: Movie -> + HorizontalMovieItem( + movie = movie, + onCLicked = onMovieClicked::invoke + ) + } + } + } + } + } + } +} + +@Preview +@Composable +fun PreviewDashboardScreen() { + val popularMovies = remember { + mutableStateOf(Resource.Success(PopularMovies)) + } + SilverTheme { + Surface { + DashboardScreen( + popularMovies = popularMovies.value, + onMovieClicked = {}, + onSeeMorePopularMoviesClicked = {}, + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/satyamthakur/silver/ui/theme/Color.kt b/app/src/main/java/com/satyamthakur/silver/ui/theme/Color.kt index d97373f..8804225 100644 --- a/app/src/main/java/com/satyamthakur/silver/ui/theme/Color.kt +++ b/app/src/main/java/com/satyamthakur/silver/ui/theme/Color.kt @@ -8,4 +8,6 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) + +val StarColor = Color(0xFFFFC319) \ No newline at end of file diff --git a/app/src/main/java/com/satyamthakur/silver/utility/Resource.kt b/app/src/main/java/com/satyamthakur/silver/utility/Resource.kt new file mode 100644 index 0000000..41eb1c1 --- /dev/null +++ b/app/src/main/java/com/satyamthakur/silver/utility/Resource.kt @@ -0,0 +1,8 @@ +package com.satyamthakur.silver.utility + +sealed class Resource(val data: T? = null, val message: String? = null) { + class Success(data: T) : Resource(data) + class Error(data: T?, message: String?) : Resource(data, message) + object Loading : Resource() + object None : Resource() +} diff --git a/app/src/main/res/values/url.xml b/app/src/main/res/values/url.xml new file mode 100644 index 0000000..79ac8bf --- /dev/null +++ b/app/src/main/res/values/url.xml @@ -0,0 +1,5 @@ + + + https://image.tmdb.org/t/p/w185%s + https://image.tmdb.org/t/p/original%s + \ No newline at end of file From a797f6c52fcb6731e8cb31f46afc76b1c28529d1 Mon Sep 17 00:00:00 2001 From: LeleStacia Date: Sun, 4 Jun 2023 22:19:18 +0700 Subject: [PATCH 03/19] Dashboard Screen Finished --- .idea/codeStyles/Project.xml | 123 ++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/deploymentTargetDropDown.xml | 17 ++ .idea/gradle.xml | 1 + app/build.gradle | 1 + .../satyamthakur/silver/domain/model/Movie.kt | 26 +++ .../ui/component/HorizontalMovieItem.kt | 15 +- .../silver/ui/component/VerticalMovieItem.kt | 151 ++++++++++++++++++ .../ui/screen/dashboard/DashboardScreen.kt | 101 ++++++------ .../dashboard/component/SectionSeparator.kt | 70 ++++++++ .../com/satyamthakur/silver/ui/theme/Color.kt | 5 +- app/src/main/res/values/strings.xml | 4 + 12 files changed, 467 insertions(+), 52 deletions(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/java/com/satyamthakur/silver/ui/component/VerticalMovieItem.kt create mode 100644 app/src/main/java/com/satyamthakur/silver/ui/screen/dashboard/component/SectionSeparator.kt diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..cc62d9d --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a2d7c21..ae388c2 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,6 +7,7 @@