diff --git a/src/main/java/net/micode/notes/tool/DataUtils.java b/src/main/java/net/micode/notes/tool/DataUtils.java index 49d5a18..6d84777 100644 --- a/src/main/java/net/micode/notes/tool/DataUtils.java +++ b/src/main/java/net/micode/notes/tool/DataUtils.java @@ -272,11 +272,27 @@ public class DataUtils { * @return 存在返回true,否则返回false */ public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + return checkVisibleFolderName(resolver, name, Notes.ID_ROOT_FOLDER); + } + + /** + * 检查可见文件夹名称是否存在(重载方法,支持指定父文件夹ID) + *

+ * 检查指定名称的文件夹是否存在于指定父文件夹下,且不在垃圾箱中。 + *

+ * + * @param resolver ContentResolver实例,用于与内容提供者交互 + * @param name 文件夹名称 + * @param parentId 父文件夹ID + * @return 存在返回true,否则返回false + */ + public static boolean checkVisibleFolderName(ContentResolver resolver, String name, long parentId) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.PARENT_ID + "=?" + " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); + new String[] { String.valueOf(parentId), name }, null); boolean exist = false; if(cursor != null) { if(cursor.getCount() > 0) { diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index f1d9277..78aa3f9 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -201,7 +201,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * Insert an introduction when user firstly use this application */ setAppInfoFromRawRes(); - + // 注册Android 13+的返回键回调 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { getOnBackInvokedDispatcher().registerOnBackInvokedCallback( @@ -1002,7 +1002,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt public void onClick(View v) { hideSoftInput(etName); String name = etName.getText().toString(); - if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { + if (DataUtils.checkVisibleFolderName(mContentResolver, name, mCurrentFolderId)) { Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), Toast.LENGTH_LONG).show(); etName.setSelection(0, etName.length()); @@ -1023,6 +1023,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt ContentValues values = new ContentValues(); values.put(NoteColumns.SNIPPET, name); values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); + values.put(NoteColumns.PARENT_ID, mCurrentFolderId); mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); } dialog.dismiss(); @@ -1068,10 +1069,32 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private void handleBackPress() { switch (mState) { case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - startAsyncNotesListQuery(); - mTitleBar.setVisibility(View.GONE); + // 查询当前文件夹的父文件夹ID + Cursor cursor = mContentResolver.query(Notes.CONTENT_NOTE_URI, + new String[]{NoteColumns.PARENT_ID, NoteColumns.SNIPPET}, + NoteColumns.ID + "=?", + new String[]{String.valueOf(mCurrentFolderId)}, + null); + + if (cursor != null && cursor.moveToFirst()) { + long parentId = cursor.getLong(0); + String parentName = cursor.getString(1); + cursor.close(); + + if (parentId == Notes.ID_ROOT_FOLDER) { + // 如果父文件夹是根文件夹,返回根目录 + mCurrentFolderId = Notes.ID_ROOT_FOLDER; + mState = ListEditState.NOTE_LIST; + mTitleBar.setVisibility(View.GONE); + } else { + // 否则返回上一级文件夹 + mCurrentFolderId = parentId; + mState = ListEditState.SUB_FOLDER; + mTitleBar.setText(parentName); + mTitleBar.setVisibility(View.VISIBLE); + } + startAsyncNotesListQuery(); + } break; case CALL_RECORD_FOLDER: mCurrentFolderId = Notes.ID_ROOT_FOLDER; @@ -1402,13 +1425,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } break; case SUB_FOLDER: - case CALL_RECORD_FOLDER: if (item.getType() == Notes.TYPE_NOTE) { openNode(item); + } else if (item.getType() == Notes.TYPE_FOLDER) { + openFolder(item); } else { Log.e(TAG, "Wrong note type in SUB_FOLDER"); } break; + case CALL_RECORD_FOLDER: + if (item.getType() == Notes.TYPE_NOTE) { + openNode(item); + } else { + Log.e(TAG, "Wrong note type in CALL_RECORD_FOLDER"); + } + break; default: break; } diff --git a/src/main/res/menu/sub_folder.xml b/src/main/res/menu/sub_folder.xml index b00de26..cb89b13 100644 --- a/src/main/res/menu/sub_folder.xml +++ b/src/main/res/menu/sub_folder.xml @@ -18,6 +18,9 @@ +