add<function>: 1. delete folder will move notes in it and itself to the trash 2. clear notes in trash

zhengkunpeng_branch
zkx 2 years ago
parent d652be7665
commit 5bfd09dfd0

@ -16,6 +16,7 @@
package net.micode.notes.ui;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@ -92,8 +93,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
private enum ListEditState {
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
}; //NOTE: 三种编辑状态@zhoukexing 2024/1/2 19:31
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER, TRASH_FOLDER
}; //NOTE: 三种编辑状态@zhoukexing 2024/1/2 19:31 新增一个
private ListEditState mState;
@ -135,6 +136,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
private final static int REQUEST_CODE_OPEN_NODE = 102;
private final static int REQUEST_CODE_NEW_NODE = 103;
private String mTitle;
private String mMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -321,11 +325,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
int itemId = item.getItemId();
if (itemId == R.id.delete) {
switch (mState) {
case SUB_FOLDER:
case CALL_RECORD_FOLDER:
case NOTE_LIST:
mTitle = getString(R.string.alert_title_delete);
mMessage = getString(R.string.alert_message_delete_notes,
mNotesListAdapter.getSelectedCount());
break;
case TRASH_FOLDER:
mTitle = getString(R.string.alert_title_delete_true);
mMessage = getString(R.string.alert_message_delete_notes_true,
mNotesListAdapter.getSelectedCount());
break;
default:
break;
}
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setTitle(mTitle);
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_notes,
mNotesListAdapter.getSelectedCount()));
builder.setMessage(mMessage);
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
@ -357,7 +376,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
/**
* Minus TitleBar's height
*/
if (mState == ListEditState.SUB_FOLDER) {
if (mState == ListEditState.SUB_FOLDER |
mState == ListEditState.TRASH_FOLDER) {
// 回收站的ui显示 @zkx
eventY -= mTitleBar.getHeight();
start -= mTitleBar.getHeight();
}
@ -473,34 +494,34 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
}
/**
* @method: batchDelete
* @description: 便
* NotesListAdaptermSelectedIndex
* @date: 2024/1/3 23:02
* @author: zhoukexing
* @param: []
* @return: void
*/
private void batchDelete() {
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
@SuppressLint("StaticFieldLeak")
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
HashSet<AppWidgetAttribute> widgets = mNotesListAdapter.getSelectedWidget();
// if (!isSyncMode()) { //在AS的虚拟机里不能联网不在同步模式下
// // if not synced, delete notes directly
// if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
// .getSelectedItemIds())) {
// } else {
// Log.e(TAG, "Delete notes error, should not happens");
// }
// } else {
if (mCurrentFolderId == Notes.ID_TRASH_FOLER){
// if in trash, really delete notes
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
} else {
Log.e(TAG, "Delete notes error, should not happens");
}
if (mCurrentFolderId == Notes.ID_TRASH_FOLER){
// if in trash, really delete notes
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
} else {
// move notes to trash
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
}
Log.e(TAG, "Delete notes error, should not happens");
}
// }
} else {
// move notes to trash
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
}
}
return widgets;
}
@ -508,8 +529,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
protected void onPostExecute(HashSet<AppWidgetAttribute> widgets) {
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
// widget挂件的Id和Type都不是非法的《==》存在这个widget挂件 @zkx
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
&& widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
// ==》 删除这个挂件
updateWidget(widget.widgetId, widget.widgetType);
}
}
@ -538,11 +561,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
// 所有与要删除文件夹相关的 widgets
HashSet<AppWidgetAttribute> widgets = DataUtils.getFolderNoteWidget(mContentResolver,
folderId);
if (!isSyncMode()) {
// if not synced, delete folder directly
if (mCurrentFolderId == Notes.ID_TRASH_FOLER) {
// if in trash, delete folder directly
DataUtils.batchDeleteNotes(mContentResolver, ids);
} else {
// in sync mode, we'll move the deleted folder into the trash folder
// move the deleted folder into the trash folder
DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
}
// 更新 widgets
@ -726,7 +749,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
// 特殊情况子文件夹是“回收站”要显式地说明展示底部栏模仿下面的call_record_folder @zkx
// 添加mAddNewNote.setVisibility(View.VISIBLE);此行后,
// sub_folder 和 call_record_folder 两种情况无差别,无需分开处理
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mState = ListEditState.NOTE_LIST;
mTitleBar.setVisibility(View.GONE);
startAsyncNotesListQuery();
break;
case CALL_RECORD_FOLDER:
case TRASH_FOLDER:
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mState = ListEditState.NOTE_LIST;
mAddNewNote.setVisibility(View.VISIBLE);
@ -840,6 +869,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync);
} else if (mState == ListEditState.SUB_FOLDER) {
getMenuInflater().inflate(R.menu.sub_folder, menu);
} else if (mState == ListEditState.TRASH_FOLDER) {
getMenuInflater().inflate(R.menu.trash_folder, menu);
} else if (mState == ListEditState.CALL_RECORD_FOLDER) {
getMenuInflater().inflate(R.menu.call_record_folder, menu);
} else {
@ -881,10 +912,45 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
onSearchRequested();
} else if (itemId == R.id.menu_trash) {
openTrashFolder();
} else if (itemId == R.id.menu_empty_trash) {
emptyTrashFolder();
}
return true;
}
/**
* @method: emptyTrashFolder
* @description: 便
* @date: 2024/1/3 22:59
* @author: zhoukexing
* @param: []
* @return: void
*/
private void emptyTrashFolder() {
// 利用已有函数,在数据结构上“选中”所有便签 @zkx
mNotesListAdapter.selectAll(true);
// 模仿选中R.id.delete构建对话框
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(getString(R.string.alert_title_delete_true));
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_notes_true,
mNotesListAdapter.getMNotesCount()));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// 这里体现了【层次化/模块化】的软件哲学。
// 当时实现这个功能有两条路可以走,
// 一条是修改已有batchDelete里的select函数改为选中所有实现一个alldelete函数
// 一条是利用batchDelete的功能删除选中的便签在进入batchDelete前选中所有
// 后者是更好的。前者需要修改方法,是侵入式的,而且会造成许多代码的重复,没有做到方法与方法之间的低耦合。
batchDelete();
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
}
/**
* @method: openTrashFolder
* @description: todo30
@ -897,7 +963,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
mCurrentFolderId = Notes.ID_TRASH_FOLER;
startAsyncNotesListQuery();
// 正常打开文件夹
mState = ListEditState.SUB_FOLDER;
mState = ListEditState.TRASH_FOLDER;
// 将顶部栏设置为 data.getSnippet 文件夹名称
mTitleBar.setText(NotesListActivity.this
.getString(R.string.menu_trash));
@ -1012,6 +1078,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
break;
case SUB_FOLDER:
case CALL_RECORD_FOLDER:
case TRASH_FOLDER:
if (item.getType() == Notes.TYPE_NOTE) {
openNode(item);
} else {

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_empty_trash"
android:title="@string/menu_empty_trash"/>
</menu>

@ -44,6 +44,7 @@
<string name="menu_search">搜索</string>
<string name="menu_trash">回收站</string>
<string name="menu_delete">删除</string>
<string name="menu_empty_trash">清空回收站</string>
<string name="menu_move">移动到文件夹</string>
<string name="menu_select_title">选中了 %d 项</string>
<string name="menu_select_none">没有选中项,操作无效</string>
@ -68,9 +69,13 @@
<string name="menu_move_parent_folder">上一级文件夹</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="alert_title_delete">删除</string>
<string name="alert_message_delete_notes">确认要删除所选的 %d 条便签吗?</string>
<string name="alert_message_delete_note">确认要删除该条便签吗?</string>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗?</string>
<string name="alert_message_delete_notes">确认要删除所选的 %d 条便签吗?将在回收站保存30天</string>
<string name="alert_message_delete_note">确认要删除该条便签吗?将在回收站保存30天</string>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗将在回收站保存30天</string>
<string name="alert_message_delete_folder_true">确认删除文件夹及所包含的便签吗?</string>
<string name="alert_title_delete_true">删除</string>
<string name="alert_message_delete_notes_true">确认要删除所选的 %d 条便签吗?</string>
<string name="alert_message_delete_note_true">确认要删除该条便签吗?</string>
<string name="format_move_notes_to_folder">已将所选 %1$d 条便签移到 %2$s 文件夹</string>
<!-- export text -->
<string name="error_sdcard_unmounted">SD卡被占用不能操作</string>

@ -35,6 +35,10 @@
<string name="note_link_email">發送郵件</string>
<string name="note_link_web">浏覽網頁</string>
<string name="note_link_other">打開地圖</string>
<string name="alert_message_delete_folder_true">確認刪除檔夾及所包含的便簽嗎?</string>
<string name="alert_title_delete_true">删除</string>
<string name="alert_message_delete_notes_true">确认要刪除所選的 %d 條便籤嗎?</string>
<string name="alert_message_delete_note_true">确认要删除該條便籤嗎?</string>
<string name="format_move_notes_to_folder">已將所選 %1$d 便籤移到 %2$s 文件夾</string>
<!-- note list string -->
<string name="menu_create_folder">新建文件夾</string>
@ -45,6 +49,7 @@
<string name="menu_search">搜尋</string>
<string name="menu_trash">回收站</string>
<string name="menu_delete">刪除</string>
<string name="menu_empty_trash">清空回收站</string>
<string name="menu_move">移動到文件夾</string>
<string name="menu_select_title">選中了 %d 項</string>
<string name="menu_select_none">沒有選中項,操作無效</string>
@ -69,9 +74,9 @@
<string name="menu_move_parent_folder">上一級文件夾</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="alert_title_delete">刪除</string>
<string name="alert_message_delete_notes">确认要刪除所選的 %d 條便籤嗎?</string>
<string name="alert_message_delete_note">确认要删除該條便籤嗎?</string>
<string name="alert_message_delete_folder">確認刪除檔夾及所包含的便簽嗎?</string>
<string name="alert_message_delete_notes">确认要删除所选的 %d 条便签吗?将在回收站保存30天</string>
<string name="alert_message_delete_note">确认要删除该条便签吗?将在回收站保存30天</string>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗将在回收站保存30天</string>
<string name="error_sdcard_unmounted">SD卡被佔用不能操作</string>
<string name="error_sdcard_export">導出TXT時發生錯誤請檢查SD卡</string>
<string name="error_note_not_exist">要查看的便籤不存在</string>

@ -48,6 +48,7 @@
<string name="menu_search">Search</string>
<string name="menu_trash">Trash Folder</string>
<string name="menu_delete">Delete</string>
<string name="menu_empty_trash">Empty Trash</string>
<string name="menu_move">Move to folder</string>
<string name="menu_select_title">%d selected</string>
<string name="menu_select_none">Nothing selected, the operation is invalid</string>
@ -75,6 +76,10 @@
<string name="alert_title_delete">Delete selected notes</string>
<string name="alert_message_delete_notes">Confirm to delete the selected %d notes?</string>
<string name="alert_message_delete_note">Confirm to delete this note?</string>
<string name="alert_message_delete_folder_true">Confirm to delete folder and its notes?</string>
<string name="alert_title_delete_true">Delete selected notes</string>
<string name="alert_message_delete_notes_true">Confirm to delete the selected %d notes?</string>
<string name="alert_message_delete_note_true">Confirm to delete this note?</string>
<string name="format_move_notes_to_folder">Have moved selected %1$d notes to %2$s folder</string>
<!-- Error information -->
<string name="error_sdcard_unmounted">SD card busy, not available now</string>

Loading…
Cancel
Save