Skip to content

Commit

Permalink
feat: 의존성 주입을 위한 Hilt를 어플리케이션 전반에 적용
Browse files Browse the repository at this point in the history
  • Loading branch information
LeeOhHyung committed Jun 6, 2021
1 parent c41c427 commit b9f217b
Show file tree
Hide file tree
Showing 15 changed files with 113 additions and 27 deletions.
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ plugins {
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
id 'dagger.hilt.android.plugin'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
}
Expand Down Expand Up @@ -113,6 +114,11 @@ dependencies {
implementation deps.room.ktx
kapt deps.room.compiler

implementation "com.google.dagger:hilt-android:2.36"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt "com.google.dagger:hilt-android-compiler:2.36"
kapt 'androidx.hilt:hilt-compiler:1.0.0'

implementation deps.gson
implementation deps.retrofit.core
implementation deps.retrofit.gson
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/kotlin/kr/tooni/tooni/TooniApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
package kr.tooni.tooni

import android.app.Application
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber

@HiltAndroidApp
class TooniApp : Application() {

override fun onCreate() {
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/kotlin/kr/tooni/tooni/data/ApiProvider.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.google.gson.FieldNamingPolicy
import com.google.gson.GsonBuilder
import kr.tooni.tooni.BuildConfig
import kr.tooni.tooni.TooniApp
import kr.tooni.tooni.data.api.Api
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
Expand Down Expand Up @@ -55,7 +56,7 @@ object ApiProvider {
.build()
}

fun <T> create(service: Class<T>): T {
fun <T: Api> create(service: Class<T>): T {
return provide().create(service)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
*/
package kr.tooni.tooni.data.preference

import android.content.SharedPreferences

interface Preference {
fun getInstance(): SharedPreferences
var uid: String
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,15 @@ import kr.tooni.tooni.core.extensions.EMPTY

class PreferenceImpl constructor(private val context: Context) : Preference {

override fun getInstance(): SharedPreferences {
return context.getSharedPreferences(
private val instance: SharedPreferences
get() = context.getSharedPreferences(
BuildConfig.APPLICATION_ID + PREFS_NAME, Context.MODE_PRIVATE
)
}

override var uid: String
get() = getInstance().getString(USER_ID, String.EMPTY) ?: String.EMPTY
get() = instance.getString(USER_ID, String.EMPTY) ?: String.EMPTY
set(value) {
getInstance().edit { putString(USER_ID, value).apply() }
instance.edit { putString(USER_ID, value).apply() }
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
*/
package kr.tooni.tooni.data.response

import kr.tooni.tooni.core.model.User

data class LoginResponse(
val data: Spec
) : BaseResponse() {

data class Spec(val user: User)
data class Spec(val nickname: String)
}
29 changes: 29 additions & 0 deletions app/src/main/kotlin/kr/tooni/tooni/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kr.tooni.tooni.di

import android.content.Context
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import kr.tooni.tooni.data.ApiProvider
import kr.tooni.tooni.data.preference.Preference
import kr.tooni.tooni.data.preference.PreferenceImpl
import javax.inject.Singleton

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

@Provides
@Singleton
fun providePreference(@ApplicationContext context: Context): Preference {
return PreferenceImpl(context)
}

@Provides
@Singleton
fun provideApiProvider(): ApiProvider {
return ApiProvider
}
}
11 changes: 11 additions & 0 deletions app/src/main/kotlin/kr/tooni/tooni/features/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package kr.tooni.tooni.features

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.fragment.app.Fragment
Expand Down Expand Up @@ -89,4 +91,13 @@ class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
.fragments
.forEach { fragment -> hide(fragment) }
}

companion object {

fun start(context: Context, action: Intent.() -> Unit = {}) {
val intent = Intent(context, MainActivity::class.java)
.apply(action)
context.startActivity(intent)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ package kr.tooni.tooni.features.launcher

import android.os.Bundle
import androidx.activity.viewModels
import dagger.hilt.android.AndroidEntryPoint
import kr.tooni.tooni.R
import kr.tooni.tooni.base.BaseActivity
import kr.tooni.tooni.databinding.ActivityLauncherBinding

@AndroidEntryPoint
class LauncherActivity : BaseActivity<ActivityLauncherBinding>(R.layout.activity_launcher) {

private val viewModel by viewModels<LauncherViewModel>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ package kr.tooni.tooni.features.launcher
import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Single
import kr.tooni.tooni.data.preference.Preference
import javax.inject.Inject

class LauncherLocalDataSource constructor(private val preference: Preference) {
class LauncherLocalDataSource @Inject constructor(
private val preference: Preference
) {

fun getUserId(): Single<String> {
return Single.fromCallable { preference.uid }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package kr.tooni.tooni.features.launcher

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import kr.tooni.tooni.data.ApiProvider
import kr.tooni.tooni.data.api.AccountApi

@Module
@InstallIn(ViewModelComponent::class)
object LauncherModule {

@Provides
fun provideLauncherRepository(
localDataSource: LauncherLocalDataSource,
remoteDataSource: LauncherRemoteDataSource
): LauncherRepository = LauncherRepositoryImpl(localDataSource, remoteDataSource)

@Provides
fun provideFirebaseAuth(): FirebaseAuth {
return Firebase.auth
}

@Provides
fun provideAccountApi(apiProvider: ApiProvider): AccountApi {
return apiProvider.create(AccountApi::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@
package kr.tooni.tooni.features.launcher

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase
import io.reactivex.rxjava3.core.Single
import kr.tooni.tooni.data.ApiProvider
import kr.tooni.tooni.data.api.AccountApi
import kr.tooni.tooni.data.request.LoginRequest
import javax.inject.Inject

class LauncherRemoteDataSource constructor(
private val apiProvider: ApiProvider = ApiProvider,
private val auth: FirebaseAuth = Firebase.auth
class LauncherRemoteDataSource @Inject constructor(
private val accountApi: AccountApi,
private val auth: FirebaseAuth
) {

fun signInAnonymously(uid: String): Single<String> {
val request = LoginRequest(loginToken = uid)
return apiProvider.create(AccountApi::class.java).login(request)
.map { it.data.user.nickname }
return accountApi.login(request)
.map { it.data.nickname }
}

fun getUserToken(): Single<String> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ package kr.tooni.tooni.features.launcher

import io.reactivex.rxjava3.core.Completable
import io.reactivex.rxjava3.core.Single
import javax.inject.Inject

class LauncherRepositoryImpl constructor(
class LauncherRepositoryImpl @Inject constructor(
private val localDataSource: LauncherLocalDataSource,
private val remoteDataSource: LauncherRemoteDataSource
): LauncherRepository {
) : LauncherRepository {

override fun signInAnonymously(): Single<String> {
return getUserId().flatMap { uid ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,25 @@
*/
package kr.tooni.tooni.features.launcher

import dagger.hilt.android.lifecycle.HiltViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers
import kr.tooni.tooni.base.BaseViewModel
import timber.log.Timber
import javax.inject.Inject

class LauncherViewModel constructor(
@HiltViewModel
class LauncherViewModel @Inject constructor(
private val launcherRepository: LauncherRepository
) : BaseViewModel() {

init {
launcherRepository.getUserId()
launcherRepository.signInAnonymously()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
.subscribe({ nickname ->
nickname
}, Timber::e)
.addDisposable()
}
}
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ buildscript {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath "com.google.firebase:firebase-crashlytics-gradle:${versions.crashlyticsGradle}"
classpath "com.google.gms:google-services:${versions.googleServices}"
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.36'
}
}

Expand Down

0 comments on commit b9f217b

Please sign in to comment.