diff --git a/.idea/compiler.xml b/.idea/compiler.xml index fb7f4a8..b589d56 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 87ecdc6..8bba0c4 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,7 +7,7 @@ - diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..103e00c --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,32 @@ + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..0fc3113 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index c8382d2..bb9c992 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - - + diff --git a/app/build.gradle b/app/build.gradle index 6814918..09623dc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,12 +6,12 @@ plugins { } android { - compileSdk 32 + compileSdk 33 defaultConfig { applicationId "com.farhan.tanvir.androidcleanarchitecture" minSdk 21 - targetSdk 32 + targetSdk 34 versionCode 1 versionName "1.0" @@ -20,6 +20,7 @@ android { useSupportLibrary true } buildConfigField("String","BASE_URL",BASE_URL) + buildConfigField("String","API_KEY",API_KEY) buildConfigField("String","POSTER_URL",POSTER_URL) } @@ -52,20 +53,20 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.core:core-ktx:1.10.1' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' - implementation 'androidx.activity:activity-compose:1.4.0' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' + implementation 'androidx.activity:activity-compose:1.7.2' implementation project(path: ':data') implementation project(path: ':domain') implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0' - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-tooling:$compose_version" @@ -73,6 +74,7 @@ dependencies { implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-compiler:$hilt_version" implementation 'androidx.hilt:hilt-navigation-compose:1.0.0' + implementation 'androidx.navigation:navigation-compose:2.6.0' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' @@ -80,13 +82,13 @@ dependencies { implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0") //GSON - implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.google.code.gson:gson:2.10.1' // Coil - implementation("io.coil-kt:coil-compose:1.4.0") + implementation("io.coil-kt:coil-compose:2.3.0") // System UI Controller - Accompanist - implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0" + implementation "com.google.accompanist:accompanist-systemuicontroller:0.30.1" //ROOM DB implementation "androidx.room:room-runtime:$room_version" @@ -95,7 +97,7 @@ dependencies { implementation "androidx.room:room-paging:$room_version" // Paging 3.0 - implementation 'androidx.paging:paging-compose:1.0.0-alpha14' + implementation 'androidx.paging:paging-compose:3.2.0-rc01' } diff --git a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/details/MovieDetailsContent.kt b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/details/MovieDetailsContent.kt index d97b989..d874c03 100644 --- a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/details/MovieDetailsContent.kt +++ b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/details/MovieDetailsContent.kt @@ -10,9 +10,12 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage import coil.compose.rememberImagePainter +import coil.request.ImageRequest import coil.size.Scale import com.farhan.tanvir.androidcleanarchitecture.BuildConfig import com.farhan.tanvir.androidcleanarchitecture.presentation.components.RatingComponent @@ -32,12 +35,13 @@ fun MovieDetailsContent(movie: Movie) { .fillMaxWidth() .verticalScroll(scrollState) ) { - Image( - painter = rememberImagePainter( - data = BuildConfig.POSTER_URL + movie.posterPath, builder = { - crossfade(true) - scale(Scale.FIT) - }), + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data( + BuildConfig.POSTER_URL + movie.posterPath + ) + .crossfade(true) + .build(), contentDescription = null, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/HomeScreen.kt b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/HomeScreen.kt index 4f66464..f6273da 100644 --- a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/HomeScreen.kt +++ b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/HomeScreen.kt @@ -31,7 +31,7 @@ fun HomeScreen(navController: NavHostController, viewModel: HomeViewModel = hilt topBar = { HomeTopBar() }, - content = { + content = { it MovieListContent(allMovies = allMovies, navController = navController) } ) diff --git a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/MovieList.kt b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/MovieList.kt index e7d5658..f3b7073 100644 --- a/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/MovieList.kt +++ b/app/src/main/java/com/farhan/tanvir/androidcleanarchitecture/presentation/screen/home/MovieList.kt @@ -1,6 +1,5 @@ package com.farhan.tanvir.androidcleanarchitecture.presentation.screen.home -import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn @@ -11,13 +10,15 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.paging.compose.LazyPagingItems -import androidx.paging.compose.items -import coil.compose.rememberImagePainter -import coil.size.Scale +import androidx.paging.compose.itemContentType +import androidx.paging.compose.itemKey +import coil.compose.AsyncImage +import coil.request.ImageRequest import com.farhan.tanvir.androidcleanarchitecture.BuildConfig import com.farhan.tanvir.androidcleanarchitecture.presentation.components.RatingComponent import com.farhan.tanvir.androidcleanarchitecture.presentation.navigation.Screen @@ -26,15 +27,16 @@ import com.farhan.tanvir.domain.model.Movie @Composable fun MovieListContent(allMovies: LazyPagingItems, navController: NavHostController) { + LazyColumn( contentPadding = PaddingValues(horizontal = 8.dp, vertical = 4.dp) ) { items( - items = allMovies, - key = { movie -> - movie.pk - } - ) { movie -> + contentType = allMovies.itemContentType { "MyPagingItems" }, + key = allMovies.itemKey { it }, + count = allMovies.itemCount, + ) { index -> + val movie = allMovies[index] if (movie != null) { MovieListItem(movie = movie, navController = navController) } @@ -62,26 +64,29 @@ fun MovieListItem(movie: Movie, navController: NavHostController) { verticalAlignment = Alignment.CenterVertically ) { movie.posterPath?.let { - Image( + AsyncImage( modifier = Modifier .padding( end = 4.dp, ) .width(120.dp), - painter = rememberImagePainter( - data = BuildConfig.POSTER_URL + movie.posterPath, builder = { - crossfade(true) - scale(Scale.FILL) - }), + model = ImageRequest.Builder(LocalContext.current) + .data( + BuildConfig.POSTER_URL + movie.posterPath + ) + .crossfade(true) + .build(), contentDescription = null, contentScale = ContentScale.Fit ) } - Column(Modifier - .height(IntrinsicSize.Max) - .padding( - end = 2.dp, - )) { + Column( + Modifier + .height(IntrinsicSize.Max) + .padding( + end = 2.dp, + ) + ) { movie.title?.let { Text(text = it, style = MaterialTheme.typography.body1) } Spacer(modifier = Modifier.height(4.dp)) movie.overview?.let { diff --git a/build.gradle b/build.gradle index efe752b..15dbd57 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,9 @@ buildscript { ext { - compose_version = '1.1.0' - hilt_version = "2.40.5" + compose_version = '1.4.3' + hilt_version = "2.46" coroutine_version="1.6.0" - room_version="2.4.1" + room_version="2.5.2" } dependencies { @@ -13,7 +13,7 @@ buildscript { plugins { id 'com.android.application' version '7.1.0' apply false id 'com.android.library' version '7.1.0' apply false - id 'org.jetbrains.kotlin.android' version '1.6.10' apply false + id 'org.jetbrains.kotlin.android' version '1.8.10' apply false } task clean(type: Delete) { diff --git a/data/build.gradle b/data/build.gradle index d2051d5..4945954 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -5,15 +5,16 @@ plugins { } android { - compileSdk 32 + compileSdk 33 defaultConfig { minSdk 21 - targetSdk 32 + targetSdk 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" buildConfigField("String","API_KEY",API_KEY) + buildConfigField("String","POSTER_URL",POSTER_URL) } buildTypes { @@ -33,21 +34,21 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' implementation project(path: ':domain') testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' //Coroutines - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' //ROOM DB implementation "androidx.room:room-runtime:$room_version" @@ -56,7 +57,7 @@ dependencies { implementation "androidx.room:room-paging:$room_version" // Paging 3.0 - implementation 'androidx.paging:paging-compose:1.0.0-alpha14' + implementation 'androidx.paging:paging-compose:3.2.0-rc01' } \ No newline at end of file diff --git a/domain/build.gradle b/domain/build.gradle index ec5d872..4c44924 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -4,7 +4,7 @@ plugins { } android { - compileSdk 32 + compileSdk 33 defaultConfig { minSdk 21 @@ -31,23 +31,23 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' //Coroutines implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version" //GSON - implementation 'com.google.code.gson:gson:2.8.9' + implementation 'com.google.code.gson:gson:2.9.0' //ROOM DB implementation "androidx.room:room-ktx:$room_version" // Paging 3.0 - implementation 'androidx.paging:paging-compose:1.0.0-alpha14' + implementation 'androidx.paging:paging-compose:3.2.0-rc01' } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index cfea692..1527d1a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,6 +21,6 @@ kotlin.code.style=official # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true -API_KEY="API_KEY" -BASE_URL="BASE_URL" -POSTER_URL = "POSTER_URL" \ No newline at end of file +API_KEY="" +BASE_URL="https://api.themoviedb.org/3/" +POSTER_URL="https://image.tmdb.org/t/p/original" \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2ee05d1..3f09d9f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Fri Jan 28 18:20:57 JST 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME