From 4851fbf35e52ed6643d1a897d3879410f7c8be92 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 22 Apr 2022 17:50:28 -0300 Subject: [PATCH 01/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] + 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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/35] 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) } } From 7087878246aca5e8ad19cb7e3864ad9610fc910d Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:02:57 -0300 Subject: [PATCH 30/35] version compose --- app/build.gradle | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 038d9f5..aff1c05 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -175,9 +175,11 @@ ext { core_version = "1.6.0" desugar_jdk_version = "1.1.5" hilt_version = "2.38.1" + glide_version = "4.13.0" + compose_ui_tool = "1.1.1" // Compose - activity_compose_version = "1.3.1" + activity_compose_version = '1.4.0' constraintlayout_compose_version = "1.0.0-rc01" viewmodel_compose_version = "1.0.0-alpha07" } @@ -297,11 +299,18 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout-compose:$constraintlayout_compose_version" implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$viewmodel_compose_version" implementation "com.google.android.material:compose-theme-adapter:$compose_version" + debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_tool" + implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_tool" + // Hilt: Official Google Dependency Injection Library implementation "com.google.dagger:hilt-android:$hilt_version" kapt "com.google.dagger:hilt-android-compiler:$hilt_version" + // Glide: Image loading framework + implementation "com.github.bumptech.glide:glide:$glide_version" + annotationProcessor "com.github.bumptech.glide:compiler:$glide_version" + // Test // Unit testing framework androidTestImplementation "com.android.support.test:rules:$test_rule_version" From 99e399a212ad7351bdd43c7a1d8ca6c83517e966 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:03:13 -0300 Subject: [PATCH 31/35] Ui compose imple --- .../android/models/recipe_hilt/Recipe.kt | 4 +- .../rocketinsights/android/ui/HiltActivity.kt | 75 +++++++++++++++++- .../android/ui/compose/CircularProgressBar.kt | 29 +++++++ .../android/ui/compose/RecipeCard.kt | 78 +++++++++++++++++++ .../ui/compose/util/ImageComposableUtils.kt | 38 +++++++++ .../android/viewmodels/HiltListViewModel.kt | 27 +++++-- 6 files changed, 241 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt create mode 100644 app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt create mode 100644 app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt 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 2c212ed..5514eb6 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 @@ -2,9 +2,9 @@ package com.rocketinsights.android.models.recipe_hilt data class Recipe( val id: Int, - val title: String, + val title: String?, val publisher: String, - val featuredImage: String, + val featuredImage: String?, val rating: Int = 0, val sourceUrl: String, val ingredients: List, 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 63d3852..9924886 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -1,8 +1,26 @@ package com.rocketinsights.android.ui import android.os.Bundle +import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.material.TextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import com.rocketinsights.android.ui.compose.CircularProgressBar +import com.rocketinsights.android.ui.compose.RecipeCard import com.rocketinsights.android.viewmodels.HiltListViewModel import dagger.hilt.android.AndroidEntryPoint @@ -14,9 +32,60 @@ class HiltActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // TODO: Show data with JetpackCompose in next PR - viewModel.liveRecipe.observe(this) { recipe -> - // do nothing for now + setContent { + val recipes = viewModel.recipes.value + val searchQuery = viewModel.searchQuery.value + val loading = viewModel.loading.value + + val focusManager = LocalFocusManager.current + + + Column() { + TextField( + value = searchQuery, + onValueChange = { newValue -> + viewModel.onSearchQueryChanged(newValue) + }, + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + label = { + Text(text = "Search") + }, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Text, + imeAction = ImeAction.Search + ), + leadingIcon = { + Icon(imageVector = Icons.Filled.Search, + contentDescription = "icon" + ) + }, + keyboardActions = KeyboardActions( + onSearch = { + viewModel.newSearch(searchQuery) + focusManager.clearFocus() + } + ) + ) + + Box( + modifier = Modifier.fillMaxSize() + ) { + LazyColumn(content = { + itemsIndexed( + items = recipes + ) { index, recipe -> + RecipeCard( + recipe = recipe, + onCardClick = {} + ) + } + }) + + CircularProgressBar(isDisplayed = loading) + } + } } } } diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt new file mode 100644 index 0000000..6176981 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt @@ -0,0 +1,29 @@ +package com.rocketinsights.android.ui.compose + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@Composable +fun CircularProgressBar( + isDisplayed: Boolean +) { + if (isDisplayed) { + Row ( + modifier = Modifier + .fillMaxWidth() + .padding(30.dp), + horizontalArrangement = Arrangement.Center + ) { + CircularProgressIndicator( + color = MaterialTheme.colors.primary + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt new file mode 100644 index 0000000..007f6b6 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt @@ -0,0 +1,78 @@ +package com.rocketinsights.android.ui.compose + +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.material.Card +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.dp +import com.rocketinsights.android.R +import com.rocketinsights.android.models.recipe_hilt.Recipe +import com.rocketinsights.android.ui.compose.util.loadPicture + +@Composable +fun RecipeCard( + recipe: Recipe, + onCardClick: () -> Unit +) { + Card( + shape = MaterialTheme.shapes.small, + modifier = Modifier + .padding( + bottom = 6.dp, + top = 6.dp + ) + .fillMaxHeight() + .clickable(onClick = onCardClick), + elevation = 8.dp + ) { + Column { + + recipe.featuredImage?.let { url -> + loadPicture( + url = url, + defaultImage = R.drawable.ic_rocketinsights_logo + ).value?.let { image -> + Image( + bitmap = image.asImageBitmap(), + contentDescription = "desc", + modifier = Modifier + .fillMaxWidth() + .height(225.dp), + contentScale = ContentScale.Crop + ) + } + } + + recipe.title?.let { title -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ){ + Text( + text = title, + modifier = Modifier + .fillMaxWidth(0.85f) + .wrapContentWidth(Alignment.Start), + style = MaterialTheme.typography.h5 + ) + Text( + text = recipe.rating.toString(), + modifier = Modifier + .fillMaxWidth() + .wrapContentWidth(Alignment.End) + .align(Alignment.CenterVertically), + style = MaterialTheme.typography.h6 + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt new file mode 100644 index 0000000..4c51596 --- /dev/null +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt @@ -0,0 +1,38 @@ +package com.rocketinsights.android.ui.compose.util + +import android.annotation.SuppressLint +import android.graphics.Bitmap +import android.graphics.drawable.Drawable +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.platform.LocalContext +import com.bumptech.glide.Glide +import com.bumptech.glide.request.target.CustomTarget +import com.bumptech.glide.request.transition.Transition + +@SuppressLint("UnrememberedMutableState") +@Composable +fun loadPicture( + url: String, + @DrawableRes defaultImage: Int +): MutableState { + val bitmapState: MutableState = mutableStateOf(null) + + Glide.with(LocalContext.current) + .asBitmap() + .placeholder(defaultImage) + .load(url) + .into(object : CustomTarget(){ + override fun onResourceReady(resource: Bitmap, transition: Transition?) { + bitmapState.value = resource + } + + override fun onLoadCleared(placeholder: Drawable?) { + + } + }) + + return bitmapState +} \ 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 84daba1..6c2b1e5 100644 --- a/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt +++ b/app/src/main/java/com/rocketinsights/android/viewmodels/HiltListViewModel.kt @@ -1,7 +1,7 @@ package com.rocketinsights.android.viewmodels -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.rocketinsights.android.models.recipe_hilt.Recipe @@ -17,19 +17,36 @@ constructor( private val repository: RecipeRepository ) : ViewModel() { - private val recipes: MutableLiveData> = MutableLiveData() - val liveRecipe: LiveData> = recipes + val recipes: MutableState> = mutableStateOf(emptyList()) + val searchQuery = mutableStateOf("") + val loading = mutableStateOf(false) init { + newSearch(searchQuery.value) + } + + fun newSearch(searchQuery: String) { viewModelScope.launch { + loading.value = true + clearSearch() + val result = repository.search( page = 1, - query = "beef carrot potato onion" + query = searchQuery ) result?.apply { recipes.value = this + loading.value = false } } } + + fun onSearchQueryChanged(query: String) { + this.searchQuery.value = query + } + + private fun clearSearch() { + recipes.value = listOf() + } } From 1a6c48a7732197917fceddf7fc3b88a325f271f5 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:12:40 -0300 Subject: [PATCH 32/35] fix imports --- .../java/com/rocketinsights/android/ui/HiltActivity.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 9924886..852ce0e 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -4,7 +4,11 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.text.KeyboardActions @@ -38,7 +42,6 @@ class HiltActivity : AppCompatActivity() { val loading = viewModel.loading.value val focusManager = LocalFocusManager.current - Column() { TextField( From 19048faabd1f7649b361c5ac295ab335295cd3a0 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:19:44 -0300 Subject: [PATCH 33/35] fixes --- .../java/com/rocketinsights/android/ui/HiltActivity.kt | 3 ++- .../android/ui/compose/CircularProgressBar.kt | 4 ++-- .../rocketinsights/android/ui/compose/RecipeCard.kt | 10 ++++++++-- .../android/ui/compose/util/ImageComposableUtils.kt | 10 ++++------ 4 files changed, 16 insertions(+), 11 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 852ce0e..05f49eb 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -60,7 +60,8 @@ class HiltActivity : AppCompatActivity() { imeAction = ImeAction.Search ), leadingIcon = { - Icon(imageVector = Icons.Filled.Search, + Icon( + imageVector = Icons.Filled.Search, contentDescription = "icon" ) }, diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt index 6176981..2f49b03 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/CircularProgressBar.kt @@ -15,7 +15,7 @@ fun CircularProgressBar( isDisplayed: Boolean ) { if (isDisplayed) { - Row ( + Row( modifier = Modifier .fillMaxWidth() .padding(30.dp), @@ -26,4 +26,4 @@ fun CircularProgressBar( ) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt index 007f6b6..af7ff3d 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt @@ -2,7 +2,13 @@ package com.rocketinsights.android.ui.compose import androidx.compose.foundation.Image import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.Card import androidx.compose.material.MaterialTheme import androidx.compose.material.Text @@ -75,4 +81,4 @@ fun RecipeCard( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt index 4c51596..f8d2cee 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/util/ImageComposableUtils.kt @@ -18,21 +18,19 @@ fun loadPicture( url: String, @DrawableRes defaultImage: Int ): MutableState { - val bitmapState: MutableState = mutableStateOf(null) + val bitmapState: MutableState = mutableStateOf(null) Glide.with(LocalContext.current) .asBitmap() .placeholder(defaultImage) .load(url) - .into(object : CustomTarget(){ + .into(object : CustomTarget() { override fun onResourceReady(resource: Bitmap, transition: Transition?) { bitmapState.value = resource } - override fun onLoadCleared(placeholder: Drawable?) { - - } + override fun onLoadCleared(placeholder: Drawable?) {} }) return bitmapState -} \ No newline at end of file +} From 0dfa9825c7d954274eb315dcb678735c8d466bf2 Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:25:43 -0300 Subject: [PATCH 34/35] clean --- .../com/rocketinsights/android/ui/HiltActivity.kt | 2 -- .../rocketinsights/android/ui/compose/RecipeCard.kt | 11 +++++------ 2 files changed, 5 insertions(+), 8 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 05f49eb..a9f7e4b 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -40,7 +40,6 @@ class HiltActivity : AppCompatActivity() { val recipes = viewModel.recipes.value val searchQuery = viewModel.searchQuery.value val loading = viewModel.loading.value - val focusManager = LocalFocusManager.current Column() { @@ -72,7 +71,6 @@ class HiltActivity : AppCompatActivity() { } ) ) - Box( modifier = Modifier.fillMaxSize() ) { diff --git a/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt index af7ff3d..a52500a 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/compose/RecipeCard.kt @@ -2,12 +2,12 @@ package com.rocketinsights.android.ui.compose import androidx.compose.foundation.Image import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material.Card import androidx.compose.material.MaterialTheme @@ -39,8 +39,7 @@ fun RecipeCard( elevation = 8.dp ) { Column { - - recipe.featuredImage?.let { url -> + recipe.featuredImage?.let { url -> loadPicture( url = url, defaultImage = R.drawable.ic_rocketinsights_logo @@ -61,7 +60,7 @@ fun RecipeCard( modifier = Modifier .fillMaxWidth() .padding(12.dp) - ){ + ) { Text( text = title, modifier = Modifier From 8d646079536cedaae2ce88933fb4361098546cba Mon Sep 17 00:00:00 2001 From: fedeturazzini Date: Fri, 29 Apr 2022 15:28:24 -0300 Subject: [PATCH 35/35] fix imports --- .../main/java/com/rocketinsights/android/ui/HiltActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 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 a9f7e4b..8b0eb78 100644 --- a/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt +++ b/app/src/main/java/com/rocketinsights/android/ui/HiltActivity.kt @@ -4,11 +4,11 @@ import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.text.KeyboardActions