Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Avoid hardcoded dispatchers #231

Merged
merged 15 commits into from
Dec 9, 2023
4 changes: 2 additions & 2 deletions .github/workflows/app-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ jobs:

steps:
- uses: actions/checkout@v1
- name: set up JDK 11
- name: Set up JDK 17
uses: actions/setup-java@v1
with:
java-version: 11
java-version: 17
#- name: Check Detekt
# run: chmod +x .github/scripts/gradlew_recursive.sh ; .github/scripts/gradlew_recursive.sh detekt
- name: Build project
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/*
.DS_Store
/build
/captures
Expand Down
6 changes: 3 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ android {
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
jvmTarget = JavaVersion.VERSION_17.toString()
}

buildFeatures {
Expand Down
2 changes: 1 addition & 1 deletion app/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import timber.log.Timber
import javax.inject.Inject

class CategoryRepositoryImpl @Inject constructor(

private val categoryDao: CategoryDao,
private val supabasePostgrest: Postgrest
) :
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@ import com.hieuwu.groceriesstore.data.network.dto.OrderDto
import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.domain.models.OrderModel
import com.hieuwu.groceriesstore.utilities.CollectionNames
import com.hieuwu.groceriesstore.utilities.CollectionNames.orders
import com.hieuwu.groceriesstore.utilities.OrderStatus
import com.hieuwu.groceriesstore.utilities.SupabaseMapper
import io.github.jan.supabase.postgrest.Postgrest
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject

Expand Down
38 changes: 38 additions & 0 deletions app/src/main/java/com/hieuwu/groceriesstore/di/DispatcherModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.hieuwu.groceriesstore.di

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import javax.inject.Qualifier

@Module
@InstallIn(SingletonComponent::class)
class DispatcherModule {

@DefaultDispatcher
@Provides
fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default

@IoDispatcher
@Provides
fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO

@MainDispatcher
@Provides
fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main
}

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class DefaultDispatcher

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class IoDispatcher

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class MainDispatcher
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.AddToCartUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class AddToCartUseCaseImpl @Inject constructor(private val orderRepository: OrderRepository) :
class AddToCartUseCaseImpl @Inject constructor(
private val orderRepository: OrderRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) :
AddToCartUseCase {
override suspend fun execute(input: AddToCartUseCase.Input): AddToCartUseCase.Output {
withContext(Dispatchers.IO) {
withContext(ioDispatcher) {
orderRepository.addLineItem(input.lineItem)
}
return AddToCartUseCase.Output()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.CreateNewOrderUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class CreateNewOrderUseCaseImpl @Inject constructor(private val orderRepository: OrderRepository) :
class CreateNewOrderUseCaseImpl @Inject constructor(
private val orderRepository: OrderRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) :
CreateNewOrderUseCase {
override suspend fun execute(input: CreateNewOrderUseCase.Input): CreateNewOrderUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
val result = orderRepository.createOrUpdate(input.order)
CreateNewOrderUseCase.Output(result)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package com.hieuwu.groceriesstore.domain.usecases.impl
import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.domain.usecases.GetCurrentCartUseCase
import com.hieuwu.groceriesstore.utilities.OrderStatus
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject

class GetCurrentCartUseCaseImpl @Inject constructor(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.GetOrderListUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class GetOrderListUseCaseImpl @Inject constructor(
private val orderRepository: OrderRepository
private val orderRepository: OrderRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) : GetOrderListUseCase {
override suspend fun execute(input: GetOrderListUseCase.Input): GetOrderListUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
val result = orderRepository.getOrders()
GetOrderListUseCase.Output.Success(data = result)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.domain.usecases.GetProfileUseCase
import javax.inject.Inject

class GetProfileUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
class GetProfileUseCaseImpl @Inject constructor(
private val userRepository: UserRepository,
) :
GetProfileUseCase {
override suspend fun execute(input: GetProfileUseCase.Input): GetProfileUseCase.Output {
val user = userRepository.getCurrentUser()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@ package com.hieuwu.groceriesstore.domain.usecases.impl
import com.hieuwu.groceriesstore.data.repository.CategoryRepository
import com.hieuwu.groceriesstore.data.repository.ProductRepository
import com.hieuwu.groceriesstore.data.repository.RecipeRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.RefreshAppDataUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class RefreshAppDataUseCaseImpl @Inject constructor(
private val productRepository: ProductRepository,
private val categoryRepository: CategoryRepository,
private val recipeRepository: RecipeRepository
) : RefreshAppDataUseCase {
private val recipeRepository: RecipeRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) : RefreshAppDataUseCase {
override suspend fun execute(input: Unit) {
withContext(Dispatchers.IO) {
withContext(ioDispatcher) {
categoryRepository.refreshDatabase()
productRepository.refreshDatabase()
recipeRepository.refreshDatabase()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.ProductRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.SearchProductUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class SearchProductUseCaseImpl @Inject constructor(private val productRepository: ProductRepository) :
class SearchProductUseCaseImpl @Inject constructor(
private val productRepository: ProductRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) :
SearchProductUseCase {
override suspend fun execute(input: SearchProductUseCase.Input): SearchProductUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
val result = productRepository.searchProductsListByName(input.name)
SearchProductUseCase.Output(result)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.SignInUseCase
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject

class SignInUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
class SignInUseCaseImpl @Inject constructor(
private val userRepository: UserRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) :
SignInUseCase {
override suspend fun execute(input: SignInUseCase.Input): SignInUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
try {
val res = userRepository.authenticate(input.email, input.password)
SignInUseCase.Output(res)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.SignOutUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class SignOutUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
class SignOutUseCaseImpl @Inject constructor(
private val userRepository: UserRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
) :
SignOutUseCase {
override suspend fun execute(input: SignOutUseCase.Input): SignOutUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
userRepository.clearUser()
SignOutUseCase.Output()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.SubmitOrderUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class SubmitOrderUseCaseImpl @Inject constructor(
private val orderRepository: OrderRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher,
) : SubmitOrderUseCase {
override suspend fun execute(input: SubmitOrderUseCase.Input): SubmitOrderUseCase.Output {
return withContext(Dispatchers.IO) {
return withContext(ioDispatcher) {
val result = orderRepository.sendOrderToServer(input.order)
SubmitOrderUseCase.Output(result)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.domain.models.LineItemModel
import com.hieuwu.groceriesstore.domain.models.OrderModel
import com.hieuwu.groceriesstore.data.repository.OrderRepository
import com.hieuwu.groceriesstore.data.repository.ProductRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.models.LineItemModel
import com.hieuwu.groceriesstore.domain.models.OrderModel
import com.hieuwu.groceriesstore.domain.usecases.UpdateCartItemUseCase
import com.hieuwu.groceriesstore.utilities.OrderStatus
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext
import javax.inject.Inject

class UpdateCartItemUseCaseImpl @Inject constructor(
private val productRepository: ProductRepository,
private val orderRepository: OrderRepository
private val orderRepository: OrderRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
) : UpdateCartItemUseCase {
override suspend fun updateLineItem(lineItemModel: LineItemModel) {
withContext(Dispatchers.IO) {
withContext(ioDispatcher) {
productRepository.updateLineItemQuantityById(
lineItemModel.quantity!!,
lineItemModel.id!!
)

}
}

override suspend fun removeLineItem(lineItemModel: LineItemModel) {
withContext(Dispatchers.IO) {
withContext(ioDispatcher) {
productRepository.removeLineItemById(lineItemModel.id!!)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.UpdateProfileUseCase
import kotlinx.coroutines.CoroutineDispatcher
import javax.inject.Inject

class UpdateProfileUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
class UpdateProfileUseCaseImpl @Inject constructor(
private val userRepository: UserRepository,
) :
UpdateProfileUseCase {
override suspend fun execute(input: UpdateProfileUseCase.Input): UpdateProfileUseCase.Output {
userRepository.updateUserProfile(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package com.hieuwu.groceriesstore.domain.usecases.impl

import com.hieuwu.groceriesstore.data.repository.UserRepository
import com.hieuwu.groceriesstore.di.IoDispatcher
import com.hieuwu.groceriesstore.domain.usecases.UserSettingsUseCase
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import javax.inject.Inject

class UserSettingsUseCaseImpl @Inject constructor(private val userRepository: UserRepository) :
class UserSettingsUseCaseImpl @Inject constructor(
private val userRepository: UserRepository,
@IoDispatcher private val ioDispatcher: CoroutineDispatcher
) :
UserSettingsUseCase {

override suspend fun execute(input: UserSettingsUseCase.Input): UserSettingsUseCase.Output {
withContext(Dispatchers.IO) {
withContext(ioDispatcher) {
userRepository.updateUserSettings(
input.id,
input.isOrderCreatedEnabled,
Expand Down
Loading
Loading