Skip to content

Commit

Permalink
Merge pull request #3 from Farhandroid/Part-2
Browse files Browse the repository at this point in the history
Part 2
  • Loading branch information
Farhandroid committed Feb 16, 2022
2 parents ba4cea4 + 22061c5 commit bea090a
Show file tree
Hide file tree
Showing 79 changed files with 826 additions and 354 deletions.
10 changes: 10 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 13 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ dependencies {
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.3.1'
implementation 'androidx.activity:activity-compose:1.3.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
implementation 'androidx.activity:activity-compose:1.4.0'
implementation project(path: ':data')
implementation project(path: ':domain')
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
Expand All @@ -83,10 +83,20 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.9'

// Coil
implementation("io.coil-kt:coil-compose:1.3.2")
implementation("io.coil-kt:coil-compose:1.4.0")

// System UI Controller - Accompanist
implementation "com.google.accompanist:accompanist-systemuicontroller:0.17.0"

//ROOM DB
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
implementation "androidx.room:room-paging:$room_version"

// Paging 3.0
implementation 'androidx.paging:paging-compose:1.0.0-alpha14'

}

kapt {
Expand Down
20 changes: 20 additions & 0 deletions app/debug/output-metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.farhan.tanvir.androidcleanarchitecture",
"variantName": "debug",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "1.0",
"outputFile": "app-debug.apk"
}
],
"elementType": "File"
}
Binary file added app/src/main/ic_launcher-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.farhan.tanvir.androidcleanarchitecture.di

