Local account : synchronize only the selected feed

This commit is contained in:
Shinokuni 2021-10-30 19:38:05 +02:00
parent 8f093eb4a2
commit 1e29b26dc5
8 changed files with 61 additions and 48 deletions

View File

@ -75,7 +75,7 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import io.reactivex.Observer;
import io.reactivex.CompletableObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableSingleObserver;
@ -622,10 +622,20 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
}
private void sync(@Nullable List<Feed> feeds) {
viewModel.sync(feeds)
viewModel.sync(feeds, feed -> {
if (viewModel.isAccountLocal() && feedNb > 0) {
binding.syncProgressTextView.setText(getString(R.string.updating_feed, feed.getName()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
binding.syncProgressBar.setProgress((feedCount * 100) / feedNb, true);
} else
binding.syncProgressBar.setProgress((feedCount * 100) / feedNb);
}
feedCount++;
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Feed>() {
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(@NonNull Disposable d) {
syncDisposable = d;
@ -636,30 +646,6 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
}
}
@Override
public void onNext(@NonNull Feed feed) {
if (viewModel.isAccountLocal() && feedNb > 0) {
binding.syncProgressTextView.setText(getString(R.string.updating_feed, feed.getName()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
binding.syncProgressBar.setProgress((feedCount * 100) / feedNb, true);
} else
binding.syncProgressBar.setProgress((feedCount * 100) / feedNb);
}
feedCount++;
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
binding.swipeRefreshLayout.setRefreshing(false);
binding.syncProgressLayout.setVisibility(View.GONE);
Utils.showSnackbar(binding.mainRoot, e.getMessage());
drawerManager.enableAccountSelection();
updating = false;
}
@Override
public void onComplete() {
viewModel.invalidate();
@ -682,6 +668,16 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou
updateDrawerFeeds(); // update drawer after syncing feeds
updating = false;
}
@Override
public void onError(@NonNull Throwable e) {
binding.swipeRefreshLayout.setRefreshing(false);
binding.syncProgressLayout.setVisibility(View.GONE);
Utils.showSnackbar(binding.mainRoot, e.getMessage());
drawerManager.enableAccountSelection();
updating = false;
}
});
}

View File

@ -9,10 +9,9 @@ import androidx.paging.LivePagedListBuilder;
import androidx.paging.PagedList;
import com.readrops.app.repositories.ARepository;
import com.readrops.app.repositories.FeedUpdate;
import com.readrops.app.utils.SharedPreferencesManager;
import com.readrops.db.Database;
import com.readrops.db.queries.ItemsQueryBuilder;
import com.readrops.db.queries.QueryFilters;
import com.readrops.db.RoomFactoryWrapper;
import com.readrops.db.entities.Feed;
import com.readrops.db.entities.Folder;
@ -21,17 +20,19 @@ import com.readrops.db.entities.account.Account;
import com.readrops.db.filters.FilterType;
import com.readrops.db.filters.ListSortType;
import com.readrops.db.pojo.ItemWithFeed;
import com.readrops.db.queries.ItemsQueryBuilder;
import com.readrops.db.queries.QueryFilters;
import org.koin.core.parameter.ParametersHolderKt;
import org.koin.java.KoinJavaComponent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
@ -123,9 +124,17 @@ public class MainViewModel extends ViewModel {
return itemsWithFeed;
}
public Observable<Feed> sync(List<Feed> feeds) {
public Completable sync(List<Feed> feeds, FeedUpdate update) {
itemsWithFeed.removeSource(lastFetch);
return repository.sync(feeds);
// get current viewed feed
if (feeds == null && queryFilters.getFilterType() == FilterType.FEED_FILTER) {
return Single.<Feed>create(emitter -> emitter.onSuccess(database.feedDao()
.getFeedById(queryFilters.getFilterFeedId())))
.flatMapCompletable(feed -> repository.sync(Collections.singletonList(feed), update));
}
return repository.sync(feeds, update);
}
public Single<Integer> getFeedCount() {

View File

@ -54,7 +54,7 @@ class SyncWorker(context: Context, parameters: WorkerParameters) : Worker(contex
val repository = get<ARepository>(parameters = { parametersOf(it) })
disposable = repository.sync(null)
disposable = repository.sync(null, null)
.doOnError { throwable ->
result = Result.failure()
Log.e(TAG, throwable.message!!, throwable)

View File

@ -1,5 +1,7 @@
package com.readrops.app.repositories;
import static com.readrops.app.utils.ReadropsKeys.FEEDS;
import android.content.Context;
import android.content.Intent;
@ -29,11 +31,8 @@ import java.util.Map;
import java.util.TreeMap;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import static com.readrops.app.utils.ReadropsKeys.FEEDS;
public abstract class ARepository {
protected Context context;
@ -57,7 +56,7 @@ public abstract class ARepository {
public abstract Completable login(Account account, boolean insert);
public abstract Observable<Feed> sync(List<Feed> feeds);
public abstract Completable sync(@Nullable List<Feed> feeds, @Nullable FeedUpdate update);
public abstract Single<List<FeedInsertionResult>> addFeeds(List<ParsingResult> results);

View File

@ -0,0 +1,9 @@
package com.readrops.app.repositories
import com.readrops.db.entities.Feed
interface FeedUpdate {
fun onNext(feed: Feed)
}

View File

@ -31,7 +31,6 @@ import java.util.Map;
import java.util.stream.Collectors;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
public class FreshRSSRepository extends ARepository {
@ -79,7 +78,7 @@ public class FreshRSSRepository extends ARepository {
}
@Override
public Observable<Feed> sync(List<Feed> feeds) {
public Completable sync(@Nullable List<Feed> feeds, @Nullable FeedUpdate update) {
FreshRSSSyncData syncData = new FreshRSSSyncData();
SyncType syncType;
@ -119,7 +118,7 @@ public class FreshRSSRepository extends ARepository {
emitter.onSuccess(syncData);
}).flatMap(syncData1 -> dataSource.sync(syncType, syncData1, account.getWriteToken()))
.flatMapObservable(syncResult -> {
.flatMapCompletable(syncResult -> {
logger.addSplit("server queries");
insertFolders(syncResult.getFolders());
@ -145,7 +144,7 @@ public class FreshRSSRepository extends ARepository {
this.syncResult = syncResult;
return Observable.empty();
return Completable.complete();
});
}

View File

@ -2,6 +2,8 @@ package com.readrops.app.repositories;
import android.accounts.NetworkErrorException;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import androidx.annotation.NonNull;
@ -30,7 +32,6 @@ import java.util.Collections;
import java.util.List;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import kotlin.Pair;
import okhttp3.Headers;
@ -54,8 +55,8 @@ public class LocalFeedRepository extends ARepository {
}
@Override
public Observable<Feed> sync(@Nullable List<Feed> feeds) {
return Observable.create(emitter -> {
public Completable sync(@Nullable List<Feed> feeds, FeedUpdate update) {
return Completable.create(emitter -> {
List<Feed> feedList;
if (feeds == null || feeds.isEmpty()) {
@ -65,7 +66,8 @@ public class LocalFeedRepository extends ARepository {
}
for (Feed feed : feedList) {
emitter.onNext(feed);
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> update.onNext(feed));
try {
Headers.Builder headers = new Headers.Builder();

View File

@ -33,7 +33,6 @@ import java.util.List;
import java.util.stream.Collectors;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Single;
import okhttp3.OkHttpClient;
@ -74,9 +73,9 @@ public class NextNewsRepository extends ARepository {
}
@Override
public Observable<Feed> sync(List<Feed> feeds) {
public Completable sync(@Nullable List<Feed> feeds, @Nullable FeedUpdate update) {
setCredentials(account);
return Observable.create(emitter -> {
return Completable.create(emitter -> {
try {
long lastModified = LocalDateTime.now().toDateTime().getMillis();
SyncType syncType;