@ -0,0 +1,247 @@
|
||||
package net.micode.notes.ui;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.AsyncQueryHandler;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
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;
|
||||
|
||||
public class RecycleBinActivity extends Activity {
|
||||
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
|
||||
|
||||
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
|
||||
|
||||
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 + "=?";
|
||||
|
||||
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>"
|
||||
+ Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR ("
|
||||
+ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND "
|
||||
+ NoteColumns.NOTES_COUNT + ">0)";
|
||||
|
||||
private final static int REQUEST_CODE_OPEN_NODE = 102;
|
||||
private final static int REQUEST_CODE_NEW_NODE = 103;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.recycle_bin);
|
||||
initResources();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (resultCode == RESULT_OK
|
||||
&& (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) {
|
||||
mNotesListAdapter.changeCursor(null);
|
||||
} else {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
startAsyncNotesListQuery();
|
||||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
private void initResources() {
|
||||
mContentResolver = this.getContentResolver();
|
||||
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
|
||||
mCurrentFolderId = Notes.ID_TRASH_FOLER;
|
||||
mNotesListView = findViewById(R.id.recycle_list);
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置选择器状态
|
||||
*/
|
||||
private void reset_ChoiseMode() {
|
||||
mNotesListAdapter.setChoiceMode(false);
|
||||
mNotesListAdapter.setChoiceMode(true);
|
||||
}
|
||||
|
||||
|
||||
private void startAsyncNotesListQuery() {
|
||||
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
|
||||
: NORMAL_SELECTION;
|
||||
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
|
||||
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, 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) {
|
||||
switch (token) {
|
||||
case FOLDER_NOTE_LIST_QUERY_TOKEN:
|
||||
mNotesListAdapter.changeCursor(cursor);
|
||||
break;
|
||||
case FOLDER_LIST_QUERY_TOKEN:
|
||||
if (cursor != null && cursor.getCount() > 0) {
|
||||
showFolderListMenu(cursor);
|
||||
} else {
|
||||
Log.e(TAG, "Query folder failed");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showFolderListMenu(Cursor cursor) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(RecycleBinActivity.this);
|
||||
builder.setTitle(R.string.menu_title_select_folder);
|
||||
final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor);
|
||||
builder.setAdapter(adapter, (dialog, which) -> {
|
||||
DataUtils.batchMoveToFolder(mContentResolver,
|
||||
mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which));
|
||||
Toast.makeText(
|
||||
RecycleBinActivity.this,
|
||||
getString(R.string.format_move_notes_to_folder,
|
||||
mNotesListAdapter.getSelectedCount(),
|
||||
adapter.getFolderName(RecycleBinActivity.this, which)),
|
||||
Toast.LENGTH_SHORT).show();
|
||||
});
|
||||
builder.show();
|
||||
}
|
||||
|
||||
// TODO: 2023/5/26 修改一下删除函数
|
||||
private void batchDelete() {
|
||||
// delete notes directly
|
||||
if (!DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
|
||||
.getSelectedItemIds())) {
|
||||
Log.e(TAG, "Delete notes error, should not happens");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
Intent intent = new Intent(RecycleBinActivity.this, NotesListActivity.class);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onContextMenuClosed(Menu menu) {
|
||||
super.onContextMenuClosed(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.recyclebin_options, menu);
|
||||
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
|
||||
menu.clear();
|
||||
getMenuInflater().inflate(R.menu.recyclebin_options, menu);
|
||||
menuItem = menu.findItem(R.id.select_all);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 当顶部菜单项被选择时所执行的函数
|
||||
*/
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
|
||||
// TODO: 2023/5/26 为这两个选项加入弹窗
|
||||
if (item.getItemId() == R.id.recover) {
|
||||
if (!DataUtils.batchMoveToFolder(mContentResolver,
|
||||
mNotesListAdapter.getSelectedItemIds(), Notes.ID_ROOT_FOLDER))
|
||||
Log.e(TAG, "Recover error, should not happens");
|
||||
} else if (item.getItemId() == R.id.realdelete) {
|
||||
batchDelete();
|
||||
} else if (item.getItemId() == R.id.select_all) {
|
||||
if (!mNotesListAdapter.isAllSelected()) {
|
||||
item.setTitle("deselect_all");
|
||||
mNotesListAdapter.selectAll(true);
|
||||
} else {
|
||||
item.setTitle("selected_all");
|
||||
mNotesListAdapter.selectAll(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
reset_ChoiseMode();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSearchRequested() {
|
||||
startSearch(null, false, null /* appData */, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
// TODO: 2023/5/26 将title改成一个icon
|
||||
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.setTitle("deselected_all");
|
||||
else if (menuItem.getTitle() == "deselected_all")
|
||||
menuItem.setTitle("selected_all");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:background="@drawable/list_background">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical"
|
||||
tools:ignore="UselessParent">
|
||||
|
||||
<ListView
|
||||
android:id="@+id/recycle_list"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="0dip"
|
||||
android:layout_weight="1"
|
||||
android:cacheColorHint="@null"
|
||||
android:listSelector="@android:color/transparent"
|
||||
android:divider="@null"
|
||||
android:fadingEdge="none" />
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/select_all"
|
||||
android:title="@android:string/selectAll"
|
||||
android:showAsAction="always"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/recover"
|
||||
android:title="@string/recover"
|
||||
android:icon="@drawable/menu_move"
|
||||
android:showAsAction="always" />
|
||||
|
||||
<item
|
||||
android:id="@+id/realdelete"
|
||||
android:title="@string/realdelete"
|
||||
android:icon="@drawable/menu_delete"
|
||||
android:showAsAction="always" />
|
||||
</menu>
|
||||
|
Loading…
Reference in new issue