Loading app/src/main/java/foundation/e/apps/data/fused/FusedAPIRepository.kt +8 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package foundation.e.apps.data.fused import androidx.lifecycle.LiveData import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin Loading Loading @@ -114,6 +115,13 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedApi) return fusedAPIImpl.getSearchResults(query, authData) } suspend fun getGplaySearchResults( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> { return fusedAPIImpl.getGplaySearchResult(query, nextPageSubBundle) } suspend fun getAppsListBasedOnCategory( authData: AuthData, category: String, Loading app/src/main/java/foundation/e/apps/data/fused/FusedApi.kt +6 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.cleanapk.data.download.Download import foundation.e.apps.data.enums.FilterLevel Loading Loading @@ -64,6 +65,11 @@ interface FusedApi { authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> suspend fun getGplaySearchResult( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> suspend fun getOnDemandModule( Loading app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +51 −52 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package foundation.e.apps.data.fused import android.content.Context import android.text.format.Formatter import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.liveData import androidx.lifecycle.map import com.aurora.gplayapi.Constants Loading @@ -29,6 +30,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R Loading Loading @@ -80,7 +82,7 @@ import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton typealias GplaySearchResultLiveData = LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> typealias GplaySearchResultFlow = Flow<ResultSupreme<Pair<List<FusedApp>, Boolean>>> typealias FusedHomeDeferred = Deferred<ResultSupreme<List<FusedHome>>> @Singleton Loading Loading @@ -285,15 +287,15 @@ class FusedApiImpl @Inject constructor( ).let { emit(it) } } if (preferenceManagerModule.isGplaySelected()) { emitSource( fetchGplaySearchResults( query, searchResult, packageSpecificResults ) ) } // if (preferenceManagerModule.isGplaySelected()) { // emitSource( // fetchGplaySearchResults( // query, // searchResult, // packageSpecificResults // ).asLiveData() // ) // } } } Loading Loading @@ -331,37 +333,25 @@ class FusedApiImpl @Inject constructor( ) } private suspend fun fetchGplaySearchResults( query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): GplaySearchResultLiveData { return runFlowWithTimeout( { getGplaySearchResult(query) }, { it.second }, { Pair(listOf(), false) // empty data for timeout } ).map { if (it.isSuccess()) { searchResult.addAll(it.data!!.first) ResultSupreme.Success( Pair( filterWithKeywordSearch( searchResult, packageSpecificResults, query ), it.data!!.second ) ) } else { it } } } // private suspend fun fetchGplaySearchResults( // query: String, // searchResult: MutableList<FusedApp>, // packageSpecificResults: ArrayList<FusedApp> // ): GplaySearchResultFlow = getGplaySearchResult(query).map { // if (it.first.isNotEmpty()) { // searchResult.addAll(it.first) // } // ResultSupreme.Success( // Pair( // filterWithKeywordSearch( // searchResult, // packageSpecificResults, // query // ), // it.second // ) // ) // } private suspend fun fetchOpenSourceSearchResult( fusedAPIImpl: FusedApiImpl, Loading Loading @@ -1115,18 +1105,26 @@ class FusedApiImpl @Inject constructor( return list } private suspend fun getGplaySearchResult( override suspend fun getGplaySearchResult( query: String, ): Flow<Pair<List<FusedApp>, Boolean>> { val searchResults = gplayRepository.getSearchResult(query, null) return searchResults.map { val fusedAppList = it.first.map { app -> replaceWithFDroid(app) } Pair( nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> { val searchResults = gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { return Pair(emptyList(), emptySet()) } val fusedAppList = searchResults.first.map { app -> replaceWithFDroid(app) }.toMutableList() if (searchResults.second.isNotEmpty()) { fusedAppList.add(FusedApp(isPlaceHolder = true)) } return Pair( fusedAppList, it.second searchResults.second ) } } /* * This function will replace a GPlay app with F-Droid app if exists, Loading Loading @@ -1431,7 +1429,8 @@ class FusedApiImpl @Inject constructor( var nextPageUrl = "" val status = runCodeWithTimeout({ val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList) filteredAppList.data?.let { fusedAppList = it.toMutableList() Loading app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ import foundation.e.apps.data.fused.utils.CategoryType import kotlinx.coroutines.flow.Flow interface GplayStoreRepository : BaseStoreRepository { suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Flow<Pair<List<App>, Boolean>> suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Pair<List<App>, MutableSet<SearchBundle.SubBundle>> suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> suspend fun getAppsByCategory(category: String, pageUrl: String? = null): Any suspend fun getCategories(type: CategoryType? = null): List<Category> Loading app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepositoryImpl.kt +9 −10 Original line number Diff line number Diff line Loading @@ -128,30 +128,29 @@ class GplayStoreRepositoryImpl @Inject constructor( override suspend fun getSearchResult( query: String, subBundle: MutableSet<SearchBundle.SubBundle>? ): Flow<Pair<List<App>, Boolean>> { return flow { var authData = loginSourceRepository.gplayAuth ?: return@flow ): Pair<List<App>, MutableSet<SearchBundle.SubBundle>> { var authData = loginSourceRepository.gplayAuth ?: return Pair(emptyList(), mutableSetOf()) val searchHelper = SearchHelper(authData).using(gPlayHttpClient) Timber.d("Fetching search result for $query, subBundle: $subBundle") subBundle?.let { val searchResult = searchHelper.next(it) emitSearchResult(searchResult) return@let Timber.d("fetching next page search data...") return emitSearchResult(searchResult) } val searchResult = searchHelper.searchResults(query) emitSearchResult(searchResult) } return emitSearchResult(searchResult) } private suspend fun FlowCollector<Pair<List<App>, Boolean>>.emitSearchResult( private fun emitSearchResult( searchBundle: SearchBundle ) { ): Pair<MutableList<App>, MutableSet<SearchBundle.SubBundle>> { val apps = searchBundle.appList Timber.d("Search result is found: ${apps.size}") emit(Pair(apps, searchBundle.subBundles.isNotEmpty())) return Pair(apps, searchBundle.subBundles) } private suspend fun fetchNextSubBundle( Loading Loading
app/src/main/java/foundation/e/apps/data/fused/FusedAPIRepository.kt +8 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package foundation.e.apps.data.fused import androidx.lifecycle.LiveData import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.enums.FilterLevel import foundation.e.apps.data.enums.Origin Loading Loading @@ -114,6 +115,13 @@ class FusedAPIRepository @Inject constructor(private val fusedAPIImpl: FusedApi) return fusedAPIImpl.getSearchResults(query, authData) } suspend fun getGplaySearchResults( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> { return fusedAPIImpl.getGplaySearchResult(query, nextPageSubBundle) } suspend fun getAppsListBasedOnCategory( authData: AuthData, category: String, Loading
app/src/main/java/foundation/e/apps/data/fused/FusedApi.kt +6 −0 Original line number Diff line number Diff line Loading @@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.SearchBundle import foundation.e.apps.data.ResultSupreme import foundation.e.apps.data.cleanapk.data.download.Download import foundation.e.apps.data.enums.FilterLevel Loading Loading @@ -64,6 +65,11 @@ interface FusedApi { authData: AuthData ): LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> suspend fun getGplaySearchResult( query: String, nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> suspend fun getOnDemandModule( Loading
app/src/main/java/foundation/e/apps/data/fused/FusedApiImpl.kt +51 −52 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ package foundation.e.apps.data.fused import android.content.Context import android.text.format.Formatter import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.liveData import androidx.lifecycle.map import com.aurora.gplayapi.Constants Loading @@ -29,6 +30,7 @@ import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.Artwork import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.SearchBundle import com.aurora.gplayapi.data.models.StreamCluster import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.apps.R Loading Loading @@ -80,7 +82,7 @@ import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton typealias GplaySearchResultLiveData = LiveData<ResultSupreme<Pair<List<FusedApp>, Boolean>>> typealias GplaySearchResultFlow = Flow<ResultSupreme<Pair<List<FusedApp>, Boolean>>> typealias FusedHomeDeferred = Deferred<ResultSupreme<List<FusedHome>>> @Singleton Loading Loading @@ -285,15 +287,15 @@ class FusedApiImpl @Inject constructor( ).let { emit(it) } } if (preferenceManagerModule.isGplaySelected()) { emitSource( fetchGplaySearchResults( query, searchResult, packageSpecificResults ) ) } // if (preferenceManagerModule.isGplaySelected()) { // emitSource( // fetchGplaySearchResults( // query, // searchResult, // packageSpecificResults // ).asLiveData() // ) // } } } Loading Loading @@ -331,37 +333,25 @@ class FusedApiImpl @Inject constructor( ) } private suspend fun fetchGplaySearchResults( query: String, searchResult: MutableList<FusedApp>, packageSpecificResults: ArrayList<FusedApp> ): GplaySearchResultLiveData { return runFlowWithTimeout( { getGplaySearchResult(query) }, { it.second }, { Pair(listOf(), false) // empty data for timeout } ).map { if (it.isSuccess()) { searchResult.addAll(it.data!!.first) ResultSupreme.Success( Pair( filterWithKeywordSearch( searchResult, packageSpecificResults, query ), it.data!!.second ) ) } else { it } } } // private suspend fun fetchGplaySearchResults( // query: String, // searchResult: MutableList<FusedApp>, // packageSpecificResults: ArrayList<FusedApp> // ): GplaySearchResultFlow = getGplaySearchResult(query).map { // if (it.first.isNotEmpty()) { // searchResult.addAll(it.first) // } // ResultSupreme.Success( // Pair( // filterWithKeywordSearch( // searchResult, // packageSpecificResults, // query // ), // it.second // ) // ) // } private suspend fun fetchOpenSourceSearchResult( fusedAPIImpl: FusedApiImpl, Loading Loading @@ -1115,18 +1105,26 @@ class FusedApiImpl @Inject constructor( return list } private suspend fun getGplaySearchResult( override suspend fun getGplaySearchResult( query: String, ): Flow<Pair<List<FusedApp>, Boolean>> { val searchResults = gplayRepository.getSearchResult(query, null) return searchResults.map { val fusedAppList = it.first.map { app -> replaceWithFDroid(app) } Pair( nextPageSubBundle: Set<SearchBundle.SubBundle>? ): Pair<List<FusedApp>, Set<SearchBundle.SubBundle>> { val searchResults = gplayRepository.getSearchResult(query, nextPageSubBundle?.toMutableSet()) if (!preferenceManagerModule.isGplaySelected()) { return Pair(emptyList(), emptySet()) } val fusedAppList = searchResults.first.map { app -> replaceWithFDroid(app) }.toMutableList() if (searchResults.second.isNotEmpty()) { fusedAppList.add(FusedApp(isPlaceHolder = true)) } return Pair( fusedAppList, it.second searchResults.second ) } } /* * This function will replace a GPlay app with F-Droid app if exists, Loading Loading @@ -1431,7 +1429,8 @@ class FusedApiImpl @Inject constructor( var nextPageUrl = "" val status = runCodeWithTimeout({ val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster val streamCluster = gplayRepository.getAppsByCategory(category, pageUrl) as StreamCluster val filteredAppList = filterRestrictedGPlayApps(authData, streamCluster.clusterAppList) filteredAppList.data?.let { fusedAppList = it.toMutableList() Loading
app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepository.kt +1 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,7 @@ import foundation.e.apps.data.fused.utils.CategoryType import kotlinx.coroutines.flow.Flow interface GplayStoreRepository : BaseStoreRepository { suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Flow<Pair<List<App>, Boolean>> suspend fun getSearchResult(query: String, subBundle: MutableSet<SearchBundle.SubBundle>?): Pair<List<App>, MutableSet<SearchBundle.SubBundle>> suspend fun getSearchSuggestions(query: String): List<SearchSuggestEntry> suspend fun getAppsByCategory(category: String, pageUrl: String? = null): Any suspend fun getCategories(type: CategoryType? = null): List<Category> Loading
app/src/main/java/foundation/e/apps/data/gplay/GplayStoreRepositoryImpl.kt +9 −10 Original line number Diff line number Diff line Loading @@ -128,30 +128,29 @@ class GplayStoreRepositoryImpl @Inject constructor( override suspend fun getSearchResult( query: String, subBundle: MutableSet<SearchBundle.SubBundle>? ): Flow<Pair<List<App>, Boolean>> { return flow { var authData = loginSourceRepository.gplayAuth ?: return@flow ): Pair<List<App>, MutableSet<SearchBundle.SubBundle>> { var authData = loginSourceRepository.gplayAuth ?: return Pair(emptyList(), mutableSetOf()) val searchHelper = SearchHelper(authData).using(gPlayHttpClient) Timber.d("Fetching search result for $query, subBundle: $subBundle") subBundle?.let { val searchResult = searchHelper.next(it) emitSearchResult(searchResult) return@let Timber.d("fetching next page search data...") return emitSearchResult(searchResult) } val searchResult = searchHelper.searchResults(query) emitSearchResult(searchResult) } return emitSearchResult(searchResult) } private suspend fun FlowCollector<Pair<List<App>, Boolean>>.emitSearchResult( private fun emitSearchResult( searchBundle: SearchBundle ) { ): Pair<MutableList<App>, MutableSet<SearchBundle.SubBundle>> { val apps = searchBundle.appList Timber.d("Search result is found: ${apps.size}") emit(Pair(apps, searchBundle.subBundles.isNotEmpty())) return Pair(apps, searchBundle.subBundles) } private suspend fun fetchNextSubBundle( Loading