From 110848a0ba41ad0147ae55d47c4a72261870f1de Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Mon, 16 Dec 2024 20:40:06 +0530 Subject: [PATCH] AppsGamesFragment: show only what is available on PlayStore --- .../store/view/ui/all/AppsGamesFragment.kt | 24 +++++++++++-------- .../store/viewmodel/all/InstalledViewModel.kt | 20 +++++++++++----- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt index 3f4565833..e391a10b0 100644 --- a/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/all/AppsGamesFragment.kt @@ -26,12 +26,13 @@ import android.view.View import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import com.aurora.gplayapi.data.models.App import com.aurora.store.AuroraApp import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.model.MinimalApp import com.aurora.store.databinding.FragmentGenericWithSearchBinding import com.aurora.store.view.epoxy.views.HeaderViewModel_ -import com.aurora.store.view.epoxy.views.InstalledAppViewModel_ +import com.aurora.store.view.epoxy.views.app.AppListViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.viewmodel.all.InstalledViewModel @@ -47,7 +48,7 @@ class AppsGamesFragment : BaseFragment() { super.onViewCreated(view, savedInstanceState) viewLifecycleOwner.lifecycleScope.launch { - viewModel.packages.collect { + viewModel.apps.collect { updateController(it) } } @@ -75,9 +76,9 @@ class AppsGamesFragment : BaseFragment() { inputSearch.addTextChangedListener(object : TextWatcher { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (s.isNullOrEmpty()) { - updateController(viewModel.packages.value) + updateController(viewModel.apps.value) } else { - val filteredPackages = viewModel.packages.value?.filter { + val filteredPackages = viewModel.apps.value?.filter { it.displayName.contains(s, true) || it.packageName.contains(s, true) } updateController(filteredPackages) @@ -96,7 +97,7 @@ class AppsGamesFragment : BaseFragment() { } } - private fun updateController(packages: List?) { + private fun updateController(packages: List?) { binding.recycler.withModels { setFilterDuplicates(true) if (packages == null) { @@ -114,17 +115,21 @@ class AppsGamesFragment : BaseFragment() { ) packages.forEach { app -> add( - InstalledAppViewModel_() + AppListViewModel_() .id(app.packageName.hashCode()) - .packageInfo(app) + .app(app) .click { _ -> openDetailsFragment( app.packageName, - MinimalApp.toApp(app) + app ) } .longClick { _ -> - openAppMenuSheet(app) + openAppMenuSheet( + MinimalApp.fromApp( + app + ) + ) false } ) @@ -132,5 +137,4 @@ class AppsGamesFragment : BaseFragment() { } } } - } diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/InstalledViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/InstalledViewModel.kt index 87f11a56e..fb78774a5 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/InstalledViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/InstalledViewModel.kt @@ -20,11 +20,11 @@ package com.aurora.store.viewmodel.all import android.content.Context -import android.content.pm.PackageInfo import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.aurora.store.data.model.MinimalApp +import com.aurora.gplayapi.data.models.App +import com.aurora.gplayapi.helpers.web.WebAppDetailsHelper import com.aurora.store.util.PackageUtil import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext @@ -41,8 +41,8 @@ class InstalledViewModel @Inject constructor( private val TAG = InstalledViewModel::class.java.simpleName - private val _packages = MutableStateFlow?>(null) - val packages = _packages.asStateFlow() + private val _apps = MutableStateFlow?>(null) + val apps = _apps.asStateFlow() init { fetchApps() @@ -51,8 +51,16 @@ class InstalledViewModel @Inject constructor( fun fetchApps() { viewModelScope.launch(Dispatchers.IO) { try { - _packages.value = PackageUtil.getAllValidPackages(context) - .map { MinimalApp.fromPackageInfo(context, it) } + val packages = PackageUtil.getAllValidPackages(context) + + // Divide the list of packages into chunks of 100 & fetch app details + // 50 is a safe number to avoid hitting the rate limit or package size limit + val chunkedPackages = packages.chunked(50) + val allApps = chunkedPackages.flatMap { chunk -> + WebAppDetailsHelper().getAppDetails(chunk.map { it.packageName }) + } + + _apps.emit(allApps) } catch (exception: Exception) { Log.e(TAG, "Failed to fetch apps", exception) }