Skip to content

Commit

Permalink
Use multiple threads for refreshing feeds (#7126)
Browse files Browse the repository at this point in the history
  • Loading branch information
0x082c8bf1 committed Apr 27, 2024
1 parent d9d4867 commit f698225
Showing 1 changed file with 43 additions and 22 deletions.
Expand Up @@ -12,6 +12,7 @@
import androidx.core.content.ContextCompat;
import androidx.work.ForegroundInfo;
import androidx.work.WorkManager;
import java.util.concurrent.TimeUnit;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.google.common.util.concurrent.Futures;
Expand Down Expand Up @@ -39,6 +40,8 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FeedUpdateWorker extends Worker {
private static final String TAG = "FeedUpdateWorker";
Expand Down Expand Up @@ -127,36 +130,54 @@ private Notification createNotification(@Nullable List<Feed> toUpdate) {
.build();
}

private void updateNotification(List<Feed> toUpdate) {
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.POST_NOTIFICATIONS)
== PackageManager.PERMISSION_GRANTED) {
notificationManager.notify(R.id.notification_updating_feeds, createNotification(toUpdate));
}
}

@NonNull
@Override
public ListenableFuture getForegroundInfoAsync() {
return Futures.immediateFuture(new ForegroundInfo(R.id.notification_updating_feeds, createNotification(null)));
}

private void refreshFeeds(List<Feed> toUpdate, boolean force) {
while (!toUpdate.isEmpty()) {
if (isStopped()) {
return;
}
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.POST_NOTIFICATIONS)
== PackageManager.PERMISSION_GRANTED) {
notificationManager.notify(R.id.notification_updating_feeds, createNotification(toUpdate));
}
Feed feed = toUpdate.get(0);
try {
if (feed.isLocalFeed()) {
LocalFeedUpdater.updateFeed(feed, getApplicationContext(), null);
} else {
refreshFeed(feed, force);
List<Feed> notificationRemainingFeeds = new ArrayList<>(toUpdate);
updateNotification(notificationRemainingFeeds);
ExecutorService executor = Executors.newFixedThreadPool(4);
for (Feed feed : toUpdate) {
executor.submit(() -> {
if (isStopped()) {
return;
}
} catch (Exception e) {
DBWriter.setFeedLastUpdateFailed(feed.getId(), true);
DownloadResult status = new DownloadResult(feed.getTitle(),
feed.getId(), Feed.FEEDFILETYPE_FEED, false,
DownloadError.ERROR_IO_ERROR, e.getMessage());
DBWriter.addDownloadStatus(status);
}
toUpdate.remove(0);
try {
if (feed.isLocalFeed()) {
LocalFeedUpdater.updateFeed(feed, getApplicationContext(), null);
} else {
refreshFeed(feed, force);
}
} catch (Exception e) {
DBWriter.setFeedLastUpdateFailed(feed.getId(), true);
DownloadResult status = new DownloadResult(feed.getTitle(),
feed.getId(), Feed.FEEDFILETYPE_FEED, false,
DownloadError.ERROR_IO_ERROR, e.getMessage());
DBWriter.addDownloadStatus(status);
}
synchronized (notificationRemainingFeeds) {
notificationRemainingFeeds.remove(feed);
if (!notificationRemainingFeeds.isEmpty()) {
updateNotification(notificationRemainingFeeds);
}
}
});
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
//~300 years have elapsed
}
}

Expand Down

0 comments on commit f698225

Please sign in to comment.