diff --git a/app/build.gradle b/app/build.gradle index 07e8fa5..273fb35 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,6 +4,7 @@ plugins { id 'kotlin-parcelize' id 'kotlin-kapt' id 'androidx.navigation.safeargs.kotlin' + id 'dagger.hilt.android.plugin' } android { @@ -91,9 +92,16 @@ dependencies { def dagger_version = "2.41" implementation "com.google.dagger:dagger:$dagger_version" - implementation "com.google.dagger:dagger-android-support:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" - kapt "com.google.dagger:dagger-android-processor:$dagger_version" + + def hilt_version = "2.38.1" + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-compiler:$hilt_version" + + def hiltExt = "1.3.0-RC1" + implementation "it.czerwinski.android.hilt:hilt-extensions:${hiltExt}" + kapt "it.czerwinski.android.hilt:hilt-processor:${hiltExt}" + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/WeatherApp.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/WeatherApp.kt index 3c6dbc3..2fd18a1 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/WeatherApp.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/WeatherApp.kt @@ -1,19 +1,9 @@ package ru.itis.karakurik.androidLab2 import android.app.Application -import ru.itis.karakurik.androidLab2.di.AppComponent -import ru.itis.karakurik.androidLab2.di.DaggerAppComponent +import dagger.hilt.android.HiltAndroidApp +@HiltAndroidApp class WeatherApp : Application() { - lateinit var appComponent: AppComponent - - override fun onCreate() { - super.onCreate() - appComponent = DaggerAppComponent - .builder() -// .context(context = this) - .application(this) - .build() - } } diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WeatherMapper.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WeatherMapper.kt index d4fd093..91bf647 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WeatherMapper.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WeatherMapper.kt @@ -12,7 +12,7 @@ class WeatherMapper @Inject constructor( private val weatherIconUrlMapper: WeatherIconUrlMapper ) { - fun map(weatherResponse: WeatherResponse) : Weather = Weather( + fun map(weatherResponse: WeatherResponse): Weather = Weather( id = weatherResponse.id, name = weatherResponse.name, lat = weatherResponse.coord.lat, @@ -27,7 +27,7 @@ class WeatherMapper @Inject constructor( iconUrl = weatherIconUrlMapper.mapToLargeIcon(weatherResponse.weather[0].icon) ) - fun map(city: City) : Weather = Weather( + fun map(city: City): Weather = Weather( id = city.id, name = city.name, lat = city.coord.lat, diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WindDegMapper.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WindDegMapper.kt index f1290e2..3b5aca4 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WindDegMapper.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/mapper/WindDegMapper.kt @@ -6,8 +6,8 @@ import javax.inject.Singleton @Singleton class WindDegMapper @Inject constructor() { - fun map(deg: Int) : WindDeg { - return when ((deg / 45 + 2* (deg%45) / 45) * 45 % 360) { + fun map(deg: Int): WindDeg { + return when ((deg / 45 + 2 * (deg % 45) / 45) * 45 % 360) { 0 -> WindDeg.N 45 -> WindDeg.NE 90 -> WindDeg.E diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/repository/WeatherRepositoryImpl.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/repository/WeatherRepositoryImpl.kt index b8497c8..e571d66 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/repository/WeatherRepositoryImpl.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/data/api/repository/WeatherRepositoryImpl.kt @@ -1,13 +1,14 @@ package ru.itis.karakurik.androidLab2.data.api.repository +import dagger.hilt.components.SingletonComponent +import it.czerwinski.android.hilt.annotations.BoundTo import ru.itis.karakurik.androidLab2.data.api.Api import ru.itis.karakurik.androidLab2.data.api.mapper.WeatherMapper import ru.itis.karakurik.androidLab2.domain.entity.Weather import ru.itis.karakurik.androidLab2.domain.repository.WeatherRepository import javax.inject.Inject -import javax.inject.Singleton -@Singleton +@BoundTo(supertype = WeatherRepository::class, component = SingletonComponent::class) class WeatherRepositoryImpl @Inject constructor( private val api: Api, private val weatherMapper: WeatherMapper diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/AppComponent.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/AppComponent.kt deleted file mode 100644 index 9098c3f..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/AppComponent.kt +++ /dev/null @@ -1,37 +0,0 @@ -package ru.itis.karakurik.androidLab2.di - -import dagger.BindsInstance -import dagger.Component -import ru.itis.karakurik.androidLab2.WeatherApp -import ru.itis.karakurik.androidLab2.di.module.AppModule -import ru.itis.karakurik.androidLab2.di.module.NetModule -import ru.itis.karakurik.androidLab2.di.module.RepoModule -import ru.itis.karakurik.androidLab2.di.module.ViewModelModule -import ru.itis.karakurik.androidLab2.presentation.MainActivity -import ru.itis.karakurik.androidLab2.presentation.fragments.cities.SearchFragment -import ru.itis.karakurik.androidLab2.presentation.fragments.weather.DetailsFragment -import javax.inject.Singleton - -@Singleton -@Component( - modules = [ - AppModule::class, - NetModule::class, - RepoModule::class, - ViewModelModule::class - ] -) -interface AppComponent { - - fun inject(mainActivity: MainActivity) - fun inject(searchFragment: SearchFragment) - fun inject(detailsFragment: DetailsFragment) - - @Component.Builder - interface Builder { - fun build(): AppComponent - - @BindsInstance - fun application(application: WeatherApp): Builder - } -} diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorAnnotation.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorAnnotation.kt deleted file mode 100644 index cab92aa..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorAnnotation.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ru.itis.karakurik.androidLab2.di.annotation - -import javax.inject.Qualifier - -@Qualifier -@Retention(AnnotationRetention.RUNTIME) -annotation class ApiKey - -@Qualifier -@Retention(AnnotationRetention.RUNTIME) -annotation class Units - -@Qualifier -@Retention(AnnotationRetention.RUNTIME) -annotation class Lang - -@Qualifier -@Retention(AnnotationRetention.RUNTIME) -annotation class Logger diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorKey.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorKey.kt deleted file mode 100644 index a3744be..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/InterceptorKey.kt +++ /dev/null @@ -1,14 +0,0 @@ -package ru.itis.karakurik.androidLab2.di.annotation - -import dagger.MapKey -import okhttp3.Interceptor -import kotlin.reflect.KClass - -@Target( - AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER -) -@Retention(AnnotationRetention.RUNTIME) -@MapKey -annotation class InterceptorKey(val value: KClass) diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/ViewModelKey.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/ViewModelKey.kt deleted file mode 100644 index f93d8b3..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/annotation/ViewModelKey.kt +++ /dev/null @@ -1,14 +0,0 @@ -package ru.itis.karakurik.androidLab2.di.annotation - -import androidx.lifecycle.ViewModel -import dagger.MapKey -import kotlin.reflect.KClass - -@Target( - AnnotationTarget.FUNCTION, - AnnotationTarget.PROPERTY_GETTER, - AnnotationTarget.PROPERTY_SETTER -) -@Retention(AnnotationRetention.RUNTIME) -@MapKey -annotation class ViewModelKey(val value: KClass) diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/AppModule.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/AppModule.kt index 9b81fa3..6b74dcf 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/AppModule.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/AppModule.kt @@ -6,16 +6,21 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.gms.location.LocationServices import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import ru.itis.karakurik.androidLab2.WeatherApp import javax.inject.Qualifier +import javax.inject.Singleton +@InstallIn(SingletonComponent::class) @Module class AppModule { - @Provides - fun provideContext(weatherApp: WeatherApp): Context = weatherApp.applicationContext +// @Provides +// fun provideContext(weatherApp: WeatherApp): Context = weatherApp.applicationContext @Provides @DefaultDispatcher @@ -43,7 +48,7 @@ class AppModule { @Provides fun provideSmoothScroller( - context: Context + @ApplicationContext context: Context ): RecyclerView.SmoothScroller = object : LinearSmoothScroller(context) { override fun getVerticalSnapPreference(): Int { return SNAP_TO_START @@ -52,6 +57,6 @@ class AppModule { @Provides fun provideFusedLocationProviderClient( - context: Context + @ApplicationContext context: Context ) = LocationServices.getFusedLocationProviderClient(context) } diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/NetModule.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/NetModule.kt index f72778f..63bf269 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/NetModule.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/NetModule.kt @@ -2,6 +2,8 @@ package ru.itis.karakurik.androidLab2.di.module import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import okhttp3.Cache import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -10,10 +12,10 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import ru.itis.karakurik.androidLab2.BuildConfig import ru.itis.karakurik.androidLab2.data.api.Api -import ru.itis.karakurik.androidLab2.di.annotation.ApiKey -import ru.itis.karakurik.androidLab2.di.annotation.Lang -import ru.itis.karakurik.androidLab2.di.annotation.Logger -import ru.itis.karakurik.androidLab2.di.annotation.Units +import ru.itis.karakurik.androidLab2.di.qualifier.ApiKeyInterceptor +import ru.itis.karakurik.androidLab2.di.qualifier.LangInterceptor +import ru.itis.karakurik.androidLab2.di.qualifier.LoggingInterceptor +import ru.itis.karakurik.androidLab2.di.qualifier.UnitsInterceptor import java.io.File import javax.inject.Qualifier @@ -25,11 +27,12 @@ private const val LANG = "RU" private const val QUERY_UNITS = "units" private const val UNITS = "metric" +@InstallIn(SingletonComponent::class) @Module class NetModule { @Provides - @ApiKey + @ApiKeyInterceptor fun apiKeyInterceptor(): Interceptor = Interceptor { chain -> val request = chain.request() val newUrl = request.url.newBuilder() @@ -44,7 +47,7 @@ class NetModule { } @Provides - @Lang + @LangInterceptor fun langInterceptor(): Interceptor = Interceptor { chain -> val request = chain.request() val newUrl = request.url.newBuilder() @@ -59,7 +62,7 @@ class NetModule { } @Provides - @Units + @UnitsInterceptor fun unitsInterceptor(): Interceptor = Interceptor { chain -> val request = chain.request() val newUrl = request.url.newBuilder() @@ -74,7 +77,7 @@ class NetModule { } @Provides - @Logger + @LoggingInterceptor fun provideLoggingInterceptor(): Interceptor { return HttpLoggingInterceptor() .setLevel( @@ -107,10 +110,10 @@ class NetModule { @Provides fun provideOkhttpClient( cache: Cache, - @ApiKey apiKeyInterceptor: Interceptor, - @Lang langInterceptor: Interceptor, - @Units unitsInterceptor: Interceptor, - @Logger loggingInterceptor: Interceptor, + @ApiKeyInterceptor apiKeyInterceptor: Interceptor, + @LangInterceptor langInterceptor: Interceptor, + @UnitsInterceptor unitsInterceptor: Interceptor, + @LoggingInterceptor loggingInterceptor: Interceptor, ): OkHttpClient = OkHttpClient.Builder() .cache(cache) diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/RepoModule.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/RepoModule.kt deleted file mode 100644 index d2516ac..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/RepoModule.kt +++ /dev/null @@ -1,17 +0,0 @@ -package ru.itis.karakurik.androidLab2.di.module - -import dagger.Binds -import dagger.Module -import ru.itis.karakurik.androidLab2.data.api.repository.WeatherRepositoryImpl -import ru.itis.karakurik.androidLab2.domain.repository.WeatherRepository -import javax.inject.Singleton - -@Module -interface RepoModule { - - @Singleton - @Binds - fun bindWeatherRepository( - impl: WeatherRepositoryImpl, - ): WeatherRepository -} diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/ViewModelModule.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/ViewModelModule.kt deleted file mode 100644 index 8c8f0df..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/di/module/ViewModelModule.kt +++ /dev/null @@ -1,34 +0,0 @@ -package ru.itis.karakurik.androidLab2.di.module - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import dagger.Binds -import dagger.Module -import dagger.multibindings.IntoMap -import ru.itis.karakurik.androidLab2.di.annotation.ViewModelKey -import ru.itis.karakurik.androidLab2.presentation.common.utils.AppViewModelFactory -import ru.itis.karakurik.androidLab2.presentation.fragments.cities.CityListViewModel -import ru.itis.karakurik.androidLab2.presentation.fragments.weather.WeatherViewModel - -@Module -interface ViewModelModule { - - @Binds - fun bindViewModelFactory( - factory: AppViewModelFactory - ): ViewModelProvider.Factory - - @Binds - @IntoMap - @ViewModelKey(CityListViewModel::class) - fun bindCityListViewModel( - viewModel: CityListViewModel - ): ViewModel - - @Binds - @IntoMap - @ViewModelKey(WeatherViewModel::class) - fun bindWeatherViewModel( - viewModel: WeatherViewModel - ): ViewModel -} diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/ApiKeyInterceptor.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/ApiKeyInterceptor.kt new file mode 100644 index 0000000..f7b8a18 --- /dev/null +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/ApiKeyInterceptor.kt @@ -0,0 +1,7 @@ +package ru.itis.karakurik.androidLab2.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class ApiKeyInterceptor diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LangInterceptor.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LangInterceptor.kt new file mode 100644 index 0000000..2f46666 --- /dev/null +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LangInterceptor.kt @@ -0,0 +1,7 @@ +package ru.itis.karakurik.androidLab2.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class LangInterceptor diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LoggingInterceptor.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LoggingInterceptor.kt new file mode 100644 index 0000000..d410c83 --- /dev/null +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/LoggingInterceptor.kt @@ -0,0 +1,7 @@ +package ru.itis.karakurik.androidLab2.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class LoggingInterceptor diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/UnitsInterceptor.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/UnitsInterceptor.kt new file mode 100644 index 0000000..cc3578d --- /dev/null +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/di/qualifier/UnitsInterceptor.kt @@ -0,0 +1,7 @@ +package ru.itis.karakurik.androidLab2.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.RUNTIME) +annotation class UnitsInterceptor diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/domain/enum/WindDeg.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/domain/enum/WindDeg.kt index 272cb4b..366af92 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/domain/enum/WindDeg.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/domain/enum/WindDeg.kt @@ -1,4 +1,5 @@ package ru.itis.karakurik.androidLab2.domain.enum + enum class WindDeg ( val deg: Int ) { diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/domain/usecase/GetWeatherUseCase.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/domain/usecase/GetWeatherUseCase.kt index e36d6fd..5ccc600 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/domain/usecase/GetWeatherUseCase.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/domain/usecase/GetWeatherUseCase.kt @@ -7,7 +7,6 @@ import ru.itis.karakurik.androidLab2.di.module.AppModule import ru.itis.karakurik.androidLab2.domain.entity.Weather import ru.itis.karakurik.androidLab2.domain.repository.WeatherRepository import javax.inject.Inject -import javax.inject.Named import javax.inject.Singleton @Singleton diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/MainActivity.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/MainActivity.kt index e63d555..05e64bf 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/MainActivity.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/MainActivity.kt @@ -4,17 +4,17 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController import by.kirich1409.viewbindingdelegate.viewBinding +import dagger.hilt.android.AndroidEntryPoint import ru.itis.karakurik.androidLab2.R -import ru.itis.karakurik.androidLab2.WeatherApp import ru.itis.karakurik.androidLab2.databinding.ActivityMainBinding import ru.itis.karakurik.androidLab2.extentions.findController +@AndroidEntryPoint class MainActivity : AppCompatActivity(R.layout.activity_main) { private val binding by viewBinding(ActivityMainBinding::bind) private var controller: NavController? = null override fun onCreate(savedInstanceState: Bundle?) { - (application as WeatherApp).appComponent.inject(this) super.onCreate(savedInstanceState) controller = binding.navHostFragmentMain.id.let { findController(it) } } diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/common/utils/AppViewModelFactory.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/common/utils/AppViewModelFactory.kt deleted file mode 100644 index 3df0820..0000000 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/common/utils/AppViewModelFactory.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ru.itis.karakurik.androidLab2.presentation.common.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import javax.inject.Inject -import javax.inject.Provider -import javax.inject.Singleton - -class AppViewModelFactory @Inject constructor( - private val viewModelMap: Map, @JvmSuppressWildcards Provider> -) : ViewModelProvider.Factory { - override fun create(modelClass: Class): T { - val result = viewModelMap[modelClass] ?: viewModelMap.entries.firstOrNull { - modelClass.isAssignableFrom(it.key) - }?.value ?: throw IllegalArgumentException("Unknown model class $modelClass") - @Suppress("UNCHECKED_CAST") - return result.get() as T - } -} diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/CityListViewModel.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/CityListViewModel.kt index 173ac7e..e878eae 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/CityListViewModel.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/CityListViewModel.kt @@ -4,12 +4,14 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import ru.itis.karakurik.androidLab2.domain.entity.Weather import ru.itis.karakurik.androidLab2.domain.usecase.GetWeatherListUseCase import ru.itis.karakurik.androidLab2.domain.usecase.GetWeatherUseCase import javax.inject.Inject +@HiltViewModel class CityListViewModel @Inject constructor( private val getWeatherUseCase: GetWeatherUseCase, private val getWeatherListUseCase: GetWeatherListUseCase diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/SearchFragment.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/SearchFragment.kt index 03f64ee..b0dd44d 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/SearchFragment.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/cities/SearchFragment.kt @@ -14,12 +14,11 @@ import androidx.appcompat.widget.SearchView import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.material.snackbar.Snackbar -import ru.itis.karakurik.androidLab2.WeatherApp +import dagger.hilt.android.AndroidEntryPoint import ru.itis.karakurik.androidLab2.databinding.FragmentSearchBinding import ru.itis.karakurik.androidLab2.presentation.fragments.cities.recycler.ListRecyclerAdapter import timber.log.Timber @@ -29,6 +28,7 @@ private const val COUNT_OF_CITIES_IN_LIST = 20 private const val DEFAULT_LAT = 55.7887 private const val DEFAULT_LON = 49.1221 +@AndroidEntryPoint class SearchFragment : Fragment() { companion object { @@ -45,12 +45,7 @@ class SearchFragment : Fragment() { private var userLat: Double = DEFAULT_LAT private var userLon: Double = DEFAULT_LON - @Inject - lateinit var factory: ViewModelProvider.Factory - - private val viewModel: CityListViewModel by viewModels { - factory - } + private val viewModel: CityListViewModel by viewModels() @Inject lateinit var smoothScroller: RecyclerView.SmoothScroller @@ -75,11 +70,6 @@ class SearchFragment : Fragment() { } } - override fun onCreate(savedInstanceState: Bundle?) { - (activity?.application as WeatherApp).appComponent.inject(this) - super.onCreate(savedInstanceState) - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/DetailsFragment.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/DetailsFragment.kt index 39cb4be..8fcb7a2 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/DetailsFragment.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/DetailsFragment.kt @@ -8,31 +8,27 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.navigation.fragment.navArgs import coil.load +import dagger.hilt.android.AndroidEntryPoint import ru.itis.karakurik.androidLab2.R -import ru.itis.karakurik.androidLab2.WeatherApp import ru.itis.karakurik.androidLab2.databinding.FragmentDetailsBinding import ru.itis.karakurik.androidLab2.domain.entity.Weather import ru.itis.karakurik.androidLab2.presentation.common.convertors.TempColorConverter -import ru.itis.karakurik.androidLab2.presentation.common.utils.AppViewModelFactory import timber.log.Timber import javax.inject.Inject +@AndroidEntryPoint class DetailsFragment : Fragment() { private var _binding: FragmentDetailsBinding? = null private val binding get() = _binding!! - @Inject - lateinit var factory: AppViewModelFactory + private val args: DetailsFragmentArgs by navArgs() - private val viewModel: WeatherViewModel by viewModels { - factory - } +// @Inject +// lateinit var factory: WeatherViewModel.Factory - override fun onCreate(savedInstanceState: Bundle?) { - (activity?.application as WeatherApp).appComponent.inject(this) - super.onCreate(savedInstanceState) - } + private val viewModel: WeatherViewModel by viewModels() override fun onCreateView( inflater: LayoutInflater, @@ -51,9 +47,11 @@ class DetailsFragment : Fragment() { initObservers() - arguments?.getInt(getString(R.string.city_id))?.let { - viewModel.onGetWeather(it) - } +// arguments?.getInt(getString(R.string.city_id))?.let { +// viewModel.onGetWeather(it) +// } + + viewModel.onGetWeather(args.cityId) } private fun initObservers() { diff --git a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/WeatherViewModel.kt b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/WeatherViewModel.kt index 1dcdfb6..4e85725 100644 --- a/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/WeatherViewModel.kt +++ b/app/src/main/java/ru/itis/karakurik/androidLab2/presentation/fragments/weather/WeatherViewModel.kt @@ -1,17 +1,40 @@ package ru.itis.karakurik.androidLab2.presentation.fragments.weather -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.* +import dagger.Module +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityRetainedComponent +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import ru.itis.karakurik.androidLab2.domain.entity.Weather import ru.itis.karakurik.androidLab2.domain.usecase.GetWeatherUseCase import javax.inject.Inject +@HiltViewModel class WeatherViewModel @Inject constructor( private val getWeatherUseCase: GetWeatherUseCase ) : ViewModel() { + +// @AssistedFactory +// interface Factory { +// fun create(@Assisted cityId: Int): Factory +// } +// +// @Suppress("UNCHECKED_CAST") +// companion object { +// fun provideFactory( +// assistedFactory: Factory, +// cityId: Int +// ): ViewModelProvider.Factory = object : ViewModelProvider.Factory { +// override fun create(modelClass: Class): T { +// return assistedFactory.create(cityId) as T +// } +// } +// } + private var _weather: MutableLiveData> = MutableLiveData() val weather: LiveData> get() = _weather @@ -27,3 +50,7 @@ class WeatherViewModel @Inject constructor( } } } + +//@Module +//@InstallIn(ActivityRetainedComponent::class) +//interface AssistedInjectModule diff --git a/build.gradle b/build.gradle index 5c5efc3..04d20b8 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.4.1" - classpath "com.google.dagger:hilt-android-gradle-plugin:2.37" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.38.1" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files