Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
Sujal-Gupta-SG committed Jan 23, 2025
1 parent 3570377 commit 333c0bc
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

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;
Expand All @@ -12,7 +16,9 @@
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;
Expand All @@ -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,
Expand Down Expand Up @@ -87,13 +102,23 @@ public DataSource<Integer, Contribution> create() {
}

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
public void onDetachView() {
compositeDisposable.clear();
contributionsRemoteDataSource.dispose();
contributionBoundaryCallback.dispose();
stopPollingForNewContributions();
}

/**
Expand All @@ -109,4 +134,55 @@ public void refreshList(final SwipeRefreshLayout swipeRefreshLayout) {
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
}
}
});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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!!)
Expand Down

0 comments on commit 333c0bc

Please sign in to comment.