- Rewrote Category to Kotlin

- Moved category to ui
- Reworked Animation (smoother)
- Updated TextDrawable
This commit is contained in:
NoodleMage
2016-02-24 11:48:21 +01:00
parent 144d315e27
commit 9f78c8f6b4
29 changed files with 624 additions and 415 deletions
@@ -38,7 +38,7 @@ import eu.kanade.tachiyomi.data.io.IOHandler;
import eu.kanade.tachiyomi.data.library.LibraryUpdateService;
import eu.kanade.tachiyomi.event.LibraryMangasEvent;
import eu.kanade.tachiyomi.ui.base.fragment.BaseRxFragment;
import eu.kanade.tachiyomi.ui.library.category.CategoryActivity;
import eu.kanade.tachiyomi.ui.category.CategoryActivity;
import eu.kanade.tachiyomi.ui.main.MainActivity;
import eu.kanade.tachiyomi.util.ToastUtil;
import icepick.State;
@@ -1,180 +0,0 @@
package eu.kanade.tachiyomi.ui.library.category;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.Menu;
import android.view.MenuItem;
import com.afollestad.materialdialogs.MaterialDialog;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import eu.kanade.tachiyomi.R;
import eu.kanade.tachiyomi.data.database.models.Category;
import eu.kanade.tachiyomi.ui.base.activity.BaseRxActivity;
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder;
import eu.kanade.tachiyomi.ui.base.adapter.OnStartDragListener;
import eu.kanade.tachiyomi.ui.decoration.DividerItemDecoration;
import eu.kanade.tachiyomi.ui.library.LibraryCategoryAdapter;
import nucleus.factory.RequiresPresenter;
import rx.Observable;
@RequiresPresenter(CategoryPresenter.class)
public class CategoryActivity extends BaseRxActivity<CategoryPresenter> implements
ActionMode.Callback, FlexibleViewHolder.OnListItemClickListener, OnStartDragListener {
@Bind(R.id.toolbar) Toolbar toolbar;
@Bind(R.id.categories_list) RecyclerView recycler;
@Bind(R.id.fab) FloatingActionButton fab;
private CategoryAdapter adapter;
private ActionMode actionMode;
private ItemTouchHelper touchHelper;
public static Intent newIntent(Context context) {
return new Intent(context, CategoryActivity.class);
}
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
setContentView(R.layout.activity_edit_categories);
ButterKnife.bind(this);
setupToolbar(toolbar);
adapter = new CategoryAdapter(this);
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setHasFixedSize(true);
recycler.setAdapter(adapter);
recycler.addItemDecoration(new DividerItemDecoration(
ResourcesCompat.getDrawable(getResources(), R.drawable.line_divider, null)));
// Touch helper to drag and reorder categories
touchHelper = new ItemTouchHelper(new CategoryItemTouchHelper(adapter));
touchHelper.attachToRecyclerView(recycler);
fab.setOnClickListener(v -> {
new MaterialDialog.Builder(this)
.title(R.string.action_add_category)
.input(R.string.name, 0, false, (dialog, input) -> {
getPresenter().createCategory(input.toString());
})
.show();
});
}
public void setCategories(List<Category> categories) {
destroyActionModeIfNeeded();
adapter.setItems(categories);
}
private List<Category> getSelectedCategories() {
// Create a blocking copy of the selected categories
return Observable.from(adapter.getSelectedItems())
.map(adapter::getItem).toList().toBlocking().single();
}
@Override
public boolean onListItemClick(int position) {
if (actionMode != null && position != -1) {
toggleSelection(position);
return true;
} else {
return false;
}
}
@Override
public void onListItemLongClick(int position) {
if (actionMode == null)
actionMode = startSupportActionMode(this);
toggleSelection(position);
}
private void toggleSelection(int position) {
adapter.toggleSelection(position, false);
int count = adapter.getSelectedItemCount();
if (count == 0) {
actionMode.finish();
} else {
setContextTitle(count);
actionMode.invalidate();
MenuItem editItem = actionMode.getMenu().findItem(R.id.action_edit);
editItem.setVisible(count == 1);
}
}
private void setContextTitle(int count) {
actionMode.setTitle(getString(R.string.label_selected, count));
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.category_selection, menu);
adapter.setMode(LibraryCategoryAdapter.MODE_MULTI);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete:
deleteCategories(getSelectedCategories());
return true;
case R.id.action_edit:
editCategory(getSelectedCategories().get(0));
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
adapter.setMode(LibraryCategoryAdapter.MODE_SINGLE);
adapter.clearSelection();
actionMode = null;
}
public void destroyActionModeIfNeeded() {
if (actionMode != null) {
actionMode.finish();
}
}
private void deleteCategories(List<Category> categories) {
getPresenter().deleteCategories(categories);
}
private void editCategory(Category category) {
new MaterialDialog.Builder(this)
.title(R.string.action_rename_category)
.input(getString(R.string.name), category.name, false, (dialog, input) -> {
getPresenter().renameCategory(category, input.toString());
})
.show();
}
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
touchHelper.startDrag(viewHolder);
}
}
@@ -1,80 +0,0 @@
package eu.kanade.tachiyomi.ui.library.category;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import eu.davidea.flexibleadapter.FlexibleAdapter;
import eu.kanade.tachiyomi.R;
import eu.kanade.tachiyomi.data.database.models.Category;
import eu.kanade.tachiyomi.ui.base.adapter.ItemTouchHelperAdapter;
public class CategoryAdapter extends FlexibleAdapter<CategoryHolder, Category> implements
ItemTouchHelperAdapter {
private final CategoryActivity activity;
private final ColorGenerator generator;
public CategoryAdapter(CategoryActivity activity) {
this.activity = activity;
generator = ColorGenerator.DEFAULT;
setHasStableIds(true);
}
public void setItems(List<Category> items) {
mItems = new ArrayList<>(items);
notifyDataSetChanged();
}
@Override
public long getItemId(int position) {
return mItems.get(position).id;
}
@Override
public void updateDataSet(String param) {
}
@Override
public CategoryHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = activity.getLayoutInflater();
View v = inflater.inflate(R.layout.item_edit_categories, parent, false);
return new CategoryHolder(v, this, activity, activity);
}
@Override
public void onBindViewHolder(CategoryHolder holder, int position) {
final Category category = getItem(position);
holder.onSetValues(category, generator);
//When user scrolls this bind the correct selection status
holder.itemView.setActivated(isSelected(position));
}
@Override
public void onItemMove(int fromPosition, int toPosition) {
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(mItems, i, i + 1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mItems, i, i - 1);
}
}
activity.getPresenter().reorderCategories(mItems);
}
@Override
public void onItemDismiss(int position) {
}
}
@@ -1,58 +0,0 @@
package eu.kanade.tachiyomi.ui.library.category;
import android.support.v4.view.MotionEventCompat;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.amulyakhare.textdrawable.TextDrawable;
import com.amulyakhare.textdrawable.util.ColorGenerator;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import eu.kanade.tachiyomi.R;
import eu.kanade.tachiyomi.data.database.models.Category;
import eu.kanade.tachiyomi.ui.base.adapter.FlexibleViewHolder;
import eu.kanade.tachiyomi.ui.base.adapter.OnStartDragListener;
public class CategoryHolder extends FlexibleViewHolder {
private View view;
@Bind(R.id.image) ImageView image;
@Bind(R.id.title) TextView title;
@Bind(R.id.reorder) ImageView reorder;
public CategoryHolder(View view, CategoryAdapter adapter,
OnListItemClickListener listener, OnStartDragListener dragListener) {
super(view, adapter, listener);
ButterKnife.bind(this, view);
this.view = view;
reorder.setOnTouchListener((v, event) -> {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
dragListener.onStartDrag(this);
return true;
}
return false;
});
}
public void onSetValues(Category category, ColorGenerator generator) {
title.setText(category.name);
image.setImageDrawable(getRound(category.name.substring(0, 1), generator));
}
private TextDrawable getRound(String text, ColorGenerator generator) {
return TextDrawable.builder().buildRound(text, generator.getColor(text));
}
@OnClick(R.id.image)
void onImageClick() {
// Simulate long click on this view to enter selection mode
onLongClick(view);
}
}
@@ -1,16 +0,0 @@
package eu.kanade.tachiyomi.ui.library.category;
import eu.kanade.tachiyomi.ui.base.adapter.ItemTouchHelperAdapter;
import eu.kanade.tachiyomi.ui.base.adapter.SimpleItemTouchHelperCallback;
public class CategoryItemTouchHelper extends SimpleItemTouchHelperCallback {
public CategoryItemTouchHelper(ItemTouchHelperAdapter adapter) {
super(adapter);
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
}
@@ -1,68 +0,0 @@
package eu.kanade.tachiyomi.ui.library.category;
import android.os.Bundle;
import java.util.List;
import javax.inject.Inject;
import eu.kanade.tachiyomi.data.database.DatabaseHelper;
import eu.kanade.tachiyomi.data.database.models.Category;
import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter;
import rx.android.schedulers.AndroidSchedulers;
public class CategoryPresenter extends BasePresenter<CategoryActivity> {
@Inject DatabaseHelper db;
private List<Category> categories;
private static final int GET_CATEGORIES = 1;
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
restartableLatestCache(GET_CATEGORIES,
() -> db.getCategories().asRxObservable()
.doOnNext(categories -> this.categories = categories)
.observeOn(AndroidSchedulers.mainThread()),
CategoryActivity::setCategories);
start(GET_CATEGORIES);
}
public void createCategory(String name) {
Category cat = Category.create(name);
// Set the new item in the last position
int max = 0;
if (categories != null) {
for (Category cat2 : categories) {
if (cat2.order > max) {
max = cat2.order + 1;
}
}
}
cat.order = max;
db.insertCategory(cat).asRxObservable().subscribe();
}
public void deleteCategories(List<Category> categories) {
db.deleteCategories(categories).asRxObservable().subscribe();
}
public void reorderCategories(List<Category> categories) {
for (int i = 0; i < categories.size(); i++) {
categories.get(i).order = i;
}
db.insertCategories(categories).asRxObservable().subscribe();
}
public void renameCategory(Category category, String name) {
category.name = name;
db.insertCategory(category).asRxObservable().subscribe();
}
}