mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-28 05:13:53 +01:00
Fixed #6084
This commit is contained in:
parent
038ae9acd4
commit
9377b7c057
2 changed files with 83 additions and 1 deletions
|
|
@ -2,8 +2,12 @@ package fr.free.nrw.commons.contributions;
|
|||
|
||||
import static fr.free.nrw.commons.di.CommonsApplicationModule.IO_THREAD;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.paging.DataSource;
|
||||
import androidx.paging.DataSource.Factory;
|
||||
import androidx.paging.LivePagedListBuilder;
|
||||
|
|
@ -12,7 +16,9 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
|
|||
import fr.free.nrw.commons.contributions.ContributionsListContract.UserActionListener;
|
||||
import io.reactivex.Scheduler;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import kotlin.Unit;
|
||||
|
|
@ -32,6 +38,15 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
|
||||
LiveData<PagedList<Contribution>> contributionList;
|
||||
|
||||
private MutableLiveData<List<Contribution>> liveData = new MutableLiveData<>();
|
||||
|
||||
private List<Contribution> existingContributions = new ArrayList<>();
|
||||
|
||||
// Timer for polling new contributions
|
||||
private Handler pollingHandler;
|
||||
private Runnable pollingRunnable;
|
||||
private long pollingInterval = 1 * 60 * 1000L; // Poll every minute
|
||||
|
||||
@Inject
|
||||
ContributionsListPresenter(
|
||||
final ContributionBoundaryCallback contributionBoundaryCallback,
|
||||
|
|
@ -87,6 +102,15 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
}
|
||||
|
||||
contributionList = livePagedListBuilder.build();
|
||||
contributionList.observeForever(pagedList -> {
|
||||
if (pagedList != null) {
|
||||
existingContributions.clear();
|
||||
existingContributions.addAll(pagedList);
|
||||
liveData.setValue(existingContributions); // Update liveData with the latest list
|
||||
}
|
||||
});
|
||||
// Start polling for new contributions
|
||||
startPollingForNewContributions();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -94,6 +118,7 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
compositeDisposable.clear();
|
||||
contributionsRemoteDataSource.dispose();
|
||||
contributionBoundaryCallback.dispose();
|
||||
stopPollingForNewContributions();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -109,4 +134,55 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
return Unit.INSTANCE;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Start polling for new contributions every 15 minutes.
|
||||
*/
|
||||
private void startPollingForNewContributions() {
|
||||
if (pollingHandler != null) {
|
||||
stopPollingForNewContributions();
|
||||
}
|
||||
|
||||
pollingHandler = new Handler(Looper.getMainLooper());
|
||||
pollingRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fetchNewContributions(); // Fetch new contributions in background
|
||||
pollingHandler.postDelayed(this, pollingInterval); // Repeat after the interval
|
||||
}
|
||||
};
|
||||
pollingHandler.post(pollingRunnable); // Start polling immediately
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop the polling task when the view is detached or the activity is paused.
|
||||
*/
|
||||
private void stopPollingForNewContributions() {
|
||||
if (pollingHandler != null && pollingRunnable != null) {
|
||||
pollingHandler.removeCallbacks(pollingRunnable);
|
||||
pollingHandler = null;
|
||||
pollingRunnable = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void appendContributions(List<Contribution> newContributions) {
|
||||
if (newContributions != null && !newContributions.isEmpty()) {
|
||||
existingContributions.addAll(newContributions);
|
||||
liveData.postValue(existingContributions);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Fetch new contributions from the server and append them to the existing list.
|
||||
*/
|
||||
private void fetchNewContributions() {
|
||||
contributionsRemoteDataSource.fetchContributions(new ContributionsRemoteDataSource.LoadCallback<Contribution>() {
|
||||
@Override
|
||||
public void onResult(List<Contribution> newContributions) {
|
||||
if (newContributions != null && !newContributions.isEmpty()) {
|
||||
appendContributions(newContributions); // Add new contributions
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,13 @@ class ContributionsRemoteDataSource
|
|||
/**
|
||||
* Fetches contributions using the MediaWiki API
|
||||
*/
|
||||
private fun fetchContributions(callback: LoadCallback<Contribution>) {
|
||||
public fun fetchContributions(callback: LoadCallback<Contribution>) {
|
||||
if (userName.isNullOrEmpty()) {
|
||||
Timber.e("Failed to fetch contributions: userName is null or empty")
|
||||
return
|
||||
}
|
||||
Timber.d("Fetching contributions for user: $userName")
|
||||
|
||||
compositeDisposable.add(
|
||||
mediaClient
|
||||
.getMediaListForUser(userName!!)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue