AppsGamesFragment: show only what is available on PlayStore

This commit is contained in:
Rahul Patel
2024-12-16 20:40:06 +05:30
parent dce752a0ff
commit 110848a0ba
2 changed files with 28 additions and 16 deletions

View File

@@ -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<FragmentGenericWithSearchBinding>() {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
viewModel.packages.collect {
viewModel.apps.collect {
updateController(it)
}
}
@@ -75,9 +76,9 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
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<FragmentGenericWithSearchBinding>() {
}
}
private fun updateController(packages: List<MinimalApp>?) {
private fun updateController(packages: List<App>?) {
binding.recycler.withModels {
setFilterDuplicates(true)
if (packages == null) {
@@ -114,17 +115,21 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
)
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<FragmentGenericWithSearchBinding>() {
}
}
}
}

View File

@@ -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<List<MinimalApp>?>(null)
val packages = _packages.asStateFlow()
private val _apps = MutableStateFlow<List<App>?>(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)
}