From 8375412a1a63323c0fdd8c88fb5d8a0bc0457439 Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Sun, 15 Oct 2023 22:01:33 +0530 Subject: [PATCH] Improve AppSales page & clearly indicate source --- .../store/view/ui/sale/AppSalesFragment.kt | 31 +++++++--- .../store/viewmodel/sale/AppSalesViewModel.kt | 62 +++++++++++++------ app/src/main/res/values/strings.xml | 2 + 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt index 27482a7e0..086ec3742 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sale/AppSalesFragment.kt @@ -23,14 +23,16 @@ import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController -import com.aurora.gplayapi.data.models.App import com.aurora.store.R import com.aurora.store.databinding.ActivityGenericRecyclerBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener 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.NoAppViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ import com.aurora.store.view.ui.commons.BaseFragment +import com.aurora.store.viewmodel.all.PaginatedAppList import com.aurora.store.viewmodel.sale.AppSalesViewModel @@ -57,13 +59,13 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) { endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { override fun onLoadMore(currentPage: Int) { - VM.next() + VM.observe() } } binding.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) updateController(null) - VM.liveAppList.observe(viewLifecycleOwner) { + VM.liveData.observe(viewLifecycleOwner) { updateController(it) } } @@ -73,11 +75,11 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) { _binding = null } - private fun updateController(appList: List?) { + private fun updateController(paginatedAppList: PaginatedAppList?) { binding.recycler .withModels { setFilterDuplicates(true) - if (appList == null) { + if (paginatedAppList == null) { for (i in 1..6) { add( AppListViewShimmerModel_() @@ -85,7 +87,13 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) { ) } } else { - appList + add( + HeaderViewModel_() + .id("header") + .title(getString(R.string.title_apps_sale_provider)) + ) + + paginatedAppList.appList .filter { it.packageName.isNotEmpty() } .forEach { add( @@ -97,12 +105,21 @@ class AppSalesFragment : BaseFragment(R.layout.activity_generic_recycler) { setFilterDuplicates(true) } - if (appList.isNotEmpty()) { + if (paginatedAppList.hasMore) { add( AppProgressViewModel_() .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)) + ) + } } } } diff --git a/app/src/main/java/com/aurora/store/viewmodel/sale/AppSalesViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/sale/AppSalesViewModel.kt index c8cbf8c25..bb8ae07f8 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/sale/AppSalesViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/sale/AppSalesViewModel.kt @@ -20,52 +20,74 @@ package com.aurora.store.viewmodel.sale import android.app.Application -import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.AuthData import com.aurora.gplayapi.helpers.AppSalesHelper +import com.aurora.store.data.RequestState import com.aurora.store.data.network.HttpClient 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.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 appSalesHelper: AppSalesHelper = AppSalesHelper(authData).using(HttpClient.getPreferredClient()) - val liveAppList: MutableLiveData> = MutableLiveData() - private var page: Int = 0 private val appList: MutableList = mutableListOf() + val liveData: MutableLiveData = MutableLiveData() + init { - observeAppSales() + requestState = RequestState.Init + observe() } - private fun observeAppSales() { - appList.clear() + override fun observe() { viewModelScope.launch(Dispatchers.IO) { - appList.addAll(getSearchResults()) - liveAppList.postValue(appList) + supervisorScope { + 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( ): List { - return appSalesHelper.getAppsOnSale(page = page++, offer = 100) - } - - fun next() { - viewModelScope.launch(Dispatchers.IO) { - val newAppList = getSearchResults() - if (newAppList.isNotEmpty()) { - appList.addAll(getSearchResults()) - liveAppList.postValue(appList) - } + return try { + appSalesHelper.getAppsOnSale(page = page++, offer = 100) + } catch (e: Exception) { + e.printStackTrace() + emptyList() } } -} \ No newline at end of file +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2421c0298..90d756f58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -121,6 +121,7 @@ "No Dependencies" "No permissions" "No updates available" + "No apps found on sale" "Paid" "Permission" "Privacy" @@ -281,6 +282,7 @@ "My apps & games" "Apps in library" "Apps on sale" + "Provider - bestappsales.com" "Blacklist manager" "Device" "Downloads"