From bc263a05f8eea5e4a010685e0c575076a8ab15e2 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 10 Mar 2019 20:01:55 +0100 Subject: [PATCH] Add feed insertion with multi selection in add fed activity --- .../app/activities/AddFeedActivity.java | 45 ++++++++++++++++--- .../app/repositories/ARepository.java | 3 ++ .../app/repositories/LocalFeedRepository.java | 13 ++++++ .../com/readrops/app/utils/ParsingResult.java | 22 ++++++++- .../app/viewmodels/AddFeedsViewModel.java | 27 +++++++++++ app/src/main/res/layout/activity_add_feed.xml | 2 +- app/src/main/res/layout/add_feed_item.xml | 30 ++++++++----- 7 files changed, 124 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java diff --git a/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java b/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java index 7904f1db..cb555ed7 100644 --- a/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java +++ b/app/src/main/java/com/readrops/app/activities/AddFeedActivity.java @@ -1,5 +1,8 @@ package com.readrops.app.activities; +import android.arch.lifecycle.AndroidViewModel; +import android.arch.lifecycle.ViewModelProvider; +import android.arch.lifecycle.ViewModelProviders; import android.support.design.widget.TextInputEditText; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; @@ -7,29 +10,32 @@ import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Patterns; +import android.util.SparseBooleanArray; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; +import android.widget.Toast; import com.mikepenz.fastadapter.FastAdapter; -import com.mikepenz.fastadapter.IAdapter; import com.mikepenz.fastadapter.adapters.ItemAdapter; -import com.mikepenz.fastadapter.listeners.OnClickListener; import com.readrops.app.R; import com.readrops.app.utils.HtmlParser; import com.readrops.app.utils.Utils; import com.readrops.app.utils.ParsingResult; +import com.readrops.app.viewmodels.AddFeedsViewModel; import com.readrops.readropslibrary.localfeed.RSSNetwork; import java.util.ArrayList; import java.util.List; +import io.reactivex.Scheduler; import io.reactivex.Single; import io.reactivex.SingleObserver; import io.reactivex.SingleOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; +import io.reactivex.observers.DisposableCompletableObserver; import io.reactivex.schedulers.Schedulers; public class AddFeedActivity extends AppCompatActivity implements View.OnClickListener { @@ -41,7 +47,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi private RecyclerView recyclerView; private ItemAdapter itemAdapter; - + private AddFeedsViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { @@ -57,10 +63,20 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi load.setOnClickListener(this); validate.setOnClickListener(this); + viewModel = ViewModelProviders.of(this).get(AddFeedsViewModel.class); + itemAdapter = new ItemAdapter<>(); FastAdapter fastAdapter = FastAdapter.with(itemAdapter); fastAdapter.withSelectable(true); fastAdapter.withOnClickListener((v, adapter, item, position) -> { + if (item.isChecked()) { + item.setChecked(false); + fastAdapter.notifyAdapterItemChanged(position); + } else { + item.setChecked(true); + fastAdapter.notifyAdapterItemChanged(position); + } + return true; }); @@ -81,7 +97,7 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi } break; case R.id.add_feed_ok: - exit(); + insertFeeds(); break; } } @@ -99,8 +115,27 @@ public class AddFeedActivity extends AppCompatActivity implements View.OnClickLi return true; } - private void exit() { + private void insertFeeds() { + List feedsToInsert = new ArrayList<>(); + for (ParsingResult result : itemAdapter.getAdapterItems()) { + if (result.isChecked()) + feedsToInsert.add(result); + } + viewModel.addFeeds(feedsToInsert) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new DisposableCompletableObserver() { + @Override + public void onComplete() { + Toast.makeText(getApplication(), "feeds inserted", Toast.LENGTH_LONG).show(); + } + + @Override + public void onError(Throwable e) { + Toast.makeText(getApplication(), "error on feed insertion", Toast.LENGTH_LONG).show(); + } + }); } private void loadFeed() { diff --git a/app/src/main/java/com/readrops/app/repositories/ARepository.java b/app/src/main/java/com/readrops/app/repositories/ARepository.java index e74a943e..eaf6dbce 100644 --- a/app/src/main/java/com/readrops/app/repositories/ARepository.java +++ b/app/src/main/java/com/readrops/app/repositories/ARepository.java @@ -11,6 +11,7 @@ import com.readrops.app.database.entities.Feed; import com.readrops.app.database.entities.Folder; import com.readrops.app.utils.ParsingResult; +import java.util.List; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -36,6 +37,8 @@ public abstract class ARepository { public abstract void addFeed(ParsingResult result); + public abstract Completable addFeeds(List results); + public abstract void updateFeed(Feed feed); public abstract void updateFeedWithFolder(FeedWithFolder feedWithFolder); diff --git a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java index e94547ac..a1d006f9 100644 --- a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java @@ -89,6 +89,19 @@ public class LocalFeedRepository extends ARepository implements QueryCallback { }); } + @Override + public Completable addFeeds(List results) { + return Completable.create(emitter -> { + for (ParsingResult result : results) { + RSSNetwork rssNet = new RSSNetwork(); + rssNet.setCallback(this); + rssNet.requestUrl(result.getUrl(), new HashMap<>()); + } + + emitter.onComplete(); + }); + } + @Override public void updateFeed(Feed feed) { executor.execute(() -> { diff --git a/app/src/main/java/com/readrops/app/utils/ParsingResult.java b/app/src/main/java/com/readrops/app/utils/ParsingResult.java index 5c9b067e..eb359f7d 100644 --- a/app/src/main/java/com/readrops/app/utils/ParsingResult.java +++ b/app/src/main/java/com/readrops/app/utils/ParsingResult.java @@ -2,6 +2,7 @@ package com.readrops.app.utils; import android.support.annotation.NonNull; import android.view.View; +import android.widget.CheckBox; import android.widget.TextView; import com.mikepenz.fastadapter.FastAdapter; @@ -16,6 +17,8 @@ public class ParsingResult extends AbstractItem payloads) { - feedLabel.setText(item.getLabel()); + if (item.getLabel() != null) + feedLabel.setText(item.getLabel()); + else + feedLabel.setVisibility(View.GONE); + feedUrl.setText(item.getUrl()); + + checkBox.setChecked(item.isChecked()); + checkBox.setClickable(false); } @Override diff --git a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java new file mode 100644 index 00000000..260e2d59 --- /dev/null +++ b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java @@ -0,0 +1,27 @@ +package com.readrops.app.viewmodels; + +import android.app.Application; +import android.arch.lifecycle.AndroidViewModel; +import android.support.annotation.NonNull; + +import com.readrops.app.repositories.LocalFeedRepository; +import com.readrops.app.utils.ParsingResult; + +import java.util.List; + +import io.reactivex.Completable; + +public class AddFeedsViewModel extends AndroidViewModel { + + private LocalFeedRepository repository; + + public AddFeedsViewModel(@NonNull Application application) { + super(application); + + repository = new LocalFeedRepository(application); + } + + public Completable addFeeds(List results) { + return repository.addFeeds(results); + } +} diff --git a/app/src/main/res/layout/activity_add_feed.xml b/app/src/main/res/layout/activity_add_feed.xml index 6496b891..3a5e1166 100644 --- a/app/src/main/res/layout/activity_add_feed.xml +++ b/app/src/main/res/layout/activity_add_feed.xml @@ -71,7 +71,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/add_feed_main_layout" - android:enabled="false"/> + android:enabled="true"/> \ No newline at end of file diff --git a/app/src/main/res/layout/add_feed_item.xml b/app/src/main/res/layout/add_feed_item.xml index ab436eb0..aba1983c 100644 --- a/app/src/main/res/layout/add_feed_item.xml +++ b/app/src/main/res/layout/add_feed_item.xml @@ -1,35 +1,43 @@ - + + + tools:text="Link description" + tools:visibility="visible" /> - \ No newline at end of file + \ No newline at end of file