From 4851fbf35e52ed6643d1a897d3879410f7c8be92 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:50:28 -0300 Subject: [PATCH 01/29] hilt library --- app/build.gradle | 20 +++++++++++++++++++- build.gradle | 2 ++ gradle.properties | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0e043fc..07a3c12 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,9 @@ apply from: 'jacoco.gradle' apply from: 'lint.gradle' apply from: 'build-scripts.gradle' +apply plugin: 'kotlin-kapt' +apply plugin: 'dagger.hilt.android.plugin' + repositories { mavenCentral() maven { url 'https://maven.google.com' } @@ -171,12 +174,12 @@ ext { lottie_version = "4.2.0" core_version = "1.6.0" desugar_jdk_version = "1.1.5" + hilt_version = "2.38.1" // Compose activity_compose_version = "1.3.1" constraintlayout_compose_version = "1.0.0-rc01" viewmodel_compose_version = "1.0.0-alpha07" } - jacoco { toolVersion = "0.8.7" } @@ -208,6 +211,9 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" + // Http Logging Interceptor implementation "com.squareup.okhttp3:okhttp:$ok_http_version" implementation "com.squareup.okhttp3:logging-interceptor:$ok_http_version" @@ -292,6 +298,14 @@ dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$viewmodel_compose_version" implementation "com.google.android.material:compose-theme-adapter:$compose_version" + // Hilt + implementation "com.google.dagger:hilt-android:$hilt_version" + kapt "com.google.dagger:hilt-android-compiler:$hilt_version" + + def hilt_lifecycle_viewmodel = "1.0.0-alpha03" + implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_lifecycle_viewmodel" + kapt "androidx.hilt:hilt-compiler:$hilt_lifecycle_viewmodel" + // Test // Unit testing framework androidTestImplementation "com.android.support.test:rules:$test_rule_version" @@ -312,3 +326,7 @@ dependencies { testImplementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testImplementation "androidx.arch.core:core-testing:$core_testing_version" } + +kapt { + correctErrorTypes true +} diff --git a/build.gradle b/build.gradle index f23d4ed..c30754d 100644 --- a/build.gradle +++ b/build.gradle @@ -9,6 +9,7 @@ buildscript { navigation_version = "2.3.5" google_services_version = "4.3.10" compose_version = "1.0.3" + hilt_version = "2.28-alpha" } repositories { gradlePluginPortal() @@ -22,6 +23,7 @@ buildscript { classpath "com.google.gms:google-services:$google_services_version" classpath "org.owasp:dependency-check-gradle:$dependency_check_version" classpath "com.github.ben-manes:gradle-versions-plugin:$gradle_versions_version" + classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/gradle.properties b/gradle.properties index 9e6fce1..f59adf6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,7 @@ android.enableJetifier=true android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m +kapt.verbose=true # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From fb0413d462dd6656289ac074074773015e0abe6b Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:51:01 -0300 Subject: [PATCH 02/29] hilt base imple --- .../android/RocketApplication.kt | 5 ++- .../android/di/hilt/AppModule.kt | 20 +++++++++ .../android/di/hilt/HiltNetworkModule.kt | 41 +++++++++++++++++++ .../android/di/hilt/RepositoryModule.kt | 28 +++++++++++++ 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt create mode 100644 app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt create mode 100644 app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt diff --git a/app/src/main/java/com/rocketinsights/android/RocketApplication.kt b/app/src/main/java/com/rocketinsights/android/RocketApplication.kt index 3de415c..adb280a 100644 --- a/app/src/main/java/com/rocketinsights/android/RocketApplication.kt +++ b/app/src/main/java/com/rocketinsights/android/RocketApplication.kt @@ -1,14 +1,17 @@ package com.rocketinsights.android import android.app.Application -import com.rocketinsights.android.di.initKoin +import androidx.viewbinding.BuildConfig +import com.rocketinsights.android.di.koin.initKoin import com.rocketinsights.android.work.messages.MessagesUpdateScheduler +import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.koin.android.ext.android.inject import timber.log.Timber +@HiltAndroidApp class RocketApplication : Application() { private val applicationScope = CoroutineScope(Dispatchers.Default) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt new file mode 100644 index 0000000..8bbab13 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt @@ -0,0 +1,20 @@ +package com.rocketinsights.android.di.hilt + +import android.content.Context +import com.rocketinsights.android.RocketApplication +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + @Singleton + @Provides + fun provideApplication(@ApplicationContext app: Context): RocketApplication { + return app as RocketApplication + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt new file mode 100644 index 0000000..3eab04e --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -0,0 +1,41 @@ +package com.rocketinsights.android.di.hilt + +import com.google.gson.GsonBuilder +import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import javax.inject.Named +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object HiltNetworkModule { + + @Singleton + @Provides + fun providesRecipeMapper(): RecipeDtoMapper { + return RecipeDtoMapper() + } + + @Singleton + @Provides + fun provideRecipeService(): RecipeService { + return Retrofit.Builder() + .baseUrl("https://food2fork.ca/api/recipe/") + .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) + .build() + .create(RecipeService::class.java) + } + + @Singleton + @Provides + @Named("auth_token") + fun provideAuthToken(): String { + return "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt new file mode 100644 index 0000000..30d6deb --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt @@ -0,0 +1,28 @@ +package com.rocketinsights.android.di.hilt + +import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.repos.RecipeRepository +import com.rocketinsights.android.repos.RecipeRepositoryImplementation +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object RepositoryModule { + + @Singleton + @Provides + fun provideRecipeRepository( + recipeService: RecipeService, + recipeMapper: RecipeDtoMapper, + ): RecipeRepository { + return RecipeRepositoryImplementation( + recipeService = recipeService, + mapper = recipeMapper + ) + } +} \ No newline at end of file From 660df80eebf2aa53176e7b559f900a5c6b5e9144 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:51:12 -0300 Subject: [PATCH 03/29] strings for hilt --- app/src/main/res/menu/main_menu.xml | 3 +++ app/src/main/res/values/strings.xml | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index 764025a..cb30f73 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -29,6 +29,9 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b36d68a..7456c88 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,6 +20,7 @@ Container Transform The Greatest RecyclerView Contacts + This is Hilt Request Permissions @@ -109,4 +110,9 @@ Contacts Read contacts permission not granted + + + Hilt example + + Hello blank fragment From 17e9a9ed14c13d5389020a62d994094d361ac067 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:51:28 -0300 Subject: [PATCH 04/29] adding hilt activity for example --- .../rocketinsights/android/ui/HiltActivity.kt | 30 +++++++++++++++++++ .../rocketinsights/android/ui/MainFragment.kt | 6 ++++ 2 files changed, 36 insertions(+) create mode 100644 app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt diff --git a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt new file mode 100644 index 0000000..ab857f9 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -0,0 +1,30 @@ +package com.rocketinsights.android.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.activity.viewModels +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.rocketinsights.android.viewmodels.HiltListViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.ExperimentalCoroutinesApi + +@AndroidEntryPoint +class HiltActivity : AppCompatActivity() { + + private val viewModel: HiltListViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + viewModel.liveRecipe.observe(this) { recipe -> + recipe[0].title + } + } +} diff --git a/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt b/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt index c1898ea..5687d40 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt @@ -1,5 +1,6 @@ package com.rocketinsights.android.ui +import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle @@ -126,6 +127,11 @@ class MainFragment : BaseFragment(R.layout.fragment_main) { setFadeThroughTransition() item.onNavDestinationSelected(findNavController()) } + R.id.hilt_fragment -> { + setFadeThroughTransition() + Intent(this.context, HiltActivity::class.java).also { startActivity(it) } + true + } else -> super.onOptionsItemSelected(item) } } From 006ab63d0ff92ac6144c21ea64fc73a88c157882 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:51:43 -0300 Subject: [PATCH 05/29] koin folder --- .../android/di/koin/KoinUtils.kt | 172 ++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 app/src/main/java/com/rocketinsights/android/di/koin/KoinUtils.kt diff --git a/app/src/main/java/com/rocketinsights/android/di/koin/KoinUtils.kt b/app/src/main/java/com/rocketinsights/android/di/koin/KoinUtils.kt new file mode 100644 index 0000000..bfe2917 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/di/koin/KoinUtils.kt @@ -0,0 +1,172 @@ +package com.rocketinsights.android.di.koin + +import android.app.Application +import android.app.NotificationManager +import android.content.Context +import android.net.ConnectivityManager +import androidx.room.Room +import androidx.work.WorkManager +import com.firebase.ui.auth.AuthUI +import com.google.firebase.auth.FirebaseAuth +import com.rocketinsights.android.auth.AuthManager +import com.rocketinsights.android.auth.FirebaseAuthManager +import com.rocketinsights.android.auth.SessionStorage +import com.rocketinsights.android.auth.SessionWatcher +import com.rocketinsights.android.coroutines.DispatcherProvider +import com.rocketinsights.android.coroutines.DispatcherProviderImpl +import com.rocketinsights.android.db.Database +import com.rocketinsights.android.managers.CalendarManager +import com.rocketinsights.android.managers.CalendarManagerImpl +import com.rocketinsights.android.managers.InternetManager +import com.rocketinsights.android.managers.PermissionsManager +import com.rocketinsights.android.managers.PermissionsManagerImpl +import com.rocketinsights.android.managers.location.LocationManager +import com.rocketinsights.android.managers.location.LocationManagerImpl +import com.rocketinsights.android.network.ApiService +import com.rocketinsights.android.network.NetworkingManager +import com.rocketinsights.android.notifications.MyAppNotificationsManager +import com.rocketinsights.android.prefs.AuthLocalStore +import com.rocketinsights.android.prefs.AuthLocalStoreImpl +import com.rocketinsights.android.prefs.LocalStore +import com.rocketinsights.android.prefs.LocalStoreImpl +import com.rocketinsights.android.repos.AuthRepository +import com.rocketinsights.android.repos.MessageRepository +import com.rocketinsights.android.repos.PlayerRepository +import com.rocketinsights.android.ui.MainActivity +import com.rocketinsights.android.ui.ParentScrollProvider +import com.rocketinsights.android.viewmodels.CalendarViewModel +import com.rocketinsights.android.viewmodels.ConnectivityViewModel +import com.rocketinsights.android.viewmodels.ContactsViewModel +import com.rocketinsights.android.viewmodels.LocationViewModel +import com.rocketinsights.android.viewmodels.MainViewModel +import com.rocketinsights.android.viewmodels.MessagesViewModel +import com.rocketinsights.android.viewmodels.PermissionsViewModel +import com.rocketinsights.android.viewmodels.PhotoViewModel +import com.rocketinsights.android.viewmodels.PlayerViewModel +import com.rocketinsights.android.viewmodels.SessionViewModel +import com.rocketinsights.android.viewmodels.TheGreatestRecyclerViewViewModel +import com.rocketinsights.android.viewmodels.UserViewModel +import com.rocketinsights.android.work.Work +import com.rocketinsights.android.work.WorkImpl +import com.rocketinsights.android.work.messages.MessagesUpdateScheduler +import com.rocketinsights.android.work.messages.MessagesUpdateSchedulerImpl +import com.rocketinsights.android.work.messages.MessagesUpdateWorkRequestFactory +import com.rocketinsights.android.work.messages.MessagesUpdateWorker +import org.koin.android.ext.koin.androidContext +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.androidx.workmanager.dsl.worker +import org.koin.androidx.workmanager.koin.workManagerFactory +import org.koin.core.context.startKoin +import org.koin.core.scope.get +import org.koin.dsl.module + +fun Application.initKoin() { + startKoin { + androidContext(this@initKoin) + workManagerFactory() + modules( + listOf( + networkModule(), + databaseModule(), + managersModule(), + repositoryModule(), + authModule(), + viewModelsModule(), + viewInteractorsModule(), + workModule() + ) + ) + } +} + +private fun networkModule() = module { + single { + NetworkingManager(get(), get(), get()) + } + single { + get().retrofitInstance.create(ApiService::class.java) + } +} + +private fun databaseModule() = module { + single { + Room.databaseBuilder( + androidContext(), + Database::class.java, + Database.NAME + ).build() + } + + single { get().messageDao() } +} + +private fun managersModule() = module { + single { + InternetManager( + androidContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + ) + } + factory { PermissionsManagerImpl(get()) } + single { LocationManagerImpl(get()) } + single { + MyAppNotificationsManager( + get(), + androidContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + ) + } + single { LocalStoreImpl(get()) } + single { CalendarManagerImpl(get(), get(), get()) } +} + +private fun repositoryModule() = module { + single { DispatcherProviderImpl() } + single { MessageRepository(get(), get(), get()) } + single { + AuthRepository(get(), get(), get(), get()).apply { + get().sessionWatcher = this + } + } + single { PlayerRepository(get()) } +} + +private fun authModule() = module { + single { FirebaseAuth.getInstance() } + single { AuthLocalStoreImpl(get()) } + factory { (context: Context) -> + FirebaseAuthManager(context, get(), AuthUI.getInstance()) + } +} + +private fun viewModelsModule() = module { + viewModel { + SessionViewModel( + get(clazz = AuthRepository::class.java) as SessionWatcher, + get(clazz = NetworkingManager::class.java) as SessionStorage + ) + } + viewModel { MainViewModel(get()) } + viewModel { MessagesViewModel(get()) } + viewModel { UserViewModel(get()) } + viewModel { ConnectivityViewModel(get()) } + viewModel { PermissionsViewModel(get()) } + viewModel { PhotoViewModel() } + viewModel { LocationViewModel(get(), get()) } + viewModel { CalendarViewModel(get()) } + viewModel { TheGreatestRecyclerViewViewModel() } + viewModel { PlayerViewModel(get()) } + viewModel { ContactsViewModel(get()) } +} + +private fun viewInteractorsModule() = module { + scope { + scoped { ParentScrollProvider() } + } +} + +private fun workModule() = module { + worker { MessagesUpdateWorker(get(), get(), get()) } + single { MessagesUpdateWorkRequestFactory.createWorkRequest() } + single { WorkManager.getInstance(get()) } + single { WorkImpl(get()) } + single { MessagesUpdateSchedulerImpl(get(), get(), get()) } +} From e948079c7e97282c2b1bd7128f67136093d3ae29 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 10:28:15 -0300 Subject: [PATCH 06/29] imple recipe part 1 --- app/src/main/AndroidManifest.xml | 11 +- .../rocketinsights/android/di/KoinUtils.kt | 172 ------------------ .../android/di/hilt/AppModule.kt | 5 +- .../android/di/hilt/HiltNetworkModule.kt | 8 +- .../hiltexample/RecipeSearchResponse.kt | 8 + .../network/hiltexample/RecipeService.kt | 23 +++ .../network/models/recipe_hilt/Recipe.kt | 13 ++ .../network/models/recipe_hilt/RecipeDto.kt | 19 ++ .../models/recipe_hilt/RecipeDtoMapper.kt | 40 ++++ .../android/repos/RecipeRepository.kt | 8 + .../repos/RecipeRepositoryImplementation.kt | 17 ++ .../rocketinsights/android/ui/HiltActivity.kt | 3 +- .../android/viewmodels/HiltListViewModel.kt | 38 ++++ 13 files changed, 179 insertions(+), 186 deletions(-) delete mode 100644 app/src/main/java/com/rocketinsights/android/di/KoinUtils.kt create mode 100644 app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt create mode 100644 app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt create mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt create mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt create mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt create mode 100644 app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt create mode 100644 app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt create mode 100644 app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 04b2829..9a52df3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,11 +32,14 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/Theme.AndroidBase.Main"> - + android:theme="@style/Theme.AndroidBase.Main" > + - + diff --git a/app/src/main/java/com/rocketinsights/android/di/KoinUtils.kt b/app/src/main/java/com/rocketinsights/android/di/KoinUtils.kt deleted file mode 100644 index fb0c482..0000000 --- a/app/src/main/java/com/rocketinsights/android/di/KoinUtils.kt +++ /dev/null @@ -1,172 +0,0 @@ -package com.rocketinsights.android.di - -import android.app.Application -import android.app.NotificationManager -import android.content.Context -import android.net.ConnectivityManager -import androidx.room.Room -import androidx.work.WorkManager -import com.firebase.ui.auth.AuthUI -import com.google.firebase.auth.FirebaseAuth -import com.rocketinsights.android.auth.AuthManager -import com.rocketinsights.android.auth.FirebaseAuthManager -import com.rocketinsights.android.auth.SessionStorage -import com.rocketinsights.android.auth.SessionWatcher -import com.rocketinsights.android.coroutines.DispatcherProvider -import com.rocketinsights.android.coroutines.DispatcherProviderImpl -import com.rocketinsights.android.db.Database -import com.rocketinsights.android.managers.CalendarManager -import com.rocketinsights.android.managers.CalendarManagerImpl -import com.rocketinsights.android.managers.InternetManager -import com.rocketinsights.android.managers.PermissionsManager -import com.rocketinsights.android.managers.PermissionsManagerImpl -import com.rocketinsights.android.managers.location.LocationManager -import com.rocketinsights.android.managers.location.LocationManagerImpl -import com.rocketinsights.android.network.ApiService -import com.rocketinsights.android.network.NetworkingManager -import com.rocketinsights.android.notifications.MyAppNotificationsManager -import com.rocketinsights.android.prefs.AuthLocalStore -import com.rocketinsights.android.prefs.AuthLocalStoreImpl -import com.rocketinsights.android.prefs.LocalStore -import com.rocketinsights.android.prefs.LocalStoreImpl -import com.rocketinsights.android.repos.AuthRepository -import com.rocketinsights.android.repos.MessageRepository -import com.rocketinsights.android.repos.PlayerRepository -import com.rocketinsights.android.ui.MainActivity -import com.rocketinsights.android.ui.ParentScrollProvider -import com.rocketinsights.android.viewmodels.CalendarViewModel -import com.rocketinsights.android.viewmodels.ConnectivityViewModel -import com.rocketinsights.android.viewmodels.ContactsViewModel -import com.rocketinsights.android.viewmodels.LocationViewModel -import com.rocketinsights.android.viewmodels.MainViewModel -import com.rocketinsights.android.viewmodels.MessagesViewModel -import com.rocketinsights.android.viewmodels.PermissionsViewModel -import com.rocketinsights.android.viewmodels.PhotoViewModel -import com.rocketinsights.android.viewmodels.PlayerViewModel -import com.rocketinsights.android.viewmodels.SessionViewModel -import com.rocketinsights.android.viewmodels.TheGreatestRecyclerViewViewModel -import com.rocketinsights.android.viewmodels.UserViewModel -import com.rocketinsights.android.work.Work -import com.rocketinsights.android.work.WorkImpl -import com.rocketinsights.android.work.messages.MessagesUpdateScheduler -import com.rocketinsights.android.work.messages.MessagesUpdateSchedulerImpl -import com.rocketinsights.android.work.messages.MessagesUpdateWorkRequestFactory -import com.rocketinsights.android.work.messages.MessagesUpdateWorker -import org.koin.android.ext.koin.androidContext -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.androidx.workmanager.dsl.worker -import org.koin.androidx.workmanager.koin.workManagerFactory -import org.koin.core.context.startKoin -import org.koin.core.scope.get -import org.koin.dsl.module - -fun Application.initKoin() { - startKoin { - androidContext(this@initKoin) - workManagerFactory() - modules( - listOf( - networkModule(), - databaseModule(), - managersModule(), - repositoryModule(), - authModule(), - viewModelsModule(), - viewInteractorsModule(), - workModule() - ) - ) - } -} - -private fun networkModule() = module { - single { - NetworkingManager(get(), get(), get()) - } - single { - get().retrofitInstance.create(ApiService::class.java) - } -} - -private fun databaseModule() = module { - single { - Room.databaseBuilder( - androidContext(), - Database::class.java, - Database.NAME - ).build() - } - - single { get().messageDao() } -} - -private fun managersModule() = module { - single { - InternetManager( - androidContext().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - ) - } - factory { PermissionsManagerImpl(get()) } - single { LocationManagerImpl(get()) } - single { - MyAppNotificationsManager( - get(), - androidContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - ) - } - single { LocalStoreImpl(get()) } - single { CalendarManagerImpl(get(), get(), get()) } -} - -private fun repositoryModule() = module { - single { DispatcherProviderImpl() } - single { MessageRepository(get(), get(), get()) } - single { - AuthRepository(get(), get(), get(), get()).apply { - get().sessionWatcher = this - } - } - single { PlayerRepository(get()) } -} - -private fun authModule() = module { - single { FirebaseAuth.getInstance() } - single { AuthLocalStoreImpl(get()) } - factory { (context: Context) -> - FirebaseAuthManager(context, get(), AuthUI.getInstance()) - } -} - -private fun viewModelsModule() = module { - viewModel { - SessionViewModel( - get(clazz = AuthRepository::class.java) as SessionWatcher, - get(clazz = NetworkingManager::class.java) as SessionStorage - ) - } - viewModel { MainViewModel(get()) } - viewModel { MessagesViewModel(get()) } - viewModel { UserViewModel(get()) } - viewModel { ConnectivityViewModel(get()) } - viewModel { PermissionsViewModel(get()) } - viewModel { PhotoViewModel() } - viewModel { LocationViewModel(get(), get()) } - viewModel { CalendarViewModel(get()) } - viewModel { TheGreatestRecyclerViewViewModel() } - viewModel { PlayerViewModel(get()) } - viewModel { ContactsViewModel(get()) } -} - -private fun viewInteractorsModule() = module { - scope { - scoped { ParentScrollProvider() } - } -} - -private fun workModule() = module { - worker { MessagesUpdateWorker(get(), get(), get()) } - single { MessagesUpdateWorkRequestFactory.createWorkRequest() } - single { WorkManager.getInstance(get()) } - single { WorkImpl(get()) } - single { MessagesUpdateSchedulerImpl(get(), get(), get()) } -} diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt index 8bbab13..ab47682 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt @@ -14,7 +14,6 @@ import javax.inject.Singleton object AppModule { @Singleton @Provides - fun provideApplication(@ApplicationContext app: Context): RocketApplication { - return app as RocketApplication - } + fun provideApplication(@ApplicationContext app: Context): RocketApplication = + app as RocketApplication } \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 3eab04e..785b2ce 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -18,9 +18,7 @@ object HiltNetworkModule { @Singleton @Provides - fun providesRecipeMapper(): RecipeDtoMapper { - return RecipeDtoMapper() - } + fun providesRecipeMapper(): RecipeDtoMapper = RecipeDtoMapper() @Singleton @Provides @@ -35,7 +33,5 @@ object HiltNetworkModule { @Singleton @Provides @Named("auth_token") - fun provideAuthToken(): String { - return "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" - } + fun provideAuthToken(): String = "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" } \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt new file mode 100644 index 0000000..f10709d --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt @@ -0,0 +1,8 @@ +package com.rocketinsights.android.network.hiltexample + +import com.rocketinsights.android.network.models.recipe_hilt.RecipeDto + +data class RecipeSearchResponse( + var count: Int, + var results: List, +) diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt new file mode 100644 index 0000000..0865725 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt @@ -0,0 +1,23 @@ +package com.rocketinsights.android.network + +import com.rocketinsights.android.network.hiltexample.RecipeSearchResponse +import com.rocketinsights.android.network.models.recipe_hilt.RecipeDto +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface RecipeService { + + @GET("search") + suspend fun search( + @Header("Authorization") token: String, + @Query("page") page: Int, + @Query("query") query: String + ): RecipeSearchResponse + + @GET("get") + suspend fun get( + @Header("Authorization") token: String, + @Query("id") id: Int + ): RecipeDto +} diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt new file mode 100644 index 0000000..8a2ff9a --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt @@ -0,0 +1,13 @@ +package com.rocketinsights.android.network.models.recipe_hilt + +data class Recipe ( + val id: Int, + val title: String, + val publisher: String, + val featuredImage: String, + val rating: Int = 0, + val sourceUrl: String, + val ingredients: List = listOf(), + val dateAdded: String, + val dateUpdated: String +) \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt new file mode 100644 index 0000000..5ef58e4 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt @@ -0,0 +1,19 @@ +package com.rocketinsights.android.network.models.recipe_hilt + +import com.google.gson.annotations.SerializedName + +data class RecipeDto( + var pk: Int, + var title: String, + var publisher: String, + @SerializedName("featured_image") + var featuredImage: String, + var rating: Int = 0, + @SerializedName("source_url") + var sourceUrl: String, + var ingredients: List = emptyList(), + @SerializedName("date_added") + var dateAdded: String, + @SerializedName("date_updated") + var dateUpdated: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt new file mode 100644 index 0000000..5752b08 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt @@ -0,0 +1,40 @@ +package com.rocketinsights.android.network.models.recipe_hilt + +class RecipeDtoMapper { + + fun mapToDomainModel(model: RecipeDto): Recipe { + return Recipe( + id = model.pk, + title = model.title, + featuredImage = model.featuredImage, + rating = model.rating, + publisher = model.publisher, + sourceUrl = model.sourceUrl, + ingredients = model.ingredients, + dateAdded = model.dateAdded, + dateUpdated = model.dateUpdated, + ) + } + + fun mapFromDomainModel(domainModel: Recipe): RecipeDto { + return RecipeDto( + pk = domainModel.id, + title = domainModel.title, + featuredImage = domainModel.featuredImage, + rating = domainModel.rating, + publisher = domainModel.publisher, + sourceUrl = domainModel.sourceUrl, + ingredients = domainModel.ingredients, + dateAdded = domainModel.dateAdded, + dateUpdated = domainModel.dateUpdated, + ) + } + + fun toDomainList(initial: List): List { + return initial.map { mapToDomainModel(it) } + } + + fun fromDomainList(initial: List): List{ + return initial.map { mapFromDomainModel(it) } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt new file mode 100644 index 0000000..19240cb --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt @@ -0,0 +1,8 @@ +package com.rocketinsights.android.repos + +import com.rocketinsights.android.network.models.recipe_hilt.Recipe + +interface RecipeRepository { + suspend fun search(token: String, page: Int, query: String): List? + suspend fun get(token: String, id: Int): Recipe +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt new file mode 100644 index 0000000..c2a621e --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -0,0 +1,17 @@ +package com.rocketinsights.android.repos + +import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.models.recipe_hilt.Recipe +import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper + +class RecipeRepositoryImplementation ( + private val recipeService: RecipeService, + private val mapper: RecipeDtoMapper, +): RecipeRepository { + + override suspend fun search(token: String, page: Int, query: String): List? = + mapper.toDomainList(recipeService.search(token = token, page = page, query = query).results) + + override suspend fun get(token: String, id: Int): Recipe = + mapper.mapToDomainModel(recipeService.get(token = token, id)) +} diff --git a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt index ab857f9..f70ad11 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -23,8 +23,9 @@ class HiltActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // TODO: Show data with JetpackCompose in next PR viewModel.liveRecipe.observe(this) { recipe -> - recipe[0].title + // do nothing for now } } } diff --git a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt new file mode 100644 index 0000000..2789935 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt @@ -0,0 +1,38 @@ +package com.rocketinsights.android.viewmodels + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.rocketinsights.android.network.models.recipe_hilt.Recipe +import com.rocketinsights.android.repos.RecipeRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject +import javax.inject.Named + +@HiltViewModel +class HiltListViewModel +@Inject +constructor( + private val repository: RecipeRepository, + @Named("auth_token") private val token: String +): ViewModel() { + + private val recipes: MutableLiveData> = MutableLiveData() + val liveRecipe: LiveData> = recipes + + init { + viewModelScope.launch { + val result = repository.search( + token = token, + page = 1, + query = "beef carrot potato onion" + ) + + result?.apply { + recipes.value = this + } + } + } +} \ No newline at end of file From 09bc105703f7ca526ef6c7652694584d6bd6b332 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 10:33:15 -0300 Subject: [PATCH 07/29] Cleaning code --- app/src/main/res/values/strings.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7456c88..8e247c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,6 +113,4 @@ Hilt example - - Hello blank fragment From 73a3e21bfa511939daf65f4f105c102481db5a12 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 10:34:40 -0300 Subject: [PATCH 08/29] cleaning --- app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt | 2 +- app/src/main/res/menu/main_menu.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt b/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt index 5687d40..2eaf86c 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/MainFragment.kt @@ -127,7 +127,7 @@ class MainFragment : BaseFragment(R.layout.fragment_main) { setFadeThroughTransition() item.onNavDestinationSelected(findNavController()) } - R.id.hilt_fragment -> { + R.id.hilt_activity -> { setFadeThroughTransition() Intent(this.context, HiltActivity::class.java).also { startActivity(it) } true diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index cb30f73..8d3f4c2 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -30,7 +30,7 @@ android:id="@+id/contacts_fragment" android:title="@string/contacts" /> Date: Mon, 25 Apr 2022 10:35:31 -0300 Subject: [PATCH 09/29] clean --- app/src/main/res/values/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e247c8..9d62f0c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,7 +20,6 @@ Container Transform The Greatest RecyclerView Contacts - This is Hilt Request Permissions From 7738e25e1c51e7b8e66ce65eae26e715d93758f0 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 11:18:35 -0300 Subject: [PATCH 10/29] bye kapt verbose --- gradle.properties | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f59adf6..9e6fce1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,6 @@ android.enableJetifier=true android.useAndroidX=true org.gradle.jvmargs=-Xmx1536m -kapt.verbose=true # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit From 927c10ceb60f33e23e03a42e99ca3f55acd9f443 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:30:58 -0300 Subject: [PATCH 11/29] cleaning imports --- .../com/rocketinsights/android/ui/HiltActivity.kt | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt index f70ad11..63d3852 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -1,19 +1,10 @@ package com.rocketinsights.android.ui -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import androidx.activity.compose.setContent import androidx.activity.viewModels -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier +import androidx.appcompat.app.AppCompatActivity import com.rocketinsights.android.viewmodels.HiltListViewModel import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.ExperimentalCoroutinesApi @AndroidEntryPoint class HiltActivity : AppCompatActivity() { From f1581d2edbd9ee995b89e4a241688d7142ee1437 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:32:12 -0300 Subject: [PATCH 12/29] code smell --- .../main/java/com/rocketinsights/android/di/hilt/AppModule.kt | 2 +- .../com/rocketinsights/android/di/hilt/HiltNetworkModule.kt | 2 +- .../com/rocketinsights/android/di/hilt/RepositoryModule.kt | 2 +- .../rocketinsights/android/viewmodels/HiltListViewModel.kt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt index ab47682..50eef66 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/AppModule.kt @@ -16,4 +16,4 @@ object AppModule { @Provides fun provideApplication(@ApplicationContext app: Context): RocketApplication = app as RocketApplication -} \ No newline at end of file +} diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 785b2ce..bf2eb18 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -34,4 +34,4 @@ object HiltNetworkModule { @Provides @Named("auth_token") fun provideAuthToken(): String = "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" -} \ No newline at end of file +} diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt index 30d6deb..824cff7 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt @@ -25,4 +25,4 @@ object RepositoryModule { mapper = recipeMapper ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt index 2789935..0fcdc91 100644 --- a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt +++ b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt @@ -17,7 +17,7 @@ class HiltListViewModel constructor( private val repository: RecipeRepository, @Named("auth_token") private val token: String -): ViewModel() { +) : ViewModel() { private val recipes: MutableLiveData> = MutableLiveData() val liveRecipe: LiveData> = recipes @@ -35,4 +35,4 @@ constructor( } } } -} \ No newline at end of file +} From adfca453dea326035112875fa408289c36fae783 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:38:54 -0300 Subject: [PATCH 13/29] code smell --- .../android/repos/RecipeRepositoryImplementation.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index c2a621e..4ad6179 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -4,12 +4,12 @@ import com.rocketinsights.android.network.RecipeService import com.rocketinsights.android.network.models.recipe_hilt.Recipe import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper -class RecipeRepositoryImplementation ( +class RecipeRepositoryImplementation( private val recipeService: RecipeService, private val mapper: RecipeDtoMapper, -): RecipeRepository { +) : RecipeRepository { - override suspend fun search(token: String, page: Int, query: String): List? = + override suspend fun search(token: String, page: Int, query: String): List = mapper.toDomainList(recipeService.search(token = token, page = page, query = query).results) override suspend fun get(token: String, id: Int): Recipe = From dd9983ffc8c47f11b39bf502530032d525296335 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:43:34 -0300 Subject: [PATCH 14/29] code smell :) --- .../java/com/rocketinsights/android/repos/RecipeRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt index 19240cb..1bc7fae 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt @@ -5,4 +5,4 @@ import com.rocketinsights.android.network.models.recipe_hilt.Recipe interface RecipeRepository { suspend fun search(token: String, page: Int, query: String): List? suspend fun get(token: String, id: Int): Recipe -} \ No newline at end of file +} From 89539377e48d370ce4a9ad464d450d15e49cb1a6 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:47:52 -0300 Subject: [PATCH 15/29] + smell code fixes --- .../android/network/models/recipe_hilt/Recipe.kt | 4 ++-- .../network/models/recipe_hilt/RecipeDto.kt | 2 +- .../models/recipe_hilt/RecipeDtoMapper.kt | 16 ++++++---------- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt index 8a2ff9a..1d6671d 100644 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt @@ -1,6 +1,6 @@ package com.rocketinsights.android.network.models.recipe_hilt -data class Recipe ( +data class Recipe( val id: Int, val title: String, val publisher: String, @@ -10,4 +10,4 @@ data class Recipe ( val ingredients: List = listOf(), val dateAdded: String, val dateUpdated: String -) \ No newline at end of file +) diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt index 5ef58e4..20adbcf 100644 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt @@ -16,4 +16,4 @@ data class RecipeDto( var dateAdded: String, @SerializedName("date_updated") var dateUpdated: String, -) \ No newline at end of file +) diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt index 5752b08..2fe107e 100644 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt +++ b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt @@ -1,8 +1,7 @@ package com.rocketinsights.android.network.models.recipe_hilt class RecipeDtoMapper { - - fun mapToDomainModel(model: RecipeDto): Recipe { + fun mapToDomainModel(model: RecipeDto): Recipe { return Recipe( id = model.pk, title = model.title, @@ -16,7 +15,7 @@ class RecipeDtoMapper { ) } - fun mapFromDomainModel(domainModel: Recipe): RecipeDto { + private fun mapFromDomainModel(domainModel: Recipe): RecipeDto { return RecipeDto( pk = domainModel.id, title = domainModel.title, @@ -30,11 +29,8 @@ class RecipeDtoMapper { ) } - fun toDomainList(initial: List): List { - return initial.map { mapToDomainModel(it) } - } + fun toDomainList(initial: List): List = initial.map { mapToDomainModel(it) } - fun fromDomainList(initial: List): List{ - return initial.map { mapFromDomainModel(it) } - } -} \ No newline at end of file + fun fromDomainList(initial: List): List = + initial.map { mapFromDomainModel(it) } +} From 76dcbaca7c0eee819244d816cef81efafc5f6696 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 12:59:03 -0300 Subject: [PATCH 16/29] code rev Juli --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 07a3c12..2b29659 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,6 +175,8 @@ ext { core_version = "1.6.0" desugar_jdk_version = "1.1.5" hilt_version = "2.38.1" + hilt_lifecycle_viewmodel = "1.0.0-alpha03" + // Compose activity_compose_version = "1.3.1" constraintlayout_compose_version = "1.0.0-rc01" @@ -211,7 +213,6 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" - implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" // Http Logging Interceptor @@ -298,11 +299,10 @@ dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$viewmodel_compose_version" implementation "com.google.android.material:compose-theme-adapter:$compose_version" - // Hilt + // Hilt: Official Google Dependency Injection Library implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version" - def hilt_lifecycle_viewmodel = "1.0.0-alpha03" implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_lifecycle_viewmodel" kapt "androidx.hilt:hilt-compiler:$hilt_lifecycle_viewmodel" From 59234a20eaf5be59a71005bd2f6eae84d8cefd2a Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 13:07:12 -0300 Subject: [PATCH 17/29] code rev juli --- app/build.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2b29659..1b028cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -326,7 +326,3 @@ dependencies { testImplementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testImplementation "androidx.arch.core:core-testing:$core_testing_version" } - -kapt { - correctErrorTypes true -} From e727425069077fc5f09b31b9e836f30d00447027 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 15:39:23 -0300 Subject: [PATCH 18/29] code rev tomi --- .../android/di/hilt/HiltNetworkModule.kt | 2 +- .../android/di/hilt/RepositoryModule.kt | 2 +- .../android/models/recipe_hilt/Recipe.kt | 13 +++++++ .../android/models/recipe_hilt/RecipeDto.kt | 19 ++++++++++ .../models/recipe_hilt/RecipeDtoMapper.kt | 36 +++++++++++++++++++ .../hiltexample/RecipeSearchResponse.kt | 2 +- .../network/hiltexample/RecipeService.kt | 2 +- .../android/repos/RecipeRepository.kt | 2 +- .../repos/RecipeRepositoryImplementation.kt | 4 +-- .../android/viewmodels/HiltListViewModel.kt | 2 +- 10 files changed, 76 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt create mode 100644 app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDto.kt create mode 100644 app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index bf2eb18..27c002f 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -2,7 +2,7 @@ package com.rocketinsights.android.di.hilt import com.google.gson.GsonBuilder import com.rocketinsights.android.network.RecipeService -import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt index 824cff7..b986061 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt @@ -1,7 +1,7 @@ package com.rocketinsights.android.di.hilt import com.rocketinsights.android.network.RecipeService -import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper import com.rocketinsights.android.repos.RecipeRepository import com.rocketinsights.android.repos.RecipeRepositoryImplementation import dagger.Module diff --git a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt new file mode 100644 index 0000000..b0d01bd --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt @@ -0,0 +1,13 @@ +package com.rocketinsights.android.models.recipe_hilt + +data class Recipe( + val id: Int, + val title: String, + val publisher: String, + val featuredImage: String, + val rating: Int = 0, + val sourceUrl: String, + val ingredients: List = listOf(), + val dateAdded: String, + val dateUpdated: String +) diff --git a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDto.kt b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDto.kt new file mode 100644 index 0000000..b4bfbcb --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDto.kt @@ -0,0 +1,19 @@ +package com.rocketinsights.android.models.recipe_hilt + +import com.google.gson.annotations.SerializedName + +data class RecipeDto( + var pk: Int, + var title: String, + var publisher: String, + @SerializedName("featured_image") + var featuredImage: String, + var rating: Int = 0, + @SerializedName("source_url") + var sourceUrl: String, + var ingredients: List = emptyList(), + @SerializedName("date_added") + var dateAdded: String, + @SerializedName("date_updated") + var dateUpdated: String, +) diff --git a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt new file mode 100644 index 0000000..73c8170 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt @@ -0,0 +1,36 @@ +package com.rocketinsights.android.models.recipe_hilt + +class RecipeDtoMapper { + fun mapToDomainModel(model: RecipeDto): Recipe { + return Recipe( + id = model.pk, + title = model.title, + featuredImage = model.featuredImage, + rating = model.rating, + publisher = model.publisher, + sourceUrl = model.sourceUrl, + ingredients = model.ingredients, + dateAdded = model.dateAdded, + dateUpdated = model.dateUpdated, + ) + } + + private fun mapFromDomainModel(domainModel: Recipe): RecipeDto { + return RecipeDto( + pk = domainModel.id, + title = domainModel.title, + featuredImage = domainModel.featuredImage, + rating = domainModel.rating, + publisher = domainModel.publisher, + sourceUrl = domainModel.sourceUrl, + ingredients = domainModel.ingredients, + dateAdded = domainModel.dateAdded, + dateUpdated = domainModel.dateUpdated, + ) + } + + fun toDomainList(initial: List): List = initial.map { mapToDomainModel(it) } + + fun fromDomainList(initial: List): List = + initial.map { mapFromDomainModel(it) } +} diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt index f10709d..0d68320 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt @@ -1,6 +1,6 @@ package com.rocketinsights.android.network.hiltexample -import com.rocketinsights.android.network.models.recipe_hilt.RecipeDto +import com.rocketinsights.android.models.recipe_hilt.RecipeDto data class RecipeSearchResponse( var count: Int, diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt index 0865725..75405a6 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt @@ -1,7 +1,7 @@ package com.rocketinsights.android.network import com.rocketinsights.android.network.hiltexample.RecipeSearchResponse -import com.rocketinsights.android.network.models.recipe_hilt.RecipeDto +import com.rocketinsights.android.models.recipe_hilt.RecipeDto import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Query diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt index 1bc7fae..64f6aa7 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt @@ -1,6 +1,6 @@ package com.rocketinsights.android.repos -import com.rocketinsights.android.network.models.recipe_hilt.Recipe +import com.rocketinsights.android.models.recipe_hilt.Recipe interface RecipeRepository { suspend fun search(token: String, page: Int, query: String): List? diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index 4ad6179..3893dbb 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -1,8 +1,8 @@ package com.rocketinsights.android.repos import com.rocketinsights.android.network.RecipeService -import com.rocketinsights.android.network.models.recipe_hilt.Recipe -import com.rocketinsights.android.network.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.models.recipe_hilt.Recipe +import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper class RecipeRepositoryImplementation( private val recipeService: RecipeService, diff --git a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt index 0fcdc91..13a47b9 100644 --- a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt +++ b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.rocketinsights.android.network.models.recipe_hilt.Recipe +import com.rocketinsights.android.models.recipe_hilt.Recipe import com.rocketinsights.android.repos.RecipeRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch From 7f4bca25ad11ac871a14974c1c5958fbaaf3f28d Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 15:42:03 -0300 Subject: [PATCH 19/29] code rev tomi --- .../models/recipe_hilt/RecipeDtoMapper.kt | 17 --------- .../network/models/recipe_hilt/Recipe.kt | 13 ------- .../network/models/recipe_hilt/RecipeDto.kt | 19 ---------- .../models/recipe_hilt/RecipeDtoMapper.kt | 36 ------------------- 4 files changed, 85 deletions(-) delete mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt delete mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt delete mode 100644 app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt diff --git a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt index 73c8170..fe59dc9 100644 --- a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt +++ b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/RecipeDtoMapper.kt @@ -15,22 +15,5 @@ class RecipeDtoMapper { ) } - private fun mapFromDomainModel(domainModel: Recipe): RecipeDto { - return RecipeDto( - pk = domainModel.id, - title = domainModel.title, - featuredImage = domainModel.featuredImage, - rating = domainModel.rating, - publisher = domainModel.publisher, - sourceUrl = domainModel.sourceUrl, - ingredients = domainModel.ingredients, - dateAdded = domainModel.dateAdded, - dateUpdated = domainModel.dateUpdated, - ) - } - fun toDomainList(initial: List): List = initial.map { mapToDomainModel(it) } - - fun fromDomainList(initial: List): List = - initial.map { mapFromDomainModel(it) } } diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt deleted file mode 100644 index 1d6671d..0000000 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/Recipe.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.rocketinsights.android.network.models.recipe_hilt - -data class Recipe( - val id: Int, - val title: String, - val publisher: String, - val featuredImage: String, - val rating: Int = 0, - val sourceUrl: String, - val ingredients: List = listOf(), - val dateAdded: String, - val dateUpdated: String -) diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt deleted file mode 100644 index 20adbcf..0000000 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDto.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.rocketinsights.android.network.models.recipe_hilt - -import com.google.gson.annotations.SerializedName - -data class RecipeDto( - var pk: Int, - var title: String, - var publisher: String, - @SerializedName("featured_image") - var featuredImage: String, - var rating: Int = 0, - @SerializedName("source_url") - var sourceUrl: String, - var ingredients: List = emptyList(), - @SerializedName("date_added") - var dateAdded: String, - @SerializedName("date_updated") - var dateUpdated: String, -) diff --git a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt b/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt deleted file mode 100644 index 2fe107e..0000000 --- a/app/src/main/java/com/rocketinsights/android/network/models/recipe_hilt/RecipeDtoMapper.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.rocketinsights.android.network.models.recipe_hilt - -class RecipeDtoMapper { - fun mapToDomainModel(model: RecipeDto): Recipe { - return Recipe( - id = model.pk, - title = model.title, - featuredImage = model.featuredImage, - rating = model.rating, - publisher = model.publisher, - sourceUrl = model.sourceUrl, - ingredients = model.ingredients, - dateAdded = model.dateAdded, - dateUpdated = model.dateUpdated, - ) - } - - private fun mapFromDomainModel(domainModel: Recipe): RecipeDto { - return RecipeDto( - pk = domainModel.id, - title = domainModel.title, - featuredImage = domainModel.featuredImage, - rating = domainModel.rating, - publisher = domainModel.publisher, - sourceUrl = domainModel.sourceUrl, - ingredients = domainModel.ingredients, - dateAdded = domainModel.dateAdded, - dateUpdated = domainModel.dateUpdated, - ) - } - - fun toDomainList(initial: List): List = initial.map { mapToDomainModel(it) } - - fun fromDomainList(initial: List): List = - initial.map { mapFromDomainModel(it) } -} From 3204004583936e1be6bdb343aac04f4865667191 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 15:45:25 -0300 Subject: [PATCH 20/29] code rev tomi --- .../rocketinsights/android/di/hilt/HiltNetworkModule.kt | 2 +- .../com/rocketinsights/android/di/hilt/RepositoryModule.kt | 2 +- .../android/network/hiltexample/RecipeService.kt | 7 +++---- .../android/repos/RecipeRepositoryImplementation.kt | 6 +++--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 27c002f..9ed3f43 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -1,7 +1,7 @@ package com.rocketinsights.android.di.hilt import com.google.gson.GsonBuilder -import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper import dagger.Module import dagger.Provides diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt index b986061..905a730 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt @@ -1,6 +1,6 @@ package com.rocketinsights.android.di.hilt -import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper import com.rocketinsights.android.repos.RecipeRepository import com.rocketinsights.android.repos.RecipeRepositoryImplementation diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt index 75405a6..cb36dc3 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt @@ -1,6 +1,5 @@ -package com.rocketinsights.android.network +package com.rocketinsights.android.network.hiltexample -import com.rocketinsights.android.network.hiltexample.RecipeSearchResponse import com.rocketinsights.android.models.recipe_hilt.RecipeDto import retrofit2.http.GET import retrofit2.http.Header @@ -9,14 +8,14 @@ import retrofit2.http.Query interface RecipeService { @GET("search") - suspend fun search( + suspend fun searchRecipe( @Header("Authorization") token: String, @Query("page") page: Int, @Query("query") query: String ): RecipeSearchResponse @GET("get") - suspend fun get( + suspend fun getRecipe( @Header("Authorization") token: String, @Query("id") id: Int ): RecipeDto diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index 3893dbb..fa18837 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -1,6 +1,6 @@ package com.rocketinsights.android.repos -import com.rocketinsights.android.network.RecipeService +import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.Recipe import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper @@ -10,8 +10,8 @@ class RecipeRepositoryImplementation( ) : RecipeRepository { override suspend fun search(token: String, page: Int, query: String): List = - mapper.toDomainList(recipeService.search(token = token, page = page, query = query).results) + mapper.toDomainList(recipeService.searchRecipe(token = token, page = page, query = query).results) override suspend fun get(token: String, id: Int): Recipe = - mapper.mapToDomainModel(recipeService.get(token = token, id)) + mapper.mapToDomainModel(recipeService.getRecipe(token = token, id)) } From 21226cea9f4e61aab5742f95518a0e3bff0185b0 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 15:58:14 -0300 Subject: [PATCH 21/29] ordered in lexicographic order --- .../com/rocketinsights/android/di/hilt/HiltNetworkModule.kt | 2 +- .../java/com/rocketinsights/android/di/hilt/RepositoryModule.kt | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 9ed3f43..721caa1 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -1,8 +1,8 @@ package com.rocketinsights.android.di.hilt import com.google.gson.GsonBuilder -import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.network.hiltexample.RecipeService import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt index 905a730..e533985 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/RepositoryModule.kt @@ -1,7 +1,7 @@ package com.rocketinsights.android.di.hilt -import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.repos.RecipeRepository import com.rocketinsights.android.repos.RecipeRepositoryImplementation import dagger.Module diff --git a/build.gradle b/build.gradle index c30754d..c1eda9d 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { navigation_version = "2.3.5" google_services_version = "4.3.10" compose_version = "1.0.3" - hilt_version = "2.28-alpha" + hilt_version = "2.38.1" } repositories { gradlePluginPortal() From 189be0d54b7f19c6c61213c37e5c1c5244065680 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 16:03:33 -0300 Subject: [PATCH 22/29] clean --- .../android/repos/RecipeRepositoryImplementation.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index fa18837..2caa83d 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -1,8 +1,8 @@ package com.rocketinsights.android.repos -import com.rocketinsights.android.network.hiltexample.RecipeService import com.rocketinsights.android.models.recipe_hilt.Recipe import com.rocketinsights.android.models.recipe_hilt.RecipeDtoMapper +import com.rocketinsights.android.network.hiltexample.RecipeService class RecipeRepositoryImplementation( private val recipeService: RecipeService, From 5eb0a7495a005969befcb42e110028d30907293c Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 16:33:33 -0300 Subject: [PATCH 23/29] code rev tomi --- .../android/network/hiltexample/RecipeSearchResponse.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt index 0d68320..de99856 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeSearchResponse.kt @@ -3,6 +3,6 @@ package com.rocketinsights.android.network.hiltexample import com.rocketinsights.android.models.recipe_hilt.RecipeDto data class RecipeSearchResponse( - var count: Int, - var results: List, + val count: Int, + val results: List, ) From 25036ae79f12422f889979108cab7be91871e15f Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 16:35:53 -0300 Subject: [PATCH 24/29] code rev tomi --- .../com/rocketinsights/android/models/recipe_hilt/Recipe.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt index b0d01bd..2c212ed 100644 --- a/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt +++ b/app/src/main/java/com/rocketinsights/android/models/recipe_hilt/Recipe.kt @@ -7,7 +7,7 @@ data class Recipe( val featuredImage: String, val rating: Int = 0, val sourceUrl: String, - val ingredients: List = listOf(), + val ingredients: List, val dateAdded: String, val dateUpdated: String ) From 86dfc0daa0a2f0821213851e7fe90141e6035e9f Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 16:52:24 -0300 Subject: [PATCH 25/29] code rev tomi --- app/build.gradle | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1b028cc..038d9f5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,7 +175,6 @@ ext { core_version = "1.6.0" desugar_jdk_version = "1.1.5" hilt_version = "2.38.1" - hilt_lifecycle_viewmodel = "1.0.0-alpha03" // Compose activity_compose_version = "1.3.1" @@ -303,9 +302,6 @@ dependencies { implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_lifecycle_viewmodel" - kapt "androidx.hilt:hilt-compiler:$hilt_lifecycle_viewmodel" - // Test // Unit testing framework androidTestImplementation "com.android.support.test:rules:$test_rule_version" From dfea7cc22ec36253738fe3e91d297ca285ac2d6d Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Mon, 25 Apr 2022 16:56:31 -0300 Subject: [PATCH 26/29] code rev juan --- .../android/network/hiltexample/RecipeService.kt | 7 ------- .../com/rocketinsights/android/repos/RecipeRepository.kt | 1 - .../android/repos/RecipeRepositoryImplementation.kt | 3 --- 3 files changed, 11 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt index cb36dc3..224340b 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt @@ -1,6 +1,5 @@ package com.rocketinsights.android.network.hiltexample -import com.rocketinsights.android.models.recipe_hilt.RecipeDto import retrofit2.http.GET import retrofit2.http.Header import retrofit2.http.Query @@ -13,10 +12,4 @@ interface RecipeService { @Query("page") page: Int, @Query("query") query: String ): RecipeSearchResponse - - @GET("get") - suspend fun getRecipe( - @Header("Authorization") token: String, - @Query("id") id: Int - ): RecipeDto } diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt index 64f6aa7..2131420 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt @@ -4,5 +4,4 @@ import com.rocketinsights.android.models.recipe_hilt.Recipe interface RecipeRepository { suspend fun search(token: String, page: Int, query: String): List? - suspend fun get(token: String, id: Int): Recipe } diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index 2caa83d..4cbee3f 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -11,7 +11,4 @@ class RecipeRepositoryImplementation( override suspend fun search(token: String, page: Int, query: String): List = mapper.toDomainList(recipeService.searchRecipe(token = token, page = page, query = query).results) - - override suspend fun get(token: String, id: Int): Recipe = - mapper.mapToDomainModel(recipeService.getRecipe(token = token, id)) } From 0ab2c1411305846a86940517cca272aec814e6e4 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Tue, 26 Apr 2022 14:18:27 -0300 Subject: [PATCH 27/29] cod rev --- .../android/di/hilt/HiltNetworkModule.kt | 36 ++++++++++++++++--- .../network/hiltexample/RecipeService.kt | 2 -- .../android/repos/RecipeRepository.kt | 2 +- .../repos/RecipeRepositoryImplementation.kt | 4 +-- .../android/viewmodels/HiltListViewModel.kt | 5 +-- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 721caa1..2e6282b 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -7,15 +7,19 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import okhttp3.Interceptor +import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory -import javax.inject.Named import javax.inject.Singleton + @Module @InstallIn(SingletonComponent::class) object HiltNetworkModule { + private var okHttpClient: OkHttpClient? = null + @Singleton @Provides fun providesRecipeMapper(): RecipeDtoMapper = RecipeDtoMapper() @@ -26,12 +30,34 @@ object HiltNetworkModule { return Retrofit.Builder() .baseUrl("https://food2fork.ca/api/recipe/") .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create())) + .client(buildClientHttp()) .build() .create(RecipeService::class.java) } - @Singleton - @Provides - @Named("auth_token") - fun provideAuthToken(): String = "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" + + private fun buildClientHttp(): OkHttpClient? { + okHttpClient = OkHttpClient.Builder() + .addInterceptor(buildInterceptor()) + .build() + + return okHttpClient + } + + private fun buildInterceptor(): Interceptor { + var interceptor = Interceptor { chain -> + var request = chain.request() + + request = request.newBuilder() + .addHeader( + "Authorization", + "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" + ) + .build() + + chain.proceed(request = request) + } + return interceptor + } } + diff --git a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt index 224340b..9660347 100644 --- a/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt +++ b/app/src/main/java/com/rocketinsights/android/network/hiltexample/RecipeService.kt @@ -1,14 +1,12 @@ package com.rocketinsights.android.network.hiltexample import retrofit2.http.GET -import retrofit2.http.Header import retrofit2.http.Query interface RecipeService { @GET("search") suspend fun searchRecipe( - @Header("Authorization") token: String, @Query("page") page: Int, @Query("query") query: String ): RecipeSearchResponse diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt index 2131420..d1deecd 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepository.kt @@ -3,5 +3,5 @@ package com.rocketinsights.android.repos import com.rocketinsights.android.models.recipe_hilt.Recipe interface RecipeRepository { - suspend fun search(token: String, page: Int, query: String): List? + suspend fun search(page: Int, query: String): List? } diff --git a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt index 4cbee3f..df73112 100644 --- a/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt +++ b/app/src/main/java/com/rocketinsights/android/repos/RecipeRepositoryImplementation.kt @@ -9,6 +9,6 @@ class RecipeRepositoryImplementation( private val mapper: RecipeDtoMapper, ) : RecipeRepository { - override suspend fun search(token: String, page: Int, query: String): List = - mapper.toDomainList(recipeService.searchRecipe(token = token, page = page, query = query).results) + override suspend fun search(page: Int, query: String): List = + mapper.toDomainList(recipeService.searchRecipe(page = page, query = query).results) } diff --git a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt index 13a47b9..84daba1 100644 --- a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt +++ b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt @@ -9,14 +9,12 @@ import com.rocketinsights.android.repos.RecipeRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject -import javax.inject.Named @HiltViewModel class HiltListViewModel @Inject constructor( - private val repository: RecipeRepository, - @Named("auth_token") private val token: String + private val repository: RecipeRepository ) : ViewModel() { private val recipes: MutableLiveData> = MutableLiveData() @@ -25,7 +23,6 @@ constructor( init { viewModelScope.launch { val result = repository.search( - token = token, page = 1, query = "beef carrot potato onion" ) From b2852a4c9d0bd033e3ab7cf5d07cf368bf58886a Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Tue, 26 Apr 2022 14:47:37 -0300 Subject: [PATCH 28/29] clean spaces --- .../com/rocketinsights/android/di/hilt/HiltNetworkModule.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index 2e6282b..afb657f 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -13,7 +13,6 @@ import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import javax.inject.Singleton - @Module @InstallIn(SingletonComponent::class) object HiltNetworkModule { @@ -35,7 +34,6 @@ object HiltNetworkModule { .create(RecipeService::class.java) } - private fun buildClientHttp(): OkHttpClient? { okHttpClient = OkHttpClient.Builder() .addInterceptor(buildInterceptor()) @@ -60,4 +58,3 @@ object HiltNetworkModule { return interceptor } } - From 37586d5d63c065685742529aad10b9d3f119c2fd Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Tue, 26 Apr 2022 15:13:56 -0300 Subject: [PATCH 29/29] changes --- .../android/di/hilt/HiltNetworkModule.kt | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt index afb657f..4e13cad 100644 --- a/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt +++ b/app/src/main/java/com/rocketinsights/android/di/hilt/HiltNetworkModule.kt @@ -42,19 +42,16 @@ object HiltNetworkModule { return okHttpClient } - private fun buildInterceptor(): Interceptor { - var interceptor = Interceptor { chain -> - var request = chain.request() - - request = request.newBuilder() - .addHeader( - "Authorization", - "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" - ) - .build() - - chain.proceed(request = request) - } - return interceptor + private fun buildInterceptor() = Interceptor { chain -> + var request = chain.request() + + request = request.newBuilder() + .addHeader( + "Authorization", + "Token 9c8b06d329136da358c2d00e76946b0111ce2c48" + ) + .build() + + chain.proceed(request = request) } }