mirror of
https://github.com/ahmedeltaher/MVVM-Kotlin-Android-Architecture.git
synced 2026-03-13 08:03:40 +08:00
Update from Dagger2.x to Android-Hilt.
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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<Any>
|
||||
|
||||
override fun androidInjector(): AndroidInjector<Any> = androidInjector
|
||||
@HiltAndroidApp
|
||||
open class App : Application() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
context = applicationContext
|
||||
initDagger()
|
||||
}
|
||||
|
||||
open fun initDagger() {
|
||||
DaggerAppComponent.builder().build().inject(this)
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<out ViewModel>)
|
||||
@@ -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
|
||||
}
|
||||
@@ -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<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : ViewModel> create(modelClass: Class<T>): 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)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Boolean>) {
|
||||
when (isFavourite) {
|
||||
is Resource.Loading -> {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<LoginResponse>) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
|
||||
50
build.gradle
50
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:<version>'
|
||||
// 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'
|
||||
}
|
||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user