From f09d89f93d20afb068288bf9e389a805f504b30f Mon Sep 17 00:00:00 2001 From: Fernando Cejas Date: Sat, 31 Oct 2020 16:31:00 +0100 Subject: [PATCH 1/3] Remove Dagger dependencies and add hilt ones. --- app/build.gradle.kts | 10 ++++---- .../sample/AndroidApplication.kt | 2 ++ build.gradle.kts | 3 ++- buildSrc/src/main/kotlin/Dependencies.kt | 23 ++++++++----------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c2f9e924..e0f44f5e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id(BuildPlugins.kotlinAndroid) id(BuildPlugins.kotlinKapt) id(BuildPlugins.kotlinAndroidExtensions) + id(BuildPlugins.androidHilt) // Internal Script plugins id(ScriptPlugins.variants) @@ -35,9 +36,7 @@ android { dependencies { //Compile time dependencies kapt(Libraries.lifecycleCompiler) - kapt(Libraries.daggerCompiler) - compileOnly(Libraries.javaxAnnotation) - compileOnly(Libraries.javaxInject) + kapt(Libraries.hiltCompiler) // Application dependencies implementation(Libraries.kotlinStdLib) @@ -54,7 +53,7 @@ dependencies { implementation(Libraries.material) implementation(Libraries.androidAnnotations) implementation(Libraries.glide) - implementation(Libraries.dagger) + implementation(Libraries.hilt) implementation(Libraries.retrofit) implementation(Libraries.okHttpLoggingInterceptor) @@ -70,7 +69,8 @@ dependencies { androidTestImplementation(TestLibraries.testExtJunit) androidTestImplementation(TestLibraries.testRules) androidTestImplementation(TestLibraries.espressoIntents) + androidTestImplementation(TestLibraries.hiltTesting) // Development dependencies debugImplementation(DevLibraries.leakCanary) -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt b/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt index 4ae3b7c8..228d653f 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt @@ -19,7 +19,9 @@ import android.app.Application import com.fernandocejas.sample.core.di.ApplicationComponent import com.fernandocejas.sample.core.di.ApplicationModule import com.fernandocejas.sample.core.di.DaggerApplicationComponent +import dagger.hilt.android.HiltAndroidApp +@HiltAndroidApp class AndroidApplication : Application() { val appComponent: ApplicationComponent by lazy(mode = LazyThreadSafetyMode.NONE) { diff --git a/build.gradle.kts b/build.gradle.kts index b672e9fb..148fb4dd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,7 @@ buildscript { dependencies { classpath (BuildPlugins.androidGradlePlugin) classpath (BuildPlugins.kotlinGradlePlugin) + classpath (BuildPlugins.hiltGradlePlugin) } } @@ -19,4 +20,4 @@ allprojects { google() jcenter() } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index d27946a0..d054955c 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -17,16 +17,19 @@ object AndroidClient { } object BuildPlugins { - object Versions { const val buildToolsVersion = "4.1.0" const val gradleVersion = "6.6.1" + const val hilt = "2.29-alpha" } + const val androidGradlePlugin = "com.android.tools.build:gradle:${Versions.buildToolsVersion}" const val kotlinGradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Kotlin.standardLibrary}" + const val hiltGradlePlugin = "com.google.dagger:hilt-android-gradle-plugin:${Versions.hilt}" const val androidApplication = "com.android.application" const val kotlinAndroid = "kotlin-android" const val kotlinKapt = "kotlin-kapt" + const val androidHilt = "dagger.hilt.android.plugin" const val kotlinAndroidExtensions = "kotlin-android-extensions" } @@ -39,6 +42,7 @@ object ScriptPlugins { object Libraries { private object Versions { + const val hilt = BuildPlugins.Versions.hilt const val appCompat = "1.2.0" const val constraintLayout = "2.0.2" const val recyclerView = "1.1.0" @@ -51,11 +55,6 @@ object Libraries { const val glide = "4.11.0" const val retrofit = "2.9.0" const val okHttpLoggingInterceptor = "4.9.0" - - //TODO: Legacy -> WIP -> Try Hilt? - const val dagger = "2.11" - const val javaxAnnotations = "1.0" - const val javaxInject = "1" } const val kotlinStdLib = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Kotlin.standardLibrary}" @@ -73,14 +72,10 @@ object Libraries { const val material = "com.google.android.material:material:${Versions.material}" const val androidAnnotations = "androidx.annotation:annotation:${Versions.annotations}" const val glide = "com.github.bumptech.glide:glide:${Versions.glide}" - const val dagger = "com.google.dagger:dagger:${Versions.dagger}" + const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}" + const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}" const val retrofit = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}" const val okHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptor}" - - //TODO: Legacy -> WIP -> Migrate to Koin or Hilt? - const val daggerCompiler = "com.google.dagger:dagger-compiler:${Versions.dagger}" - const val javaxAnnotation = "javax.annotation:jsr250-api:${Versions.javaxAnnotations}" - const val javaxInject = "javax.inject:javax.inject:${Versions.javaxInject}" } object TestLibraries { @@ -94,6 +89,7 @@ object TestLibraries { const val espressoIntents = "3.1.0" const val testExtensions = "1.1.1" const val testRules = "1.1.0" + const val hiltTesting = BuildPlugins.Versions.hilt } const val junit4 = "junit:junit:${Versions.junit4}" @@ -105,6 +101,7 @@ object TestLibraries { const val espressoCore = "androidx.test.espresso:espresso-core:${Versions.espressoCore}" const val espressoIntents = "androidx.test.espresso:espresso-intents:${Versions.espressoIntents}" const val testExtJunit = "androidx.test.ext:junit:${Versions.testExtensions}" + const val hiltTesting = "com.google.dagger:hilt-android-testing:${Versions.hiltTesting}" } object DevLibraries { @@ -113,4 +110,4 @@ object DevLibraries { } const val leakCanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakCanary}" -} \ No newline at end of file +} From ee9dd5b49cfae2a1287c7c4707942bd01a61e62e Mon Sep 17 00:00:00 2001 From: Fernando Cejas Date: Mon, 2 Nov 2020 11:46:55 +0100 Subject: [PATCH 2/3] Compile app but runtime error. --- app/build.gradle.kts | 4 ++ .../sample/AndroidApplication.kt | 20 +-------- .../sample/core/di/ApplicationComponent.kt | 34 --------------- .../sample/core/di/ApplicationModule.kt | 9 ++-- .../core/di/viewmodel/ViewModelFactory.kt | 38 ----------------- .../sample/core/di/viewmodel/ViewModelKey.kt | 24 ----------- .../core/di/viewmodel/ViewModelModule.kt | 40 ------------------ .../sample/core/extension/Fragment.kt | 14 +----- .../sample/core/navigation/RouteActivity.kt | 9 +--- .../sample/core/platform/BaseActivity.kt | 2 + .../sample/core/platform/BaseFragment.kt | 14 ++---- .../sample/core/platform/NetworkHandler.kt | 5 ++- .../features/movies/MovieDetailsFragment.kt | 32 +++++--------- .../features/movies/MovieDetailsView.kt | 14 +++--- .../features/movies/MovieDetailsViewModel.kt | 10 +++-- .../sample/features/movies/MoviesFragment.kt | 17 ++++---- .../sample/features/movies/MoviesViewModel.kt | 8 +++- .../sample/features/movies/PlayMovie.kt | 3 +- buildSrc/build.gradle.kts | 4 +- buildSrc/src/main/kotlin/Dependencies.kt | 4 +- .../kotlin/scripts/compilation.gradle.kts | 15 ++++++- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- gradlew.bat | 21 ++------- 25 files changed, 85 insertions(+), 260 deletions(-) delete mode 100644 app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationComponent.kt delete mode 100644 app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelFactory.kt delete mode 100644 app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelKey.kt delete mode 100644 app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelModule.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e0f44f5e..5cc8df15 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -54,9 +54,13 @@ dependencies { implementation(Libraries.androidAnnotations) implementation(Libraries.glide) implementation(Libraries.hilt) + implementation(Libraries.hiltLifecycle) implementation(Libraries.retrofit) implementation(Libraries.okHttpLoggingInterceptor) + //TODO: change this + implementation ("androidx.fragment:fragment-ktx:1.2.5") + // Unit/Android tests dependencies testImplementation(TestLibraries.junit4) testImplementation(TestLibraries.mockk) diff --git a/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt b/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt index 228d653f..b23daf6a 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/AndroidApplication.kt @@ -16,25 +16,7 @@ package com.fernandocejas.sample import android.app.Application -import com.fernandocejas.sample.core.di.ApplicationComponent -import com.fernandocejas.sample.core.di.ApplicationModule -import com.fernandocejas.sample.core.di.DaggerApplicationComponent import dagger.hilt.android.HiltAndroidApp @HiltAndroidApp -class AndroidApplication : Application() { - - val appComponent: ApplicationComponent by lazy(mode = LazyThreadSafetyMode.NONE) { - DaggerApplicationComponent - .builder() - .applicationModule(ApplicationModule(this)) - .build() - } - - override fun onCreate() { - super.onCreate() - this.injectMembers() - } - - private fun injectMembers() = appComponent.inject(this) -} +class AndroidApplication : Application() diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationComponent.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationComponent.kt deleted file mode 100644 index f5832bbf..00000000 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationComponent.kt +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (C) 2020 Fernando Cejas Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.fernandocejas.sample.core.di - -import com.fernandocejas.sample.AndroidApplication -import com.fernandocejas.sample.core.di.viewmodel.ViewModelModule -import com.fernandocejas.sample.features.movies.MovieDetailsFragment -import com.fernandocejas.sample.features.movies.MoviesFragment -import com.fernandocejas.sample.core.navigation.RouteActivity -import dagger.Component -import javax.inject.Singleton - -@Singleton -@Component(modules = [ApplicationModule::class, ViewModelModule::class]) -interface ApplicationComponent { - fun inject(application: AndroidApplication) - fun inject(routeActivity: RouteActivity) - - fun inject(moviesFragment: MoviesFragment) - fun inject(movieDetailsFragment: MovieDetailsFragment) -} diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt index 8fc82470..da49f6fb 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt @@ -15,12 +15,12 @@ */ package com.fernandocejas.sample.core.di -import android.content.Context -import com.fernandocejas.sample.AndroidApplication import com.fernandocejas.sample.BuildConfig import com.fernandocejas.sample.features.movies.MoviesRepository import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ApplicationComponent import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit @@ -28,9 +28,8 @@ import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton @Module -class ApplicationModule(private val application: AndroidApplication) { - - @Provides @Singleton fun provideApplicationContext(): Context = application +@InstallIn(ApplicationComponent::class) +class ApplicationModule { @Provides @Singleton fun provideRetrofit(): Retrofit { return Retrofit.Builder() diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelFactory.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelFactory.kt deleted file mode 100644 index 84ba1db2..00000000 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelFactory.kt +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (C) 2020 Fernando Cejas Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.fernandocejas.sample.core.di.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import javax.inject.Inject -import javax.inject.Provider -import javax.inject.Singleton - -@Singleton -@Suppress("UNCHECKED_CAST") -class ViewModelFactory -@Inject constructor(private val creators: Map, - @JvmSuppressWildcards Provider>) : ViewModelProvider.Factory { - - override fun create(modelClass: Class): T { - val creator = creators[modelClass] ?: - creators.asIterable().firstOrNull { modelClass.isAssignableFrom(it.key) }?.value ?: - throw IllegalArgumentException("Unknown ViewModel class $modelClass") - - return try { creator.get() as T } - catch (e: Exception) { throw RuntimeException(e) } - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelKey.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelKey.kt deleted file mode 100644 index 93565abc..00000000 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelKey.kt +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (C) 2020 Fernando Cejas Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.fernandocejas.sample.core.di.viewmodel - -import androidx.lifecycle.ViewModel -import dagger.MapKey -import kotlin.reflect.KClass - -@MapKey -@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) -internal annotation class ViewModelKey(val value: KClass) \ No newline at end of file diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelModule.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelModule.kt deleted file mode 100644 index 65a7564e..00000000 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/viewmodel/ViewModelModule.kt +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (C) 2020 Fernando Cejas Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.fernandocejas.sample.core.di.viewmodel - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.fernandocejas.sample.features.movies.MovieDetailsViewModel -import com.fernandocejas.sample.features.movies.MoviesViewModel -import dagger.Binds -import dagger.Module -import dagger.multibindings.IntoMap - -@Module -abstract class ViewModelModule { - @Binds - internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory - - @Binds - @IntoMap - @ViewModelKey(MoviesViewModel::class) - abstract fun bindsMoviesViewModel(moviesViewModel: MoviesViewModel): ViewModel - - @Binds - @IntoMap - @ViewModelKey(MovieDetailsViewModel::class) - abstract fun bindsMovieDetailsViewModel(movieDetailsViewModel: MovieDetailsViewModel): ViewModel -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/extension/Fragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/extension/Fragment.kt index 6f548219..2891c695 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/extension/Fragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/extension/Fragment.kt @@ -17,27 +17,17 @@ package com.fernandocejas.sample.core.extension import android.content.Context import android.view.View -import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.ViewModelProviders import com.fernandocejas.sample.core.platform.BaseActivity import com.fernandocejas.sample.core.platform.BaseFragment -import kotlinx.android.synthetic.main.activity_layout.fragmentContainer +import kotlinx.android.synthetic.main.activity_layout.* inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) = beginTransaction().func().commit() -inline fun Fragment.viewModel(factory: ViewModelProvider.Factory, body: T.() -> Unit): T { - val vm = ViewModelProviders.of(this, factory)[T::class.java] - vm.body() - return vm -} - fun BaseFragment.close() = fragmentManager?.popBackStack() val BaseFragment.viewContainer: View get() = (activity as BaseActivity).fragmentContainer -val BaseFragment.appContext: Context get() = activity?.applicationContext!! \ No newline at end of file +val BaseFragment.appContext: Context get() = activity?.applicationContext!! diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/navigation/RouteActivity.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/navigation/RouteActivity.kt index ba134e01..f96bf734 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/navigation/RouteActivity.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/navigation/RouteActivity.kt @@ -17,21 +17,16 @@ package com.fernandocejas.sample.core.navigation import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import com.fernandocejas.sample.AndroidApplication -import com.fernandocejas.sample.core.di.ApplicationComponent +import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject +@AndroidEntryPoint class RouteActivity : AppCompatActivity() { - private val appComponent: ApplicationComponent by lazy(mode = LazyThreadSafetyMode.NONE) { - (application as AndroidApplication).appComponent - } - @Inject internal lateinit var navigator: Navigator override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appComponent.inject(this) navigator.showMain(this) } } diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseActivity.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseActivity.kt index 15179fe6..a9579077 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseActivity.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseActivity.kt @@ -19,6 +19,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.fernandocejas.sample.R import com.fernandocejas.sample.core.extension.inTransaction +import dagger.hilt.android.AndroidEntryPoint import kotlinx.android.synthetic.main.toolbar.* /** @@ -27,6 +28,7 @@ import kotlinx.android.synthetic.main.toolbar.* * * @see AppCompatActivity */ +@AndroidEntryPoint abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseFragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseFragment.kt index 07ccf98a..c1d58a39 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseFragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/BaseFragment.kt @@ -22,31 +22,23 @@ import android.view.ViewGroup import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import com.fernandocejas.sample.AndroidApplication import com.fernandocejas.sample.R.color -import com.fernandocejas.sample.core.di.ApplicationComponent import com.fernandocejas.sample.core.extension.appContext import com.fernandocejas.sample.core.extension.viewContainer import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.toolbar.progress -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.android.synthetic.main.toolbar.* /** * Base Fragment class with helper methods for handling views and back button events. * * @see Fragment */ +@AndroidEntryPoint abstract class BaseFragment : Fragment() { abstract fun layoutId(): Int - val appComponent: ApplicationComponent by lazy(mode = LazyThreadSafetyMode.NONE) { - (activity?.application as AndroidApplication).appComponent - } - - @Inject lateinit var viewModelFactory: ViewModelProvider.Factory - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = inflater.inflate(layoutId(), container, false) diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/NetworkHandler.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/NetworkHandler.kt index b25afbbe..5bf0ddff 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/platform/NetworkHandler.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/platform/NetworkHandler.kt @@ -19,6 +19,7 @@ import android.content.Context import android.net.NetworkCapabilities import android.os.Build import com.fernandocejas.sample.core.extension.connectivityManager +import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import javax.inject.Singleton @@ -27,7 +28,7 @@ import javax.inject.Singleton */ @Singleton class NetworkHandler -@Inject constructor(private val context: Context) { +@Inject constructor(@ApplicationContext private val context: Context) { fun isNetworkAvailable(): Boolean { val connectivityManager = context.connectivityManager @@ -50,4 +51,4 @@ class NetworkHandler return networkInfo.isConnected } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt index 6326633f..8c2cbcdf 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt @@ -17,28 +17,16 @@ package com.fernandocejas.sample.features.movies import android.os.Bundle import android.view.View -import com.fernandocejas.sample.core.platform.BaseFragment +import androidx.fragment.app.viewModels import com.fernandocejas.sample.R -import com.fernandocejas.sample.features.movies.MovieFailure.NonExistentMovie import com.fernandocejas.sample.core.exception.Failure import com.fernandocejas.sample.core.exception.Failure.NetworkConnection import com.fernandocejas.sample.core.exception.Failure.ServerError -import com.fernandocejas.sample.core.extension.close -import com.fernandocejas.sample.core.extension.failure -import com.fernandocejas.sample.core.extension.isVisible -import com.fernandocejas.sample.core.extension.loadFromUrl -import com.fernandocejas.sample.core.extension.loadUrlAndPostponeEnterTransition -import com.fernandocejas.sample.core.extension.observe -import com.fernandocejas.sample.core.extension.viewModel -import kotlinx.android.synthetic.main.fragment_movie_details.movieCast -import kotlinx.android.synthetic.main.fragment_movie_details.movieDetails -import kotlinx.android.synthetic.main.fragment_movie_details.movieDirector -import kotlinx.android.synthetic.main.fragment_movie_details.moviePlay -import kotlinx.android.synthetic.main.fragment_movie_details.moviePoster -import kotlinx.android.synthetic.main.fragment_movie_details.movieSummary -import kotlinx.android.synthetic.main.fragment_movie_details.movieYear -import kotlinx.android.synthetic.main.fragment_movie_details.scrollView -import kotlinx.android.synthetic.main.toolbar.toolbar +import com.fernandocejas.sample.core.extension.* +import com.fernandocejas.sample.core.platform.BaseFragment +import com.fernandocejas.sample.features.movies.MovieFailure.NonExistentMovie +import kotlinx.android.synthetic.main.fragment_movie_details.* +import kotlinx.android.synthetic.main.toolbar.* import javax.inject.Inject class MovieDetailsFragment : BaseFragment() { @@ -59,16 +47,15 @@ class MovieDetailsFragment : BaseFragment() { @Inject lateinit var movieDetailsAnimator: MovieDetailsAnimator - private lateinit var movieDetailsViewModel: MovieDetailsViewModel + private val movieDetailsViewModel: MovieDetailsViewModel by viewModels() override fun layoutId() = R.layout.fragment_movie_details override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appComponent.inject(this) activity?.let { movieDetailsAnimator.postponeEnterTransition(it) } - movieDetailsViewModel = viewModel(viewModelFactory) { + with(movieDetailsViewModel) { observe(movieDetails, ::renderMovieDetails) failure(failure, ::handleFailure) } @@ -81,7 +68,7 @@ class MovieDetailsFragment : BaseFragment() { } else { movieDetailsAnimator.scaleUpView(moviePlay) movieDetailsAnimator.cancelTransition(moviePoster) - moviePoster.loadFromUrl((arguments!![PARAM_MOVIE] as MovieView).poster) + moviePoster.loadFromUrl((requireArguments()[PARAM_MOVIE] as MovieView).poster) } } @@ -116,6 +103,7 @@ class MovieDetailsFragment : BaseFragment() { is NetworkConnection -> { notify(R.string.failure_network_connection); close() } is ServerError -> { notify(R.string.failure_server_error); close() } is NonExistentMovie -> { notify(R.string.failure_movie_non_existent); close() } + else -> { notify(R.string.failure_server_error); close() } } } } diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsView.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsView.kt index 2eb727d7..e02483ea 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsView.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsView.kt @@ -16,10 +16,10 @@ package com.fernandocejas.sample.features.movies data class MovieDetailsView(val id: Int, - val title: String, - val poster: String, - val summary: String, - val cast: String, - val director: String, - val year: Int, - val trailer: String) + val title: String, + val poster: String, + val summary: String, + val cast: String, + val director: String, + val year: Int, + val trailer: String) diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt index 27cbb885..20f2d62a 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt @@ -15,15 +15,19 @@ */ package com.fernandocejas.sample.features.movies +import androidx.hilt.Assisted +import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import com.fernandocejas.sample.core.platform.BaseViewModel import com.fernandocejas.sample.features.movies.GetMovieDetails.Params import javax.inject.Inject class MovieDetailsViewModel -@Inject constructor(private val getMovieDetails: GetMovieDetails, - private val playMovie: PlayMovie) : BaseViewModel() { +@ViewModelInject constructor(private val getMovieDetails: GetMovieDetails, + @Assisted private val savedStateHandle: SavedStateHandle, + private val playMovie: PlayMovie) : BaseViewModel() { private val _movieDetails: MutableLiveData = MutableLiveData() val movieDetails: LiveData = _movieDetails @@ -37,4 +41,4 @@ class MovieDetailsViewModel _movieDetails.value = MovieDetailsView(movie.id, movie.title, movie.poster, movie.summary, movie.cast, movie.director, movie.year, movie.trailer) } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt index 5935d910..bc9b9e32 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt @@ -18,21 +18,20 @@ package com.fernandocejas.sample.features.movies import android.os.Bundle import android.view.View import androidx.annotation.StringRes +import androidx.fragment.app.viewModels import androidx.recyclerview.widget.StaggeredGridLayoutManager -import com.fernandocejas.sample.core.platform.BaseFragment import com.fernandocejas.sample.R -import com.fernandocejas.sample.features.movies.MovieFailure.ListNotAvailable import com.fernandocejas.sample.core.exception.Failure import com.fernandocejas.sample.core.exception.Failure.NetworkConnection import com.fernandocejas.sample.core.exception.Failure.ServerError import com.fernandocejas.sample.core.extension.failure import com.fernandocejas.sample.core.extension.invisible import com.fernandocejas.sample.core.extension.observe -import com.fernandocejas.sample.core.extension.viewModel import com.fernandocejas.sample.core.extension.visible import com.fernandocejas.sample.core.navigation.Navigator -import kotlinx.android.synthetic.main.fragment_movies.emptyView -import kotlinx.android.synthetic.main.fragment_movies.movieList +import com.fernandocejas.sample.core.platform.BaseFragment +import com.fernandocejas.sample.features.movies.MovieFailure.ListNotAvailable +import kotlinx.android.synthetic.main.fragment_movies.* import javax.inject.Inject class MoviesFragment : BaseFragment() { @@ -40,15 +39,14 @@ class MoviesFragment : BaseFragment() { @Inject lateinit var navigator: Navigator @Inject lateinit var moviesAdapter: MoviesAdapter - private lateinit var moviesViewModel: MoviesViewModel + private val moviesViewModel: MoviesViewModel by viewModels() override fun layoutId() = R.layout.fragment_movies override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - appComponent.inject(this) - moviesViewModel = viewModel(viewModelFactory) { + with(moviesViewModel) { observe(movies, ::renderMoviesList) failure(failure, ::handleFailure) } @@ -65,7 +63,7 @@ class MoviesFragment : BaseFragment() { movieList.layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL) movieList.adapter = moviesAdapter moviesAdapter.clickListener = { movie, navigationExtras -> - navigator.showMovieDetails(activity!!, movie, navigationExtras) } + navigator.showMovieDetails(requireActivity(), movie, navigationExtras) } } private fun loadMoviesList() { @@ -85,6 +83,7 @@ class MoviesFragment : BaseFragment() { is NetworkConnection -> renderFailure(R.string.failure_network_connection) is ServerError -> renderFailure(R.string.failure_server_error) is ListNotAvailable -> renderFailure(R.string.failure_movies_list_unavailable) + else -> renderFailure(R.string.failure_server_error) } } diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt index dc06bfb4..c2cd7b1e 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt @@ -15,14 +15,18 @@ */ package com.fernandocejas.sample.features.movies +import androidx.hilt.Assisted +import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.SavedStateHandle import com.fernandocejas.sample.core.interactor.UseCase.None import com.fernandocejas.sample.core.platform.BaseViewModel import javax.inject.Inject class MoviesViewModel -@Inject constructor(private val getMovies: GetMovies) : BaseViewModel() { +@ViewModelInject constructor(private val getMovies: GetMovies, + @Assisted private val savedStateHandle: SavedStateHandle) : BaseViewModel() { private val _movies: MutableLiveData> = MutableLiveData() val movies: LiveData> = _movies @@ -32,4 +36,4 @@ class MoviesViewModel private fun handleMovieList(movies: List) { _movies.value = movies.map { MovieView(it.id, it.poster) } } -} \ No newline at end of file +} diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/PlayMovie.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/PlayMovie.kt index 72319055..1ff61290 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/PlayMovie.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/PlayMovie.kt @@ -23,10 +23,11 @@ import com.fernandocejas.sample.core.functional.Either.Right import com.fernandocejas.sample.core.interactor.UseCase import com.fernandocejas.sample.core.interactor.UseCase.None import com.fernandocejas.sample.core.navigation.Navigator +import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject class PlayMovie -@Inject constructor(private val context: Context, +@Inject constructor(@ApplicationContext private val context: Context, private val navigator: Navigator) : UseCase() { override suspend fun run(params: Params): Either { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index eb9ac6fd..84db995c 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,6 @@ object Dependencies { const val AndroidBuildTools = "com.android.tools.build:gradle:4.1.0" + const val kotlinGradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10" const val detektGradlePlugin = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.14.1" } @@ -15,5 +16,6 @@ repositories { dependencies { implementation(Dependencies.AndroidBuildTools) + implementation(Dependencies.kotlinGradlePlugin) implementation(Dependencies.detektGradlePlugin) -} \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index d054955c..4166667c 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -19,7 +19,7 @@ object AndroidClient { object BuildPlugins { object Versions { const val buildToolsVersion = "4.1.0" - const val gradleVersion = "6.6.1" + const val gradleVersion = "6.7" const val hilt = "2.29-alpha" } @@ -43,6 +43,7 @@ object ScriptPlugins { object Libraries { private object Versions { const val hilt = BuildPlugins.Versions.hilt + const val hiltLifecycle = "1.0.0-alpha01" const val appCompat = "1.2.0" const val constraintLayout = "2.0.2" const val recyclerView = "1.1.0" @@ -73,6 +74,7 @@ object Libraries { const val androidAnnotations = "androidx.annotation:annotation:${Versions.annotations}" const val glide = "com.github.bumptech.glide:glide:${Versions.glide}" const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}" + const val hiltLifecycle = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltLifecycle}" const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}" const val retrofit = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}" const val okHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptor}" diff --git a/buildSrc/src/main/kotlin/scripts/compilation.gradle.kts b/buildSrc/src/main/kotlin/scripts/compilation.gradle.kts index dcaf8c6d..d2a73607 100644 --- a/buildSrc/src/main/kotlin/scripts/compilation.gradle.kts +++ b/buildSrc/src/main/kotlin/scripts/compilation.gradle.kts @@ -1,6 +1,9 @@ package scripts -plugins { id("com.android.application") apply false } +plugins { + id("com.android.application") apply false + id("kotlin-android") apply false +} android { packagingOptions { @@ -15,4 +18,12 @@ android { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } -} \ No newline at end of file + + testOptions { + animationsDisabled = true + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6656 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 Yte!%o?r4GTrVtxD61Ym!|5fq-1K$0e!T1w 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 33682bbb..14e30f74 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index fbd7c515..4f906e0c 100755 --- a/gradlew +++ b/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index a9f778a7..ac1b06f9 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 41d1064de177823f32a59d8c1fdd166e4787ae19 Mon Sep 17 00:00:00 2001 From: Zhu Date: Thu, 29 Apr 2021 23:44:09 +0800 Subject: [PATCH 3/3] =?UTF-8?q?finish=20the=20refactor=20of=E3=80=8Chilt?= =?UTF-8?q?=E3=80=8D.=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * finish the refactor of「hilt」. * update the version of「Hilt」and do some migration steps. * remove redundant Annotation. * remove redundant Annotation. * keep the old code style. * upgrade the version of「Hilt」to stable. Co-authored-by: Zhu --- app/build.gradle.kts | 1 - .../fernandocejas/sample/core/di/ApplicationModule.kt | 4 ++-- .../sample/features/movies/MovieDetailsActivity.kt | 1 + .../sample/features/movies/MovieDetailsFragment.kt | 2 +- .../sample/features/movies/MovieDetailsViewModel.kt | 10 +++++----- .../sample/features/movies/MoviesActivity.kt | 1 + .../sample/features/movies/MoviesFragment.kt | 2 +- .../sample/features/movies/MoviesViewModel.kt | 8 ++++---- buildSrc/src/main/kotlin/Dependencies.kt | 4 +--- 9 files changed, 16 insertions(+), 17 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5cc8df15..7ae3729e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -54,7 +54,6 @@ dependencies { implementation(Libraries.androidAnnotations) implementation(Libraries.glide) implementation(Libraries.hilt) - implementation(Libraries.hiltLifecycle) implementation(Libraries.retrofit) implementation(Libraries.okHttpLoggingInterceptor) diff --git a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt b/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt index da49f6fb..59d26acb 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/core/di/ApplicationModule.kt @@ -20,7 +20,7 @@ import com.fernandocejas.sample.features.movies.MoviesRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn -import dagger.hilt.android.components.ApplicationComponent +import dagger.hilt.components.SingletonComponent import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit @@ -28,7 +28,7 @@ import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton @Module -@InstallIn(ApplicationComponent::class) +@InstallIn(SingletonComponent::class) class ApplicationModule { @Provides @Singleton fun provideRetrofit(): Retrofit { diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsActivity.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsActivity.kt index 2cb99984..d1b692aa 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsActivity.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsActivity.kt @@ -18,6 +18,7 @@ package com.fernandocejas.sample.features.movies import android.content.Context import android.content.Intent import com.fernandocejas.sample.core.platform.BaseActivity +import dagger.hilt.android.AndroidEntryPoint class MovieDetailsActivity : BaseActivity() { diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt index 8c2cbcdf..0f4bdeff 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsFragment.kt @@ -47,7 +47,7 @@ class MovieDetailsFragment : BaseFragment() { @Inject lateinit var movieDetailsAnimator: MovieDetailsAnimator - private val movieDetailsViewModel: MovieDetailsViewModel by viewModels() + private val movieDetailsViewModel by viewModels() override fun layoutId() = R.layout.fragment_movie_details diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt index 20f2d62a..64dbf395 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MovieDetailsViewModel.kt @@ -15,19 +15,19 @@ */ package com.fernandocejas.sample.features.movies -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import com.fernandocejas.sample.core.platform.BaseViewModel import com.fernandocejas.sample.features.movies.GetMovieDetails.Params +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +@HiltViewModel class MovieDetailsViewModel -@ViewModelInject constructor(private val getMovieDetails: GetMovieDetails, - @Assisted private val savedStateHandle: SavedStateHandle, - private val playMovie: PlayMovie) : BaseViewModel() { +@Inject constructor(private val getMovieDetails: GetMovieDetails, + private val savedStateHandle: SavedStateHandle, + private val playMovie: PlayMovie) : BaseViewModel() { private val _movieDetails: MutableLiveData = MutableLiveData() val movieDetails: LiveData = _movieDetails diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesActivity.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesActivity.kt index a6c541b6..e03f2c45 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesActivity.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesActivity.kt @@ -18,6 +18,7 @@ package com.fernandocejas.sample.features.movies import android.content.Context import android.content.Intent import com.fernandocejas.sample.core.platform.BaseActivity +import dagger.hilt.android.AndroidEntryPoint class MoviesActivity : BaseActivity() { diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt index bc9b9e32..a5f662ef 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesFragment.kt @@ -63,7 +63,7 @@ class MoviesFragment : BaseFragment() { movieList.layoutManager = StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL) movieList.adapter = moviesAdapter moviesAdapter.clickListener = { movie, navigationExtras -> - navigator.showMovieDetails(requireActivity(), movie, navigationExtras) } + navigator.showMovieDetails(requireActivity(), movie, navigationExtras) } } private fun loadMoviesList() { diff --git a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt index c2cd7b1e..da32b693 100644 --- a/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt +++ b/app/src/main/kotlin/com/fernandocejas/sample/features/movies/MoviesViewModel.kt @@ -15,18 +15,18 @@ */ package com.fernandocejas.sample.features.movies -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import com.fernandocejas.sample.core.interactor.UseCase.None import com.fernandocejas.sample.core.platform.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject +@HiltViewModel class MoviesViewModel -@ViewModelInject constructor(private val getMovies: GetMovies, - @Assisted private val savedStateHandle: SavedStateHandle) : BaseViewModel() { +@Inject constructor(private val getMovies: GetMovies, + private val savedStateHandle: SavedStateHandle) : BaseViewModel() { private val _movies: MutableLiveData> = MutableLiveData() val movies: LiveData> = _movies diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 4166667c..f6d12f8f 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -20,7 +20,7 @@ object BuildPlugins { object Versions { const val buildToolsVersion = "4.1.0" const val gradleVersion = "6.7" - const val hilt = "2.29-alpha" + const val hilt = "2.35.1" } const val androidGradlePlugin = "com.android.tools.build:gradle:${Versions.buildToolsVersion}" @@ -43,7 +43,6 @@ object ScriptPlugins { object Libraries { private object Versions { const val hilt = BuildPlugins.Versions.hilt - const val hiltLifecycle = "1.0.0-alpha01" const val appCompat = "1.2.0" const val constraintLayout = "2.0.2" const val recyclerView = "1.1.0" @@ -74,7 +73,6 @@ object Libraries { const val androidAnnotations = "androidx.annotation:annotation:${Versions.annotations}" const val glide = "com.github.bumptech.glide:glide:${Versions.glide}" const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}" - const val hiltLifecycle = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltLifecycle}" const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}" const val retrofit = "com.squareup.retrofit2:converter-gson:${Versions.retrofit}" const val okHttpLoggingInterceptor = "com.squareup.okhttp3:logging-interceptor:${Versions.okHttpLoggingInterceptor}"