Add feed insertion with multi selection in add fed activity

This commit is contained in:
Shinokuni 2019-03-10 20:01:55 +01:00
parent 78f2b65a30
commit bc263a05f8
7 changed files with 124 additions and 18 deletions

View File

@ -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<ParsingResult> 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<ParsingResult> 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<ParsingResult> 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() {

View File

@ -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<ParsingResult> results);
public abstract void updateFeed(Feed feed);
public abstract void updateFeedWithFolder(FeedWithFolder feedWithFolder);

View File

@ -89,6 +89,19 @@ public class LocalFeedRepository extends ARepository implements QueryCallback {
});
}
@Override
public Completable addFeeds(List<ParsingResult> 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(() -> {

View File

@ -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<ParsingResult, ParsingResult.Par
private String label;
private boolean checked;
public ParsingResult(String url, String label) {
this.url = url;
this.label = label;
@ -37,6 +40,14 @@ public class ParsingResult extends AbstractItem<ParsingResult, ParsingResult.Par
this.label = label;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
public boolean isChecked() {
return checked;
}
@Override
public boolean isSelectable() {
return true;
@ -67,18 +78,27 @@ public class ParsingResult extends AbstractItem<ParsingResult, ParsingResult.Par
private TextView feedLabel;
private TextView feedUrl;
private CheckBox checkBox;
public ParsingResultViewHolder(View itemView) {
super(itemView);
feedLabel = itemView.findViewById(R.id.add_feed_item_label);
feedUrl = itemView.findViewById(R.id.add_feed_item_url);
checkBox = itemView.findViewById(R.id.add_feed_checkbox);
}
@Override
public void bindView(ParsingResult item, List<Object> 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

View File

@ -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<ParsingResult> results) {
return repository.addFeeds(results);
}
}

View File

@ -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"/>
</android.support.constraint.ConstraintLayout>

View File

@ -1,35 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:focusable="true"
android:clickable="true"
android:focusable="true"
android:padding="6dp">
<CheckBox
android:id="@+id/add_feed_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true" />
<TextView
android:id="@+id/add_feed_item_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginStart="8dp"
android:layout_marginBottom="6dp"
android:layout_toEndOf="@id/add_feed_checkbox"
android:ellipsize="end"
android:maxLines="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Link description" />
tools:text="Link description"
tools:visibility="visible" />
<TextView
android:id="@+id/add_feed_item_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_below="@id/add_feed_item_label"
android:layout_alignParentEnd="true"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/add_feed_checkbox"
android:ellipsize="end"
android:maxLines="2"
android:minLines="1"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/add_feed_item_label"
tools:text="feed url" />
</android.support.constraint.ConstraintLayout>
</RelativeLayout>