Add folder insertion with RxJava and DiffUtil to fastAdapter (needs some improvements though)

This commit is contained in:
Shinokuni 2019-03-05 18:21:13 +01:00
parent bd3f279d0a
commit 652ce8b629
6 changed files with 132 additions and 12 deletions
app/src/main

@ -2,21 +2,40 @@ package com.readrops.app.activities;
import android.arch.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.util.DiffUtil;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.InputType;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.mikepenz.fastadapter.FastAdapter;
import com.mikepenz.fastadapter.IInterceptor;
import com.mikepenz.fastadapter.adapters.ModelAdapter;
import com.mikepenz.fastadapter.commons.utils.DiffCallback;
import com.mikepenz.fastadapter.commons.utils.DiffCallbackImpl;
import com.mikepenz.fastadapter.commons.utils.FastAdapterDiffUtil;
import com.readrops.app.database.entities.Folder;
import com.readrops.app.views.EditFeedDialog;
import com.readrops.app.views.FeedWithFolderItem;
import com.readrops.app.viewmodels.ManageFeedsViewModel;
import com.readrops.app.R;
import com.readrops.app.database.pojo.FeedWithFolder;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import io.reactivex.Scheduler;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.observers.DisposableCompletableObserver;
import io.reactivex.schedulers.Schedulers;
public class ManageFeedsActivity extends AppCompatActivity {
private RecyclerView recyclerView;
@ -50,13 +69,55 @@ public class ManageFeedsActivity extends AppCompatActivity {
});
fastAdapter = FastAdapter.with(itemAdapter);
recyclerView.setAdapter(fastAdapter);
viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(ManageFeedsViewModel.class);
viewModel.getFeedsWithFolder().observe(this, feedWithFolders -> {
itemAdapter.add(feedWithFolders);
fastAdapter.notifyAdapterDataSetChanged();
List<FeedWithFolderItem> items = new ArrayList<>();
for (FeedWithFolder feedWithFolder : feedWithFolders) {
FeedWithFolderItem folderItem = new FeedWithFolderItem(feedWithFolder);
folderItem.setListener(new FeedWithFolderItem.ManageFeedsListener() {
@Override
public void onEdit(FeedWithFolder feedWithFolder) {
openEditFeedDialog(feedWithFolder);
}
@Override
public void onDelete(FeedWithFolder feedWithFolder) {
}
});
items.add(folderItem);
}
if (items.size() > 0) {
DiffUtil.DiffResult diffResult = FastAdapterDiffUtil.calculateDiff(itemAdapter, items, new DiffCallback<FeedWithFolderItem>(){
@Override
public boolean areItemsTheSame(FeedWithFolderItem oldItem, FeedWithFolderItem newItem) {
return oldItem.getModel().getFeed().getId() == newItem.getModel().getFeed().getId();
}
@Override
public boolean areContentsTheSame(FeedWithFolderItem oldItem, FeedWithFolderItem newItem) {
FeedWithFolder feedWithFolder1 = oldItem.getModel();
FeedWithFolder feedWithFolder2 = newItem.getModel();
return feedWithFolder1.getFeed().getName().equals(feedWithFolder1.getFeed().getName()) &&
feedWithFolder1.getFeed().getUrl().equals(feedWithFolder2.getFeed().getUrl()) &&
feedWithFolder1.getFolder().getName().equals(feedWithFolder2.getFolder().getName());
}
@Nullable
@Override
public Object getChangePayload(FeedWithFolderItem oldItem, int oldItemPosition, FeedWithFolderItem newItem, int newItemPosition) {
return null;
}
});
FastAdapterDiffUtil.set(itemAdapter, diffResult);
}
});
}
@ -71,16 +132,49 @@ public class ManageFeedsActivity extends AppCompatActivity {
transaction.add(editFeedDialog, "").commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.feeds_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.add_folder:
addFolder();
return true;
}
return super.onOptionsItemSelected(item);
}
private void addFolder() {
new MaterialDialog.Builder(this)
.title(R.string.add_folder)
.positiveText(R.string.validate)
.input(R.string.folder, 0, (dialog, input) -> {
Folder folder = new Folder(input.toString());
viewModel.addFolder(folder)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableCompletableObserver() {
@Override
public void onComplete() {
Toast.makeText(getApplication(), "folder inserted", Toast.LENGTH_LONG).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(getApplication(), "error on folder insertion", Toast.LENGTH_LONG).show();
}
});
})
.show();
}
@Override
public void onBackPressed() {
finish();

@ -42,14 +42,7 @@ public abstract class ARepository {
public abstract void deleteFeed(Feed feed);
public Completable addFolder(String name) {
return Completable.create(emitter -> {
Folder folder = new Folder(name);
database.folderDao().insert(folder);
emitter.onComplete();
});
}
public abstract Completable addFolder(Folder folder);
public Completable deleteFolder(Folder folder) {
return Completable.create(emitter -> {

@ -6,6 +6,7 @@ import android.graphics.Bitmap;
import android.support.v7.graphics.Palette;
import android.util.Patterns;
import com.readrops.app.database.entities.Folder;
import com.readrops.app.database.pojo.FeedWithFolder;
import com.readrops.app.database.pojo.ItemWithFeed;
import com.readrops.app.database.entities.Feed;
@ -30,6 +31,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;
import io.reactivex.Completable;
public class LocalFeedRepository extends ARepository implements QueryCallback {
private static final String TAG = LocalFeedRepository.class.getSimpleName();
@ -112,6 +115,14 @@ public class LocalFeedRepository extends ARepository implements QueryCallback {
});
}
@Override
public Completable addFolder(Folder folder) {
return Completable.create(emitter -> {
database.folderDao().insert(folder);
emitter.onComplete();
});
}
@Override
public void onSyncSuccess(AFeed feed, RSSNetwork.RSSType type) {
switch (type) {

@ -12,6 +12,8 @@ import com.readrops.app.repositories.LocalFeedRepository;
import java.util.List;
import io.reactivex.Completable;
public class ManageFeedsViewModel extends AndroidViewModel {
private Database db;
@ -39,4 +41,8 @@ public class ManageFeedsViewModel extends AndroidViewModel {
public LiveData<List<Folder>> getFolders() {
return folders;
}
public Completable addFolder(Folder folder) {
return repository.addFolder(folder);
}
}

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,6h-8l-2,-2L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM19,14h-3v3h-2v-3h-3v-2h3L14,9h2v3h3v2z"/>
</vector>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add_folder"
android:title="@string/add_folder"
android:icon="@drawable/ic_new_folder"
app:showAsAction="ifRoom"/>
</menu>