package app.fadai.supernote.module.notes.folder; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.support.design.widget.TextInputLayout; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import com.app.fadai.supernote.R; import java.util.ArrayList; import java.util.List; import app.fadai.supernote.adapter.RvEditFolderAdapter; import app.fadai.supernote.bean.NoteFolder; import app.fadai.supernote.constants.EditFolderConstans; import app.fadai.supernote.model.INoteFolderModel; import app.fadai.supernote.model.LoadDataCallBack; import app.fadai.supernote.model.NoteFolderModel; import app.fadai.supernote.module.base.BasePresenter; /** * <pre> * author : FaDai * e-mail : [email protected] * time : 2017/07/04 * desc : xxxx描述 * version: 1.0 * </pre> */ public class FolderPresenter extends BasePresenter<IFolderView> implements IFolderPresenter { // 当前已选中的便签夹 private int mCurrentFolderId; // 当前已选中的便签夹是否已被删除 private boolean mIsCurrentFolderDeleted=false; // 是否对便签夹做了修改 private int mResultCode= Activity.RESULT_CANCELED; private RvEditFolderAdapter mAdapter; private INoteFolderModel<NoteFolder> mNoteFolderModel = new NoteFolderModel(); @Override public void setAdapter(RvEditFolderAdapter adapter) { this.mAdapter = adapter; } @Override public void getIntentData(Intent intent) { mCurrentFolderId=intent.getIntExtra("current_folder_id",0); } @Override public void getData() { mNoteFolderModel.loadNoteFoldersList(new LoadDataCallBack<NoteFolder>() { @Override protected void onSuccedd(List<NoteFolder> list) { mAdapter.setNewData(list); } }); } @Override public void choiceItem(int position) { boolean isChecked = mAdapter.mCheckList.get(position); if (isChecked) { EditFolderConstans.selectedCount--; } else { EditFolderConstans.selectedCount++; } mAdapter.mCheckList.set(position, !isChecked); mAdapter.notifyItemChanged(position); } @Override public void editFolder(int position) { mResultCode=Activity.RESULT_OK; if (EditFolderConstans.selectedItem == position) { // 如果当前item正在编辑 saveCurrentItem(position); } else if(EditFolderConstans.selectedItem!=-1){ // 已有其他Item正在被编辑 cancelEditItem(); editItem(position); } else{ // 无任何item正在被编辑 editItem(position); } } private void saveCurrentItem(int position) { EditText et = (EditText) mAdapter.getViewByPosition(position, R.id.et_edit_folder_name); String newName = et.getText().toString(); verifyName(position,newName); } private void verifyName( int position,String newName) { // 新名字为空 if (newName.isEmpty()){ setEditError(position,"便签夹名为空"); return ; } // 名字重复 for (int i = 0; i < mAdapter.getData().size(); i++) { if (i != position && mAdapter.getData().get(i).getFolderName().equals(newName)) { setEditError(position,"已存在"); return; } } saveNewNameToFolder(position,newName); } private void setEditError(int position, String errorTip) { TextInputLayout textInputLayout=(TextInputLayout)mAdapter.getViewByPosition(position,R.id.textinput_edit_folder_name); textInputLayout.setErrorEnabled(true); textInputLayout.setError(errorTip); } private void saveNewNameToFolder(int position,String newName){ NoteFolder folder = mAdapter.getData().get(position); folder.setFolderName(newName); folder.save(); EditFolderConstans.selectedItem=-1; mAdapter.notifyItemChanged(position); closeKeyboard(mAdapter.getViewByPosition(position,R.id.et_edit_folder_name)); mView.showAddBtn(); } // 关闭键盘 public void closeKeyboard(View view){ InputMethodManager manager=(InputMethodManager)view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if(manager.isActive()){ manager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS); } } private void cancelEditItem(){ int i=EditFolderConstans.selectedItem; EditFolderConstans.selectedItem=-1; mAdapter.notifyItemChanged(i); } private void editItem(int position){ EditFolderConstans.selectedItem=position; mAdapter.notifyItemChanged(position); EditText editText=(EditText)mAdapter.getViewByPosition(position,R.id.et_edit_folder_name); editText.selectAll(); setFoucus(editText); mView.hideAddBtn(); } // 获取焦点并弹出键盘 public void setFoucus(View view){ // 获取 接受焦点的资格 view.setFocusable(true); // 获取 焦点可以响应点触的资格 view.setFocusableInTouchMode(true); // 请求焦点 view.requestFocus(); // 弹出键盘 InputMethodManager manager=(InputMethodManager)view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); manager.toggleSoftInput(0,0); manager.showSoftInput(view,0); } @Override public void addFolder() { mResultCode=Activity.RESULT_OK; mView.hideAddBtn(); NoteFolder folder=new NoteFolder(); // 已有item处于编辑状态,则让其恢复为正常状态 if(EditFolderConstans.selectedItem!=-1){ cancelEditItem(); } String newName=getNewFolderName(); folder.setFolderName(newName); folder.save(); mAdapter.addData(folder); mView.scrollToItem(mAdapter.getData().size()-1); // 新建便签夹的弹出键盘在Adapter中设置(因为RecyclerView的scrollToItem需要一定的时间) EditFolderConstans.isNewFolder=true; EditFolderConstans.selectedItem=mAdapter.getData().size()-1; } @Override public void judgeToDelete() { if(EditFolderConstans.selectedCount>0){ mView.showDeleteDialog(); } else { mView.showSnackbar(); } } @Override public void deleteMoreFolders() { new AsyncTask<String, Integer, Boolean>() { @Override protected void onPreExecute() { mResultCode=Activity.RESULT_OK; mView.showLoading("删除中..."); } @Override protected Boolean doInBackground(String... params) { // 当前正在编辑的便签夹是否被删除 boolean isSelectedDeleted=false; for(int i=mAdapter.mCheckList.size()-1;i>=0;i--){ if(mAdapter.mCheckList.get(i)){ if(i==EditFolderConstans.selectedItem){ isSelectedDeleted=true; } deleteFolder(i); } } return isSelectedDeleted; } @Override protected void onPostExecute(Boolean aBoolean) { mView.unShowLoading(); EditFolderConstans.selectedCount=0; // 判断当前编辑的便签是否被删除 if(aBoolean){ mView.showAddBtn(); EditFolderConstans.selectedItem=-1; } mAdapter.notifyDataSetChanged(); } }.execute(); } @Override public void setMenuAlpha(MenuItem menuItem) { if(EditFolderConstans.selectedCount>0){ menuItem.getIcon().setAlpha(255); } else { menuItem.getIcon().setAlpha(85); } } private void deleteFolder(int position){ NoteFolder folder=mAdapter.getData().get(position); // 判断删除的是否是当前主页已选中的便签夹 if(folder.getId()==mCurrentFolderId) mIsCurrentFolderDeleted=true; mAdapter.getData().remove(position); mAdapter.mCheckList.remove(position); mNoteFolderModel.deleteNoteFolder(folder); } @Override public void setResult() { initConstans(); Intent intent=new Intent(); intent.putExtra("is_current_folder_deleted",mIsCurrentFolderDeleted); mView.setActivityResultAndFinish(mResultCode,intent); } private void initConstans(){ EditFolderConstans.selectedCount=0; EditFolderConstans.selectedItem=-1; EditFolderConstans.isNewFolder=false; } private String getNewFolderName(){ List<NoteFolder> list=new ArrayList<>(); // 找出所有包含新建便签夹的名字 for(int i=0;i<mAdapter.getData().size();i++){ NoteFolder folder=mAdapter.getData().get(i); if(folder.getFolderName().contains("新建便签夹")){ list.add(folder); } } // 从新建便签夹1 -> 新建便签夹2 依次尝试 int n=1; while (true){ String newName; if(n==1){ newName="新建便签夹"; } else { newName="新建便签夹"+n; } int i; for(i=0;i<list.size();i++){ if(list.get(i).getFolderName().equals(newName)){ break; } } // 没有包含新建便签夹的项 或者 已有的项都与newName不一样 if(list.size()==0 || i==list.size()){ return newName; } n++; } } }