diff --git a/app/src/main/java/com/aurora/store/view/custom/recycler/EndlessRecyclerOnScrollListener.kt b/app/src/main/java/com/aurora/store/view/custom/recycler/EndlessRecyclerOnScrollListener.kt index a4ed6520a..1e20b9ca9 100644 --- a/app/src/main/java/com/aurora/store/view/custom/recycler/EndlessRecyclerOnScrollListener.kt +++ b/app/src/main/java/com/aurora/store/view/custom/recycler/EndlessRecyclerOnScrollListener.kt @@ -48,21 +48,12 @@ abstract class EndlessRecyclerOnScrollListener : RecyclerView.OnScrollListener { constructor() - constructor(layoutManager: RecyclerView.LayoutManager) { - this.layoutManager = layoutManager - } - constructor(visibleThreshold: Int) { this.visibleThreshold = visibleThreshold } - constructor(layoutManager: RecyclerView.LayoutManager, visibleThreshold: Int) { - this.layoutManager = layoutManager - this.visibleThreshold = visibleThreshold - } - private fun findFirstVisibleItemPosition(recyclerView: RecyclerView): Int { - val child = findOneVisibleChild(0, layoutManager.childCount, false, true) + val child = findOneVisibleChild(0, layoutManager.childCount, true, false) return if (child == null) RecyclerView.NO_POSITION else recyclerView.getChildAdapterPosition( child ) diff --git a/app/src/main/java/com/aurora/store/view/ui/all/InstalledAppsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/all/InstalledAppsFragment.kt index 50fa62df8..e4a9a8b64 100644 --- a/app/src/main/java/com/aurora/store/view/ui/all/InstalledAppsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/all/InstalledAppsFragment.kt @@ -26,7 +26,7 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.aurora.gplayapi.data.models.App import com.aurora.store.R -import com.aurora.store.databinding.FragmentUpdatesBinding +import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.view.epoxy.views.HeaderViewModel_ import com.aurora.store.view.epoxy.views.app.AppListViewModel_ import com.aurora.store.view.epoxy.views.shimmer.AppListViewShimmerModel_ @@ -36,14 +36,12 @@ import com.aurora.store.viewmodel.all.InstalledViewModel class InstalledAppsFragment : BaseFragment() { private lateinit var VM: InstalledViewModel - private lateinit var B: FragmentUpdatesBinding + private lateinit var B: FragmentAppsBinding companion object { @JvmStatic fun newInstance(): InstalledAppsFragment { - return InstalledAppsFragment().apply { - - } + return InstalledAppsFragment() } } @@ -52,15 +50,15 @@ class InstalledAppsFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - B = FragmentUpdatesBinding.bind( + B = FragmentAppsBinding.bind( inflater.inflate( - R.layout.fragment_updates, + R.layout.fragment_apps, container, false ) ) - VM = ViewModelProvider(requireActivity()).get(InstalledViewModel::class.java) + VM = ViewModelProvider(requireActivity())[InstalledViewModel::class.java] return B.root } @@ -69,11 +67,6 @@ class InstalledAppsFragment : BaseFragment() { super.onViewCreated(view, savedInstanceState) VM.liveData.observe(viewLifecycleOwner) { updateController(it) - B.swipeRefreshLayout.isRefreshing = false - } - - B.swipeRefreshLayout.setOnRefreshListener { - VM.observe() } updateController(null) @@ -83,7 +76,7 @@ class InstalledAppsFragment : BaseFragment() { B.recycler.withModels { setFilterDuplicates(true) if (appList == null) { - for (i in 1..6) { + for (i in 1..10) { add( AppListViewShimmerModel_() .id(i) diff --git a/app/src/main/java/com/aurora/store/view/ui/all/LibraryAppsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/all/LibraryAppsFragment.kt index d472afd5a..881446c45 100644 --- a/app/src/main/java/com/aurora/store/view/ui/all/LibraryAppsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/all/LibraryAppsFragment.kt @@ -26,6 +26,7 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.store.R +import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.databinding.FragmentUpdatesBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener import com.aurora.store.view.epoxy.views.AppProgressViewModel_ @@ -38,7 +39,7 @@ import com.aurora.store.viewmodel.all.LibraryAppsViewModel class LibraryAppsFragment : BaseFragment() { private lateinit var VM: LibraryAppsViewModel - private lateinit var B: FragmentUpdatesBinding + private lateinit var B: FragmentAppsBinding lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener companion object { @@ -55,9 +56,9 @@ class LibraryAppsFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - B = FragmentUpdatesBinding.bind( + B = FragmentAppsBinding.bind( inflater.inflate( - R.layout.fragment_updates, + R.layout.fragment_apps, container, false ) @@ -70,7 +71,6 @@ class LibraryAppsFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - B.swipeRefreshLayout.isEnabled = false VM.liveData.observe(viewLifecycleOwner) { updateController(it) } @@ -92,7 +92,7 @@ class LibraryAppsFragment : BaseFragment() { B.recycler.withModels { setFilterDuplicates(true) if (streamCluster == null) { - for (i in 1..6) { + for (i in 1..10) { add( AppListViewShimmerModel_() .id(i) diff --git a/app/src/main/java/com/aurora/store/view/ui/all/PurchasedAppsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/all/PurchasedAppsFragment.kt index 368f736a2..2aa14dcd1 100644 --- a/app/src/main/java/com/aurora/store/view/ui/all/PurchasedAppsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/all/PurchasedAppsFragment.kt @@ -24,28 +24,26 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.aurora.gplayapi.data.models.App import com.aurora.store.R -import com.aurora.store.databinding.FragmentUpdatesBinding +import com.aurora.store.databinding.FragmentAppsBinding import com.aurora.store.view.custom.recycler.EndlessRecyclerOnScrollListener -import com.aurora.store.view.epoxy.views.HeaderViewModel_ +import com.aurora.store.view.epoxy.views.AppProgressViewModel_ 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.PaginatedAppList import com.aurora.store.viewmodel.all.PurchasedViewModel class PurchasedAppsFragment : BaseFragment() { private lateinit var VM: PurchasedViewModel - private lateinit var B: FragmentUpdatesBinding + private lateinit var B: FragmentAppsBinding lateinit var endlessRecyclerOnScrollListener: EndlessRecyclerOnScrollListener companion object { @JvmStatic fun newInstance(): PurchasedAppsFragment { - return PurchasedAppsFragment().apply { - - } + return PurchasedAppsFragment() } } @@ -54,15 +52,15 @@ class PurchasedAppsFragment : BaseFragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View { - B = FragmentUpdatesBinding.bind( + B = FragmentAppsBinding.bind( inflater.inflate( - R.layout.fragment_updates, + R.layout.fragment_apps, container, false ) ) - VM = ViewModelProvider(requireActivity()).get(PurchasedViewModel::class.java) + VM = ViewModelProvider(requireActivity())[PurchasedViewModel::class.java] return B.root } @@ -71,11 +69,6 @@ class PurchasedAppsFragment : BaseFragment() { super.onViewCreated(view, savedInstanceState) VM.liveData.observe(viewLifecycleOwner) { updateController(it) - B.swipeRefreshLayout.isRefreshing = false - } - - B.swipeRefreshLayout.setOnRefreshListener { - VM.observe() } attachRecycler() @@ -84,32 +77,28 @@ class PurchasedAppsFragment : BaseFragment() { } private fun attachRecycler() { - endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener() { + val endlessRecyclerOnScrollListener = object : EndlessRecyclerOnScrollListener(8) { override fun onLoadMore(currentPage: Int) { VM.observe() } } + B.recycler.addOnScrollListener(endlessRecyclerOnScrollListener) } - private fun updateController(appList: List?) { + private fun updateController(paginatedAppList: PaginatedAppList?) { B.recycler.withModels { setFilterDuplicates(true) - if (appList == null) { - for (i in 1..6) { + if (paginatedAppList == null) { + for (i in 1..10) { add( AppListViewShimmerModel_() .id(i) ) } } else { - add( - HeaderViewModel_() - .id("header") - .title("${appList.size} apps purchased") - ) - appList.forEach { app -> + paginatedAppList.appList.forEach { app -> add( AppListViewModel_() .id(app.id) @@ -121,6 +110,13 @@ class PurchasedAppsFragment : BaseFragment() { } ) } + + if (paginatedAppList.hasMore){ + add( + AppProgressViewModel_() + .id("progress") + ) + } } } } diff --git a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt index fadca4a77..21b006f84 100644 --- a/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/commons/BlacklistFragment.kt @@ -74,7 +74,7 @@ class BlacklistFragment : Fragment(R.layout.activity_generic_recycler) { binding.recycler.withModels { setFilterDuplicates(true) if (blackList == null) { - for (i in 1..6) { + for (i in 1..10) { add( AppListViewShimmerModel_() .id(i) diff --git a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt index 772261857..c5582074d 100644 --- a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt @@ -185,7 +185,7 @@ class UpdatesFragment : BaseFragment(R.layout.fragment_updates) { binding.recycler.withModels { setFilterDuplicates(true) if (updateFileMap == null) { - for (i in 1..6) { + for (i in 1..10) { add( AppListViewShimmerModel_() .id(i) diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt index 289972104..721d31904 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/BlacklistViewModel.kt @@ -80,8 +80,4 @@ class BlacklistViewModel(application: Application) : BaseAndroidViewModel(applic } } } - - override fun onCleared() { - super.onCleared() - } } 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 1ecf338c8..ac4030400 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 @@ -42,12 +42,12 @@ class InstalledViewModel(application: Application) : BaseAppsViewModel(applicati override fun observe() { viewModelScope.launch(Dispatchers.IO) { - try { + requestState = try { appList.flushAndAdd(getFilteredApps()) liveData.postValue(appList.sortedBy { it.displayName.lowercase(Locale.getDefault()) }) - requestState = RequestState.Complete + RequestState.Complete } catch (e: Exception) { - requestState = RequestState.Pending + RequestState.Pending } } } @@ -58,12 +58,15 @@ class InstalledViewModel(application: Application) : BaseAppsViewModel(applicati is BusEvent.InstallEvent -> { updateListAndPost(event.packageName) } + is BusEvent.UninstallEvent -> { updateListAndPost(event.packageName) } + is BusEvent.Blacklisted -> { observe() } + else -> { } diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/LibraryAppsViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/LibraryAppsViewModel.kt index 71e2a1560..d81f66bd3 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/LibraryAppsViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/LibraryAppsViewModel.kt @@ -43,7 +43,7 @@ class LibraryAppsViewModel(application: Application) : BaseAndroidViewModel(appl var streamCluster: StreamCluster = StreamCluster() init { - observe() + requestState = RequestState.Init } override fun observe() { diff --git a/app/src/main/java/com/aurora/store/viewmodel/all/PurchasedViewModel.kt b/app/src/main/java/com/aurora/store/viewmodel/all/PurchasedViewModel.kt index c0935bad9..fc630b21d 100644 --- a/app/src/main/java/com/aurora/store/viewmodel/all/PurchasedViewModel.kt +++ b/app/src/main/java/com/aurora/store/viewmodel/all/PurchasedViewModel.kt @@ -32,39 +32,51 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.supervisorScope +data class PaginatedAppList( + var appList: MutableList = mutableListOf(), + var hasMore: Boolean +) + class PurchasedViewModel(application: Application) : BaseAndroidViewModel(application) { - private val authData = AuthProvider - .with(application) - .getAuthData() + private val authData = AuthProvider.with(application).getAuthData() - private val purchaseHelper = PurchaseHelper(authData) - .using(HttpClient.getPreferredClient()) + private val purchaseHelper = PurchaseHelper(authData).using(HttpClient.getPreferredClient()) - val liveData: MutableLiveData> = MutableLiveData() + private var appList: MutableList = mutableListOf() - var appList: MutableList = mutableListOf() + val liveData: MutableLiveData = MutableLiveData() init { requestState = RequestState.Init - observe() } override fun observe() { viewModelScope.launch(Dispatchers.IO) { supervisorScope { - try { - appList.addAll(purchaseHelper.getPurchaseHistory(appList.size)) - liveData.postValue(appList) - requestState = RequestState.Complete + requestState = try { + val nextAppList = purchaseHelper.getPurchaseHistory(appList.size) + .filter { it.displayName.isNotEmpty() } + + if (nextAppList.isEmpty()) { + liveData.postValue(PaginatedAppList( + appList, + false + )) + } else { + appList.addAll(nextAppList) + liveData.postValue( + PaginatedAppList( + appList, + true + ) + ) + } + RequestState.Complete } catch (e: Exception) { - requestState = RequestState.Pending + RequestState.Pending } } } } - - override fun onCleared() { - super.onCleared() - } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_apps.xml b/app/src/main/res/layout/fragment_apps.xml new file mode 100644 index 000000000..5f9881e47 --- /dev/null +++ b/app/src/main/res/layout/fragment_apps.xml @@ -0,0 +1,36 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_app_progress.xml b/app/src/main/res/layout/view_app_progress.xml index b8ed262bc..f7111892e 100644 --- a/app/src/main/res/layout/view_app_progress.xml +++ b/app/src/main/res/layout/view_app_progress.xml @@ -20,6 +20,7 @@ @@ -27,5 +28,7 @@ android:id="@+id/img_icon" android:layout_width="@dimen/icon_size_cluster" android:layout_height="@dimen/icon_size_cluster" + android:scaleX="0.5" + android:scaleY="0.5" android:layout_centerInParent="true" /> \ No newline at end of file