diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java index 2a14982..61f56d2 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java @@ -34,9 +34,22 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; import java.util.HashSet; - +/** + * 数据操作工具类 + * 提供对笔记数据的各种操作方法,包括批量删除、移动笔记、查询数据等功能 + * 所有方法均为静态方法,可直接调用 + */ public class DataUtils { public static final String TAG = "DataUtils"; + + /** + * 批量删除笔记 + * 使用ContentProvider的批量操作功能高效删除多个笔记 + * + * @param resolver 内容解析器 + * @param ids 要删除的笔记ID集合 + * @return 删除操作是否成功 + */ public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { if (ids == null) { Log.d(TAG, "the ids is null"); @@ -49,15 +62,18 @@ public class DataUtils { ArrayList operationList = new ArrayList(); for (long id : ids) { + // 避免删除系统根文件夹 if(id == Notes.ID_ROOT_FOLDER) { Log.e(TAG, "Don't delete system folder root"); continue; } + // 构建删除操作 ContentProviderOperation.Builder builder = ContentProviderOperation .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); operationList.add(builder.build()); } try { + // 执行批量操作 ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); if (results == null || results.length == 0 || results[0] == null) { Log.d(TAG, "delete notes failed, ids:" + ids.toString()); @@ -72,14 +88,33 @@ public class DataUtils { return false; } + /** + * 将单个笔记移动到指定文件夹 + * + * @param resolver 内容解析器 + * @param id 要移动的笔记ID + * @param srcFolderId 原文件夹ID + * @param desFolderId 目标文件夹ID + */ public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { ContentValues values = new ContentValues(); + // 更新父文件夹ID和原始父文件夹ID values.put(NoteColumns.PARENT_ID, desFolderId); values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + // 标记为本地修改,以便同步 values.put(NoteColumns.LOCAL_MODIFIED, 1); resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); } + /** + * 批量将笔记移动到指定文件夹 + * 使用ContentProvider的批量操作功能高效移动多个笔记 + * + * @param resolver 内容解析器 + * @param ids 要移动的笔记ID集合 + * @param folderId 目标文件夹ID + * @return 移动操作是否成功 + */ public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, long folderId) { if (ids == null) { @@ -89,6 +124,7 @@ public class DataUtils { ArrayList operationList = new ArrayList(); for (long id : ids) { + // 构建更新操作 ContentProviderOperation.Builder builder = ContentProviderOperation .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); builder.withValue(NoteColumns.PARENT_ID, folderId); @@ -97,9 +133,10 @@ public class DataUtils { } try { + // 执行批量操作 ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + Log.d(TAG, "move notes failed, ids:" + ids.toString()); return false; } return true; @@ -112,18 +149,22 @@ public class DataUtils { } /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + * 获取用户创建的文件夹数量(不包括系统文件夹) + * + * @param resolver 内容解析器 + * @return 用户文件夹数量 */ public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, + // 查询类型为文件夹且不是垃圾桶的记录数量 + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, new String[] { "COUNT(*)" }, NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, + new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) }, null); int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { + if (cursor != null) { + if (cursor.moveToFirst()) { try { count = cursor.getInt(0); } catch (IndexOutOfBoundsException e) { @@ -136,11 +177,19 @@ public class DataUtils { return count; } + /** + * 检查笔记在数据库中是否可见(非垃圾桶中的指定类型笔记) + * + * @param resolver 内容解析器 + * @param noteId 笔记ID + * @param type 笔记类型 + * @return 是否可见 + */ public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, + new String[] { String.valueOf(type) }, null); boolean exist = false; @@ -153,6 +202,13 @@ public class DataUtils { return exist; } + /** + * 检查笔记是否存在于数据库中 + * + * @param resolver 内容解析器 + * @param noteId 笔记ID + * @return 是否存在 + */ public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, null, null, null); @@ -167,6 +223,13 @@ public class DataUtils { return exist; } + /** + * 检查数据项是否存在于数据库中 + * + * @param resolver 内容解析器 + * @param dataId 数据项ID + * @return 是否存在 + */ public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null, null, null, null); @@ -181,6 +244,13 @@ public class DataUtils { return exist; } + /** + * 检查文件夹名称是否已存在(非垃圾桶中的文件夹) + * + * @param resolver 内容解析器 + * @param name 文件夹名称 + * @return 是否存在同名文件夹 + */ public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + @@ -188,8 +258,8 @@ public class DataUtils { " AND " + NoteColumns.SNIPPET + "=?", new String[] { name }, null); boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { + if (cursor != null) { + if (cursor.getCount() > 0) { exist = true; } cursor.close(); @@ -197,6 +267,13 @@ public class DataUtils { return exist; } + /** + * 获取文件夹关联的小部件属性 + * + * @param resolver 内容解析器 + * @param folderId 文件夹ID + * @return 小部件属性集合 + */ public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, @@ -224,11 +301,18 @@ public class DataUtils { return set; } + /** + * 根据笔记ID获取关联的电话号码 + * + * @param resolver 内容解析器 + * @param noteId 笔记ID + * @return 电话号码,不存在则返回空字符串 + */ public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, + new String[] { CallNote.PHONE_NUMBER }, CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + new String[] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, null); if (cursor != null && cursor.moveToFirst()) { @@ -243,12 +327,20 @@ public class DataUtils { return ""; } + /** + * 根据电话号码和通话时间获取关联的笔记ID + * + * @param resolver 内容解析器 + * @param phoneNumber 电话号码 + * @param callDate 通话时间 + * @return 笔记ID,不存在则返回0 + */ public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, + new String[] { CallNote.NOTE_ID }, CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, + new String[] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, null); if (cursor != null) { @@ -264,11 +356,19 @@ public class DataUtils { return 0; } + /** + * 根据笔记ID获取笔记摘要 + * + * @param resolver 内容解析器 + * @param noteId 笔记ID + * @return 笔记摘要 + * @throws IllegalArgumentException 当笔记不存在时抛出 + */ public static String getSnippetById(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, + new String[] { NoteColumns.SNIPPET }, NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, + new String[] { String.valueOf(noteId) }, null); if (cursor != null) { @@ -282,6 +382,13 @@ public class DataUtils { throw new IllegalArgumentException("Note is not found with id: " + noteId); } + /** + * 格式化笔记摘要 + * 去除前后空格,并截断第一个换行符之前的内容 + * + * @param snippet 原始摘要 + * @return 格式化后的摘要 + */ public static String getFormattedSnippet(String snippet) { if (snippet != null) { snippet = snippet.trim(); @@ -292,4 +399,4 @@ public class DataUtils { } return snippet; } -} +} \ No newline at end of file diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java index 1ad3ad6..4aaacdc 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java @@ -22,24 +22,38 @@ import android.preference.PreferenceManager; import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * 资源解析工具类,负责管理和提供笔记应用中的各种资源ID + * 包括背景颜色、文本大小、不同界面元素的背景资源等 + * 采用单例模式设计,通过静态方法提供全局访问 + */ public class ResourceParser { + // 定义笔记背景颜色常量 public static final int YELLOW = 0; public static final int BLUE = 1; public static final int WHITE = 2; public static final int GREEN = 3; public static final int RED = 4; + // 默认背景颜色为黄色 public static final int BG_DEFAULT_COLOR = YELLOW; + // 定义文本大小常量 public static final int TEXT_SMALL = 0; public static final int TEXT_MEDIUM = 1; public static final int TEXT_LARGE = 2; public static final int TEXT_SUPER = 3; + // 默认文本大小为中等 public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + /** + * 笔记编辑界面背景资源管理类 + * 提供获取不同颜色背景资源ID的方法 + */ public static class NoteBgResources { + // 编辑界面主体背景资源数组,按颜色索引 private final static int [] BG_EDIT_RESOURCES = new int [] { R.drawable.edit_yellow, R.drawable.edit_blue, @@ -48,6 +62,7 @@ public class ResourceParser { R.drawable.edit_red }; + // 编辑界面标题背景资源数组,按颜色索引 private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { R.drawable.edit_title_yellow, R.drawable.edit_title_blue, @@ -56,25 +71,48 @@ public class ResourceParser { R.drawable.edit_title_red }; + /** + * 根据颜色ID获取编辑界面主体背景资源ID + * @param id 颜色ID,对应ResourceParser中定义的颜色常量 + * @return 对应的背景资源ID + */ public static int getNoteBgResource(int id) { return BG_EDIT_RESOURCES[id]; } + /** + * 根据颜色ID获取编辑界面标题背景资源ID + * @param id 颜色ID,对应ResourceParser中定义的颜色常量 + * @return 对应的标题背景资源ID + */ public static int getNoteTitleBgResource(int id) { return BG_EDIT_TITLE_RESOURCES[id]; } } + /** + * 获取默认背景颜色ID + * 根据用户偏好设置决定返回随机颜色还是默认黄色 + * @param context 应用上下文 + * @return 背景颜色ID + */ public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + // 如果用户开启了随机背景选项,返回随机颜色ID return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); } else { + // 默认返回黄色背景 return BG_DEFAULT_COLOR; } } + /** + * 笔记列表项背景资源管理类 + * 提供获取列表中不同位置笔记项背景资源ID的方法 + */ public static class NoteItemBgResources { + // 列表中第一项的背景资源数组,按颜色索引 private final static int [] BG_FIRST_RESOURCES = new int [] { R.drawable.list_yellow_up, R.drawable.list_blue_up, @@ -83,6 +121,7 @@ public class ResourceParser { R.drawable.list_red_up }; + // 列表中中间项的背景资源数组,按颜色索引 private final static int [] BG_NORMAL_RESOURCES = new int [] { R.drawable.list_yellow_middle, R.drawable.list_blue_middle, @@ -91,6 +130,7 @@ public class ResourceParser { R.drawable.list_red_middle }; + // 列表中最后一项的背景资源数组,按颜色索引 private final static int [] BG_LAST_RESOURCES = new int [] { R.drawable.list_yellow_down, R.drawable.list_blue_down, @@ -99,6 +139,7 @@ public class ResourceParser { R.drawable.list_red_down, }; + // 列表中只有一项时的背景资源数组,按颜色索引 private final static int [] BG_SINGLE_RESOURCES = new int [] { R.drawable.list_yellow_single, R.drawable.list_blue_single, @@ -107,28 +148,57 @@ public class ResourceParser { R.drawable.list_red_single }; + /** + * 获取列表中第一项的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getNoteBgFirstRes(int id) { return BG_FIRST_RESOURCES[id]; } + /** + * 获取列表中最后一项的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getNoteBgLastRes(int id) { return BG_LAST_RESOURCES[id]; } + /** + * 获取列表中只有一项时的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getNoteBgSingleRes(int id) { return BG_SINGLE_RESOURCES[id]; } + /** + * 获取列表中中间项的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getNoteBgNormalRes(int id) { return BG_NORMAL_RESOURCES[id]; } + /** + * 获取文件夹项的背景资源ID + * @return 文件夹背景资源ID + */ public static int getFolderBgRes() { return R.drawable.list_folder; } } + /** + * 桌面小部件背景资源管理类 + * 提供获取不同尺寸小部件背景资源ID的方法 + */ public static class WidgetBgResources { + // 2x尺寸小部件的背景资源数组,按颜色索引 private final static int [] BG_2X_RESOURCES = new int [] { R.drawable.widget_2x_yellow, R.drawable.widget_2x_blue, @@ -137,10 +207,16 @@ public class ResourceParser { R.drawable.widget_2x_red, }; + /** + * 获取2x尺寸小部件的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getWidget2xBgResource(int id) { return BG_2X_RESOURCES[id]; } + // 4x尺寸小部件的背景资源数组,按颜色索引 private final static int [] BG_4X_RESOURCES = new int [] { R.drawable.widget_4x_yellow, R.drawable.widget_4x_blue, @@ -149,12 +225,22 @@ public class ResourceParser { R.drawable.widget_4x_red }; + /** + * 获取4x尺寸小部件的背景资源ID + * @param id 颜色ID + * @return 对应的背景资源ID + */ public static int getWidget4xBgResource(int id) { return BG_4X_RESOURCES[id]; } } + /** + * 文本外观资源管理类 + * 提供获取不同文本大小样式资源ID的方法 + */ public static class TextAppearanceResources { + // 文本外观样式资源数组,按大小索引 private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { R.style.TextAppearanceNormal, R.style.TextAppearanceMedium, @@ -162,11 +248,16 @@ public class ResourceParser { R.style.TextAppearanceSuper }; + /** + * 根据ID获取文本外观样式资源ID + * 包含对无效ID的防御性编程处理 + * @param id 文本大小ID,对应ResourceParser中定义的文本大小常量 + * @return 对应的文本外观样式资源ID + */ public static int getTexAppearanceResource(int id) { /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + * HACKME: 修复在共享偏好中存储资源ID可能导致的问题 + * 如果ID大于资源数组长度,返回默认字体大小对应的资源ID */ if (id >= TEXTAPPEARANCE_RESOURCES.length) { return BG_DEFAULT_FONT_SIZE; @@ -174,6 +265,10 @@ public class ResourceParser { return TEXTAPPEARANCE_RESOURCES[id]; } + /** + * 获取文本外观资源数组的长度 + * @return 资源数组长度 + */ public static int getResourcesSize() { return TEXTAPPEARANCE_RESOURCES.length; }