Add a progress bar in the folder layout to represent the number of feeds by folder out of the max number of feeds

This commit is contained in:
Shinokuni 2019-12-30 13:52:24 +01:00
parent eca546bea7
commit aa26886894
4 changed files with 59 additions and 19 deletions

View File

@ -21,6 +21,7 @@ import java.util.List;
public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdapter.FolderViewHolder> { public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdapter.FolderViewHolder> {
private ManageFoldersListener listener; private ManageFoldersListener listener;
private int totalFeedCount;
public FoldersAdapter(ManageFoldersListener listener) { public FoldersAdapter(ManageFoldersListener listener) {
super(DIFF_CALLBACK); super(DIFF_CALLBACK);
@ -28,6 +29,9 @@ public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdap
this.listener = listener; this.listener = listener;
} }
public void setTotalFeedCount(int totalFeedCount) {
this.totalFeedCount = totalFeedCount;
}
private static final DiffUtil.ItemCallback<FolderWithFeedCount> DIFF_CALLBACK = new DiffUtil.ItemCallback<FolderWithFeedCount>() { private static final DiffUtil.ItemCallback<FolderWithFeedCount> DIFF_CALLBACK = new DiffUtil.ItemCallback<FolderWithFeedCount>() {
@Override @Override
@ -59,13 +63,10 @@ public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdap
@Override @Override
public void onBindViewHolder(@NonNull FolderViewHolder holder, int position, @NonNull List<Object> payloads) { public void onBindViewHolder(@NonNull FolderViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.size() > 0) { if (!payloads.isEmpty()) {
FolderWithFeedCount folder = (FolderWithFeedCount) payloads.get(0); FolderWithFeedCount folderWithFeedCount = (FolderWithFeedCount) payloads.get(0);
holder.binding.folderName.setText(folder.getFolder().getName()); holder.bind(folderWithFeedCount);
int stringRes = folder.getFeedCount() > 1 ? R.string.feeds_number : R.string.feed_number;
holder.binding.folderFeedsCount.setText(holder.itemView.getContext().getString(stringRes, String.valueOf(folder.getFeedCount())));
} else } else
onBindViewHolder(holder, position); onBindViewHolder(holder, position);
@ -73,18 +74,10 @@ public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdap
@Override @Override
public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) { public void onBindViewHolder(@NonNull FolderViewHolder holder, int position) {
FolderWithFeedCount folder = getItem(position); FolderWithFeedCount folderWithFeedCount = getItem(position);
holder.binding.folderName.setText(folder.getFolder().getName()); holder.bind(folderWithFeedCount);
holder.itemView.setOnClickListener(v -> listener.onClick(folderWithFeedCount.getFolder()));
int stringRes = folder.getFeedCount() > 1 ? R.string.feeds_number : R.string.feed_number;
holder.binding.folderFeedsCount.setText(holder.itemView.getContext().getString(stringRes, String.valueOf(folder.getFeedCount())));
holder.itemView.setOnClickListener(v -> listener.onClick(folder.getFolder()));
}
public Folder getFolder(int position) {
return getItem(position).getFolder();
} }
public interface ManageFoldersListener { public interface ManageFoldersListener {
@ -100,5 +93,15 @@ public class FoldersAdapter extends ListAdapter<FolderWithFeedCount, FoldersAdap
this.binding = binding; this.binding = binding;
} }
private void bind(FolderWithFeedCount folderWithFeedCount) {
binding.folderName.setText(folderWithFeedCount.getFolder().getName());
int stringRes = folderWithFeedCount.getFeedCount() > 1 ? R.string.feeds_number : R.string.feed_number;
binding.folderFeedsCount.setText(itemView.getContext().getString(stringRes, String.valueOf(folderWithFeedCount.getFeedCount())));
binding.folderProgressBar.setMax(totalFeedCount);
binding.folderProgressBar.setProgress(folderWithFeedCount.getFeedCount());
}
} }
} }

View File

@ -27,6 +27,7 @@ import com.readrops.readropslibrary.utils.ConflictException;
import com.readrops.readropslibrary.utils.UnknownFormatException; import com.readrops.readropslibrary.utils.UnknownFormatException;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.observers.DisposableSingleObserver;
import io.reactivex.schedulers.Schedulers; import io.reactivex.schedulers.Schedulers;
import static com.readrops.app.utils.ReadropsKeys.ACCOUNT; import static com.readrops.app.utils.ReadropsKeys.ACCOUNT;
@ -68,10 +69,28 @@ public class FoldersFragment extends Fragment {
viewModel = ViewModelProviders.of(this).get(ManageFeedsFoldersViewModel.class); viewModel = ViewModelProviders.of(this).get(ManageFeedsFoldersViewModel.class);
viewModel.setAccount(account); viewModel.setAccount(account);
viewModel.getFeedCountByAccount()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableSingleObserver<Integer>() {
@Override
public void onSuccess(Integer feedCount) {
adapter.setTotalFeedCount(feedCount);
getFoldersWithFeedCount();
}
@Override
public void onError(Throwable e) {
Utils.showSnackbar(binding.foldersRoot, e.getMessage());
}
});
}
private void getFoldersWithFeedCount() {
viewModel.getFoldersWithFeedCount().observe(this, folders -> { viewModel.getFoldersWithFeedCount().observe(this, folders -> {
adapter.submitList(folders); adapter.submitList(folders);
if (folders.size() > 0) { if (!folders.isEmpty()) {
binding.foldersEmptyList.setVisibility(View.GONE); binding.foldersEmptyList.setVisibility(View.GONE);
} else { } else {
binding.foldersEmptyList.setVisibility(View.VISIBLE); binding.foldersEmptyList.setVisibility(View.VISIBLE);

View File

@ -85,4 +85,8 @@ public class ManageFeedsFoldersViewModel extends AndroidViewModel {
public Completable deleteFeed(Feed feed) { public Completable deleteFeed(Feed feed) {
return repository.deleteFeed(feed); return repository.deleteFeed(feed);
} }
public Single<Integer> getFeedCountByAccount() {
return db.feedDao().getFeedCount(account.getId());
}
} }

View File

@ -15,7 +15,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:padding="8dp"> android:paddingTop="8dp">
<TextView <TextView
android:id="@+id/folder_name" android:id="@+id/folder_name"
@ -23,6 +23,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_marginStart="8dp"
android:layout_toStartOf="@id/folder_feeds_count" android:layout_toStartOf="@id/folder_feeds_count"
tools:text="Folder 1" /> tools:text="Folder 1" />
@ -32,8 +33,21 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginEnd="8dp"
tools:text="15 feeds" /> tools:text="15 feeds" />
<ProgressBar
android:id="@+id/folder_progress_bar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_below="@id/folder_name"
android:layout_alignParentStart="true"
android:layout_marginTop="6dp"
android:background="@android:color/transparent"
tools:max="100"
tools:progress="50" />
</RelativeLayout> </RelativeLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>