diff --git a/src/note_but_github/app/src/main/java/net/micode/notes/ui/TrashFolderActivity.java b/src/note_but_github/app/src/main/java/net/micode/notes/ui/TrashFolderActivity.java new file mode 100644 index 0000000..69aeca9 --- /dev/null +++ b/src/note_but_github/app/src/main/java/net/micode/notes/ui/TrashFolderActivity.java @@ -0,0 +1,287 @@ +package net.micode.notes.ui; +import static android.widget.Toast.LENGTH_SHORT; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.AsyncQueryHandler; +import android.content.ContentResolver; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; +import android.widget.Toast; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.DataUtils; + +import java.io.File; + +public class TrashFolderActivity extends Activity { + private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; + + private BackgroundQueryHandler mBackgroundQueryHandler; + + private NotesListAdapter mNotesListAdapter; + + private ListView mNotesListView; + + + + private long mCurrentFolderId; + + private ContentResolver mContentResolver; + + private static final String TAG = "RecycleActivity"; + + private MenuItem menuItem; + + private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.recycle_bin); + initResources(); + + } + + /** + * 查询背景状态,初始化页面背景,与背景切换功能中相同 + */ + + + /** + * 切换自定义背景,与背景切换功能中相同 + * @param path 图片地址 + */ + private void bitmapBg(String path){ + Bitmap bm; + try{ + File file=new File(path); + if (file.exists()){//bitmap转换图片 + bm = BitmapFactory.decodeFile(path); + Drawable drawable = new BitmapDrawable(bm); + getWindow().setBackgroundDrawable(drawable); + } + }catch (Exception e){//抛出异常 + e.printStackTrace(); + Toast.makeText(this, "自定义背景切换失败", LENGTH_SHORT).show(); + } + } + + @Override + protected void onStart() { + super.onStart(); + startAsyncNotesListQuery();//启动查询 + } + + /** + * 初始化各种资源的函数 + */ + @SuppressLint({"InflateParams", "WorldReadableFiles"}) + private void initResources() { + mContentResolver = this.getContentResolver(); + mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); + mCurrentFolderId = Notes.ID_TRASH_FOLER; + mNotesListView = findViewById(R.id.recycle_bin); + mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), + null, false); + mNotesListView.setOnItemClickListener(new OnListItemClickListener()); + mNotesListAdapter = new NotesListAdapter(this); + mNotesListAdapter.setChoiceMode(true); + mNotesListView.setAdapter(mNotesListAdapter); + + } + + /** + * 查询回收站便签列表,与NoteListActivity中相似 + */ + private void startAsyncNotesListQuery() { + //查询便签列表,与NoteListActivity类似 + mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, + Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, NORMAL_SELECTION, new String[]{ + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + } + + @SuppressLint("HandlerLeak") + private final class BackgroundQueryHandler extends AsyncQueryHandler { + public BackgroundQueryHandler(ContentResolver contentResolver) { + super(contentResolver); + } + + @Override + protected void onQueryComplete(int token, Object cookie, Cursor cursor) { + if (token == FOLDER_NOTE_LIST_QUERY_TOKEN) { + mNotesListAdapter.changeCursor(cursor); + } + } + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + finish(); + } + + /** + * 顶部菜单生成,生成顶部的全选 还原 删除 按钮 + */ + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + //重置菜单 + menu.clear(); + //从自定义xml中获取样式 + getMenuInflater().inflate(R.menu.recyclebin_options, menu); + //绑定全选按钮 + menuItem = menu.findItem(R.id.select_all); + return true; + } + + /** + * 删除所选便签的方法,直接永久删除便签,并调用弹窗供用户进行确认 + */ + private void batchDelete() { + //如果没有选中任何便签 + if (mNotesListAdapter.getSelectedCount() == 0) { + Log.e(TAG, "Send to desktop error"); + //小弹窗提醒 + Toast.makeText(this, R.string.error_delete_or_recover, LENGTH_SHORT).show(); + return; + } + // 构建确认弹窗 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + //设置弹窗标题 + builder.setTitle(getString(R.string.alert_title_delete)); + //设置弹窗图标 + builder.setIcon(android.R.drawable.ic_dialog_alert); + //设置弹窗消息 + builder.setMessage(getString(R.string.alert_message_realdelete)); + //设置积极选项 + builder.setPositiveButton(android.R.string.ok, + (dialog, which) -> {//点击确认选项后的事件 + if (!DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter + .getSelectedItemIds())) { + Log.e(TAG, "Delete notes error, should not happens"); + } + //重置所有便签的选择状态 + mNotesListAdapter.selectAll(false); + }); + //设置消极选项 + builder.setNegativeButton(android.R.string.cancel, null); + //弹出弹窗 + builder.show(); + } + + /** + * 还原所选中便签的方法,原理为将便签移出trash文件夹到根文件夹,构建弹窗供用户确认 + */ + void recover() { + //如果没有选中任何便签 + if (mNotesListAdapter.getSelectedCount() == 0) { + Log.e(TAG, "Send to desktop error"); + //小弹窗提醒 + Toast.makeText(this, R.string.error_delete_or_recover, LENGTH_SHORT).show(); + return; + } + //构建弹窗 + AlertDialog.Builder builder = new AlertDialog.Builder(this); + //设置弹窗标题 + builder.setTitle(getString(R.string.recover)); + //设置弹窗图标 + builder.setIcon(android.R.drawable.ic_dialog_alert); + //设置弹窗内消息 + builder.setMessage(getString(R.string.alert_message_recover)); + //设置积极选项 + builder.setPositiveButton(android.R.string.ok, + (dialog, which) -> {//确认后执行的方法 + if (mNotesListAdapter.getSelectedCount() != 0) { + //移动所选便签至根文件夹 + DataUtils.batchMoveToFolder(mContentResolver, + mNotesListAdapter.getSelectedItemIds(), Notes.ID_ROOT_FOLDER); + //重置所有便签的选择状态 + mNotesListAdapter.selectAll(false); + } + else//空选便签时执行 + Log.e(TAG, "Recover error, no note was selected"); + }); + //设置消极选项 + builder.setNegativeButton(android.R.string.cancel, null); + //显示弹窗 + builder.show(); + } + + /** + * 当顶部菜单中的选项被选择时所执行的函数 + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + + if (item.getItemId() == R.id.recover) {//还原选项 + //还原便签 + recover(); + + } else if (item.getItemId() == R.id.realdelete) {//删除选项 + //删除便签 + batchDelete(); + + } else if (item.getItemId() == R.id.select_all) {//全选选项 + //全选按钮状态切换 + if (!mNotesListAdapter.isAllSelected()) {//若便签没有被全选的情况下点击全选按钮 + //切换取消全选图标 + item.setIcon(getResources().getDrawable(R.drawable.deselect_all)); + //选择所有便签 + mNotesListAdapter.selectAll(true); + } else {//如果便签已经被全选 + //切换全选图标 + item.setIcon(getResources().getDrawable(R.drawable.select_all)); + //取消全选所有便签 + mNotesListAdapter.selectAll(false); + } + } + return true; + } + + /** + * 点击便签事件监听器,当点击任意便签项时触发 + */ + private class OnListItemClickListener implements OnItemClickListener { + + public void onItemClick(AdapterView parent, View view, int position, long id) { + //当点击的是便签项时 + if (view instanceof NotesListItem) { + //从视图获取便签项 + NoteItemData item = ((NotesListItem) view).getItemData(); + //判断是不是便签,防止点击到文件夹的情况,与上一句一样基本上没用 + if (item.getType() == Notes.TYPE_NOTE) { + //定位 + position = position - mNotesListView.getHeaderViewsCount(); + //改变单个便签的被选择状态 + mNotesListAdapter.setCheckedItem(position, !mNotesListAdapter.isSelectedItem(position)); + + //用于判断是否手动全选了便签 + if (mNotesListAdapter.isAllSelected()) + //切换取消全选图标 + menuItem.setIcon(getResources().getDrawable(R.drawable.deselect_all)); + else + //切换全选图标 + menuItem.setIcon(getResources().getDrawable(R.drawable.select_all)); + } + } + } + + } +}