AppsGamesFragment: show only what is available on PlayStore
This commit is contained in:
@@ -26,12 +26,13 @@ import android.view.View
|
|||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.aurora.gplayapi.data.models.App
|
||||||
import com.aurora.store.AuroraApp
|
import com.aurora.store.AuroraApp
|
||||||
import com.aurora.store.data.event.InstallerEvent
|
import com.aurora.store.data.event.InstallerEvent
|
||||||
import com.aurora.store.data.model.MinimalApp
|
import com.aurora.store.data.model.MinimalApp
|
||||||
import com.aurora.store.databinding.FragmentGenericWithSearchBinding
|
import com.aurora.store.databinding.FragmentGenericWithSearchBinding
|
||||||
import com.aurora.store.view.epoxy.views.HeaderViewModel_
|
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.epoxy.views.shimmer.AppListViewShimmerModel_
|
||||||
import com.aurora.store.view.ui.commons.BaseFragment
|
import com.aurora.store.view.ui.commons.BaseFragment
|
||||||
import com.aurora.store.viewmodel.all.InstalledViewModel
|
import com.aurora.store.viewmodel.all.InstalledViewModel
|
||||||
@@ -47,7 +48,7 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
viewLifecycleOwner.lifecycleScope.launch {
|
viewLifecycleOwner.lifecycleScope.launch {
|
||||||
viewModel.packages.collect {
|
viewModel.apps.collect {
|
||||||
updateController(it)
|
updateController(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,9 +76,9 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
|
|||||||
inputSearch.addTextChangedListener(object : TextWatcher {
|
inputSearch.addTextChangedListener(object : TextWatcher {
|
||||||
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
||||||
if (s.isNullOrEmpty()) {
|
if (s.isNullOrEmpty()) {
|
||||||
updateController(viewModel.packages.value)
|
updateController(viewModel.apps.value)
|
||||||
} else {
|
} else {
|
||||||
val filteredPackages = viewModel.packages.value?.filter {
|
val filteredPackages = viewModel.apps.value?.filter {
|
||||||
it.displayName.contains(s, true) || it.packageName.contains(s, true)
|
it.displayName.contains(s, true) || it.packageName.contains(s, true)
|
||||||
}
|
}
|
||||||
updateController(filteredPackages)
|
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 {
|
binding.recycler.withModels {
|
||||||
setFilterDuplicates(true)
|
setFilterDuplicates(true)
|
||||||
if (packages == null) {
|
if (packages == null) {
|
||||||
@@ -114,17 +115,21 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
|
|||||||
)
|
)
|
||||||
packages.forEach { app ->
|
packages.forEach { app ->
|
||||||
add(
|
add(
|
||||||
InstalledAppViewModel_()
|
AppListViewModel_()
|
||||||
.id(app.packageName.hashCode())
|
.id(app.packageName.hashCode())
|
||||||
.packageInfo(app)
|
.app(app)
|
||||||
.click { _ ->
|
.click { _ ->
|
||||||
openDetailsFragment(
|
openDetailsFragment(
|
||||||
app.packageName,
|
app.packageName,
|
||||||
MinimalApp.toApp(app)
|
app
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.longClick { _ ->
|
.longClick { _ ->
|
||||||
openAppMenuSheet(app)
|
openAppMenuSheet(
|
||||||
|
MinimalApp.fromApp(
|
||||||
|
app
|
||||||
|
)
|
||||||
|
)
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -132,5 +137,4 @@ class AppsGamesFragment : BaseFragment<FragmentGenericWithSearchBinding>() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,11 @@
|
|||||||
package com.aurora.store.viewmodel.all
|
package com.aurora.store.viewmodel.all
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageInfo
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
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 com.aurora.store.util.PackageUtil
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
@@ -41,8 +41,8 @@ class InstalledViewModel @Inject constructor(
|
|||||||
|
|
||||||
private val TAG = InstalledViewModel::class.java.simpleName
|
private val TAG = InstalledViewModel::class.java.simpleName
|
||||||
|
|
||||||
private val _packages = MutableStateFlow<List<MinimalApp>?>(null)
|
private val _apps = MutableStateFlow<List<App>?>(null)
|
||||||
val packages = _packages.asStateFlow()
|
val apps = _apps.asStateFlow()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
fetchApps()
|
fetchApps()
|
||||||
@@ -51,8 +51,16 @@ class InstalledViewModel @Inject constructor(
|
|||||||
fun fetchApps() {
|
fun fetchApps() {
|
||||||
viewModelScope.launch(Dispatchers.IO) {
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
_packages.value = PackageUtil.getAllValidPackages(context)
|
val packages = PackageUtil.getAllValidPackages(context)
|
||||||
.map { MinimalApp.fromPackageInfo(context, it) }
|
|
||||||
|
// 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) {
|
} catch (exception: Exception) {
|
||||||
Log.e(TAG, "Failed to fetch apps", exception)
|
Log.e(TAG, "Failed to fetch apps", exception)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user