import android.app.Application
import androidx.room.Database
import androidx.room.Room
import com.farhan.tanvir.data.db.MovieDB
import com.farhan.tanvir.data.db.MovieDao
import com.farhan.tanvir.data.db.MovieRemoteKeysDao
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {

@Provides
fun provideDatabase(app: Application): MovieDB =
Room.databaseBuilder(app, MovieDB::class.java, "movie_db").fallbackToDestructiveMigration()
.build()

@Provides
fun provideMovieDao(movieDB: MovieDB) : MovieDao= movieDB.movieDao()

@Provides
fun provideMovieRemoteKeysDao(movieDB: MovieDB) : MovieRemoteKeysDao = movieDB.movieRemoteKeysDao()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.farhan.tanvir.androidcleanarchitecture.di

import com.farhan.tanvir.data.db.MovieDao
import com.farhan.tanvir.data.repository.dataSource.MovieLocalDataSource
import com.farhan.tanvir.data.repository.dataSourceImpl.MovieLocalDataSourceImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent


@Module
@InstallIn(SingletonComponent::class)
object LocalDataModule {
@Provides
fun provideLocalDataSource(movieDao: MovieDao): MovieLocalDataSource =
MovieLocalDataSourceImpl(movieDao = movieDao)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.farhan.tanvir.androidcleanarchitecture.di

import com.farhan.tanvir.data.api.MovieApi
import com.farhan.tanvir.data.db.MovieDB
import com.farhan.tanvir.data.repository.dataSource.MovieRemoteDataSource
import com.farhan.tanvir.data.repository.dataSourceImpl.MovieRemoteDataSourceImpl
import dagger.Module
Expand All @@ -13,6 +14,6 @@ import dagger.hilt.components.SingletonComponent
@InstallIn(SingletonComponent::class)
object RemoteDataModule {
@Provides
fun provideMoviesRemoteDataSource(movieApi: MovieApi) : MovieRemoteDataSource =
MovieRemoteDataSourceImpl(movieApi)
fun provideMoviesRemoteDataSource(movieApi: MovieApi, movieDB: MovieDB) : MovieRemoteDataSource =
MovieRemoteDataSourceImpl(movieApi, movieDB = movieDB)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.farhan.tanvir.androidcleanarchitecture.di

import com.farhan.tanvir.data.repository.MovieRepositoryImpl
import com.farhan.tanvir.data.repository.dataSource.MovieLocalDataSource
import com.farhan.tanvir.data.repository.dataSource.MovieRemoteDataSource
import com.farhan.tanvir.domain.repository.MovieRepository
import dagger.Module
Expand All @@ -14,6 +15,9 @@ import dagger.hilt.components.SingletonComponent
object RepositoryModule {

@Provides
fun provideMoviesRepository(movieRemoteDataSource: MovieRemoteDataSource) : MovieRepository=
MovieRepositoryImpl(movieRemoteDataSource)
fun provideMoviesRepository(
movieRemoteDataSource: MovieRemoteDataSource,
movieLocalDataSource: MovieLocalDataSource
): MovieRepository =
MovieRepositoryImpl(movieRemoteDataSource, movieLocalDataSource = movieLocalDataSource)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.farhan.tanvir.androidcleanarchitecture.di

import com.farhan.tanvir.domain.repository.MovieRepository
import com.farhan.tanvir.domain.useCase.GetMoviesFromDBUseCase
import com.farhan.tanvir.domain.useCase.GetPopularMoviesUseCase
import com.farhan.tanvir.domain.useCase.MovieUseCases
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
Expand All @@ -10,7 +12,10 @@ import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object UseCaseModule {

@Provides
fun provideGetPopularMoviesUseCase(movieRepository: MovieRepository) =
GetPopularMoviesUseCase(movieRepository)
fun provideMovieUseCases(movieRepository: MovieRepository) = MovieUseCases(
getPopularMoviesUseCase = GetPopularMoviesUseCase(movieRepository = movieRepository),
getMoviesFromDBUseCase = GetMoviesFromDBUseCase(movieRepository = movieRepository)
)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.farhan.tanvir.androidcleanarchitecture.presentation.components

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.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.unit.dp
import com.farhan.tanvir.androidcleanarchitecture.R

@Composable
fun RatingComponent(rating: String) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
painter = painterResource(id = R.drawable.ic_baseline_star_rate),
contentDescription = null,
modifier = Modifier
.padding(
end = 2.dp,
)
)
Text(text = rating, style = MaterialTheme.typography.body2)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.farhan.tanvir.androidcleanarchitecture.presentation.components

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.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.unit.dp
import com.farhan.tanvir.androidcleanarchitecture.R
import java.util.*


@Composable
fun ReleaseDateComponent(releaseDate: String) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically
) {
Icon(
painter = painterResource(id = R.drawable.ic_baseline_date_range_24),
contentDescription = null,
modifier = Modifier.padding(
end = 2.dp,
)
)
Text(text = releaseDate, style = MaterialTheme.typography.body2)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ package com.farhan.tanvir.androidcleanarchitecture.presentation.navigation

import androidx.compose.runtime.Composable
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import com.farhan.tanvir.androidcleanarchitecture.presentation.screen.details.MovieDetailsScreen
import com.farhan.tanvir.androidcleanarchitecture.presentation.screen.home.HomeScreen
import com.farhan.tanvir.androidcleanarchitecture.util.Constant

@Composable
fun NavGraph(navController: NavHostController) {
Expand All @@ -15,5 +19,14 @@ fun NavGraph(navController: NavHostController) {
composable(route = Screen.Home.route) {
HomeScreen(navController = navController)
}
composable(
route = Screen.MovieDetails.route,
arguments = listOf(navArgument(Constant.MOVIE_DETAILS_ARGUMENT_KEY) {
type = NavType.StringType
})
) { backStackEntry ->
backStackEntry.arguments?.getString(Constant.MOVIE_DETAILS_ARGUMENT_KEY)
?.let { MovieDetailsScreen(it,navController) }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ package com.farhan.tanvir.androidcleanarchitecture.presentation.navigation

sealed class Screen(val route: String) {
object Home : Screen("home_screen")
object MovieDetails : Screen("movie_details_screen/{movieId}") {
fun passMovieId(movieId: String) = "movie_details_screen/$movieId"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.farhan.tanvir.androidcleanarchitecture.presentation.screen.details

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Card
import androidx.compose.material.MaterialTheme
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.text.font.FontWeight
import androidx.compose.ui.unit.dp
import coil.compose.rememberImagePainter
import coil.size.Scale
import com.farhan.tanvir.androidcleanarchitecture.BuildConfig
import com.farhan.tanvir.androidcleanarchitecture.presentation.components.RatingComponent
import com.farhan.tanvir.androidcleanarchitecture.presentation.components.ReleaseDateComponent
import com.farhan.tanvir.androidcleanarchitecture.ui.theme.AppThemeColor
import com.farhan.tanvir.domain.model.Movie

@Composable
fun MovieDetailsContent(movie: Movie) {
val scrollState = rememberScrollState()
Card(
elevation = 0.dp,
backgroundColor = MaterialTheme.colors.AppThemeColor
) {
Column(
modifier = Modifier
.fillMaxWidth()
.verticalScroll(scrollState)
) {
Image(
painter = rememberImagePainter(
data = BuildConfig.POSTER_URL + movie.posterPath, builder = {
crossfade(true)
scale(Scale.FIT)
}),
contentDescription = null,
modifier = Modifier
.fillMaxWidth()
.height(350.dp),
contentScale = ContentScale.FillWidth
)
Column(modifier = Modifier.padding(8.dp)) {
Spacer(modifier = Modifier.height(16.dp))
movie.title?.let {
Text(
text = it,
style = MaterialTheme.typography.h5,
fontWeight = FontWeight.Bold
)
}
Spacer(modifier = Modifier.height(8.dp))
movie.releaseDate?.let {
ReleaseDateComponent(releaseDate = it)
}
Spacer(modifier = Modifier.height(8.dp))
movie.rating?.let { RatingComponent(rating = it) }
Spacer(modifier = Modifier.height(16.dp))
movie.overview?.let {
Text(
text = it,
style = MaterialTheme.typography.body2
)
}
}
}
}
}
Loading

0 comments on commit bea090a

Please sign in to comment.