package app.fadai.supernote.module.notes.main; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.app.Activity; import android.app.ActivityOptions; import android.content.DialogInterface; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.StringRes; import android.support.design.widget.BottomSheetDialog; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; import com.app.fadai.supernote.R; import com.blankj.utilcode.util.SizeUtils; import com.chad.library.adapter.base.BaseQuickAdapter; import com.orhanobut.logger.Logger; import java.util.List; import app.fadai.supernote.adapter.NoteBottomSheetFolderAdapter; import app.fadai.supernote.adapter.RvNoteListAdapter; import app.fadai.supernote.bean.Note; import app.fadai.supernote.bean.NoteFolder; import app.fadai.supernote.constants.Constans; import app.fadai.supernote.constants.NoteListConstans; import app.fadai.supernote.module.base.BaseActivity; import app.fadai.supernote.module.lock.modification.LockModificationActivity; import app.fadai.supernote.module.lock.verification.LockActivity; import app.fadai.supernote.module.notes.edit.EditNoteActivity; import app.fadai.supernote.utils.ProgressDialogUtils; import butterknife.BindView; public class NoteMainActivity extends BaseActivity<INoteMainView, NoteMainPresenter> implements INoteMainView<List<Note>>, View.OnClickListener, View.OnTouchListener { @BindView(R.id.rv_note_list) RecyclerView mRvNoteList; // 便签列表 @BindView(R.id.tv_note_list_to_privacy) TextView mTvToPrivacy; // 设为私密 @BindView(R.id.tv_note_list_delete) TextView mTvDelete; // 删除 @BindView(R.id.tv_note_list_move) TextView mTvMove; // 移动 @BindView(R.id.fab_note_list_add) FloatingActionButton mFabAdd; // 添加便签 @BindView(R.id.rl_note_list_bottom_bar) RelativeLayout mRlBottomBar; // 多选操作的bottomBar @BindView(R.id.drawer_layout) DrawerLayout mDrawer; private MenuItem mSearchMenu; private MenuItem mShowModeMenu; private MenuItem mCheckAllMenu; private float mScrollLastY; private float mTouchSlop; private RvNoteListAdapter mAdapter = new RvNoteListAdapter(); @Override protected int attachLayoutRes() { return R.layout.activity_main; } @Override protected NoteMainPresenter initPresenter() { NoteMainPresenter presenter = new NoteMainPresenter(); presenter.attch(this); presenter.setAdapter(mAdapter); return presenter; } @Override protected void initViews() { mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); mPresenter.initDataBase(); initDrawer(); initAdapter(); mRvNoteList.setAdapter(mAdapter); mRvNoteList.setOnTouchListener(this); mPresenter.initNoteRvLayoutManager(); } /** * 初始化侧滑栏 */ public void initDrawer() { ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, mDrawer, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); mDrawer.setDrawerListener(toggle); toggle.syncState(); } private void initAdapter() { mAdapter.setOnItemChildClickListener(mOnRvClickListener); mAdapter.setOnItemChildLongClickListener(mOnRvLongClickListener); mAdapter.setEmptyView(getRvEmptyView()); } /** * 便签Rv点击事件 * * @describe */ BaseQuickAdapter.OnItemChildClickListener mOnRvClickListener = new BaseQuickAdapter.OnItemChildClickListener() { @Override public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { mPresenter.onNoteRvClick(position); } }; /** * 便签Rv长按事件 * * @describe */ BaseQuickAdapter.OnItemChildLongClickListener mOnRvLongClickListener = new BaseQuickAdapter.OnItemChildLongClickListener() { @Override public boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) { Logger.d(NoteListConstans.isInSearch); if (!NoteListConstans.isInSearch) { // 搜索模式下不允许长按事件 mPresenter.doMultiSelectActionAndChoiceThisItem(position); } return true; } }; private View getRvEmptyView() { View view = LayoutInflater.from(mContext).inflate(R.layout.layout_empty, null, false); return view; } @Override protected void updateViews() { mPresenter.start(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.fab_note_list_add: toEditNoteForAdd(); break; case R.id.tv_note_list_delete: showDeleteDialog(); break; case R.id.tv_note_list_move: mPresenter.moveNotes(); break; case R.id.tv_note_list_to_privacy: mPresenter.putNoteToPrivacy(); break; } } // 显示dialog private void showDeleteDialog() { new AlertDialog.Builder(mContext) .setTitle("删除便签") .setMessage("确定删除选中的便签吗?") .setPositiveButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mPresenter.deleteNotes(); } }) .setNegativeButton("取消", null) .show(); } @Override public boolean onTouch(View v, MotionEvent event) { float rawY = event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mScrollLastY = rawY; break; case MotionEvent.ACTION_MOVE: if ((rawY - mScrollLastY) > mTouchSlop) { // 手指向下滑动 setAddFabIn(); } else if ((mScrollLastY - rawY) > mTouchSlop) { // 手指向上滑动 setAddFabOut(); } mScrollLastY = rawY; break; } return false; } @Override public void onBackPressed() { if (mDrawer.isDrawerOpen(GravityCompat.START)) {// 侧滑菜单已打开 mDrawer.closeDrawer(GravityCompat.START); } else if (mPresenter.isShowMultiSelectAction()) {// 已显示多选菜单 mPresenter.cancelMultiSelectAction(); } else { // 默认 super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. initOptionMemu(menu); return true; } /** * 初始化toolbar menu */ public void initOptionMemu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); mSearchMenu = menu.findItem(R.id.menu_note_search); initSearchMenu(mSearchMenu); mShowModeMenu = menu.findItem(R.id.menu_note_show_mode); mPresenter.initShowModeMenuIcon(mShowModeMenu); mCheckAllMenu = menu.findItem(R.id.menu_note_check_all); } private void initSearchMenu(MenuItem searchItem) { SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // 搜索View的文字改变事件 searchView.setOnQueryTextListener(qreryTextListener); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem menuItem) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem menuItem) { mPresenter.cancelFilter(); mPresenter.setOutSearch(); return true; } }); } else { searchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { mPresenter.setOutSearch(); mPresenter.cancelFilter(); return true; } }); } } /** * toolbar的SearchView的文字改变事件 */ private SearchView.OnQueryTextListener qreryTextListener = new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { mPresenter.setFilter(newText); return true; } }; /** * 更新toolbar的menu */ @Override public boolean onPrepareOptionsMenu(Menu menu) { if (mPresenter.isShowMultiSelectAction()) { setMenuForMulitiSelectionActionIsShow(); } else { setMenuForMulitiSelectionActionIsNotShow(); } return true; } private void setMenuForMulitiSelectionActionIsShow() { mSearchMenu.setVisible(false); mShowModeMenu.setVisible(false); mCheckAllMenu.setVisible(true); mToolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mPresenter.isShowMultiSelectAction()) { mPresenter.cancelMultiSelectAction(); } } }); } private void setMenuForMulitiSelectionActionIsNotShow() { mSearchMenu.setVisible(true); mShowModeMenu.setVisible(true); mCheckAllMenu.setVisible(false); // 自定义的drawer打开关闭的事件 MyActionBarDrawerToggle toggle = new MyActionBarDrawerToggle( this, mDrawer, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); mDrawer.addDrawerListener(toggle); toggle.syncState(); } // 继承系统定义的事件。重写drawer open的事件,如果多选菜单以显示,则关闭多选菜单. class MyActionBarDrawerToggle extends ActionBarDrawerToggle { public MyActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, @StringRes int openDrawerContentDescRes, @StringRes int closeDrawerContentDescRes) { super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if (mPresenter.isShowMultiSelectAction()) { mPresenter.cancelMultiSelectAction(); } // 滑动时,容易导致fab隐藏,所以让其显示 setAddFabIn(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.menu_note_show_mode: mPresenter.changeNoteRvLayoutManagerAndMenuIcon(item); break; case R.id.menu_note_check_all: mPresenter.doChoiceAllNote(); break; case R.id.menu_note_search: mPresenter.setInSearch(); break; } return super.onOptionsItemSelected(item); } @Override public void setRvScrollToFirst() { mRvNoteList.scrollToPosition(0); } @Override public void showChoiceNotesCount(String title) { setTitle(title); } @Override public void showCurrentNoteFolderName(String title) { setTitle(title); } @Override public void updateOptionMenu() { // 更新toolbar菜单,系统会去调用onPrepareOptionsMenu(MenuItem item)方法 supportInvalidateOptionsMenu(); } @Override public void setAddFabOut() { ObjectAnimator animator = ObjectAnimator.ofFloat(mFabAdd, "translationY", SizeUtils.dp2px(80)); animator.setDuration(150); animator.start(); } @Override public void setAddFabIn() { ObjectAnimator animator = ObjectAnimator.ofFloat(mFabAdd, "translationY", SizeUtils.dp2px(0)); animator.setDuration(150); animator.start(); } @Override public void showAddFab() { mFabAdd.setVisibility(View.VISIBLE); setAddFabIn(); } @Override public void hideAddFab() { ObjectAnimator animator = ObjectAnimator.ofFloat(mFabAdd, "translationY", SizeUtils.dp2px(80)); animator.setDuration(150); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mFabAdd.setVisibility(View.GONE); } }); animator.start(); } @Override public void hideDrawer() { mDrawer.closeDrawer(GravityCompat.START); } @Override public void hideBottomBar() { // 下移动画 ObjectAnimator animator = ObjectAnimator.ofFloat(mRlBottomBar, "translationY", SizeUtils.dp2px(56)); animator.setDuration(300); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mRlBottomBar.setVisibility(View.GONE); } }); animator.start(); } @Override public void showBottomBar() { mRlBottomBar.setVisibility(View.VISIBLE); // bottombar进行一个上移的动画 ObjectAnimator animator = ObjectAnimator.ofFloat(mRlBottomBar, "translationY", SizeUtils.dp2px(56), 0); animator.setDuration(300); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { } }); animator.start(); } @Override public void setCheckMenuEnable() { setButtonEnabled(true, mTvDelete); setButtonEnabled(true, mTvMove); setButtonEnabled(true, mTvToPrivacy); } @Override public void setCheckMenuUnEnable() { setButtonEnabled(false, mTvDelete); setButtonEnabled(false, mTvMove); setButtonEnabled(false, mTvToPrivacy); } // 设置按钮的可使用性 private void setButtonEnabled(boolean enabled, TextView view) { view.setEnabled(enabled); if (enabled) { view.setTextColor(getResources().getColor(R.color.white)); } else { view.setTextColor(getResources().getColor(R.color.colorWhiteAlpha30)); } } @Override public void setCheckMenuForAllAndNormal() { mTvToPrivacy.setText("设为私密"); mTvDelete.setText("删除"); mTvMove.setText("移动"); mTvToPrivacy.setVisibility(View.VISIBLE); mTvDelete.setVisibility(View.VISIBLE); mTvMove.setVisibility(View.VISIBLE); } @Override public void setCheckMenuForPrivacy() { mTvToPrivacy.setText("移除私密"); mTvDelete.setText("删除"); mTvToPrivacy.setVisibility(View.VISIBLE); mTvDelete.setVisibility(View.VISIBLE); mTvMove.setVisibility(View.GONE); } @Override public void setCheckMenuForRecycleBin() { mTvDelete.setText("删除"); mTvMove.setText("恢复"); mTvToPrivacy.setVisibility(View.GONE); mTvDelete.setVisibility(View.VISIBLE); mTvMove.setVisibility(View.VISIBLE); } @Override public void showMoveBottomSheet() { final BottomSheetDialog dialog = new BottomSheetDialog(mContext); // 获取contentView ViewGroup contentView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); View root = LayoutInflater.from(mContext).inflate(R.layout.bottom_sheet_folder, contentView, false); RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.recycler_bottom_sheet_folder); recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); dialog.setContentView(root); recyclerView.setAdapter(getBottomSheetRvAdapter(dialog)); dialog.show(); } private NoteBottomSheetFolderAdapter getBottomSheetRvAdapter(final BottomSheetDialog dialog) { final NoteBottomSheetFolderAdapter folderAdapter = new NoteBottomSheetFolderAdapter(); folderAdapter.setNewData(mPresenter.getFolderDataList()); folderAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() { @Override public void onItemClick(BaseQuickAdapter adapter, View view, int position) { NoteFolder folder = folderAdapter.getData().get(position); mPresenter.moveNotesToFolder(folder); dialog.cancel(); } }); return folderAdapter; } @Override public void showNoteRecoverDialog(final int position) { new AlertDialog.Builder(mContext) .setMessage("无法直接打开便签,是否恢复至原有便签夹?") .setPositiveButton("恢复", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mPresenter.recoverNote(position); } }) .setNegativeButton("取消", null) .show(); } @Override public void changeNoteRvLayoutManager(RecyclerView.LayoutManager manager) { mRvNoteList.setLayoutManager(manager); mPresenter.refreshRv(); } @Override public void toLockActivity() { Intent intent; if (Constans.isLocked) { intent = new Intent(mContext, LockActivity.class); } else { intent = new Intent(mContext, LockModificationActivity.class); } // 5.0及以上则使用Activity动画 if (Build.VERSION.SDK_INT >= 21) { Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(this).toBundle(); startActivityForResult(intent, NoteListConstans.REQUEST_CODE_LOCK, bundle); } else { startActivityForResult(intent, NoteListConstans.REQUEST_CODE_LOCK); } } @Override public void toEditNoteForAdd() { Intent intent = new Intent(this, EditNoteActivity.class); intent.putExtra("is_add", true); startActivityForResult(intent, NoteListConstans.REQUEST_CODE_ADD); } @Override public void toEditNoteForEdit(Note note, int position) { Intent intent = new Intent(this, EditNoteActivity.class); intent.putExtra("position", position); intent.putExtra("is_add", false); intent.putExtra("note_id", note.getNoteId()); intent.putExtra("note_content", note.getNoteContent()); intent.putExtra("modified_time", note.getModifiedTime()); startActivityForResult(intent, NoteListConstans.REQUEST_CODE_EDIT); } private ProgressDialogUtils mProgressDialog=new ProgressDialogUtils(this); @Override public void showLoading(String message) { mProgressDialog.show(message); } @Override public void unShowLoading() { mProgressDialog.hide(); } @Override public void showSnackbar(String message) { Snackbar.make(mFabAdd, message, Snackbar.LENGTH_SHORT).setAction("Action", null).show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { mPresenter.onActivityResult(requestCode, resultCode, data); } }