Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

di #117

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open

di #117

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
id("androidx.navigation.safeargs")
id("com.google.dagger.hilt.android")
}

android {
Expand Down Expand Up @@ -111,4 +112,19 @@ dependencies {

// Lottie Animation
implementation("com.airbnb.android:lottie:6.0.0")

//dagger hilt
implementation("com.google.dagger:hilt-android:2.44")
kapt("com.google.dagger:hilt-android-compiler:2.44")

//room dependency
val room_version = "2.5.1"

implementation ("androidx.room:room-runtime:$room_version")
kapt ("androidx.room:room-compiler:$room_version")
annotationProcessor ("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-rxjava3:$room_version")
}
kapt {
correctErrorTypes = true
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".MarvelApplication"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Marvel"
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/com/red_velvet/marvel/MarvelApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.red_velvet.marvel

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class MarvelApplication: Application(){}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.red_velvet.marvel.data.local

import androidx.room.Database
import androidx.room.RoomDatabase
import com.red_velvet.marvel.data.local.dao.DataBaseDao
import com.red_velvet.marvel.data.local.entity.ComicsEntity
import com.red_velvet.marvel.data.local.entity.SearchCharacterResultEntity


@Database(
entities = [ComicsEntity::class,
SearchCharacterResultEntity::class],
version = 1)
abstract class MarvelDataBase: RoomDatabase() {
abstract fun dataBaseDao(): DataBaseDao
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.red_velvet.marvel.data.local.dao

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.red_velvet.marvel.data.local.entity.ComicsEntity
import com.red_velvet.marvel.data.local.entity.SearchCharacterResultEntity
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Single

@Dao
interface DataBaseDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(comic: List<ComicsEntity>): Completable

@Query("SELECT * FROM Comics_table WHERE id = :id")
fun getComic(id: Long): Single<ComicsEntity>

@Query("SELECT * FROM Comics_table")
fun getAllComics(): Single<List<ComicsEntity>>

@Query("SELECT * FROM Comics_table WHERE dateDescriptor = :dateDescriptor")
fun getComicsByDateDescriptor(dateDescriptor: String?): Single<List<ComicsEntity>>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertSearchCharacterResult(item: List<SearchCharacterResultEntity>) : Completable

@Query("Select * From searchCharacterResult_table")
fun getSearchCharacterResult(): Single<List<SearchCharacterResultEntity>>

@Query("Select * From searchCharacterResult_table ORDER BY id DESC LIMIT 1")
fun getLastSearchCharacterResult(): Single<List<SearchCharacterResultEntity>>

@Query("Select * From searchCharacterResult_table Where name = :name")
fun getSearchCharacterResultByName(name: String): Single<List<SearchCharacterResultEntity>>

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.red_velvet.marvel.data.local.entity

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "Comics_table")
data class ComicsEntity (
@PrimaryKey val id: Long,
val title: String,
val imgUrl: String,
val dateDescriptor: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.red_velvet.marvel.data.local.entity

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "searchCharacterResult_table")
data class SearchCharacterResultEntity(
@PrimaryKey var id: Long,
var name: String,
var imgUrl: String)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.red_velvet.marvel.data.model

import com.google.gson.annotations.SerializedName

data class Comic(
data class ComicDto(
@SerializedName("characters")
val characters: ResourceCollection? = ResourceCollection(),
@SerializedName("collectedIssues")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.red_velvet.marvel.data.remote

import com.red_velvet.marvel.data.model.BaseResponse
import com.red_velvet.marvel.data.model.Character
import com.red_velvet.marvel.data.model.Comic
import com.red_velvet.marvel.data.model.ComicDto
import com.red_velvet.marvel.data.model.Creator
import com.red_velvet.marvel.data.model.Event
import com.red_velvet.marvel.data.model.Series
Expand All @@ -19,19 +19,19 @@ interface MarvelService {
fun getAllComics(
@Query("titleStartsWith") titleStartsWith: String? = null,
@Query("dateDescriptor") dateDescriptor: String? = null,
): Single<Response<BaseResponse<List<Comic>>>>
): Single<Response<BaseResponse<List<ComicDto>>>>

@GET("comics/{comicId}")
fun getComicDetailById(
@Path("comicId") comicId: Int
): Single<Response<BaseResponse<List<Comic>>>>
): Single<Response<BaseResponse<List<ComicDto>>>>

@GET("characters/{characterId}/comics")
fun getComicsByCharacterId(
@Path("characterId") characterId: Int,
@Query("titleStartsWith") titleStartsWith: String? = null,
@Query("dateDescriptor") dateDescriptor: String? = null
): Single<Response<BaseResponse<List<Comic>>>>
): Single<Response<BaseResponse<List<ComicDto>>>>

@GET("comics/{comicId}/creators")
fun getCreatorByComicId(
Expand Down Expand Up @@ -85,7 +85,7 @@ interface MarvelService {
@GET("stories/{storyId}/comics")
fun getComicsByStoryId(
@Path("storyId") storyId: Int
): Single<Response<BaseResponse<List<Comic>>>>
): Single<Response<BaseResponse<List<ComicDto>>>>

@GET("characters")
fun getAllCharacters(
Expand Down

This file was deleted.

31 changes: 31 additions & 0 deletions app/src/main/java/com/red_velvet/marvel/di/DataBaseModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.red_velvet.marvel.di

import android.content.Context
import androidx.room.Room
import com.red_velvet.marvel.data.local.MarvelDataBase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

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

private const val DATABASE_NAME = "MarvelDataBase"

@Singleton
@Provides
fun provideMarvelDataBase(@ApplicationContext context: Context): MarvelDataBase {
return Room.databaseBuilder(
context,
MarvelDataBase::class.java,
DATABASE_NAME).build()
}

@Singleton
@Provides
fun provideDao(dataBase: MarvelDataBase) = dataBase.dataBaseDao()
}
66 changes: 66 additions & 0 deletions app/src/main/java/com/red_velvet/marvel/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.red_velvet.marvel.di

import com.red_velvet.marvel.data.remote.AuthorizationInterceptor
import com.red_velvet.marvel.data.remote.MarvelService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

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

private const val BASE_URL = "http://gateway.marvel.com/v1/public/"

@Singleton
@Provides
fun provideMarvelService(
okHttpClient: OkHttpClient,
gsonConverterFactory: GsonConverterFactory,
rxJava3CallAdapterFactory: RxJava3CallAdapterFactory
): MarvelService {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(gsonConverterFactory)
.client(okHttpClient)
.addCallAdapterFactory(rxJava3CallAdapterFactory)
.build().create(MarvelService::class.java)
}

@Singleton
@Provides
fun provideOkHttpClient(authInterceptor: AuthorizationInterceptor, loggingInterceptor: HttpLoggingInterceptor): OkHttpClient{
return OkHttpClient
.Builder()
.addInterceptor(loggingInterceptor)
.addInterceptor(authInterceptor)
.readTimeout(15, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.build()
}

@Singleton
@Provides
fun provideAuthInterceptor() = AuthorizationInterceptor()

@Singleton
@Provides
fun provideLoggingInterceptor() =
HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BODY) }

@Singleton
@Provides
fun provideGson() = GsonConverterFactory.create()

@Singleton
@Provides
fun provideRxJava() = RxJava3CallAdapterFactory.create()
}
38 changes: 38 additions & 0 deletions app/src/main/java/com/red_velvet/marvel/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.red_velvet.marvel.di

import com.red_velvet.marvel.data.local.MarvelDataBase
import com.red_velvet.marvel.data.local.dao.DataBaseDao
import com.red_velvet.marvel.data.remote.MarvelService
import com.red_velvet.marvel.domain.repository.MarvelRepository
import com.red_velvet.marvel.domain.repository.MarvelRepositoryImpl
import com.red_velvet.marvel.domain.mapper.comics.ComicDtoToComicsEntityMapper
import com.red_velvet.marvel.domain.mapper.comics.ComicsEntityToComicsMapper
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent


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

@Provides
fun provideRepository(
marvelDataBaseDao: DataBaseDao,
apiService: MarvelService,
comicDtoToComicsEntityMapper: ComicDtoToComicsEntityMapper,
comicsEntityToComicsMapper: ComicsEntityToComicsMapper
): MarvelRepository {
return MarvelRepositoryImpl(
apiService,
marvelDataBaseDao,
comicDtoToComicsEntityMapper,
comicsEntityToComicsMapper)
}

@Provides
fun provideComicsEntityMapper() = ComicDtoToComicsEntityMapper()
@Provides
fun provideComicsMapper() = ComicsEntityToComicsMapper()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.red_velvet.marvel.domain.mapper

interface Mapper<I, O> {
fun map(input: I,dateDescriptor: String?): O
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.red_velvet.marvel.domain.mapper.comics

import com.red_velvet.marvel.data.local.entity.ComicsEntity
import com.red_velvet.marvel.data.model.ComicDto
import com.red_velvet.marvel.domain.mapper.Mapper

class ComicDtoToComicsEntityMapper : Mapper<ComicDto, ComicsEntity> {

override fun map(input: ComicDto, dateDescriptor: String?): ComicsEntity {
return ComicsEntity(
id = input.id?.toLong() ?: 0L,
title = input.title.orEmpty(),
dateDescriptor = dateDescriptor ?: "",
imgUrl = "${input.thumbnail?.path}.${input.thumbnail?.extension}"
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.red_velvet.marvel.domain.mapper.comics

import com.red_velvet.marvel.data.local.entity.ComicsEntity
import com.red_velvet.marvel.domain.mapper.Mapper
import com.red_velvet.marvel.domain.model.Comics

class ComicsEntityToComicsMapper : Mapper<ComicsEntity, Comics> {

override fun map(input: ComicsEntity, dateDescriptor: String?): Comics {
return Comics(
id = input.id.toInt(),
title = input.title,
dateDescriptor = dateDescriptor ?: "",
imgUrl = input.imgUrl
)
}
}
Loading