@ -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