package com.yydcdut.note.presenters.setting.impl; import android.content.Context; import android.os.Handler; import android.os.Message; import com.yydcdut.note.R; import com.yydcdut.note.bus.CategoryDeleteEvent; import com.yydcdut.note.bus.CategoryEditEvent; import com.yydcdut.note.entity.Category; import com.yydcdut.note.entity.PhotoNote; import com.yydcdut.note.injector.ContextLife; import com.yydcdut.note.model.compare.ComparatorFactory; import com.yydcdut.note.model.rx.RxCategory; import com.yydcdut.note.model.rx.RxPhotoNote; import com.yydcdut.note.presenters.setting.IEditCategoryPresenter; import com.yydcdut.note.utils.FilePathUtils; import com.yydcdut.note.utils.YLog; import com.yydcdut.note.views.IView; import com.yydcdut.note.views.setting.IEditCategoryView; import org.greenrobot.eventbus.EventBus; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.inject.Inject; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; /** * Created by yuyidong on 15/11/15. */ public class EditCategoryPresenterImpl implements IEditCategoryPresenter, Handler.Callback { private static final int MESSAGE_RENAME_NONE = -1; private static final int MESSAGE_DELETE_NONE = -2; private static final int MESSAGE_FINISH = -3; private Context mContext; private IEditCategoryView mEditCategoryView; private Handler mHandler; private int mCurrentMessage = 0; /** * 要删除的category */ private List<Integer> mDeleteCategoryIdList; /** * 要重命名的category */ private Map<Integer, String> mRenameCategoryLabelMap; private RxCategory mRxCategory; private RxPhotoNote mRxPhotoNote; @Inject public EditCategoryPresenterImpl(@ContextLife("Activity") Context context, RxCategory rxCategory, RxPhotoNote rxPhotoNote) { mContext = context; mRxCategory = rxCategory; mRxPhotoNote = rxPhotoNote; } @Override public Context getContext() { return mContext; } @Override public void attachView(IView iView) { mHandler = new Handler(this); mDeleteCategoryIdList = new ArrayList<>(); mRenameCategoryLabelMap = new HashMap<>(); mEditCategoryView = (IEditCategoryView) iView; mRxCategory.getAllCategories() .observeOn(AndroidSchedulers.mainThread()) .subscribe(categories -> mEditCategoryView.showCategoryList(categories), (throwable -> YLog.e(throwable))); } @Override public void detachView() { mRxCategory.refreshCategories().subscribe((categories -> { }), (throwable -> YLog.e(throwable))); mRenameCategoryLabelMap.clear(); mDeleteCategoryIdList.clear(); } @Override public void renameCategory(int index, String newLabel) { if (newLabel.length() == 0) { mEditCategoryView.showSnackbar(mContext.getResources().getString(R.string.toast_fail)); return; } mRxCategory.getAllCategories() .map(categories -> categories.get(index)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(category1 -> { mRenameCategoryLabelMap.put(category1.getId(), newLabel); category1.setLabel(newLabel); mEditCategoryView.updateListView(); }, (throwable -> YLog.e(throwable))); } @Override public void deleteCategory(int index) { mRxCategory.getAllCategories() .map(categories -> { Category category = categories.get(index); categories.remove(category); return category; }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(category1 -> { mDeleteCategoryIdList.add(category1.getId()); mEditCategoryView.updateListView(); }, (throwable -> YLog.e(throwable))); } @Override public void doJob() { mEditCategoryView.showProgressBar(); renameCategories(); } private void sortCategories() { mRxCategory.updateOrder().subscribe(categories -> mHandler.sendEmptyMessage(1), (throwable -> YLog.e(throwable))); } /** * 重命名 */ private void renameCategories() { if (mRenameCategoryLabelMap.size() > 0) { mRxCategory.refreshCategories() .subscribe(categories1 -> { Iterator<Map.Entry<Integer, String>> iterator = mRenameCategoryLabelMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); Integer categoryId = entry.getKey(); String newLabel = entry.getValue(); mRxCategory.updateLabel(categoryId, newLabel) .subscribe(categories -> mHandler.sendEmptyMessage(1), (throwable -> YLog.e(throwable))); } }, (throwable -> YLog.e(throwable))); } else { mHandler.sendEmptyMessage(MESSAGE_RENAME_NONE); } } /** * 删除分类 */ private void deleteCategories() { if (mDeleteCategoryIdList.size() > 0) { mRxCategory.refreshCategories() .observeOn(Schedulers.io()) .subscribe(categories -> { for (int id : mDeleteCategoryIdList) { mRxPhotoNote.findByCategoryId(id, ComparatorFactory.FACTORY_NOT_SORT) .subscribe(photoNoteList -> { for (PhotoNote photoNote : photoNoteList) { FilePathUtils.deleteAllFiles(photoNote.getPhotoName()); } mRxPhotoNote.deletePhotoNotes(photoNoteList, id).subscribe((photoNoteList2 -> { }), (throwable -> YLog.e(throwable))); }, (throwable -> YLog.e(throwable))); mRxCategory.delete(id).subscribe(categories2 -> mHandler.sendEmptyMessage(1), (throwable -> YLog.e(throwable))); } }, (throwable -> YLog.e(throwable))); } else { mHandler.sendEmptyMessage(MESSAGE_DELETE_NONE); } } @Override public boolean handleMessage(Message msg) { switch (msg.what) { case MESSAGE_RENAME_NONE: deleteCategories(); return false; case MESSAGE_DELETE_NONE: sortCategories(); return false; case MESSAGE_FINISH: if (mDeleteCategoryIdList.size() > 0) { EventBus.getDefault().post(new CategoryDeleteEvent()); } else { EventBus.getDefault().post(new CategoryEditEvent()); } mEditCategoryView.hideProgressBar(); mEditCategoryView.finishActivity(); return false; default: mCurrentMessage++; break; } if (mCurrentMessage == mRenameCategoryLabelMap.size()) { deleteCategories(); } else if (mCurrentMessage == mRenameCategoryLabelMap.size() + mDeleteCategoryIdList.size()) { sortCategories(); } else if (mCurrentMessage == mRenameCategoryLabelMap.size() + mDeleteCategoryIdList.size() + 1) { mRxCategory.getAllCategories() .subscribe((categories -> { //todo 删除图片,删除PhotoNote boolean checked = false; for (Category category : categories) { checked |= category.isCheck(); } if (!checked && categories.size() > 0) { categories.get(0).setCheck(true); mRxCategory.updateCategory(categories.get(0)).subscribe(); } //todo 当所有的都没有了怎么办 }), (throwable -> YLog.e(throwable)), () -> mHandler.sendEmptyMessage(MESSAGE_FINISH)); } return false; } }