mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-28 13:23:58 +01:00
Fixed #6084
This commit is contained in:
parent
333c0bcbf3
commit
9f9938a0b7
2 changed files with 53 additions and 18 deletions
|
|
@ -22,7 +22,6 @@ import java.util.List;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import kotlin.Unit;
|
||||
import kotlin.jvm.functions.Function0;
|
||||
|
||||
/**
|
||||
* The presenter class for Contributions
|
||||
|
|
@ -45,7 +44,7 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
// Timer for polling new contributions
|
||||
private Handler pollingHandler;
|
||||
private Runnable pollingRunnable;
|
||||
private long pollingInterval = 1 * 60 * 1000L; // Poll every minute
|
||||
private long pollingInterval = 24 * 60 * 60 * 1000L; // Poll every day
|
||||
|
||||
@Inject
|
||||
ContributionsListPresenter(
|
||||
|
|
@ -136,7 +135,7 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
}
|
||||
|
||||
/**
|
||||
* Start polling for new contributions every 15 minutes.
|
||||
* Start polling for new contributions every 24 hour.
|
||||
*/
|
||||
private void startPollingForNewContributions() {
|
||||
if (pollingHandler != null) {
|
||||
|
|
@ -147,7 +146,7 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
pollingRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fetchNewContributions(); // Fetch new contributions in background
|
||||
checkForNewContributions();
|
||||
pollingHandler.postDelayed(this, pollingInterval); // Repeat after the interval
|
||||
}
|
||||
};
|
||||
|
|
@ -164,22 +163,33 @@ public class ContributionsListPresenter implements UserActionListener {
|
|||
pollingRunnable = null;
|
||||
}
|
||||
}
|
||||
private String lastKnownIdentifier = null; // Declare and initialize
|
||||
|
||||
public void appendContributions(List<Contribution> newContributions) {
|
||||
if (newContributions != null && !newContributions.isEmpty()) {
|
||||
existingContributions.addAll(newContributions);
|
||||
liveData.postValue(existingContributions);
|
||||
/**
|
||||
* Check for new contributions by comparing the latest contribution identifier.
|
||||
*/
|
||||
private void checkForNewContributions() {
|
||||
contributionsRemoteDataSource.fetchLatestContributionIdentifier(latestIdentifier -> {
|
||||
if (latestIdentifier != null && !latestIdentifier.equals(lastKnownIdentifier)) {
|
||||
lastKnownIdentifier = latestIdentifier;
|
||||
fetchAllContributions(); // Fetch the full list of contributions
|
||||
}
|
||||
return Unit.INSTANCE; // Explicitly return Unit for Kotlin compatibility
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch new contributions from the server and append them to the existing list.
|
||||
*/
|
||||
private void fetchNewContributions() {
|
||||
contributionsRemoteDataSource.fetchContributions(new ContributionsRemoteDataSource.LoadCallback<Contribution>() {
|
||||
private void fetchAllContributions() {
|
||||
contributionsRemoteDataSource.fetchAllContributions(new ContributionsRemoteDataSource.LoadCallback<Contribution>() {
|
||||
@Override
|
||||
public void onResult(List<Contribution> newContributions) {
|
||||
if (newContributions != null && !newContributions.isEmpty()) {
|
||||
appendContributions(newContributions); // Add new contributions
|
||||
existingContributions.clear();
|
||||
existingContributions.addAll(newContributions);
|
||||
liveData.postValue(existingContributions); // Update liveData with the new list
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -25,14 +25,14 @@ class ContributionsRemoteDataSource
|
|||
params: LoadInitialParams<Int>,
|
||||
callback: LoadInitialCallback<Contribution>,
|
||||
) {
|
||||
fetchContributions(callback)
|
||||
fetchAllContributions(callback)
|
||||
}
|
||||
|
||||
override fun loadAfter(
|
||||
params: LoadParams<Int>,
|
||||
callback: LoadCallback<Contribution>,
|
||||
) {
|
||||
fetchContributions(callback)
|
||||
fetchAllContributions(callback)
|
||||
}
|
||||
|
||||
override fun loadBefore(
|
||||
|
|
@ -46,7 +46,7 @@ class ContributionsRemoteDataSource
|
|||
/**
|
||||
* Fetches contributions using the MediaWiki API
|
||||
*/
|
||||
public fun fetchContributions(callback: LoadCallback<Contribution>) {
|
||||
fun fetchAllContributions(callback: LoadCallback<Contribution>) {
|
||||
if (userName.isNullOrEmpty()) {
|
||||
Timber.e("Failed to fetch contributions: userName is null or empty")
|
||||
return
|
||||
|
|
@ -61,8 +61,9 @@ class ContributionsRemoteDataSource
|
|||
Contribution(media = it, state = Contribution.STATE_COMPLETED)
|
||||
}
|
||||
}.subscribeOn(ioThreadScheduler)
|
||||
.subscribe({
|
||||
callback.onResult(it)
|
||||
.subscribe({ contributions ->
|
||||
// Pass the contributions to the callback
|
||||
callback.onResult(contributions)
|
||||
}) { error: Throwable ->
|
||||
Timber.e(
|
||||
"Failed to fetch contributions: %s",
|
||||
|
|
@ -71,6 +72,30 @@ class ContributionsRemoteDataSource
|
|||
},
|
||||
)
|
||||
}
|
||||
/**
|
||||
* Fetches the latest contribution identifier only
|
||||
*/
|
||||
fun fetchLatestContributionIdentifier(callback: (String?) -> Unit) {
|
||||
if (userName.isNullOrEmpty()) {
|
||||
Timber.e("Failed to fetch latest contribution: userName is null or empty")
|
||||
return
|
||||
}
|
||||
Timber.d("Fetching latest contribution identifier for user: $userName")
|
||||
|
||||
compositeDisposable.add(
|
||||
mediaClient.getMediaListForUser(userName!!)
|
||||
.map { mediaList ->
|
||||
mediaList.firstOrNull()?.pageId.toString() // Extract the first contribution's pageId
|
||||
}
|
||||
.subscribeOn(ioThreadScheduler)
|
||||
.subscribe({ latestIdentifier ->
|
||||
callback(latestIdentifier)
|
||||
}) { error: Throwable ->
|
||||
Timber.e("Failed to fetch latest contribution identifier: %s", error.message)
|
||||
callback(null)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
fun dispose() {
|
||||
compositeDisposable.dispose()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue