Loading app/src/main/java/foundation/e/apps/data/application/HomeRepositoryAdapter.kt 0 → 100644 +116 −0 Original line number Diff line number Diff line package foundation.e.apps.data.application import androidx.lifecycle.asFlow import foundation.e.apps.domain.ResultSupreme import foundation.e.apps.domain.application.model.Application import foundation.e.apps.domain.application.model.Home import foundation.e.apps.domain.home.HomeRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject import javax.inject.Singleton @Singleton class HomeRepositoryAdapter @Inject constructor( private val applicationRepository: ApplicationRepository, ) : HomeRepository { override fun getHomeScreenData(): Flow<ResultSupreme<List<Home>>> { return applicationRepository.getHomeScreenData().asFlow().map { result -> when (result) { is foundation.e.apps.data.ResultSupreme.Success -> { ResultSupreme.Success(result.data.orEmpty().map { it.toDomain() }) } is foundation.e.apps.data.ResultSupreme.Timeout -> { ResultSupreme.Timeout( result.data?.map { it.toDomain() }, result.exception ?: java.util.concurrent.TimeoutException(), ) } is foundation.e.apps.data.ResultSupreme.Error -> { val data = result.data?.map { it.toDomain() } ResultSupreme.create( foundation.e.apps.domain.enums.ResultStatus.UNKNOWN, data, result.message, result.exception, ) } } } } private fun foundation.e.apps.data.application.data.Home.toDomain() = Home( title = title, list = list.map { it.toDomain() }, source = source, id = id, ) private fun foundation.e.apps.data.application.data.Application.toDomain() = Application( _id = _id, author = author, category = category, description = description, perms = perms, reportId = reportId, icon_image_path = icon_image_path, icon_url = icon_url, last_modified = last_modified, latest_version_code = latest_version_code, latest_version_number = latest_version_number, latest_downloaded_version = latest_downloaded_version, licence = licence, name = name, other_images_path = other_images_path, package_name = package_name, ratings = ratings.toDomain(), offer_type = offer_type, status = foundation.e.apps.domain.enums.Status.valueOf(status.name), shareUrl = shareUrl, originalSize = originalSize, appSize = appSize, source = source, price = price, isFree = isFree, is_pwa = is_pwa, pwaPlayerDbId = pwaPlayerDbId, url = url, type = foundation.e.apps.domain.enums.Type.valueOf(type.name), privacyScore = privacyScore, isPurchased = isPurchased, updatedOn = updatedOn, numberOfPermission = numberOfPermission, numberOfTracker = numberOfTracker, restriction = restriction.toDomain(), isPlaceHolder = isPlaceHolder, filterLevel = foundation.e.apps.domain.enums.FilterLevel.valueOf(filterLevel.name), isGplayReplaced = isGplayReplaced, isFDroidApp = isFDroidApp, contentRating = contentRating.toDomain(), antiFeatures = antiFeatures, isSystemApp = isSystemApp, ) private fun foundation.e.apps.data.application.data.Ratings.toDomain() = foundation.e.apps.domain.application.model.Ratings( privacyScore = privacyScore, usageQualityScore = usageQualityScore, ) private fun com.aurora.gplayapi.data.models.ContentRating.toDomain() = foundation.e.apps.domain.application.model.ContentRating( id = id, title = title, description = description, artworkUrl = artwork.url, ) private fun com.aurora.gplayapi.Constants.Restriction.toDomain() = if (this == com.aurora.gplayapi.Constants.Restriction.NOT_RESTRICTED) { foundation.e.apps.domain.application.model.AppRestriction.NOT_RESTRICTED } else { foundation.e.apps.domain.application.model.AppRestriction.RESTRICTED } } app/src/main/java/foundation/e/apps/data/di/bindings/DomainBindingsModule.kt +7 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.data.Stores import foundation.e.apps.data.application.HomeRepositoryAdapter import foundation.e.apps.data.preference.AppLoungePreference import javax.inject.Singleton Loading @@ -15,6 +16,12 @@ interface DomainBindingsModule { @Singleton fun bindStores(impl: Stores): foundation.e.apps.domain.Stores @Binds @Singleton fun bindHomeRepository( impl: HomeRepositoryAdapter ): foundation.e.apps.domain.home.HomeRepository @Binds @Singleton fun bindSearchPreferenceProvider( Loading app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt +1 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ class HomeFragment : Fragment(R.layout.fragment_home) { private fun loadData() { if (shouldLoadData()) { showLoadingUI() homeViewModel.getHomeScreenData(viewLifecycleOwner) homeViewModel.getHomeScreenData() } } Loading app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt +4 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package foundation.e.apps.ui.home import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope Loading @@ -31,6 +30,7 @@ import foundation.e.apps.domain.home.FetchHomeScreenDataUseCase import foundation.e.apps.domain.home.HomeScreenResult import foundation.e.apps.domain.home.HomeSection import foundation.e.apps.ui.home.model.ApplicationDomainDiffUtil import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject Loading Loading @@ -66,13 +66,13 @@ class HomeViewModel @Inject constructor( return true } fun getHomeScreenData(lifecycleOwner: LifecycleOwner) { fun getHomeScreenData() { viewModelScope.launch { fetchHomeScreenDataUseCase().observe(lifecycleOwner) { fetchHomeScreenDataUseCase().collect { postHomeResult(it) if (it.isSuccess()) { return@observe return@collect } } } Loading app/src/main/java/foundation/e/apps/domain/home/FetchHomeScreenDataUseCase.kt→domain/src/main/java/foundation/e/apps/domain/home/FetchHomeScreenDataUseCase.kt +8 −9 Original line number Diff line number Diff line Loading @@ -18,20 +18,19 @@ package foundation.e.apps.domain.home import androidx.lifecycle.LiveData import androidx.lifecycle.map import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Home import foundation.e.apps.domain.ResultSupreme import foundation.e.apps.domain.application.ApplicationDomain import foundation.e.apps.domain.application.model.Application import foundation.e.apps.domain.application.model.Home import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject class FetchHomeScreenDataUseCase @Inject constructor( private val applicationRepository: ApplicationRepository, private val homeRepository: HomeRepository, ) { operator fun invoke(): LiveData<HomeScreenResult> { return applicationRepository.getHomeScreenData().map { result -> operator fun invoke(): Flow<HomeScreenResult> { return homeRepository.getHomeScreenData().map { result -> val homeSections = result.data?.map { it.toDomain() }.orEmpty() when (result) { is ResultSupreme.Success -> HomeScreenResult.Success(homeSections) Loading Loading
app/src/main/java/foundation/e/apps/data/application/HomeRepositoryAdapter.kt 0 → 100644 +116 −0 Original line number Diff line number Diff line package foundation.e.apps.data.application import androidx.lifecycle.asFlow import foundation.e.apps.domain.ResultSupreme import foundation.e.apps.domain.application.model.Application import foundation.e.apps.domain.application.model.Home import foundation.e.apps.domain.home.HomeRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject import javax.inject.Singleton @Singleton class HomeRepositoryAdapter @Inject constructor( private val applicationRepository: ApplicationRepository, ) : HomeRepository { override fun getHomeScreenData(): Flow<ResultSupreme<List<Home>>> { return applicationRepository.getHomeScreenData().asFlow().map { result -> when (result) { is foundation.e.apps.data.ResultSupreme.Success -> { ResultSupreme.Success(result.data.orEmpty().map { it.toDomain() }) } is foundation.e.apps.data.ResultSupreme.Timeout -> { ResultSupreme.Timeout( result.data?.map { it.toDomain() }, result.exception ?: java.util.concurrent.TimeoutException(), ) } is foundation.e.apps.data.ResultSupreme.Error -> { val data = result.data?.map { it.toDomain() } ResultSupreme.create( foundation.e.apps.domain.enums.ResultStatus.UNKNOWN, data, result.message, result.exception, ) } } } } private fun foundation.e.apps.data.application.data.Home.toDomain() = Home( title = title, list = list.map { it.toDomain() }, source = source, id = id, ) private fun foundation.e.apps.data.application.data.Application.toDomain() = Application( _id = _id, author = author, category = category, description = description, perms = perms, reportId = reportId, icon_image_path = icon_image_path, icon_url = icon_url, last_modified = last_modified, latest_version_code = latest_version_code, latest_version_number = latest_version_number, latest_downloaded_version = latest_downloaded_version, licence = licence, name = name, other_images_path = other_images_path, package_name = package_name, ratings = ratings.toDomain(), offer_type = offer_type, status = foundation.e.apps.domain.enums.Status.valueOf(status.name), shareUrl = shareUrl, originalSize = originalSize, appSize = appSize, source = source, price = price, isFree = isFree, is_pwa = is_pwa, pwaPlayerDbId = pwaPlayerDbId, url = url, type = foundation.e.apps.domain.enums.Type.valueOf(type.name), privacyScore = privacyScore, isPurchased = isPurchased, updatedOn = updatedOn, numberOfPermission = numberOfPermission, numberOfTracker = numberOfTracker, restriction = restriction.toDomain(), isPlaceHolder = isPlaceHolder, filterLevel = foundation.e.apps.domain.enums.FilterLevel.valueOf(filterLevel.name), isGplayReplaced = isGplayReplaced, isFDroidApp = isFDroidApp, contentRating = contentRating.toDomain(), antiFeatures = antiFeatures, isSystemApp = isSystemApp, ) private fun foundation.e.apps.data.application.data.Ratings.toDomain() = foundation.e.apps.domain.application.model.Ratings( privacyScore = privacyScore, usageQualityScore = usageQualityScore, ) private fun com.aurora.gplayapi.data.models.ContentRating.toDomain() = foundation.e.apps.domain.application.model.ContentRating( id = id, title = title, description = description, artworkUrl = artwork.url, ) private fun com.aurora.gplayapi.Constants.Restriction.toDomain() = if (this == com.aurora.gplayapi.Constants.Restriction.NOT_RESTRICTED) { foundation.e.apps.domain.application.model.AppRestriction.NOT_RESTRICTED } else { foundation.e.apps.domain.application.model.AppRestriction.RESTRICTED } }
app/src/main/java/foundation/e/apps/data/di/bindings/DomainBindingsModule.kt +7 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import foundation.e.apps.data.Stores import foundation.e.apps.data.application.HomeRepositoryAdapter import foundation.e.apps.data.preference.AppLoungePreference import javax.inject.Singleton Loading @@ -15,6 +16,12 @@ interface DomainBindingsModule { @Singleton fun bindStores(impl: Stores): foundation.e.apps.domain.Stores @Binds @Singleton fun bindHomeRepository( impl: HomeRepositoryAdapter ): foundation.e.apps.domain.home.HomeRepository @Binds @Singleton fun bindSearchPreferenceProvider( Loading
app/src/main/java/foundation/e/apps/ui/home/HomeFragment.kt +1 −1 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ class HomeFragment : Fragment(R.layout.fragment_home) { private fun loadData() { if (shouldLoadData()) { showLoadingUI() homeViewModel.getHomeScreenData(viewLifecycleOwner) homeViewModel.getHomeScreenData() } } Loading
app/src/main/java/foundation/e/apps/ui/home/HomeViewModel.kt +4 −4 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package foundation.e.apps.ui.home import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope Loading @@ -31,6 +30,7 @@ import foundation.e.apps.domain.home.FetchHomeScreenDataUseCase import foundation.e.apps.domain.home.HomeScreenResult import foundation.e.apps.domain.home.HomeSection import foundation.e.apps.ui.home.model.ApplicationDomainDiffUtil import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import javax.inject.Inject Loading Loading @@ -66,13 +66,13 @@ class HomeViewModel @Inject constructor( return true } fun getHomeScreenData(lifecycleOwner: LifecycleOwner) { fun getHomeScreenData() { viewModelScope.launch { fetchHomeScreenDataUseCase().observe(lifecycleOwner) { fetchHomeScreenDataUseCase().collect { postHomeResult(it) if (it.isSuccess()) { return@observe return@collect } } } Loading
app/src/main/java/foundation/e/apps/domain/home/FetchHomeScreenDataUseCase.kt→domain/src/main/java/foundation/e/apps/domain/home/FetchHomeScreenDataUseCase.kt +8 −9 Original line number Diff line number Diff line Loading @@ -18,20 +18,19 @@ package foundation.e.apps.domain.home import androidx.lifecycle.LiveData import androidx.lifecycle.map import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.application.ApplicationRepository import foundation.e.apps.data.application.data.Application import foundation.e.apps.data.application.data.Home import foundation.e.apps.domain.ResultSupreme import foundation.e.apps.domain.application.ApplicationDomain import foundation.e.apps.domain.application.model.Application import foundation.e.apps.domain.application.model.Home import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject class FetchHomeScreenDataUseCase @Inject constructor( private val applicationRepository: ApplicationRepository, private val homeRepository: HomeRepository, ) { operator fun invoke(): LiveData<HomeScreenResult> { return applicationRepository.getHomeScreenData().map { result -> operator fun invoke(): Flow<HomeScreenResult> { return homeRepository.getHomeScreenData().map { result -> val homeSections = result.data?.map { it.toDomain() }.orEmpty() when (result) { is ResultSupreme.Success -> HomeScreenResult.Success(homeSections) Loading