Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1275f171 authored by Jonathan Klee's avatar Jonathan Klee
Browse files

refactor(home): move home domain flow to domain module

parent 5efc0f27
Loading
Loading
Loading
Loading
Loading
+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
        }
}
+7 −0
Original line number Diff line number Diff line
@@ -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

@@ -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(
+1 −1
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ class HomeFragment : Fragment(R.layout.fragment_home) {
    private fun loadData() {
        if (shouldLoadData()) {
            showLoadingUI()
            homeViewModel.getHomeScreenData(viewLifecycleOwner)
            homeViewModel.getHomeScreenData()
        }
    }

+4 −4
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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
                }
            }
        }
+8 −9
Original line number Diff line number Diff line
@@ -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