diff --git a/app/build.gradle b/app/build.gradle index 7c49279..c99b439 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,10 +3,12 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-platform-android' +apply plugin: 'dagger.hilt.android.plugin' + android { - compileSdkVersion rootProject.compileSdkVersion - buildToolsVersion '29.0.3' + compileSdkVersion 30 + buildToolsVersion '30.0.2' defaultConfig { applicationId 'com.eltaher.task' minSdkVersion rootProject.minSdkVersion @@ -59,6 +61,14 @@ android { pickFirst 'META-INF/kotlinx-coroutines-core.kotlin_module' pickFirst 'META-INF/kotlinx-coroutines-io.kotlin_module' } + + configurations.all { + resolutionStrategy { + exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug" + + } + } + testOptions { unitTests.returnDefaultValues = true } @@ -79,7 +89,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) //kotlin - //implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" implementation "androidx.annotation:annotation:$annotationVersion" @@ -89,7 +98,6 @@ dependencies { //junit 5 testImplementation "org.junit.jupiter:junit-jupiter-engine:$junitVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion" - testImplementation "org.junit.platform:junit-platform-runner:$junitRunnerVersion" androidTestImplementation "androidx.test.ext:junit:$androidXJunitVersion" androidTestImplementation "org.assertj:assertj-core:$assertjVersion" @@ -111,20 +119,12 @@ dependencies { implementation "androidx.recyclerview:recyclerview:$recyclerviewVersion" implementation "androidx.appcompat:appcompat:$appcompatVersion" implementation "com.google.android.material:material:$materialVersion" - implementation "androidx.core:core-ktx:$coreKtxVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$coordinatorLayoutVersion" implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion" implementation "androidx.cardview:cardview:$cardViewVersion" - implementation "androidx.activity:activity:$activityVersion" - implementation "androidx.activity:activity-ktx:$activityKtxVersion" - //Dagger - implementation "com.google.dagger:dagger:$daggerVersion" - kapt "com.google.dagger:dagger-compiler:$daggerVersion" - implementation "com.google.dagger:dagger-android:$daggerVersion" - implementation "com.google.dagger:dagger-android-support:$daggerVersion" - kapt "com.google.dagger:dagger-android-processor:$daggerVersion" - kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion" + //Logging implementation "com.squareup.okhttp3:logging-interceptor:$okhttpInterceptorVersion" @@ -142,8 +142,6 @@ dependencies { //MultiDex implementation "androidx.multidex:multidex:$multiDexVersion" - //Mockk -// androidTestImplementation "io.mockk:mockk-android:$mockVersion" testImplementation "io.mockk:mockk:$mockVersion" //coroutines @@ -152,4 +150,12 @@ dependencies { implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleKTXVersion" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleKTXVersion" + implementation "androidx.core:core-ktx:$coreKtxVersion" + implementation "androidx.activity:activity-ktx:$activityKtxVersion" + + implementation 'com.google.dagger:hilt-android:2.31.2-alpha' + kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha' +} +kapt { + correctErrorTypes true } \ No newline at end of file diff --git a/app/src/androidTest/java/com/task/AppTest.kt b/app/src/androidTest/java/com/task/AppTest.kt index 1d4f8df..f043adc 100644 --- a/app/src/androidTest/java/com/task/AppTest.kt +++ b/app/src/androidTest/java/com/task/AppTest.kt @@ -1,8 +1,4 @@ package com.task -import com.task.di.DaggerTestAppComponent class AppTest: App() { - override fun initDagger() { - DaggerTestAppComponent.builder().application(this).build().inject(this) - } } diff --git a/app/src/androidTest/java/com/task/di/TestAppComponent.kt b/app/src/androidTest/java/com/task/di/TestAppComponent.kt deleted file mode 100644 index 66a4f13..0000000 --- a/app/src/androidTest/java/com/task/di/TestAppComponent.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.task.di - -import android.app.Application -import com.task.AppTest -import dagger.BindsInstance -import dagger.Component -import dagger.android.AndroidInjectionModule -import javax.inject.Singleton - -@Singleton -@Component( - modules = [TestDataModule::class, - AndroidInjectionModule::class, - AppModule::class, - ActivityModuleBuilder::class - , ViewModelModule::class]) -interface TestAppComponent : AppComponent { - @Component.Builder - interface Builder { - @BindsInstance - fun application(application: Application): Builder - - fun build(): TestAppComponent - } - - fun inject(app: AppTest) -} diff --git a/app/src/androidTest/java/com/task/di/TestDataModule.kt b/app/src/androidTest/java/com/task/di/TestDataModule.kt index 0c4f599..d4420c5 100644 --- a/app/src/androidTest/java/com/task/di/TestDataModule.kt +++ b/app/src/androidTest/java/com/task/di/TestDataModule.kt @@ -4,9 +4,12 @@ import com.task.TestDataRepository import com.task.data.DataRepositorySource import dagger.Binds import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton @Module +@InstallIn(SingletonComponent::class) abstract class TestDataModule { @Binds @Singleton diff --git a/app/src/main/java/com/task/App.kt b/app/src/main/java/com/task/App.kt index 9dbab3f..443ab95 100644 --- a/app/src/main/java/com/task/App.kt +++ b/app/src/main/java/com/task/App.kt @@ -1,32 +1,18 @@ package com.task +import android.app.Application import android.content.Context -import androidx.multidex.MultiDexApplication -import com.task.di.DaggerAppComponent -import dagger.android.AndroidInjector -import dagger.android.DispatchingAndroidInjector -import dagger.android.HasAndroidInjector -import javax.inject.Inject +import dagger.hilt.android.HiltAndroidApp /** * Created by AhmedEltaher */ - -open class App : MultiDexApplication(), HasAndroidInjector { - - @Inject - lateinit var androidInjector: DispatchingAndroidInjector - - override fun androidInjector(): AndroidInjector = androidInjector +@HiltAndroidApp +open class App : Application() { override fun onCreate() { super.onCreate() context = applicationContext - initDagger() - } - - open fun initDagger() { - DaggerAppComponent.builder().build().inject(this) } companion object { diff --git a/app/src/main/java/com/task/di/ActivityModuleBuilder.kt b/app/src/main/java/com/task/di/ActivityModuleBuilder.kt deleted file mode 100644 index 1a0d927..0000000 --- a/app/src/main/java/com/task/di/ActivityModuleBuilder.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.task.di - -import com.task.ui.component.details.DetailsActivity -import com.task.ui.component.login.LoginActivity -import com.task.ui.component.recipes.RecipesListActivity -import com.task.ui.component.splash.SplashActivity -import dagger.Module -import dagger.android.ContributesAndroidInjector - -@Suppress("unused") -@Module -abstract class ActivityModuleBuilder { - @ContributesAndroidInjector() - abstract fun contributeSplashActivity(): SplashActivity - - @ContributesAndroidInjector() - abstract fun contributeHomeActivity(): RecipesListActivity - - @ContributesAndroidInjector() - abstract fun contributeDetailsActivity(): DetailsActivity - - @ContributesAndroidInjector() - abstract fun contributeLoginActivity(): LoginActivity -} diff --git a/app/src/main/java/com/task/di/AppComponent.kt b/app/src/main/java/com/task/di/AppComponent.kt deleted file mode 100644 index 0634cbb..0000000 --- a/app/src/main/java/com/task/di/AppComponent.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.task.di - -import com.task.App -import dagger.Component -import dagger.android.AndroidInjectionModule -import javax.inject.Singleton - -@Singleton -@Component( - modules = [ - AndroidInjectionModule::class, - AppModule::class, - DataModule::class, - ErrorModule::class, - ActivityModuleBuilder::class - , ViewModelModule::class - ] -) -interface AppComponent { - @Component.Builder - interface Builder { - fun build(): AppComponent - } - - fun inject(app: App) -} diff --git a/app/src/main/java/com/task/di/AppModule.kt b/app/src/main/java/com/task/di/AppModule.kt index adf2a68..153ab89 100644 --- a/app/src/main/java/com/task/di/AppModule.kt +++ b/app/src/main/java/com/task/di/AppModule.kt @@ -6,11 +6,14 @@ import com.task.utils.Network import com.task.utils.NetworkConnectivity import dagger.Module import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import kotlinx.coroutines.Dispatchers import javax.inject.Singleton import kotlin.coroutines.CoroutineContext @Module +@InstallIn(SingletonComponent::class) class AppModule { @Provides @Singleton diff --git a/app/src/main/java/com/task/di/DataModule.kt b/app/src/main/java/com/task/di/DataModule.kt index e492950..e2d8de2 100644 --- a/app/src/main/java/com/task/di/DataModule.kt +++ b/app/src/main/java/com/task/di/DataModule.kt @@ -5,10 +5,13 @@ import com.task.data.DataRepository import com.task.data.DataRepositorySource import dagger.Binds import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton // Tells Dagger this is a Dagger module @Module +@InstallIn(SingletonComponent::class) abstract class DataModule { @Binds @Singleton diff --git a/app/src/main/java/com/task/di/ErrorModule.kt b/app/src/main/java/com/task/di/ErrorModule.kt index b185758..12f4bf1 100644 --- a/app/src/main/java/com/task/di/ErrorModule.kt +++ b/app/src/main/java/com/task/di/ErrorModule.kt @@ -6,10 +6,13 @@ import com.task.usecase.errors.ErrorFactory import com.task.usecase.errors.ErrorManager import dagger.Binds import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent import javax.inject.Singleton // with @Module we Telling Dagger that, this is a Dagger module @Module +@InstallIn(SingletonComponent::class) abstract class ErrorModule { @Binds @Singleton diff --git a/app/src/main/java/com/task/di/ViewModelKey.kt b/app/src/main/java/com/task/di/ViewModelKey.kt deleted file mode 100644 index a86f1d3..0000000 --- a/app/src/main/java/com/task/di/ViewModelKey.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.task.di - -import androidx.lifecycle.ViewModel -import dagger.MapKey -import kotlin.reflect.KClass - -@MustBeDocumented -@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/com/task/di/ViewModelModule.kt b/app/src/main/java/com/task/di/ViewModelModule.kt deleted file mode 100644 index 53ef91b..0000000 --- a/app/src/main/java/com/task/di/ViewModelModule.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.task.di - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import com.task.ui.ViewModelFactory -import com.task.ui.component.details.DetailsViewModel -import com.task.ui.component.login.LoginViewModel -import com.task.ui.component.recipes.RecipesListViewModel -import com.task.ui.component.splash.SplashViewModel -import dagger.Binds -import dagger.Module -import dagger.multibindings.IntoMap - -/** - * Since dagger - * support multibinding you are free to bind as may ViewModels as you want. - */ -@Suppress("unused") -@Module -abstract class ViewModelModule { - @Binds - internal abstract fun bindViewModelFactory(viewModelFactory: ViewModelFactory): ViewModelProvider.Factory - - @Binds - @IntoMap - @ViewModelKey(RecipesListViewModel::class) - abstract fun bindUserViewModel(viewModel: RecipesListViewModel): ViewModel - - @Binds - @IntoMap - @ViewModelKey(SplashViewModel::class) - abstract fun bindSplashViewModel(viewModel: SplashViewModel): ViewModel - - @Binds - @IntoMap - @ViewModelKey(DetailsViewModel::class) - internal abstract fun bindSplashViewModel(viewModel: DetailsViewModel): ViewModel - - @Binds - @IntoMap - @ViewModelKey(LoginViewModel::class) - internal abstract fun bindLoginViewModel(viewModel: LoginViewModel): ViewModel -} diff --git a/app/src/main/java/com/task/ui/ViewModelFactory.kt b/app/src/main/java/com/task/ui/ViewModelFactory.kt deleted file mode 100644 index 0a47ef6..0000000 --- a/app/src/main/java/com/task/ui/ViewModelFactory.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.task.ui - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import javax.inject.Inject -import javax.inject.Provider -import javax.inject.Singleton - -@Singleton -class ViewModelFactory @Inject constructor(@JvmSuppressWildcards private val creators: Map, @JvmSuppressWildcards Provider>) : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun create(modelClass: Class): T { - val creator = creators[modelClass] ?: creators.entries.firstOrNull { - modelClass.isAssignableFrom(it.key) - }?.value ?: throw IllegalArgumentException("unknown model class $modelClass") - try { - @Suppress("UNCHECKED_CAST") - return creator.get() as T - } catch (e: Exception) { - throw RuntimeException(e) - } - - } -} diff --git a/app/src/main/java/com/task/ui/base/BaseActivity.kt b/app/src/main/java/com/task/ui/base/BaseActivity.kt index a7d4fb2..ba653c6 100644 --- a/app/src/main/java/com/task/ui/base/BaseActivity.kt +++ b/app/src/main/java/com/task/ui/base/BaseActivity.kt @@ -3,7 +3,6 @@ package com.task.ui.base import android.os.Bundle import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity -import dagger.android.AndroidInjection /** * Created by AhmedEltaher @@ -12,15 +11,12 @@ import dagger.android.AndroidInjection abstract class BaseActivity : AppCompatActivity() { - protected abstract fun initializeViewModel() abstract fun observeViewModel() protected abstract fun initViewBinding() override fun onCreate(savedInstanceState: Bundle?) { - AndroidInjection.inject(this) super.onCreate(savedInstanceState) initViewBinding() - initializeViewModel() observeViewModel() } diff --git a/app/src/main/java/com/task/ui/component/details/DetailsActivity.kt b/app/src/main/java/com/task/ui/component/details/DetailsActivity.kt index 68ed765..335f98e 100644 --- a/app/src/main/java/com/task/ui/component/details/DetailsActivity.kt +++ b/app/src/main/java/com/task/ui/component/details/DetailsActivity.kt @@ -3,6 +3,7 @@ package com.task.ui.component.details import android.os.Bundle import android.view.Menu import android.view.MenuItem +import androidx.activity.viewModels import androidx.core.content.ContextCompat import com.squareup.picasso.Picasso import com.task.R @@ -10,24 +11,20 @@ import com.task.RECIPE_ITEM_KEY import com.task.data.Resource import com.task.data.dto.recipes.RecipesItem import com.task.databinding.DetailsLayoutBinding -import com.task.ui.ViewModelFactory import com.task.ui.base.BaseActivity import com.task.utils.observe import com.task.utils.toGone import com.task.utils.toVisible -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint /** * Created by AhmedEltaher */ +@AndroidEntryPoint class DetailsActivity : BaseActivity() { - @Inject - lateinit var viewModel: DetailsViewModel - - @Inject - lateinit var viewModelFactory: ViewModelFactory + private val viewModel: DetailsViewModel by viewModels() private lateinit var binding: DetailsLayoutBinding private var menu: Menu? = null @@ -66,10 +63,6 @@ class DetailsActivity : BaseActivity() { observe(viewModel.isFavourite, ::handleIsFavourite) } - override fun initializeViewModel() { - viewModel = viewModelFactory.create(viewModel::class.java) - } - private fun handleIsFavourite(isFavourite: Resource) { when (isFavourite) { is Resource.Loading -> { diff --git a/app/src/main/java/com/task/ui/component/details/DetailsViewModel.kt b/app/src/main/java/com/task/ui/component/details/DetailsViewModel.kt index 3046bb0..95b24f2 100644 --- a/app/src/main/java/com/task/ui/component/details/DetailsViewModel.kt +++ b/app/src/main/java/com/task/ui/component/details/DetailsViewModel.kt @@ -9,6 +9,7 @@ import com.task.data.Resource import com.task.data.dto.recipes.RecipesItem import com.task.ui.base.BaseViewModel import com.task.utils.wrapEspressoIdlingResource +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject @@ -16,7 +17,7 @@ import javax.inject.Inject /** * Created by AhmedEltaher */ - +@HiltViewModel open class DetailsViewModel @Inject constructor(private val dataRepository: DataRepositorySource) : BaseViewModel() { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) diff --git a/app/src/main/java/com/task/ui/component/login/LoginActivity.kt b/app/src/main/java/com/task/ui/component/login/LoginActivity.kt index e8c9b4e..018dbba 100644 --- a/app/src/main/java/com/task/ui/component/login/LoginActivity.kt +++ b/app/src/main/java/com/task/ui/component/login/LoginActivity.kt @@ -2,27 +2,24 @@ package com.task.ui.component.login import android.content.Intent import android.os.Bundle +import androidx.activity.viewModels import androidx.lifecycle.LiveData import com.google.android.material.snackbar.Snackbar import com.task.data.Resource import com.task.data.dto.login.LoginResponse import com.task.databinding.LoginActivityBinding -import com.task.ui.ViewModelFactory import com.task.ui.base.BaseActivity import com.task.ui.component.recipes.RecipesListActivity import com.task.utils.* -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint /** * Created by AhmedEltaher */ - +@AndroidEntryPoint class LoginActivity : BaseActivity() { - @Inject - lateinit var viewModelFactory: ViewModelFactory - @Inject - lateinit var loginViewModel: LoginViewModel + private val loginViewModel: LoginViewModel by viewModels() private lateinit var binding: LoginActivityBinding @@ -37,10 +34,6 @@ class LoginActivity : BaseActivity() { setContentView(view) } - override fun initializeViewModel() { - loginViewModel = viewModelFactory.create(loginViewModel::class.java) - } - override fun observeViewModel() { observe(loginViewModel.loginLiveData, ::handleLoginResult) observeSnackBarMessages(loginViewModel.showSnackBar) @@ -48,8 +41,10 @@ class LoginActivity : BaseActivity() { } private fun doLogin() { - loginViewModel.doLogin(binding.username.text.trim().toString(), - binding.password.text.toString()) + loginViewModel.doLogin( + binding.username.text.trim().toString(), + binding.password.text.toString() + ) } private fun handleLoginResult(status: Resource) { diff --git a/app/src/main/java/com/task/ui/component/login/LoginViewModel.kt b/app/src/main/java/com/task/ui/component/login/LoginViewModel.kt index da6d213..77ab22c 100644 --- a/app/src/main/java/com/task/ui/component/login/LoginViewModel.kt +++ b/app/src/main/java/com/task/ui/component/login/LoginViewModel.kt @@ -15,6 +15,7 @@ import com.task.ui.base.BaseViewModel import com.task.utils.RegexUtils.isValidEmail import com.task.utils.SingleEvent import com.task.utils.wrapEspressoIdlingResource +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject @@ -22,7 +23,7 @@ import javax.inject.Inject /** * Created by AhmedEltaher */ - +@HiltViewModel class LoginViewModel @Inject constructor(private val dataRepository: DataRepository) : BaseViewModel() { @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) diff --git a/app/src/main/java/com/task/ui/component/recipes/RecipesListActivity.kt b/app/src/main/java/com/task/ui/component/recipes/RecipesListActivity.kt index 96d30a5..cd8068f 100644 --- a/app/src/main/java/com/task/ui/component/recipes/RecipesListActivity.kt +++ b/app/src/main/java/com/task/ui/component/recipes/RecipesListActivity.kt @@ -10,6 +10,7 @@ import android.view.View.GONE import android.view.View.VISIBLE import android.widget.SearchView import android.widget.SearchView.OnQueryTextListener +import androidx.activity.viewModels import androidx.lifecycle.LiveData import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar @@ -20,25 +21,20 @@ import com.task.data.dto.recipes.Recipes import com.task.data.dto.recipes.RecipesItem import com.task.data.error.SEARCH_ERROR import com.task.databinding.HomeActivityBinding -import com.task.ui.ViewModelFactory import com.task.ui.base.BaseActivity import com.task.ui.component.details.DetailsActivity import com.task.ui.component.recipes.adapter.RecipesAdapter import com.task.utils.* -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint /** * Created by AhmedEltaher */ - +@AndroidEntryPoint class RecipesListActivity : BaseActivity() { private lateinit var binding: HomeActivityBinding - @Inject - lateinit var recipesListViewModel: RecipesListViewModel - - @Inject - lateinit var viewModelFactory: ViewModelFactory + private val recipesListViewModel: RecipesListViewModel by viewModels() private lateinit var recipesAdapter: RecipesAdapter override fun initViewBinding() { @@ -47,10 +43,6 @@ class RecipesListActivity : BaseActivity() { setContentView(view) } - override fun initializeViewModel() { - recipesListViewModel = viewModelFactory.create(RecipesListViewModel::class.java) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.title = getString(R.string.recipe) diff --git a/app/src/main/java/com/task/ui/component/recipes/RecipesListViewModel.kt b/app/src/main/java/com/task/ui/component/recipes/RecipesListViewModel.kt index 9e09407..cd35893 100644 --- a/app/src/main/java/com/task/ui/component/recipes/RecipesListViewModel.kt +++ b/app/src/main/java/com/task/ui/component/recipes/RecipesListViewModel.kt @@ -11,6 +11,7 @@ import com.task.data.dto.recipes.RecipesItem import com.task.ui.base.BaseViewModel import com.task.utils.SingleEvent import com.task.utils.wrapEspressoIdlingResource +import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import java.util.Locale.ROOT @@ -19,7 +20,7 @@ import javax.inject.Inject /** * Created by AhmedEltaher */ - +@HiltViewModel class RecipesListViewModel @Inject constructor(private val dataRepositoryRepository: DataRepositorySource) : BaseViewModel() { diff --git a/app/src/main/java/com/task/ui/component/splash/SplashActivity.kt b/app/src/main/java/com/task/ui/component/splash/SplashActivity.kt index dabdadf..5b6c871 100644 --- a/app/src/main/java/com/task/ui/component/splash/SplashActivity.kt +++ b/app/src/main/java/com/task/ui/component/splash/SplashActivity.kt @@ -3,23 +3,20 @@ package com.task.ui.component.splash import android.content.Intent import android.os.Bundle import android.os.Handler +import androidx.activity.viewModels import com.task.databinding.SplashLayoutBinding -import com.task.ui.ViewModelFactory import com.task.ui.base.BaseActivity import com.task.ui.component.login.LoginActivity import com.task.SPLASH_DELAY -import javax.inject.Inject +import dagger.hilt.android.AndroidEntryPoint /** * Created by AhmedEltaher */ - +@AndroidEntryPoint class SplashActivity : BaseActivity(){ - @Inject - lateinit var viewModelFactory: ViewModelFactory - @Inject - lateinit var splashViewModel: SplashViewModel + private val splashViewModel: SplashViewModel by viewModels() private lateinit var binding: SplashLayoutBinding @@ -29,17 +26,12 @@ class SplashActivity : BaseActivity(){ setContentView(view) } - override fun initializeViewModel() { - splashViewModel = viewModelFactory.create(splashViewModel::class.java) - } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) navigateToMainScreen() } override fun observeViewModel() { - } private fun navigateToMainScreen() { diff --git a/app/src/main/java/com/task/ui/component/splash/SplashViewModel.kt b/app/src/main/java/com/task/ui/component/splash/SplashViewModel.kt index ed2f706..3c8d730 100644 --- a/app/src/main/java/com/task/ui/component/splash/SplashViewModel.kt +++ b/app/src/main/java/com/task/ui/component/splash/SplashViewModel.kt @@ -1,10 +1,11 @@ package com.task.ui.component.splash import com.task.ui.base.BaseViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject /** * Created by AhmedEltaher */ - +@HiltViewModel class SplashViewModel @Inject constructor() : BaseViewModel() diff --git a/build.gradle b/build.gradle index 1d9910c..e2efe49 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.10' + ext.kotlin_version = '1.4.21' repositories { google() jcenter() @@ -9,12 +9,12 @@ buildscript { maven { url "https://maven.google.com" } } dependencies { - classpath "com.android.tools.build:gradle:4.0.1" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - + classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.google.dagger:hilt-android-gradle-plugin:2.31.2-alpha' + classpath 'com.google.dagger:hilt-android-gradle-plugin:' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.google.gms:google-services:4.3.4' classpath 'com.android.support.test.espresso:espresso-idling-resource:3.0.2' } } @@ -37,13 +37,13 @@ ext { // Sdk and tools // Support library and architecture components support minSdk 14 and above. minSdkVersion = 21 - targetSdkVersion = 29 - compileSdkVersion = 29 + targetSdkVersion = 30 + compileSdkVersion = 30 - junitVersion = '5.6.2' - junitRunnerVersion = '1.6.2' + junitVersion = '5.7.0' + junitRunnerVersion = '1.7.0' androidXJunitVersion = '1.1.2' - assertjVersion = '3.16.1' + assertjVersion = '3.19.0' coreTestingVersion = '2.1.0' espressoIntentsVersion = '3.3.0' espressoCoreVersion = '3.3.0' @@ -51,32 +51,32 @@ ext { runnerVersion = '1.3.0' espressoVersion = '3.3.0' coreTestingVersion = '2.1.0' - coroutinesTestVersion = '1.3.2' + coroutinesTestVersion = '1.4.2-native-mt' recyclerviewVersion = '1.1.0' appcompatVersion='1.2.0' - materialVersion='1.3.0-alpha02' - coreKtxVersion='1.3.0' + materialVersion= '1.3.0-rc01' + coreKtxVersion= '1.3.2' coordinatorLayoutVersion='1.1.0' - constraintLayoutVersion='2.0.1' + constraintLayoutVersion= '2.0.4' cardViewVersion='1.0.0' - activityVersion='1.2.0-alpha08' - activityKtxVersion='1.2.0-alpha05' - daggerVersion = '2.28.3' + activityVersion= '1.2.0-rc01' + activityKtxVersion= '1.2.0-rc01' + daggerVersion = '2.31.2' retrofitVersion = '2.9.0' - moshiVersion = '1.9.3' - okhttpVersion = '4.8.1' - okhttpInterceptorVersion ='4.8.1' + moshiVersion = '1.11.0' + okhttpVersion = '4.9.0' + okhttpInterceptorVersion = '4.9.0' multiDexVersion = '2.0.1' picassoVersion = '2.71828' - mockVersion = '1.10.0' + mockVersion = '1.10.5' coroutinesCoreVersion ='1.3.4' coroutinesCoreCommonVersion = '1.3.7' lifecycleExtensionsVersion ='2.2.0' lifecycleKTXVersion = '2.3.0-alpha04' - coroutinesCoreVersion ='1.3.4' - coroutinesCommonVersion = '1.3.7' + coroutinesCoreVersion = '1.4.2-native-mt' + coroutinesCommonVersion = '1.3.8' lifecycleExtensionsVersion ='2.2.0' - lifecycleKTXVersion = '2.3.0-alpha04' - kotlinVersion ='1.4.0' + lifecycleKTXVersion = '2.3.0-rc01' + kotlinVersion = '1.4.21' annotationVersion ='1.1.0' } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23f1828..ee73821 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Sep 26 20:38:20 CEST 2020 +#Mon Jan 25 23:44:31 CET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip