diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 5cd135a..9bba60d 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -14,6 +14,7 @@ diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..372d749 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 7bfef59..d5d35ec 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 060cbbf..b2eb137 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,19 +1,19 @@ -apply plugin: 'com.android.application' - -apply plugin: 'kotlin-android' - -apply plugin: 'kotlin-android-extensions' - -apply plugin: 'kotlin-kapt' -apply plugin: 'de.mannodermaus.android-junit5' +plugins { + id 'com.android.application' + id 'kotlin-android' + id 'kotlin-android-extensions' + id 'kotlin-kapt' + id 'de.mannodermaus.android-junit5' + id 'dagger.hilt.android.plugin' +} android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" + compileSdkVersion 30 + buildToolsVersion "29.0.3" defaultConfig { applicationId "com.example.githubfirebaseissue" minSdkVersion 21 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -49,7 +49,7 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0' api "androidx.appcompat:appcompat:$appcompat_version" api "androidx.constraintlayout:constraintlayout:$androidx_constraint_layout_version" @@ -66,7 +66,7 @@ dependencies { api "com.squareup.retrofit2:converter-gson:$retrofit_version" api "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" api 'com.squareup.retrofit2:adapter-rxjava2:2.7.1' - api "com.squareup.okhttp3:okhttp:4.3.1" + api "com.squareup.okhttp3:okhttp:4.6.0" api "com.squareup.okhttp3:logging-interceptor:$logging_interceptor_version" api "com.github.bumptech.glide:glide:$glide_version" @@ -87,7 +87,7 @@ dependencies { api "com.google.code.gson:gson:$gson_version" //shimmer - api 'com.facebook.shimmer:shimmer:0.1.0@aar' + api 'com.facebook.shimmer:shimmer:0.5.0@aar' // dagger implementation "com.google.dagger:dagger:$dagger_version" @@ -102,11 +102,15 @@ dependencies { testImplementation "com.jraska.livedata:testing-ktx:$jraska_version" testImplementation "junit:junit:$junit_version" testImplementation "org.mockito:mockito-inline:$mockito_version" - testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.2' + testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.1' testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0" testImplementation "org.hamcrest:hamcrest-library:$hamcrest_version" testImplementation "com.google.truth:truth:1.0" + //hilt + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-compiler:$hilt_version" + //Spek testImplementation 'org.junit.platform:junit-platform-engine:1.6.2' testImplementation 'org.jetbrains.spek:spek-api:1.1.5' diff --git a/app/src/main/java/com/example/githubfirebaseissue/GithubApplication.kt b/app/src/main/java/com/example/githubfirebaseissue/GithubApplication.kt index 1f38a7f..7d1cb88 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/GithubApplication.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/GithubApplication.kt @@ -1,13 +1,8 @@ package com.example.githubfirebaseissue -import com.example.githubfirebaseissue.di.component.DaggerApplicationComponent -import dagger.android.AndroidInjector -import dagger.android.DaggerApplication +import android.app.Application +import dagger.hilt.android.HiltAndroidApp -class GithubApplication : DaggerApplication() { - - override fun applicationInjector(): AndroidInjector { - return DaggerApplicationComponent.factory().create(this) - } -} \ No newline at end of file +@HiltAndroidApp +class GithubApplication : Application() diff --git a/app/src/main/java/com/example/githubfirebaseissue/base/BaseActivity.kt b/app/src/main/java/com/example/githubfirebaseissue/base/BaseActivity.kt index 25ce58f..4becb31 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/base/BaseActivity.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/base/BaseActivity.kt @@ -1,15 +1,14 @@ package com.example.githubfirebaseissue.base import android.os.Bundle -import dagger.android.AndroidInjection +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -import dagger.android.support.DaggerAppCompatActivity +import dagger.hilt.android.AndroidEntryPoint -abstract class BaseActivity : DaggerAppCompatActivity() { +abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { - AndroidInjection.inject(this) super.onCreate(savedInstanceState) setContentView(getLayoutRes()) } diff --git a/app/src/main/java/com/example/githubfirebaseissue/base/BaseFragment.kt b/app/src/main/java/com/example/githubfirebaseissue/base/BaseFragment.kt index a6337c6..b2fc2a2 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/base/BaseFragment.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/base/BaseFragment.kt @@ -10,7 +10,6 @@ import android.widget.TextView import android.widget.Toast import androidx.fragment.app.Fragment import com.example.githubfirebaseissue.R -import dagger.android.support.AndroidSupportInjection import okio.IOException import retrofit2.HttpException @@ -18,7 +17,6 @@ import retrofit2.HttpException abstract class BaseFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { - AndroidSupportInjection.inject(this) super.onCreate(savedInstanceState) } diff --git a/app/src/main/java/com/example/githubfirebaseissue/base/CustomViewModelFactory.kt b/app/src/main/java/com/example/githubfirebaseissue/base/CustomViewModelFactory.kt deleted file mode 100644 index a08bd78..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/base/CustomViewModelFactory.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.githubfirebaseissue.base - - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import javax.inject.Inject -import javax.inject.Provider - -class CustomViewModelFactory @Inject constructor( - - private val creators: Map, @JvmSuppressWildcards Provider> -) : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - var creator: Provider? = creators[modelClass] - if (creator == null) { - for ((key, value) in creators) { - if (modelClass.isAssignableFrom(key)) { - creator = value - break - } - } - } - requireNotNull(creator) { "unknown model class $modelClass" } - try { - return creator.get() as T - } catch (e: Exception) { - throw RuntimeException(e) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/common/BaseSchedulerProvider.kt b/app/src/main/java/com/example/githubfirebaseissue/common/BaseSchedulerProvider.kt index cb16cec..e74a67f 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/common/BaseSchedulerProvider.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/common/BaseSchedulerProvider.kt @@ -3,13 +3,14 @@ package com.example.githubfirebaseissue.common import io.reactivex.Scheduler import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import javax.inject.Inject interface RxScheduler { val io: Scheduler val main: Scheduler } -class BaseSchedulerProvider: RxScheduler { +class BaseSchedulerProvider @Inject constructor() : RxScheduler { override val io: Scheduler get() = Schedulers.io() override val main: Scheduler diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/component/ApplicationComponent.kt b/app/src/main/java/com/example/githubfirebaseissue/di/component/ApplicationComponent.kt index acca77e..3d8974d 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/di/component/ApplicationComponent.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/di/component/ApplicationComponent.kt @@ -1,24 +1,9 @@ package com.example.githubfirebaseissue.di.component -import com.example.githubfirebaseissue.GithubApplication import com.example.githubfirebaseissue.di.module.ApiModule -import com.example.githubfirebaseissue.di.module.ActivityBindingModule -import com.example.githubfirebaseissue.di.module.ViewModelModule -import com.example.githubfirebaseissue.di.scope.AppScope import dagger.Component -import dagger.android.AndroidInjector -import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton -@AppScope -@Component( - modules = [ - AndroidSupportInjectionModule::class, - ActivityBindingModule::class, - ViewModelModule::class, - ApiModule::class] -) -interface ApplicationComponent : AndroidInjector { - - @Component.Factory - abstract class Builder: AndroidInjector.Factory -} \ No newline at end of file +@Singleton +@Component(modules = [ApiModule::class]) +interface ApplicationComponent diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/ActivityBindingModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/ActivityBindingModule.kt deleted file mode 100644 index ad68bf2..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/ActivityBindingModule.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.githubfirebaseissue.di.module - -import com.example.githubfirebaseissue.ui.activity.MainActivity -import dagger.Module -import dagger.android.ContributesAndroidInjector - - -@Module -internal abstract class ActivityBindingModule { - - @ContributesAndroidInjector(modules = [FragmentProviderModule::class]) - internal abstract fun contributeMainActivity(): MainActivity - -} \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/ApiModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/ApiModule.kt index 421fd85..1e4ecef 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/ApiModule.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/di/module/ApiModule.kt @@ -4,34 +4,37 @@ import com.example.githubfirebaseissue.api.ApiConstant import com.example.githubfirebaseissue.api.GithubApi import com.example.githubfirebaseissue.common.BaseSchedulerProvider import com.example.githubfirebaseissue.common.RxScheduler +import dagger.Binds import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory import retrofit2.converter.gson.GsonConverterFactory - +@InstallIn(SingletonComponent::class) @Module(includes = [InterceptorModule::class, RepositoryModule::class]) -class ApiModule { +abstract class ApiModule { - @Provides - fun provideRetrofit(client: OkHttpClient): Retrofit { - return Retrofit.Builder() - .baseUrl(ApiConstant.GITHUB_BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .client(client) - .build() - } + companion object { + @Provides + fun provideRetrofit(client: OkHttpClient): Retrofit { + return Retrofit.Builder() + .baseUrl(ApiConstant.GITHUB_BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .client(client) + .build() + } - @Provides - fun provideApiInterface(retrofit: Retrofit): GithubApi { - return retrofit.create(GithubApi::class.java) + @Provides + fun provideApiInterface(retrofit: Retrofit): GithubApi { + return retrofit.create(GithubApi::class.java) + } } - @Provides - fun provideRxScheduler(): RxScheduler { - return BaseSchedulerProvider() - } + @Binds + abstract fun provideRxScheduler(scheduler: BaseSchedulerProvider): RxScheduler } \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/FragmentProviderModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/FragmentProviderModule.kt deleted file mode 100644 index eba84c7..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/FragmentProviderModule.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.githubfirebaseissue.di.module - -import com.example.githubfirebaseissue.ui.fragment.CommentsFragment -import com.example.githubfirebaseissue.ui.fragment.IssuesFragment -import dagger.Module -import dagger.android.ContributesAndroidInjector - -@Module -abstract class FragmentProviderModule { - - @ContributesAndroidInjector - abstract fun provideIssueFragment(): IssuesFragment - - @ContributesAndroidInjector - abstract fun provideCommentFragment(): CommentsFragment -} \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/InterceptorModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/InterceptorModule.kt index 41e4bd3..67e7c65 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/InterceptorModule.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/di/module/InterceptorModule.kt @@ -1,10 +1,10 @@ package com.example.githubfirebaseissue.di.module +import android.content.Context import android.util.Log import com.example.githubfirebaseissue.GithubApplication import com.example.githubfirebaseissue.api.ApiConstant.Companion.HEADER_CACHE_CONTROL import com.example.githubfirebaseissue.api.ApiConstant.Companion.HEADER_PRAGMA -import com.example.githubfirebaseissue.di.scope.AppScope import dagger.Module import dagger.Provides import okhttp3.* @@ -12,16 +12,19 @@ import okhttp3.logging.HttpLoggingInterceptor import java.io.File import okhttp3.CacheControl import com.example.githubfirebaseissue.helper.ApplicationUtil +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import java.util.concurrent.TimeUnit @Module +@InstallIn(SingletonComponent::class) class InterceptorModule { @Provides - @AppScope fun provideOkHttpClient( - context: GithubApplication, + @ApplicationContext context: Context, interceptor: HttpLoggingInterceptor ): OkHttpClient { return OkHttpClient.Builder() @@ -34,7 +37,6 @@ class InterceptorModule { @Provides - @AppScope fun provideLoggingInterceptor(): HttpLoggingInterceptor { val httpLoggingInterceptor = HttpLoggingInterceptor() httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY @@ -42,7 +44,7 @@ class InterceptorModule { } - private fun provideCache(context: GithubApplication): Cache? { + private fun provideCache(context: Context): Cache? { var cache: Cache? = null try { cache = Cache(File(context.cacheDir, "http-cache"), 10 * 1024 * 1024) @@ -53,7 +55,7 @@ class InterceptorModule { } private fun provideOfflineCacheInterceptor( - context: GithubApplication, + context: Context, chain: Interceptor.Chain ): Response { var request = chain.request() @@ -74,7 +76,7 @@ class InterceptorModule { } private fun provideCacheInterceptor( - context: GithubApplication, + context: Context, chain: Interceptor.Chain ): Response { val response = chain.proceed(chain.request()) diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/RepositoryModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/RepositoryModule.kt index 5a22a5f..a384543 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/RepositoryModule.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/di/module/RepositoryModule.kt @@ -1,24 +1,22 @@ package com.example.githubfirebaseissue.di.module -import com.example.githubfirebaseissue.api.GithubApi import com.example.githubfirebaseissue.repository.GithubRepository import com.example.githubfirebaseissue.repository.GithubRepositoryImpl import com.example.githubfirebaseissue.usecase.GetFireBaseIssueUseCase import com.example.githubfirebaseissue.usecase.GetFireBaseIssueUseCaseImpl +import dagger.Binds import dagger.Module -import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent @Module -class RepositoryModule { +@InstallIn(SingletonComponent::class) +abstract class RepositoryModule { - @Provides - fun provideGithubFirebaseUseCase(githubRepository: GithubRepository): GetFireBaseIssueUseCase { - return GetFireBaseIssueUseCaseImpl(githubRepository) - } + @Binds + abstract fun provideGithubFirebaseUseCase(useCaseImpl: GetFireBaseIssueUseCaseImpl): GetFireBaseIssueUseCase - @Provides - fun provideGithubRepository(githubApi: GithubApi): GithubRepository { - return GithubRepositoryImpl(githubApi) - } + @Binds + abstract fun provideGithubRepository(repoImpl: GithubRepositoryImpl): GithubRepository } \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/module/ViewModelModule.kt b/app/src/main/java/com/example/githubfirebaseissue/di/module/ViewModelModule.kt deleted file mode 100644 index d0281d6..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/di/module/ViewModelModule.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.githubfirebaseissue.di.module - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.example.githubfirebaseissue.base.CustomViewModelFactory -import com.example.githubfirebaseissue.di.scope.ViewModelKey -import com.example.githubfirebaseissue.ui.viewmodel.MainViewModel -import dagger.Binds -import dagger.Module -import dagger.multibindings.IntoMap - - -@Module -internal abstract class ViewModelModule { - - @Binds - abstract fun bindViewModelFactory(factory: CustomViewModelFactory): ViewModelProvider.Factory - - @Binds - @IntoMap - @ViewModelKey(MainViewModel::class) - abstract fun bindMainViewModel(viewModel: MainViewModel): ViewModel -} \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/scope/AppScope.kt b/app/src/main/java/com/example/githubfirebaseissue/di/scope/AppScope.kt deleted file mode 100644 index 7b8a3fc..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/di/scope/AppScope.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.githubfirebaseissue.di.scope - -import javax.inject.Scope - - -@Scope -@Retention(AnnotationRetention.RUNTIME) -@MustBeDocumented -annotation class AppScope \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/di/scope/ViewModelKey.kt b/app/src/main/java/com/example/githubfirebaseissue/di/scope/ViewModelKey.kt deleted file mode 100644 index 93dddf3..0000000 --- a/app/src/main/java/com/example/githubfirebaseissue/di/scope/ViewModelKey.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.githubfirebaseissue.di.scope - -import androidx.lifecycle.ViewModel -import dagger.MapKey -import kotlin.reflect.KClass - - -@MustBeDocumented -@Target(AnnotationTarget.FUNCTION) -@Retention(AnnotationRetention.RUNTIME) -@MapKey -internal annotation class ViewModelKey(val value: KClass) \ No newline at end of file diff --git a/app/src/main/java/com/example/githubfirebaseissue/ui/activity/MainActivity.kt b/app/src/main/java/com/example/githubfirebaseissue/ui/activity/MainActivity.kt index efd98a2..399e06f 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/ui/activity/MainActivity.kt @@ -6,7 +6,9 @@ import com.example.githubfirebaseissue.R import com.example.githubfirebaseissue.base.BaseActivity import com.example.githubfirebaseissue.callback.IFragmentChangeCallback import com.example.githubfirebaseissue.ui.fragment.IssuesFragment +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint class MainActivity : BaseActivity(), IFragmentChangeCallback { override fun getLayoutRes() = R.layout.activity_main diff --git a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractCommentsFragment.kt b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractCommentsFragment.kt index 3803c84..8f26d08 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractCommentsFragment.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractCommentsFragment.kt @@ -1,28 +1,21 @@ package com.example.githubfirebaseissue.ui.fragment -import android.os.Bundle import android.view.View -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.viewModels import com.example.githubfirebaseissue.base.BaseFragment -import com.example.githubfirebaseissue.base.CustomViewModelFactory import com.example.githubfirebaseissue.common.EventObserver import com.example.githubfirebaseissue.model.Comment import com.example.githubfirebaseissue.ui.viewmodel.MainViewModel -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint abstract class AbstractCommentsFragment : BaseFragment() { companion object { const val ISSUE_NUMBER = "ISSUE_NUMBER" } - @Inject - lateinit var viewModelFactory: CustomViewModelFactory - - private val viewModel: MainViewModel by lazy { - ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java) - } + private val viewModel: MainViewModel by viewModels() override fun viewInitialization(view: View) { @@ -36,7 +29,7 @@ abstract class AbstractCommentsFragment : BaseFragment() { private fun observeDataChange() { - viewModel.loadingState.observe(viewLifecycleOwner, Observer { showLoadingState(it) }) + viewModel.loadingState.observe(viewLifecycleOwner, { showLoadingState(it) }) viewModel.apiError.observe(viewLifecycleOwner, EventObserver { handleError(it) }) viewModel.commentsLiveData.observe(viewLifecycleOwner, EventObserver { if (it.isNotEmpty()) diff --git a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractIssueFragment.kt b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractIssueFragment.kt index 5352c62..4080e7b 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractIssueFragment.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/AbstractIssueFragment.kt @@ -2,24 +2,18 @@ package com.example.githubfirebaseissue.ui.fragment import android.os.Bundle import android.view.View -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModelProvider +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import com.example.githubfirebaseissue.base.BaseFragment -import com.example.githubfirebaseissue.base.CustomViewModelFactory import com.example.githubfirebaseissue.common.EventObserver -import com.example.githubfirebaseissue.helper.ApplicationUtil import com.example.githubfirebaseissue.model.Issue import com.example.githubfirebaseissue.ui.viewmodel.MainViewModel -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +@AndroidEntryPoint abstract class AbstractIssueFragment : BaseFragment() { - @Inject - lateinit var viewModelFactory: CustomViewModelFactory - - private val viewModel: MainViewModel by lazy { - ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java) - } + private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -33,7 +27,7 @@ abstract class AbstractIssueFragment : BaseFragment() { private fun observeDataChange() { - viewModel.loadingState.observe(viewLifecycleOwner, Observer { showLoadingState(it) }) + viewModel.loadingState.observe(viewLifecycleOwner, { showLoadingState(it) }) viewModel.apiError.observe(viewLifecycleOwner, EventObserver { handleError(it) }) viewModel.issueLiveData.observe(viewLifecycleOwner, EventObserver { setIssuesData(it) diff --git a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/IssuesFragment.kt b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/IssuesFragment.kt index 3d74b87..d19038e 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/IssuesFragment.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/ui/fragment/IssuesFragment.kt @@ -53,9 +53,9 @@ class IssuesFragment : AbstractIssueFragment(), IAdapterCallback { override fun showLoadingState(loading: Boolean) { if (loading) - shimmer_view_container.startShimmerAnimation() + shimmer_view_container.startShimmer() else { - shimmer_view_container.stopShimmerAnimation() + shimmer_view_container.stopShimmer() shimmer_view_container.visibility = View.GONE } } diff --git a/app/src/main/java/com/example/githubfirebaseissue/ui/viewmodel/MainViewModel.kt b/app/src/main/java/com/example/githubfirebaseissue/ui/viewmodel/MainViewModel.kt index 3fa050a..8a52412 100644 --- a/app/src/main/java/com/example/githubfirebaseissue/ui/viewmodel/MainViewModel.kt +++ b/app/src/main/java/com/example/githubfirebaseissue/ui/viewmodel/MainViewModel.kt @@ -8,16 +8,16 @@ import com.example.githubfirebaseissue.common.RxScheduler import com.example.githubfirebaseissue.model.Comment import com.example.githubfirebaseissue.model.Issue import com.example.githubfirebaseissue.usecase.GetFireBaseIssueUseCase -import io.reactivex.android.schedulers.AndroidSchedulers +import dagger.hilt.android.lifecycle.HiltViewModel import io.reactivex.disposables.CompositeDisposable import javax.inject.Inject -import io.reactivex.schedulers.Schedulers -class MainViewModel @Inject constructor(private val useCase: GetFireBaseIssueUseCase, - private val scheduler : RxScheduler -) : - ViewModel() { +@HiltViewModel +class MainViewModel @Inject constructor( + private val useCase: GetFireBaseIssueUseCase, + private val scheduler: RxScheduler +) : ViewModel() { private val _issueLiveData by lazy { MutableLiveData>>() } val issueLiveData: LiveData>> by lazy { _issueLiveData } @@ -42,8 +42,7 @@ class MainViewModel @Inject constructor(private val useCase: GetFireBaseIssueUse .doOnError { loadingState.value = false } .map { it.sortedByDescending { issue -> issue.updatedAt } } .subscribe( - { Event(it).run(_issueLiveData::postValue) } - , + { Event(it).run(_issueLiveData::postValue) }, { Event(it).run(_apiError::postValue) } ) disposable.add(issueDisposable) @@ -69,5 +68,4 @@ class MainViewModel @Inject constructor(private val useCase: GetFireBaseIssueUse disposable.clear() } - } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9e458f2..8c91cc4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.61' + ext.kotlin_version = '1.4.30' ext { //Version @@ -12,27 +12,28 @@ buildscript { sdk_min_version = 19 sdk_target_version = 28 sdk_compile_version = 28 - glide_version = '4.11.0' - appcompat_version = '1.1.0' + glide_version = '4.12.0' + appcompat_version = '1.2.0' lifecycle_version = "2.2.0" androidx_stable_version = "1.2.0-alpha01" androidx_constraint_layout_version = "2.0.0-beta4" - logging_interceptor_version = "4.3.1" + logging_interceptor_version = "4.6.0" ktx_version = "1.0.2" ktx_fragment_version = "1.2.2" - retrofit_version = "2.4.0" + retrofit_version = "2.9.0" rxJavaVersion = '2.1.1' android_material_version = "1.2.0-alpha05" - gson_version = "2.8.5" - junit_version = '4.12' + gson_version = "2.8.6" + junit_version = '4.13.2' test_runner_version = '1.2.0' test_espresso_version = '3.2.0' jraska_version = "1.1.0" hamcrest_version = "1.3" - mockito_version = "2.21.0" - dagger_version = "2.23.2" + mockito_version = "2.28.2" + dagger_version = "2.29.1" arch_runtime_version = "1.1.1" arch_version = "1.1.1" + hilt_version = "2.33-beta" } repositories { google() @@ -43,6 +44,7 @@ buildscript { classpath 'com.android.tools.build:gradle:3.6.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.mannodermaus.gradle.plugins:android-junit5:1.5.2.0" + classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }