From 8eed7ee554ea031e6215c5cb4c7072364b7736be Mon Sep 17 00:00:00 2001 From: parneet-guraya Date: Tue, 17 Dec 2024 13:08:12 +0530 Subject: [PATCH] pull down to refresh Signed-off-by: parneet-guraya --- .../ContributionBoundaryCallback.kt | 25 ++- .../ContributionsListContract.java | 3 + .../ContributionsListFragment.java | 4 + .../ContributionsListPresenter.java | 12 +- .../layout/fragment_contributions_list.xml | 192 +++++++++--------- 5 files changed, 131 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt index 3f7bffe91..7de499b44 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionBoundaryCallback.kt @@ -2,7 +2,6 @@ package fr.free.nrw.commons.contributions import androidx.paging.PagedList.BoundaryCallback import fr.free.nrw.commons.auth.SessionManager -import fr.free.nrw.commons.di.CommonsApplicationModule import fr.free.nrw.commons.di.CommonsApplicationModule.Companion.IO_THREAD import fr.free.nrw.commons.media.MediaClient import io.reactivex.Scheduler @@ -31,10 +30,7 @@ class ContributionBoundaryCallback * network */ override fun onZeroItemsLoaded() { - if (sessionManager.userName != null) { - mediaClient.resetUserNameContinuation(sessionManager.userName!!) - } - fetchContributions() + refreshList() } /** @@ -51,10 +47,17 @@ class ContributionBoundaryCallback fetchContributions() } + fun refreshList(onRefreshFinish: () -> Unit = {}){ + if (sessionManager.userName != null) { + mediaClient.resetUserNameContinuation(sessionManager.userName!!) + } + fetchContributions(onRefreshFinish) + } + /** * Fetches contributions using the MediaWiki API */ - private fun fetchContributions() { + private fun fetchContributions(onRefreshFinish: () -> Unit = {}) { if (sessionManager.userName != null) { userName ?.let { userName -> @@ -65,12 +68,15 @@ class ContributionBoundaryCallback Contribution(media = media, state = Contribution.STATE_COMPLETED) } }.subscribeOn(ioThreadScheduler) - .subscribe(::saveContributionsToDB) { error: Throwable -> + .subscribe({ list -> + saveContributionsToDB(list, onRefreshFinish) + },{ error -> + onRefreshFinish() Timber.e( "Failed to fetch contributions: %s", error.message, ) - } + }) }?.let { compositeDisposable.add( it, @@ -84,12 +90,13 @@ class ContributionBoundaryCallback /** * Saves the contributions the the local DB */ - private fun saveContributionsToDB(contributions: List) { + private fun saveContributionsToDB(contributions: List, onRefreshFinish: () -> Unit) { compositeDisposable.add( repository .save(contributions) .subscribeOn(ioThreadScheduler) .subscribe { longs: List? -> + onRefreshFinish() repository["last_fetch_timestamp"] = System.currentTimeMillis() }, ) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListContract.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListContract.java index 58bd2783d..c97a03190 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListContract.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListContract.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons.contributions; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import fr.free.nrw.commons.BasePresenter; /** @@ -17,5 +18,7 @@ public class ContributionsListContract { } public interface UserActionListener extends BasePresenter { + + void refreshList(SwipeRefreshLayout swipeRefreshLayout); } } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 509d1eb95..f8b3a7e9e 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -191,6 +191,10 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl initAdapter(); + binding.swipeRefreshLayout.setOnRefreshListener(() -> { + contributionsListPresenter.refreshList(binding.swipeRefreshLayout); + }); + return binding.getRoot(); } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListPresenter.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListPresenter.java index 735ff63d4..89a0c8cdf 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListPresenter.java @@ -8,14 +8,15 @@ import androidx.paging.DataSource; import androidx.paging.DataSource.Factory; import androidx.paging.LivePagedListBuilder; import androidx.paging.PagedList; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import fr.free.nrw.commons.contributions.ContributionsListContract.UserActionListener; -import fr.free.nrw.commons.di.CommonsApplicationModule; import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; -import java.util.Arrays; import java.util.Collections; import javax.inject.Inject; import javax.inject.Named; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; /** * The presenter class for Contributions @@ -95,4 +96,11 @@ public class ContributionsListPresenter implements UserActionListener { contributionBoundaryCallback.dispose(); } + @Override + public void refreshList(SwipeRefreshLayout swipeRefreshLayout) { + contributionBoundaryCallback.refreshList(() -> { + swipeRefreshLayout.setRefreshing(false); + return Unit.INSTANCE; + }); + } } diff --git a/app/src/main/res/layout/fragment_contributions_list.xml b/app/src/main/res/layout/fragment_contributions_list.xml index b490c35ff..3ce4156be 100644 --- a/app/src/main/res/layout/fragment_contributions_list.xml +++ b/app/src/main/res/layout/fragment_contributions_list.xml @@ -1,125 +1,129 @@ - + + + android:orientation="vertical"> + + android:id="@+id/noContributionsYet" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_centerInParent="true" + android:layout_marginEnd="@dimen/tiny_gap" + android:layout_marginRight="@dimen/tiny_gap" + android:gravity="center" + android:text="@string/no_uploads" + android:visibility="gone" /> + android:visibility="gone" /> - + - + + + + android:contentDescription="@string/add_contribution_from_camera" + android:tint="@color/button_blue" + android:visibility="gone" + app:backgroundTint="@color/main_background_light" + app:elevation="@dimen/tiny_margin" + app:fabSize="mini" + app:srcCompat="@drawable/ic_photo_camera_white_24dp" + app:useCompatPadding="true" /> - + - + - - - + - + +