|
|
|
|
@ -295,7 +295,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
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)";
|
|
|
|
|
+ NoteColumns.NOTES_COUNT + ">0)" + " OR ("
|
|
|
|
|
+ NoteColumns.ID + "=" + Notes.ID_TRASH_FOLER + ")"; // 添加回收站文件夹到根目录列表
|
|
|
|
|
|
|
|
|
|
/** 打开笔记请求码 */
|
|
|
|
|
private final static int REQUEST_CODE_OPEN_NODE = 102;
|
|
|
|
|
@ -458,6 +459,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
protected void onStart() {
|
|
|
|
|
super.onStart();
|
|
|
|
|
startAsyncNotesListQuery();
|
|
|
|
|
// 启动回收站自动清理任务
|
|
|
|
|
net.micode.notes.worker.TrashCleanupWorker.doCleanup(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -512,66 +515,88 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
private MenuItem mMoveMenu;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建动作模式
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法完成以下工作:
|
|
|
|
|
* 1. 加载菜单资源
|
|
|
|
|
* 2. 设置删除菜单的点击监听器
|
|
|
|
|
* 3. 根据当前文件夹ID和用户文件夹数量设置移动菜单的可见性
|
|
|
|
|
* 4. 保存动作模式实例
|
|
|
|
|
* 5. 设置列表适配器为选择模式
|
|
|
|
|
* 6. 禁用列表的长按功能
|
|
|
|
|
* 7. 隐藏新建笔记按钮
|
|
|
|
|
* 8. 设置自定义视图
|
|
|
|
|
* 9. 创建下拉菜单
|
|
|
|
|
* 10. 设置下拉菜单的点击监听器
|
|
|
|
|
* </p>
|
|
|
|
|
* @param mode 动作模式
|
|
|
|
|
* @param menu 菜单
|
|
|
|
|
* @return 是否创建成功,返回true表示成功
|
|
|
|
|
*/
|
|
|
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
|
|
|
getMenuInflater().inflate(R.menu.note_list_options, menu);
|
|
|
|
|
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
|
|
|
|
|
mMoveMenu = menu.findItem(R.id.move);
|
|
|
|
|
if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER
|
|
|
|
|
|| DataUtils.getUserFolderCount(mContentResolver) == 0) {
|
|
|
|
|
mMoveMenu.setVisible(false);
|
|
|
|
|
} else {
|
|
|
|
|
mMoveMenu.setVisible(true);
|
|
|
|
|
mMoveMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
// 添加置顶菜单初始化
|
|
|
|
|
MenuItem pinMenu = menu.findItem(R.id.pin);
|
|
|
|
|
if (pinMenu != null) {
|
|
|
|
|
pinMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
// 添加锁定菜单初始化
|
|
|
|
|
MenuItem lockMenu = menu.findItem(R.id.lock);
|
|
|
|
|
if (lockMenu != null) {
|
|
|
|
|
lockMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
mActionMode = mode;
|
|
|
|
|
mNotesListAdapter.setChoiceMode(true);
|
|
|
|
|
mNotesListView.setLongClickable(false);
|
|
|
|
|
mAddNewNote.setVisibility(View.GONE);
|
|
|
|
|
|
|
|
|
|
View customView = LayoutInflater.from(NotesListActivity.this).inflate(
|
|
|
|
|
R.layout.note_list_dropdown_menu, null);
|
|
|
|
|
mode.setCustomView(customView);
|
|
|
|
|
mDropDownMenu = new DropdownMenu(NotesListActivity.this,
|
|
|
|
|
(Button) customView.findViewById(R.id.selection_menu),
|
|
|
|
|
R.menu.note_list_dropdown);
|
|
|
|
|
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
|
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
|
mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected());
|
|
|
|
|
updateMenu();
|
|
|
|
|
return true;
|
|
|
|
|
* 创建动作模式
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法完成以下工作:
|
|
|
|
|
* 1. 加载菜单资源
|
|
|
|
|
* 2. 设置删除菜单的点击监听器
|
|
|
|
|
* 3. 根据当前文件夹ID和用户文件夹数量设置移动菜单或恢复菜单的可见性
|
|
|
|
|
* 4. 保存动作模式实例
|
|
|
|
|
* 5. 设置列表适配器为选择模式
|
|
|
|
|
* 6. 禁用列表的长按功能
|
|
|
|
|
* 7. 隐藏新建笔记按钮
|
|
|
|
|
* 8. 设置自定义视图
|
|
|
|
|
* 9. 创建下拉菜单
|
|
|
|
|
* 10. 设置下拉菜单的点击监听器
|
|
|
|
|
* </p>
|
|
|
|
|
* @param mode 动作模式
|
|
|
|
|
* @param menu 菜单
|
|
|
|
|
* @return 是否创建成功,返回true表示成功
|
|
|
|
|
*/
|
|
|
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
|
|
|
getMenuInflater().inflate(R.menu.note_list_options, menu);
|
|
|
|
|
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
|
|
|
|
|
|
|
|
|
|
if (mCurrentFolderId == Notes.ID_TRASH_FOLER) {
|
|
|
|
|
// 在回收站内部,显示恢复按钮
|
|
|
|
|
MenuItem restoreMenu = menu.findItem(R.id.restore);
|
|
|
|
|
if (restoreMenu != null) {
|
|
|
|
|
restoreMenu.setVisible(true);
|
|
|
|
|
restoreMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
// 隐藏移动按钮
|
|
|
|
|
MenuItem moveMenu = menu.findItem(R.id.move);
|
|
|
|
|
if (moveMenu != null) {
|
|
|
|
|
moveMenu.setVisible(false);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 在回收站外部,显示移动按钮
|
|
|
|
|
mMoveMenu = menu.findItem(R.id.move);
|
|
|
|
|
if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER
|
|
|
|
|
|| DataUtils.getUserFolderCount(mContentResolver) == 0) {
|
|
|
|
|
mMoveMenu.setVisible(false);
|
|
|
|
|
} else {
|
|
|
|
|
mMoveMenu.setVisible(true);
|
|
|
|
|
mMoveMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
// 隐藏恢复按钮
|
|
|
|
|
MenuItem restoreMenu = menu.findItem(R.id.restore);
|
|
|
|
|
if (restoreMenu != null) {
|
|
|
|
|
restoreMenu.setVisible(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 添加置顶菜单初始化
|
|
|
|
|
MenuItem pinMenu = menu.findItem(R.id.pin);
|
|
|
|
|
if (pinMenu != null) {
|
|
|
|
|
pinMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
// 添加锁定菜单初始化
|
|
|
|
|
MenuItem lockMenu = menu.findItem(R.id.lock);
|
|
|
|
|
if (lockMenu != null) {
|
|
|
|
|
lockMenu.setOnMenuItemClickListener(this);
|
|
|
|
|
}
|
|
|
|
|
mActionMode = mode;
|
|
|
|
|
mNotesListAdapter.setChoiceMode(true);
|
|
|
|
|
mNotesListView.setLongClickable(false);
|
|
|
|
|
mAddNewNote.setVisibility(View.GONE);
|
|
|
|
|
|
|
|
|
|
View customView = LayoutInflater.from(NotesListActivity.this).inflate(
|
|
|
|
|
R.layout.note_list_dropdown_menu, null);
|
|
|
|
|
mode.setCustomView(customView);
|
|
|
|
|
mDropDownMenu = new DropdownMenu(NotesListActivity.this,
|
|
|
|
|
(Button) customView.findViewById(R.id.selection_menu),
|
|
|
|
|
R.menu.note_list_dropdown);
|
|
|
|
|
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
|
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
|
mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected());
|
|
|
|
|
updateMenu();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 更新菜单
|
|
|
|
|
@ -672,55 +697,71 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理菜单项点击事件
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法完成以下工作:
|
|
|
|
|
* 1. 检查是否有选中的笔记,如果没有则显示提示
|
|
|
|
|
* 2. 根据菜单项ID处理不同的操作:
|
|
|
|
|
* - 删除:显示删除确认对话框,点击确定后调用batchDelete方法
|
|
|
|
|
* - 移动:调用startQueryDestinationFolders方法查询目标文件夹
|
|
|
|
|
* </p>
|
|
|
|
|
* @param item 菜单项
|
|
|
|
|
* @return 是否处理成功,返回true表示成功
|
|
|
|
|
*/
|
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
|
if (mNotesListAdapter.getSelectedCount() == 0) {
|
|
|
|
|
Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none),
|
|
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
* 处理菜单项点击事件
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法完成以下工作:
|
|
|
|
|
* 1. 检查是否有选中的笔记,如果没有则显示提示
|
|
|
|
|
* 2. 根据菜单项ID处理不同的操作:
|
|
|
|
|
* - 删除:显示删除确认对话框,点击确定后调用batchDelete方法
|
|
|
|
|
* - 移动:调用startQueryDestinationFolders方法查询目标文件夹
|
|
|
|
|
* - 恢复:调用batchRestore方法恢复选中的项目
|
|
|
|
|
* </p>
|
|
|
|
|
* @param item 菜单项
|
|
|
|
|
* @return 是否处理成功,返回true表示成功
|
|
|
|
|
*/
|
|
|
|
|
public boolean onMenuItemClick(MenuItem item) {
|
|
|
|
|
if (mNotesListAdapter.getSelectedCount() == 0) {
|
|
|
|
|
Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none),
|
|
|
|
|
Toast.LENGTH_SHORT).show();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
|
case R.id.delete:
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_notes,
|
|
|
|
|
mNotesListAdapter.getSelectedCount()));
|
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
|
public void onClick(DialogInterface dialog,
|
|
|
|
|
int which) {
|
|
|
|
|
batchDelete();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
|
builder.show();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.move:
|
|
|
|
|
startQueryDestinationFolders();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.pin:
|
|
|
|
|
togglePinnedStatus();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.lock:
|
|
|
|
|
showPasswordDialog();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
|
case R.id.delete:
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
|
|
|
|
|
|
|
|
|
|
if (mCurrentFolderId == Notes.ID_TRASH_FOLER) {
|
|
|
|
|
// 在回收站内部,提示永久删除
|
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_notes_permanently,
|
|
|
|
|
mNotesListAdapter.getSelectedCount()));
|
|
|
|
|
} else {
|
|
|
|
|
// 在回收站外部,提示移动到回收站
|
|
|
|
|
builder.setTitle(getString(R.string.alert_title_delete));
|
|
|
|
|
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
|
|
|
builder.setMessage(getString(R.string.alert_message_delete_notes,
|
|
|
|
|
mNotesListAdapter.getSelectedCount()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
builder.setPositiveButton(android.R.string.ok,
|
|
|
|
|
new DialogInterface.OnClickListener() {
|
|
|
|
|
public void onClick(DialogInterface dialog,
|
|
|
|
|
int which) {
|
|
|
|
|
batchDelete();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
builder.setNegativeButton(android.R.string.cancel, null);
|
|
|
|
|
builder.show();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.move:
|
|
|
|
|
startQueryDestinationFolders();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.restore:
|
|
|
|
|
// 恢复选中的项目
|
|
|
|
|
batchRestore();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.pin:
|
|
|
|
|
togglePinnedStatus();
|
|
|
|
|
break;
|
|
|
|
|
case R.id.lock:
|
|
|
|
|
showPasswordDialog();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -913,8 +954,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法在异步任务中完成以下工作:
|
|
|
|
|
* 1. 获取选中的部件属性
|
|
|
|
|
* 2. 如果不在同步模式,直接删除选中的笔记
|
|
|
|
|
* 3. 如果在同步模式,将选中的笔记移动到回收站
|
|
|
|
|
* 2. 如果当前在回收站内部,直接永久删除选中的笔记
|
|
|
|
|
* 3. 如果当前不在回收站内部,将选中的笔记移动到回收站
|
|
|
|
|
* 4. 更新相关部件
|
|
|
|
|
* 5. 结束多选模式
|
|
|
|
|
* </p>
|
|
|
|
|
@ -923,16 +964,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
|
|
|
|
|
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
|
|
|
|
|
HashSet<AppWidgetAttribute> widgets = mNotesListAdapter.getSelectedWidget();
|
|
|
|
|
if (!isSyncMode()) {
|
|
|
|
|
// if not synced, delete notes directly
|
|
|
|
|
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
|
|
|
|
|
.getSelectedItemIds())) {
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
if (mCurrentFolderId == Notes.ID_TRASH_FOLER) {
|
|
|
|
|
// 在回收站内部,直接永久删除
|
|
|
|
|
if (!DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter.getSelectedItemIds())) {
|
|
|
|
|
Log.e(TAG, "Delete notes error, should not happens");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// in sync mode, we'll move the deleted note into the trash
|
|
|
|
|
// folder
|
|
|
|
|
// 在回收站外部,移动到回收站
|
|
|
|
|
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
|
|
|
|
|
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
|
|
|
|
|
Log.e(TAG, "Move notes to trash folder error, should not happens");
|
|
|
|
|
@ -956,6 +995,103 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
}.execute();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量恢复回收站中的项目
|
|
|
|
|
* <p>
|
|
|
|
|
* 该方法在异步任务中完成以下工作:
|
|
|
|
|
* 1. 获取选中的项目ID
|
|
|
|
|
* 2. 对于每个项目,查询其原始父文件夹ID
|
|
|
|
|
* 3. 将项目移动回原始父文件夹(如果原始父文件夹不存在或也在回收站中,则移动到根文件夹)
|
|
|
|
|
* 4. 更新相关部件
|
|
|
|
|
* 5. 结束动作模式
|
|
|
|
|
* </p>
|
|
|
|
|
*/
|
|
|
|
|
private void batchRestore() {
|
|
|
|
|
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
|
|
|
|
|
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
|
|
|
|
|
HashSet<AppWidgetAttribute> widgets = mNotesListAdapter.getSelectedWidget();
|
|
|
|
|
HashSet<Long> selectedIds = mNotesListAdapter.getSelectedItemIds();
|
|
|
|
|
|
|
|
|
|
for (Long itemId : selectedIds) {
|
|
|
|
|
try {
|
|
|
|
|
// 查询项目的原始父文件夹ID
|
|
|
|
|
String[] projection = {NoteColumns.ORIGIN_PARENT_ID, NoteColumns.ID};
|
|
|
|
|
String selection = NoteColumns.ID + "=" + itemId;
|
|
|
|
|
|
|
|
|
|
Cursor cursor = mContentResolver.query(
|
|
|
|
|
Notes.CONTENT_NOTE_URI,
|
|
|
|
|
projection,
|
|
|
|
|
selection,
|
|
|
|
|
null,
|
|
|
|
|
null
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (cursor != null && cursor.moveToFirst()) {
|
|
|
|
|
long originParentId = cursor.getLong(0);
|
|
|
|
|
long currentId = cursor.getLong(1);
|
|
|
|
|
cursor.close();
|
|
|
|
|
|
|
|
|
|
// 检查原始父文件夹是否存在且不在回收站中
|
|
|
|
|
long targetParentId = originParentId;
|
|
|
|
|
|
|
|
|
|
// 查询原始父文件夹的信息
|
|
|
|
|
Cursor folderCursor = mContentResolver.query(
|
|
|
|
|
Notes.CONTENT_NOTE_URI,
|
|
|
|
|
new String[]{NoteColumns.PARENT_ID},
|
|
|
|
|
NoteColumns.ID + "=" + originParentId,
|
|
|
|
|
null,
|
|
|
|
|
null
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
boolean isValidFolder = false;
|
|
|
|
|
if (folderCursor != null) {
|
|
|
|
|
if (folderCursor.moveToFirst()) {
|
|
|
|
|
long folderParentId = folderCursor.getLong(0);
|
|
|
|
|
// 检查原始父文件夹是否在回收站中
|
|
|
|
|
if (folderParentId != Notes.ID_TRASH_FOLER) {
|
|
|
|
|
isValidFolder = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
folderCursor.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果原始父文件夹无效,使用根文件夹
|
|
|
|
|
if (!isValidFolder) {
|
|
|
|
|
targetParentId = Notes.ID_ROOT_FOLDER;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 移动项目回原始父文件夹或根文件夹
|
|
|
|
|
HashSet<Long> ids = new HashSet<Long>();
|
|
|
|
|
ids.add(currentId);
|
|
|
|
|
if (!DataUtils.batchMoveToFolder(mContentResolver, ids, targetParentId)) {
|
|
|
|
|
Log.e(TAG, "Restore item error: " + currentId);
|
|
|
|
|
}
|
|
|
|
|
} else if (cursor != null) {
|
|
|
|
|
cursor.close();
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
Log.e(TAG, "Failed to restore item: " + itemId, e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return widgets;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onPostExecute(HashSet<AppWidgetAttribute> widgets) {
|
|
|
|
|
if (widgets != null) {
|
|
|
|
|
for (AppWidgetAttribute widget : widgets) {
|
|
|
|
|
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
|
|
|
|
|
&& widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
|
|
|
|
|
updateWidget(widget.widgetId, widget.widgetType);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
mModeCallBack.finishActionMode();
|
|
|
|
|
}
|
|
|
|
|
}.execute();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 切换选中便签的置顶状态
|
|
|
|
|
*/
|
|
|
|
|
@ -1010,8 +1146,8 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
* 该方法完成以下工作:
|
|
|
|
|
* 1. 检查文件夹ID是否为根文件夹ID,如果是则返回错误
|
|
|
|
|
* 2. 获取文件夹的部件属性
|
|
|
|
|
* 3. 如果不在同步模式,直接删除文件夹
|
|
|
|
|
* 4. 如果在同步模式,将文件夹移动到回收站
|
|
|
|
|
* 3. 如果文件夹在回收站外部,将其移动到回收站
|
|
|
|
|
* 4. 如果文件夹在回收站内部,直接永久删除
|
|
|
|
|
* 5. 更新相关部件
|
|
|
|
|
* </p>
|
|
|
|
|
* @param folderId 要删除的文件夹ID
|
|
|
|
|
@ -1026,13 +1162,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
ids.add(folderId);
|
|
|
|
|
HashSet<AppWidgetAttribute> widgets = DataUtils.getFolderNoteWidget(mContentResolver,
|
|
|
|
|
folderId);
|
|
|
|
|
if (!isSyncMode()) {
|
|
|
|
|
// if not synced, delete folder directly
|
|
|
|
|
DataUtils.batchDeleteNotes(mContentResolver, ids);
|
|
|
|
|
|
|
|
|
|
if (mCurrentFolderId == Notes.ID_TRASH_FOLER) {
|
|
|
|
|
// 在回收站内部,直接永久删除
|
|
|
|
|
if (!DataUtils.batchDeleteNotes(mContentResolver, ids)) {
|
|
|
|
|
Log.e(TAG, "Delete folder error, should not happens");
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// in sync mode, we'll move the deleted folder into the trash folder
|
|
|
|
|
// 在回收站外部,移动到回收站
|
|
|
|
|
DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (widgets != null) {
|
|
|
|
|
for (AppWidgetAttribute widget : widgets) {
|
|
|
|
|
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
|
|
|
|
|
@ -1641,7 +1781,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt
|
|
|
|
|
if (view instanceof NotesListItem) {
|
|
|
|
|
NoteItemData item = ((NotesListItem) view).getItemData();
|
|
|
|
|
if (mNotesListAdapter.isInChoiceMode()) {
|
|
|
|
|
if (item.getType() == Notes.TYPE_NOTE) {
|
|
|
|
|
// 在选择模式下,允许选择所有类型的项
|
|
|
|
|
// 但根文件夹不能被选中
|
|
|
|
|
if (item.getId() != Notes.ID_ROOT_FOLDER) {
|
|
|
|
|
position = position - mNotesListView.getHeaderViewsCount();
|
|
|
|
|
mModeCallBack.onItemCheckedStateChanged(null, position, id,
|
|
|
|
|
!mNotesListAdapter.isSelectedItem(position));
|
|
|
|
|
|