Improve AppSales page & clearly indicate source

This commit is contained in:
Rahul Patel
2023-10-15 22:01:33 +05:30
parent eb46790994
commit 8375412a1a
3 changed files with 68 additions and 27 deletions

View File

@@ -23,14 +23,16 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.databinding.ActivityGenericRecyclerBinding
import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener
import com.aurora.store.view.epoxy.views.AppProgressViewModel_ import com.aurora.store.view.epoxy.views.AppProgressViewModel_
import com.aurora.store.view.epoxy.views.HeaderViewModel_
import com.aurora.store.view.epoxy.views.app.AppListViewModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_
import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
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.PaginatedAppList
import com.aurora.store.viewmodel.sale.AppSalesViewModel import com.aurora.store.viewmodel.sale.AppSalesViewModel
@@ -57,13 +59,13 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) {
endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() {
override fun onLoadMore(currentPage: Int) { override fun onLoadMore(currentPage: Int) {
VM.next() VM.observe()
} }
} }
binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener)
updateController(null) updateController(null)
VM.liveAppList.observe(viewLifecycleOwner) { VM.liveData.observe(viewLifecycleOwner) {
updateController(it) updateController(it)
} }
} }
@@ -73,11 +75,11 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) {
_binding = null _binding = null
} }
private fun updateController(appList: List<App>?) { private fun updateController(paginatedAppList: PaginatedAppList?) {
binding.recycler binding.recycler
.withModels { .withModels {
setFilterDuplicates(true) setFilterDuplicates(true)
if (appList == null) { if (paginatedAppList == null) {
for (i in 1..6) { for (i in 1..6) {
add( add(
AppListViewShimmerModel_() AppListViewShimmerModel_()
@@ -85,7 +87,13 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) {
) )
} }
} else { } else {
appList add(
HeaderViewModel_()
.id("header")
.title(getString(R.string.title_apps_sale_provider))
)
paginatedAppList.appList
.filter { it.packageName.isNotEmpty() } .filter { it.packageName.isNotEmpty() }
.forEach { .forEach {
add( add(
@@ -97,12 +105,21 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) {
setFilterDuplicates(true) setFilterDuplicates(true)
} }
if (appList.isNotEmpty()) { if (paginatedAppList.hasMore) {
add( add(
AppProgressViewModel_() AppProgressViewModel_()
.id("progress") .id("progress")
) )
} }
if (!paginatedAppList.hasMore && paginatedAppList.appList.isEmpty()) {
add(
NoAppViewModel_()
.id("no_app_sale")
.icon(R.drawable.ic_apps)
.message(getString(R.string.details_no_apps_on_sale))
)
}
} }
} }
} }

View File

@@ -20,52 +20,74 @@
package com.aurora.store.viewmodel.sale package com.aurora.store.viewmodel.sale
import android.app.Application import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.data.models.AuthData
import com.aurora.gplayapi.helpers.AppSalesHelper import com.aurora.gplayapi.helpers.AppSalesHelper
import com.aurora.store.data.RequestState
import com.aurora.store.data.network.HttpClient import com.aurora.store.data.network.HttpClient
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.viewmodel.BaseAndroidViewModel
import com.aurora.store.viewmodel.all.PaginatedAppList
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.supervisorScope
class AppSalesViewModel(application: Application) : AndroidViewModel(application) { class AppSalesViewModel(application: Application) : BaseAndroidViewModel(application) {
private val authData: AuthData = AuthProvider.with(application).getAuthData() private val authData: AuthData = AuthProvider.with(application).getAuthData()
private val appSalesHelper: AppSalesHelper = private val appSalesHelper: AppSalesHelper =
AppSalesHelper(authData).using(HttpClient.getPreferredClient()) AppSalesHelper(authData).using(HttpClient.getPreferredClient())
val liveAppList: MutableLiveData<List<App>> = MutableLiveData()
private var page: Int = 0 private var page: Int = 0
private val appList: MutableList<App> = mutableListOf() private val appList: MutableList<App> = mutableListOf()
val liveData: MutableLiveData<PaginatedAppList> = MutableLiveData()
init { init {
observeAppSales() requestState = RequestState.Init
observe()
} }
private fun observeAppSales() { override fun observe() {
appList.clear()
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
appList.addAll(getSearchResults()) supervisorScope {
liveAppList.postValue(appList) requestState = try {
val nextAppList = getSearchResults()
if (nextAppList.isEmpty()) {
liveData.postValue(
PaginatedAppList(
appList,
hasMore = false
)
)
} else {
appList.addAll(nextAppList)
liveData.postValue(
PaginatedAppList(
appList,
hasMore = true
)
)
}
RequestState.Complete
} catch (e: Exception) {
RequestState.Pending
}
}
} }
} }
private fun getSearchResults( private fun getSearchResults(
): List<App> { ): List<App> {
return appSalesHelper.getAppsOnSale(page = page++, offer = 100) return try {
} appSalesHelper.getAppsOnSale(page = page++, offer = 100)
} catch (e: Exception) {
fun next() { e.printStackTrace()
viewModelScope.launch(Dispatchers.IO) { emptyList()
val newAppList = getSearchResults()
if (newAppList.isNotEmpty()) {
appList.addAll(getSearchResults())
liveAppList.postValue(appList)
}
} }
} }
} }

View File

@@ -121,6 +121,7 @@
<string name="details_no_dependencies">"No Dependencies"</string> <string name="details_no_dependencies">"No Dependencies"</string>
<string name="details_no_permission">"No permissions"</string> <string name="details_no_permission">"No permissions"</string>
<string name="details_no_updates">"No updates available"</string> <string name="details_no_updates">"No updates available"</string>
<string name="details_no_apps_on_sale">"No apps found on sale"</string>
<string name="details_paid">"Paid"</string> <string name="details_paid">"Paid"</string>
<string name="details_permission">"Permission"</string> <string name="details_permission">"Permission"</string>
<string name="details_privacy">"Privacy"</string> <string name="details_privacy">"Privacy"</string>
@@ -281,6 +282,7 @@
<string name="title_apps_games">"My apps &amp; games"</string> <string name="title_apps_games">"My apps &amp; games"</string>
<string name="title_apps_library">"Apps in library"</string> <string name="title_apps_library">"Apps in library"</string>
<string name="title_apps_sale">"Apps on sale"</string> <string name="title_apps_sale">"Apps on sale"</string>
<string name="title_apps_sale_provider">"Provider - bestappsales.com"</string>
<string name="title_blacklist_manager">"Blacklist manager"</string> <string name="title_blacklist_manager">"Blacklist manager"</string>
<string name="title_device">"Device"</string> <string name="title_device">"Device"</string>
<string name="title_download_manager">"Downloads"</string> <string name="title_download_manager">"Downloads"</string>