From bfddefbc3b8eef993e7b3e584a85b2b1099091fc Mon Sep 17 00:00:00 2001 From: Surponess Date: Tue, 23 Dec 2025 23:21:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E5=A4=84=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/net/micode/notes/data/Contact.java | 53 +++- .../src/net/micode/notes/data/Notes.java | 246 ++++++++---------- .../notes/data/NotesDatabaseHelper.java | 51 ++-- .../net/micode/notes/data/NotesProvider.java | 53 ++-- .../src/net/micode/notes/model/Note.java | 65 ++--- .../net/micode/notes/model/WorkingNote.java | 108 +++++--- .../net/micode/notes/tool/BackupUtils.java | 32 +-- .../src/net/micode/notes/tool/DataUtils.java | 14 +- .../net/micode/notes/tool/ResourceParser.java | 5 - .../micode/notes/ui/AlarmAlertActivity.java | 5 +- .../micode/notes/ui/AlarmInitReceiver.java | 5 +- .../micode/notes/ui/FoldersListAdapter.java | 5 +- .../src/net/micode/notes/ui/NoteItemData.java | 5 +- .../micode/notes/ui/NotesListActivity.java | 24 +- .../net/micode/notes/ui/NotesListAdapter.java | 25 +- .../net/micode/notes/ui/NotesListItem.java | 5 +- .../notes/ui/NotesPreferenceActivity.java | 14 +- .../notes/widget/NoteWidgetProvider.java | 5 +- .../notes/widget/NoteWidgetProvider_2x.java | 5 +- .../notes/widget/NoteWidgetProvider_4x.java | 5 +- 20 files changed, 409 insertions(+), 321 deletions(-) diff --git a/src/Notes-master/src/net/micode/notes/data/Contact.java b/src/Notes-master/src/net/micode/notes/data/Contact.java index 4389c06..2ac3c50 100644 --- a/src/Notes-master/src/net/micode/notes/data/Contact.java +++ b/src/Notes-master/src/net/micode/notes/data/Contact.java @@ -26,11 +26,12 @@ import android.util.Log; import java.util.HashMap; /** - * 联系人工具 - * 用于根据电话号码获取联系人名称,并使用缓存提高性能 + * 联系人查询工具类 + * 核心功能:在小米便签中用于智能识别电话号码并显示联系人名称 + * 实现方法:通过电话号码查询系统联系人的姓名,并通过哈希表缓存查询结果,避免重复查询,提升性能 */ public class Contact { - // 联系人缓存哈希表,用于存储电话号码和联系人名称的映射关系 + // 功能:缓存查询结果,,暂时存储电话号码与联系人的映射关系,避免重复查询,节省开销 private static HashMap sContactCache; // 日志标签 private static final String TAG = "Contact"; @@ -42,12 +43,27 @@ public class Contact { + "(SELECT raw_contact_id " + " FROM phone_lookup" + " WHERE min_match = '+')"; + /** + * SQL语句逻辑解读 + * AND 连接一个条件与下一个条件 + * 第一个条件:PHONE_NUMBERS_EQUAL(Phone.NUMBER,?) + * PHONE_NUMBERS_EQUAL 函数:Android系统提供的特殊函数,用于查找和Phone.NUMBER相同的电话号码 + * 第二个条件:Data.MIMETYPE = 'Phone.CONTENT_ITEM_TYPE' + * 确保数据类型必须是电话号码类型 + * 第三个条件:Data.RAW_CONTACT_ID IN A + * 联系人的ID必须存在于这个表格A中 + * 表格A:(SELECT raw_contact_id FROM phone_lookup WHERE min_match = '+') + * phone_lookup:Android系统中的一个与联系人数据有关的特殊表 + * min_match:最小匹配位数 + * 预先计算一个电话号码的最小匹配形式的表格 + */ /** - * 根据电话号码获取联系人名称 - * @param context 上下文对象 - * @param phoneNumber 电话号码 - * @return 联系人名称,如果未找到则返回null + * 根据电话号码获取联系人姓名。 + * + * @param context 上下文对象,用于访问 ContentResolver + * @param phoneNumber 电话号码(原始字符串,不做预处理) + * @return 联系人姓名;未找到或异常时返回 null */ public static String getContact(Context context, String phoneNumber) { // 如果缓存哈希表为空,则创建新的哈希表 @@ -55,34 +71,45 @@ public class Contact { sContactCache = new HashMap(); } // 检查缓存中是否已有该电话号码对应的联系人 + // 检查缓存中是否已存在该电话号码的查询结果 if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } // 构建查询条件,替换min_match参数 + // PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)用于计算电话号码的最小匹配位数 + // 将占位符"+"替换为最小匹配数,以构建完整的查询语句 String selection = CALLER_ID_SELECTION.replace("+", PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); - // 查询联系人数据库 + /** + * 查询联系人数据库 + * context.getContentResolver().query:查询当前应用程序的数据 + */ Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, - selection, - new String[] { phoneNumber }, - null); + Data.CONTENT_URI, // 查询URI + new String [] { Phone.DISPLAY_NAME }, // 联系人的名称作为返回值 + selection, // 查询条件 + new String[] { phoneNumber }, // 电话号码作为查询参数 + null); // 无排序方式 // 如果找到联系人,返回名称并缓存 + // 查询系统联系人数据库 if (cursor != null && cursor.moveToFirst()) { try { + // 获取第一行第一列的联系人姓名 String name = cursor.getString(0); // 将联系人和电话号码存入缓存中,以便下次查找 sContactCache.put(phoneNumber, name); return name; } catch (IndexOutOfBoundsException e) { + // 发生数组越界异常,将异常记录到日志Log中 Log.e(TAG, " Cursor get string error " + e.toString()); return null; } finally { + // 关闭Cursor,防止内存泄露 cursor.close(); } } else { + // 没有找到匹配的联系人,将信息写入日志中 Log.d(TAG, "No contact matched with number:" + phoneNumber); return null; } diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index dbee197..5b309f9 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -24,241 +24,213 @@ import android.net.Uri; * 纯定义类,不包含函数实现 */ public class Notes { - public static final String AUTHORITY = "micode_notes"; // 内容提供者的权限标识 - public static final String TAG = "Notes"; // 日志标签 - public static final int TYPE_NOTE = 0; // 笔记类型:普通笔记 - public static final int TYPE_FOLDER = 1; // 笔记类型:文件夹 - public static final int TYPE_SYSTEM = 2; // 笔记类型:系统笔记 - - /** - * 以下是系统文件夹的标识符 - * {@link Notes#ID_ROOT_FOLDER } 是默认文件夹 - * {@link Notes#ID_TEMPARAY_FOLDER } 用于不属于任何文件夹的笔记 - * {@link Notes#ID_CALL_RECORD_FOLDER} 用于存储通话记录 - */ + // ContentProvider的授权标识 + public static final String AUTHORITY = "micode_notes"; + // 日志标签 + public static final String TAG = "Notes"; + // 0类型:普通笔记 + public static final int TYPE_NOTE = 0; + // 1类型:文件夹 + public static final int TYPE_FOLDER = 1; + // 2类型:系统文件夹 + public static final int TYPE_SYSTEM = 2; + + // 系统文件夹的 ID 定义。 + // #ID_ROOT_FOLDER 默认根文件夹 + // #ID_TEMPARAY_FOLDER 临时文件夹,移动笔记时的中转 + // #ID_CALL_RECORD_FOLDER 通话记录专用文件夹 + // #ID_TRASH_FOLER 回收站 public static final int ID_ROOT_FOLDER = 0; // 默认根文件夹 public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹(用于无归属的笔记) public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹 public static final int ID_TRASH_FOLER = -3; // 回收站文件夹 - // Intent额外数据键定义 - public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; // 提醒日期 - public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; // 背景颜色ID - public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; // 小组件ID - public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; // 小组件类型 - public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; // 文件夹ID - public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; // 通话日期 - - // 小组件类型定义 - public static final int TYPE_WIDGET_INVALIDE = -1; // 无效小组件 - public static final int TYPE_WIDGET_2X = 0; // 2x大小的小组件 - public static final int TYPE_WIDGET_4X = 1; // 4x大小的小组件 + /** + * Intent Extra 键常量,用于在 Android 组件间通过 Intent 传递数据,包括: + * 1. 提醒日期 + * 2. 背景颜色ID + * 3. 小部件ID + * 4. 小部件类型 + * 5. 文件夹ID + * 6. 通话日期 + */ + public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; + public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; + public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; + public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; + public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; + public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; + + // 无效的小部件类型 -1 + public static final int TYPE_WIDGET_INVALIDE = -1; + // 2x2小部件类型 0 + public static final int TYPE_WIDGET_2X = 0; + // 4x4小部件类型 1 + public static final int TYPE_WIDGET_4X = 1; /** * 数据类型常量定义 */ public static class DataConstants { - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; // 普通文本笔记类型 - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; // 通话记录笔记类型 + // 普通笔记的MIME类型 + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; + // 通话记录笔记的MIME类型 + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; } - /** - * 查询所有笔记和文件夹的Uri - */ + // URI 是 ContentProvider 的标准访问入口,用于统一访问应用的数据。 + // 查询所有笔记和文件夹的URI public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); - /** - * 查询笔记数据的Uri - */ + // 查询数据表的URI public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + /** + * NoteColumns 接口 - 便签表(notes表)列定义 + * 定义了便签和文件夹数据库表的所有列名和类型 + */ /** * 笔记表的列名定义接口 */ public interface NoteColumns { - /** - * 行的唯一ID - */ + + // 行的唯一ID public static final String ID = "_id"; - /** - * 笔记或文件夹的父级ID - */ + // 笔记或文件夹的父ID public static final String PARENT_ID = "parent_id"; - /** - * 笔记或文件夹的创建日期 - */ + // 笔记或文件夹的创建日期 public static final String CREATED_DATE = "created_date"; - /** - * 最近修改日期 - */ + // 最后修改日期 public static final String MODIFIED_DATE = "modified_date"; - /** - * 提醒日期 - */ + // 提醒日期 public static final String ALERTED_DATE = "alert_date"; - /** - * 文件夹名称或笔记内容摘要 - */ + // 文件夹名称或笔记的文本内容摘要 public static final String SNIPPET = "snippet"; - /** - * 笔记关联的小组件ID - */ + // 笔记的小部件ID public static final String WIDGET_ID = "widget_id"; - /** - * 笔记关联的小组件类型 - */ + // 笔记的小部件类型 public static final String WIDGET_TYPE = "widget_type"; - /** - * 笔记背景颜色ID - */ + // 笔记的背景颜色ID public static final String BG_COLOR_ID = "bg_color_id"; - /** - * 是否有附件标识 - * 对于文本笔记,没有附件;对于多媒体笔记,至少有一个附件 - */ + // 是否有附件;对于文本笔记没有附件,多媒体笔记至少有一个附件 public static final String HAS_ATTACHMENT = "has_attachment"; - /** - * 文件夹中包含的笔记数量 - */ + // 文件夹中的笔记数量 public static final String NOTES_COUNT = "notes_count"; - /** - * 文件类型:文件夹或笔记 - */ + // 文件类型:文件夹或笔记 public static final String TYPE = "type"; - /** - * 最后同步ID - */ + // 最后一次同步的ID public static final String SYNC_ID = "sync_id"; - /** - * 本地修改状态标识 - */ + // 标记是否在本地被修改 public static final String LOCAL_MODIFIED = "local_modified"; - /** - * 移动到临时文件夹前的原始父级ID - */ + // 移动到临时文件夹之前的原始父ID public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - /** - * 谷歌任务ID - */ + // Google Task的ID public static final String GTASK_ID = "gtask_id"; - /** - * 版本号 - */ + // 版本号 public static final String VERSION = "version"; } - /** - * 笔记数据表的列名定义接口 + /** + * DataColumns 接口 - 便签数据表(data表)列定义 + * 定义了便签详细内容的数据表列名和类型 + * 使用MIME_TYPE字段区分不同类型的便签数据(文本便签、通话记录等) */ public interface DataColumns { - /** - * 行的唯一ID - */ + // 行的唯一ID public static final String ID = "_id"; - /** - * 该行代表的项的MIME类型 - */ + // 该行数据项的MIME类型 public static final String MIME_TYPE = "mime_type"; - /** - * 该数据所属的笔记ID - */ + // 该数据所属笔记的引用ID public static final String NOTE_ID = "note_id"; - /** - * 创建日期 - */ + // 笔记或文件夹的创建日期 public static final String CREATED_DATE = "created_date"; - /** - * 最近修改日期 - */ + // 最后修改日期 public static final String MODIFIED_DATE = "modified_date"; - /** - * 数据内容 - */ + // 数据内容 public static final String CONTENT = "content"; - /** - * 通用数据列1,含义由{@link #MIMETYPE}决定,用于整数类型 - */ + // 通用数据列1 public static final String DATA1 = "data1"; - /** - * 通用数据列2,含义由{@link #MIMETYPE}决定,用于整数类型 - */ + // 通用数据列2 public static final String DATA2 = "data2"; - /** - * 通用数据列3,含义由{@link #MIMETYPE}决定,用于文本类型 - */ + // 通用数据列3 public static final String DATA3 = "data3"; - /** - * 通用数据列4,含义由{@link #MIMETYPE}决定,用于文本类型 - */ + // 通用数据列4 public static final String DATA4 = "data4"; - /** - * 通用数据列5,含义由{@link #MIMETYPE}决定,用于文本类型 - */ + // 通用数据列5 public static final String DATA5 = "data5"; } /** - * 文本笔记的数据类型定义 + * TextNote 类 - 文本便签数据定义 + * 定义了文本便签特有的数据列和URI */ public static final class TextNote implements DataColumns { - /** - * 笔记模式:指示文本是否处于 checklist 模式 - */ + // 模式标识:文本是否为清单模式 public static final String MODE = DATA1; - public static final int MODE_CHECK_LIST = 1; // Checklist模式 + // 清单模式常量 + public static final int MODE_CHECK_LIST = 1; + + // 普通模式常量 + public static final int MODE_NORMAL = 0; - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; // 文本笔记集合的MIME类型 + // 文本笔记的目录MIME类型 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; // 单个文本笔记的MIME类型 + // 文本笔记的单项MIME类型 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); // 文本笔记的内容URI + // 文本笔记的URI + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } /** - * 通话记录笔记的数据类型定义 + * CallNote 类 - 通话记录便签数据定义 + * 定义了通话记录便签特有的数据列和URI */ public static final class CallNote implements DataColumns { - /** - * 通话记录的通话日期 - */ + // 通话日期 public static final String CALL_DATE = DATA1; - /** - * 通话记录的电话号码 - */ + // 电话号码 public static final String PHONE_NUMBER = DATA3; - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; // 通话记录集合的MIME类型 + // 联系人姓名 + public static final String CONTACT_NAME = DATA4; + + // 通话记录笔记的目录MIME类型 + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; // 单个通话记录的MIME类型 + // 通话记录笔记的单项MIME类型 + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); // 通话记录的内容URI + // 通话记录笔记的URI + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); } } diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index b06ea01..78c7f01 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -33,19 +33,25 @@ import net.micode.notes.data.Notes.NoteColumns; public class NotesDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "note.db"; // 数据库名称 private static final int DB_VERSION = 4; // 数据库版本 - +; /** * 数据库表名定义接口 */ public interface TABLE { - public static final String NOTE = "note"; // 笔记表 - public static final String DATA = "data"; // 笔记数据表 + /** 笔记表名 */ + public static final String NOTE = "note"; + + /** 数据表名 */ + public static final String DATA = "data"; } + private static final String TAG = "NotesDatabaseHelper"; // 日志标签 private static NotesDatabaseHelper mInstance; // 单例实例 - // 创建笔记表的SQL语句 + /** 数据库帮助类的单例实例 */ + private static NotesDatabaseHelper mInstance; + private static final String CREATE_NOTE_TABLE_SQL = "CREATE TABLE " + TABLE.NOTE + "(" + NoteColumns.ID + " INTEGER PRIMARY KEY," + @@ -86,7 +92,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { // 创建笔记数据表中note_id列的索引 private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + - TABLE.DATA + "(" + DataColumns.NOTE_ID + ")"; + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; /** * 当笔记移动到文件夹时增加文件夹的笔记计数 @@ -131,9 +137,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " AND " + NoteColumns.NOTES_COUNT + ">0;" + " END"; - /** - * 当插入类型为{@link DataConstants#NOTE}的数据时更新笔记内容 - */ + /**插入 TEXT_NOTE 类型的数据行时,用数据内容刷新 note.snippet */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = "CREATE TRIGGER update_note_content_on_insert " + " AFTER INSERT ON " + TABLE.DATA + @@ -144,9 +148,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + " END"; - /** - * 当类型为{@link DataConstants#NOTE}的数据发生变化时更新笔记内容 - */ + /**更新 TEXT_NOTE 数据行时,同步更新 note.snippet */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = "CREATE TRIGGER update_note_content_on_update " + " AFTER UPDATE ON " + TABLE.DATA + @@ -157,9 +159,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + " END"; - /** - * 当类型为{@link DataConstants#NOTE}的数据被删除时更新笔记内容 - */ + /** 删除 TEXT_NOTE 数据行时,清空 note.snippet */ private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = "CREATE TRIGGER update_note_content_on_delete " + " AFTER delete ON " + TABLE.DATA + @@ -262,25 +262,19 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); - /** - * 根文件夹,默认文件夹 - */ + // 创建根文件夹(默认文件夹) values.clear(); values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); - /** - * 临时文件夹,用于移动笔记时临时存储 - */ + // 创建临时文件夹(用于移动笔记) values.clear(); values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); db.insert(TABLE.NOTE, null, values); - /** - * 回收站文件夹 - */ + // 创建回收站文件夹 values.clear(); values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); @@ -326,12 +320,10 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { return mInstance; } - /** - * 当数据库首次创建时调用 - * @param db 数据库对象 - */ + /** 创建数据库:依次创建 note 表与 data 表 */ @Override public void onCreate(SQLiteDatabase db) { + createNoteTable(db); // 创建笔记表 createDataTable(db); // 创建笔记数据表 } @@ -344,13 +336,14 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + boolean reCreateTriggers = false; // 是否需要重建触发器 boolean skipV2 = false; // 是否跳过版本2的升级 // 从版本1升级 if (oldVersion == 1) { upgradeToV2(db); - skipV2 = true; // 版本2到版本3的升级已经包含在版本1到版本2的升级中 + oldVersion++; } @@ -376,7 +369,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { // 检查升级是否成功 if (oldVersion != newVersion) { throw new IllegalStateException("Upgrade notes database to version " + newVersion - + " fails"); + } } diff --git a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java index 69acdc6..3949f8c 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java @@ -41,20 +41,28 @@ import net.micode.notes.data.NotesDatabaseHelper.TABLE; * 支持搜索和搜索建议功能 */ public class NotesProvider extends ContentProvider { + private static final UriMatcher mMatcher; // URI匹配器,用于解析不同类型的URI请求 - private NotesDatabaseHelper mHelper; // 数据库帮助类实例 + // 数据库帮助类实例,负责获取读写数据库 + private NotesDatabaseHelper mHelper; private static final String TAG = "NotesProvider"; // 日志标签 - // URI类型常量定义 - private static final int URI_NOTE = 1; // 笔记集合URI - private static final int URI_NOTE_ITEM = 2; // 单个笔记URI - private static final int URI_DATA = 3; // 笔记数据集合URI - private static final int URI_DATA_ITEM = 4; // 单个笔记数据URI + // URI匹配码:笔记列表 + private static final int URI_NOTE = 1; + // URI匹配码:单个笔记 + private static final int URI_NOTE_ITEM = 2; + // URI匹配码:数据列表 + private static final int URI_DATA = 3; + // URI匹配码:单个数据项 + private static final int URI_DATA_ITEM = 4; + - private static final int URI_SEARCH = 5; // 搜索URI - private static final int URI_SEARCH_SUGGEST = 6; // 搜索建议URI + // URI匹配码:搜索 + private static final int URI_SEARCH = 5; + // URI匹配码:搜索建议 + private static final int URI_SEARCH_SUGGEST = 6; /** * 静态初始化块 - 配置URI匹配规则 @@ -77,8 +85,8 @@ public class NotesProvider extends ContentProvider { } /** - * 搜索结果的投影定义 - * x'0A' 表示SQLite中的换行符\n,搜索结果中会去除换行符和空白以显示更多信息 + * 笔记搜索投影字段。 + * x'0A' 代表 SQLite 中的换行符;搜索时去掉换行与空格,便于列表展示更多内容。 */ private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," @@ -128,6 +136,7 @@ public class NotesProvider extends ContentProvider { c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); break; + case URI_NOTE_ITEM: // 查询单个笔记 id = uri.getPathSegments().get(1); c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id @@ -174,6 +183,7 @@ public class NotesProvider extends ContentProvider { throw new IllegalArgumentException("Unknown URI " + uri); } if (c != null) { + // 通知游标所关联的 URI,用于后续数据变更时自动刷新 c.setNotificationUri(getContext().getContentResolver(), uri); } return c; @@ -204,13 +214,13 @@ public class NotesProvider extends ContentProvider { default: throw new IllegalArgumentException("Unknown URI " + uri); } - // 通知笔记URI数据变化 + // 通知笔记 URI 变化(noteId>0 时) if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); } - // 通知数据URI数据变化 + // 通知数据 URI 变化(dataId>0 时) if (dataId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); @@ -242,6 +252,7 @@ public class NotesProvider extends ContentProvider { /** * ID that smaller than 0 is system folder which is not allowed to * trash + * ID小于0的是系统文件夹,不允许删除 */ long noteId = Long.valueOf(id); if (noteId <= 0) { @@ -265,6 +276,7 @@ public class NotesProvider extends ContentProvider { } if (count > 0) { if (deleteData) { + // 数据行删除会影响笔记摘要,通知笔记 URI getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); } getContext().getContentResolver().notifyChange(uri, null); @@ -314,7 +326,7 @@ public class NotesProvider extends ContentProvider { if (count > 0) { if (updateData) { - // 如果更新了数据内容,也通知笔记URI的观察者 + // 数据行更新影响笔记摘要,通知笔记 URI getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); } // 通知URI的观察者数据已更改 @@ -324,20 +336,21 @@ public class NotesProvider extends ContentProvider { } /** - * 解析并格式化查询条件 - * @param selection 原始查询条件 - * @return 格式化后的查询条件 + * 拼接 WHERE 子句,如果传入 selection 非空则加上 AND (...)。 + * + * @param selection 选择条件 + * @return 格式化后的选择条件 */ private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : ""); } /** - * 增加笔记的版本号 + * 增加笔记版本号,用于标记被修改过。 * 用于记录笔记的修改版本,支持并发更新场景 - * @param id 笔记ID,-1表示更新所有符合条件的笔记 - * @param selection 查询条件 - * @param selectionArgs 查询条件参数 + * @param id 笔记ID;小于0表示不按ID过滤,仅使用 selection + * @param selection 选择条件 + * @param selectionArgs 选择参数 */ private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); diff --git a/src/Notes-master/src/net/micode/notes/model/Note.java b/src/Notes-master/src/net/micode/notes/model/Note.java index 42cd97d..ed49896 100644 --- a/src/Notes-master/src/net/micode/notes/model/Note.java +++ b/src/Notes-master/src/net/micode/notes/model/Note.java @@ -40,18 +40,20 @@ import java.util.ArrayList; * 采用分层设计,将笔记的元数据和具体内容分开管理 */ public class Note { - private ContentValues mNoteDiffValues; // 存储笔记的差异值,用于增量更新 - private NoteData mNoteData; // 存储笔记的具体数据(文本、通话等) - private static final String TAG = "Note"; // 日志标签 + /** 笔记差异值,用于记录笔记表的修改字段(增量更新) */ + private ContentValues mNoteDiffValues; + /** 笔记数据对象,负责文本与通话相关的数据行 */ + private NoteData mNoteData; + private static final String TAG = "Note"; /** - * 创建一个新笔记并返回其ID - * 用于向数据库中添加新笔记 + * 创建新笔记并返回ID。 + * * @param context 上下文对象 - * @param folderId 新笔记所属的文件夹ID - * @return 新创建的笔记ID + * @param folderId 目标父文件夹ID + * @return 新创建的笔记ID(>0);失败抛出异常或返回0 */ public static synchronized long getNewNoteId(Context context, long folderId) { - // 创建一个新笔记在数据库中 + // 在数据库中创建新笔记:设置创建/修改时间、类型、父文件夹等初始值 ContentValues values = new ContentValues(); long createdTime = System.currentTimeMillis(); values.put(NoteColumns.CREATED_DATE, createdTime); @@ -83,7 +85,7 @@ public class Note { } /** - * 设置笔记的元数据值 + * 设置笔记表字段的值,并标记本地修改。 * @param key 字段名 * @param value 字段值 */ @@ -94,7 +96,7 @@ public class Note { } /** - * 设置文本笔记的数据 + * 设置文本数据字段(data 表)。 * @param key 字段名 * @param value 字段值 */ @@ -127,7 +129,7 @@ public class Note { } /** - * 设置通话笔记的数据 + * 设置通话数据字段(data 表)。 * @param key 字段名 * @param value 字段值 */ @@ -144,11 +146,11 @@ public class Note { } /** - * 同步笔记到数据库 - * 将本地修改的笔记数据同步到数据库中 + * 将笔记的增量更新同步到数据库。 + * * @param context 上下文对象 - * @param noteId 要同步的笔记ID - * @return 同步是否成功 + * @param noteId 笔记ID + * @return 同步成功返回 true,失败返回 false */ public boolean syncNote(Context context, long noteId) { if (noteId <= 0) { @@ -159,16 +161,12 @@ public class Note { return true; } - /** - * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and - * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info - */ + // 理论上任何变更都应更新 LOCAL_MODIFIED 与 MODIFIED_DATE;即便 note 表更新失败,也继续尝试写 data if (context.getContentResolver().update( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, null) == 0) { Log.e(TAG, "Update note error, should not happen"); - // Do not return, fall through + // 不返回,继续执行 } mNoteDiffValues.clear(); @@ -191,9 +189,18 @@ public class Note { private ContentValues mCallDataValues; // 通话笔记数据值 private static final String TAG = "NoteData"; // 日志标签 - /** - * 构造方法 - 初始化笔记数据对象 - */ + /** 文本数据值 */ + private ContentValues mTextDataValues; + + /** 通话数据ID */ + private long mCallDataId; + + /** 通话数据值 */ + private ContentValues mCallDataValues; + + private static final String TAG = "NoteData"; + + /** 构造函数:初始化两个数据集与对应 ID */ public NoteData() { mTextDataValues = new ContentValues(); mCallDataValues = new ContentValues(); @@ -234,7 +241,7 @@ public class Note { } /** - * 设置通话笔记的数据 + * 设置通话数据字段,并同步标记 note 为本地修改。 * @param key 字段名 * @param value 字段值 */ @@ -245,7 +252,7 @@ public class Note { } /** - * 设置文本笔记的数据 + * 设置文本数据字段,并同步标记 note 为本地修改。 * @param key 字段名 * @param value 字段值 */ @@ -263,9 +270,7 @@ public class Note { * @return 同步后的URI,同步失败返回null */ Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ + // 安全检查 if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); } @@ -274,6 +279,7 @@ public class Note { ContentProviderOperation.Builder builder = null; if(mTextDataValues.size() > 0) { + // 写入或更新文本数据(MIME: text_note) mTextDataValues.put(DataColumns.NOTE_ID, noteId); if (mTextDataId == 0) { mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); @@ -296,6 +302,7 @@ public class Note { } if(mCallDataValues.size() > 0) { + // 写入或更新通话数据(MIME: call_note) mCallDataValues.put(DataColumns.NOTE_ID, noteId); if (mCallDataId == 0) { mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index 4279860..023280a 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -31,7 +31,11 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.Notes.TextNote; import net.micode.notes.tool.ResourceParser.NoteBgResources; - +/** + * 工作笔记类。 + *

职责:代表当前正在编辑/展示的笔记,封装从数据库加载、修改、保存、以及小部件联动等操作。

+ *

使用场景:编辑页、列表点击进入编辑、或小部件创建笔记时,都通过该类聚合业务逻辑。

+ */ /** * 工作笔记 * 用于在用户界面层管理笔记的编辑状态和操作 @@ -53,10 +57,35 @@ public class WorkingNote { private boolean mIsDeleted; // 是否已删除 private NoteSettingChangedListener mNoteSettingStatusListener; // 笔记设置变化监听器 - /** - * 笔记数据查询投影列 - * 用于查询笔记的详细内容数据 - */ + /** 提醒日期 */ + private long mAlertDate; + + /** 修改日期 */ + private long mModifiedDate; + + /** 背景颜色ID */ + private int mBgColorId; + + /** 小部件ID */ + private int mWidgetId; + + /** 小部件类型 */ + private int mWidgetType; + + /** 文件夹ID */ + private long mFolderId; + + /** 上下文对象 */ + private Context mContext; + + private static final String TAG = "WorkingNote"; + + /** 是否已删除 */ + private boolean mIsDeleted; + + /** 笔记设置变化监听器 */ + private NoteSettingChangedListener mNoteSettingStatusListener; + public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, // 数据ID DataColumns.CONTENT, // 笔记内容 @@ -94,10 +123,27 @@ public class WorkingNote { private static final int NOTE_WIDGET_TYPE_COLUMN = 4; // 小部件类型列索引 private static final int NOTE_MODIFIED_DATE_COLUMN = 5; // 修改日期列索引 + private static final int DATA_MIME_TYPE_COLUMN = 2; + + private static final int DATA_MODE_COLUMN = 3; + + private static final int NOTE_PARENT_ID_COLUMN = 0; + + private static final int NOTE_ALERTED_DATE_COLUMN = 1; + + private static final int NOTE_BG_COLOR_ID_COLUMN = 2; + + private static final int NOTE_WIDGET_ID_COLUMN = 3; + + private static final int NOTE_WIDGET_TYPE_COLUMN = 4; + + private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + /** - * 构造方法 - 创建新笔记 + * 新建笔记的构造函数。 + * * @param context 上下文对象 - * @param folderId 所属文件夹ID + * @param folderId 文件夹ID */ private WorkingNote(Context context, long folderId) { mContext = context; @@ -127,8 +173,8 @@ public class WorkingNote { } /** - * 从数据库加载笔记信息 - * 加载笔记的元数据,如文件夹ID、提醒日期、背景颜色等 + * 加载笔记元数据(note 表),包括父文件夹、背景色、小部件、提醒、修改时间等。 + * 加载完成后再拉取 data 表详细内容。 */ private void loadNote() { Cursor cursor = mContext.getContentResolver().query( @@ -153,8 +199,8 @@ public class WorkingNote { } /** - * 从数据库加载笔记内容数据 - * 加载笔记的实际内容和相关数据类型信息 + * 加载笔记的数据内容(data 表)。 + *

遍历该笔记的所有数据行:找到文本行(NOTE)记录内容与模式;找到通话行(CALL_NOTE)记录其数据ID。

*/ private void loadNoteData() { Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, @@ -185,13 +231,14 @@ public class WorkingNote { } /** - * 创建空笔记 + * 创建空白笔记实例(尚未写入数据库)。 + * * @param context 上下文对象 - * @param folderId 所属文件夹ID - * @param widgetId 小部件ID + * @param folderId 目标文件夹ID + * @param widgetId 关联小部件ID * @param widgetType 小部件类型 - * @param defaultBgColorId 默认背景颜色ID - * @return 新创建的空工作笔记对象 + * @param defaultBgColorId 默认背景色 + * @return 工作笔记对象 */ public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, int widgetType, int defaultBgColorId) { @@ -213,8 +260,9 @@ public class WorkingNote { } /** - * 保存笔记到数据库 - * @return 是否保存成功 + * 保存笔记:必要时创建新记录,然后同步增量到 note/data,并刷新小部件。 + * + * @return 保存成功返回true,否则返回false */ public synchronized boolean saveNote() { if (isWorthSaving()) { @@ -227,9 +275,7 @@ public class WorkingNote { mNote.syncNote(mContext, mNoteId); - /** - * Update widget content if there exist any widget of this note - */ + // 如果该笔记存在小部件,更新小部件内容 if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { @@ -242,8 +288,8 @@ public class WorkingNote { } /** - * 检查笔记是否存在于数据库中 - * @return 如果笔记已存在于数据库中返回true,否则返回false + * 判断笔记是否已有持久化记录(noteId>0)。 + * @return 存在返回true */ public boolean existInDatabase() { return mNoteId > 0; @@ -264,7 +310,7 @@ public class WorkingNote { } /** - * 设置笔记设置变化监听器 + * 注册笔记设置变化监听器(用于通知 UI 或小部件刷新)。 * @param l 监听器对象 */ public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { @@ -272,8 +318,8 @@ public class WorkingNote { } /** - * 设置笔记提醒日期 - * @param date 提醒日期时间 + * 设置提醒时间,并通知监听器。 + * @param date 提醒日期时间戳 * @param set 是否设置提醒 */ public void setAlertDate(long date, boolean set) { @@ -287,8 +333,8 @@ public class WorkingNote { } /** - * 标记笔记为已删除或未删除 - * @param mark 是否标记为已删除 + * 标记笔记为已删除,若关联小部件则触发刷新。 + * @param mark 是否标记为删除 */ public void markDeleted(boolean mark) { mIsDeleted = mark; @@ -299,7 +345,7 @@ public class WorkingNote { } /** - * 设置笔记背景颜色ID + * 设置背景颜色,并通知监听器、记录本地修改。 * @param id 背景颜色ID */ public void setBgColorId(int id) { @@ -313,8 +359,8 @@ public class WorkingNote { } /** - * 设置笔记模式(普通模式/清单模式) - * @param mode 模式类型 + * 设置清单模式。 + * @param mode 模式(0 普通,1 清单) */ public void setCheckListMode(int mode) { if (mMode != mode) { diff --git a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java index 3d1c33d..219aa85 100644 --- a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java @@ -35,14 +35,18 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; - +/** + * 备份工具类。 + *

职责:导出笔记为可读文本文件,提供状态码供 UI 反馈。

+ *

当前实现仅支持导出,未包含导入逻辑。

+ */ /** * 备份工具 - 用于将笔记数据导出为文本文件 * 采用单例模式设计,确保全局只有一个备份工具实例 */ public class BackupUtils { private static final String TAG = "BackupUtils"; // 日志标签 - // Singleton stuff + /** 单例实例 */ private static BackupUtils sInstance; // 单例实例 /** @@ -57,22 +61,20 @@ public class BackupUtils { return sInstance; } - /** - * Following states are signs to represents backup or restore - * status - */ - // Currently, the sdcard is not mounted + /** 备份或恢复状态常量 */ + /** SD卡未挂载 */ public static final int STATE_SD_CARD_UNMOUONTED = 0; // SD卡未挂载 - // The backup file not exist + /** 备份文件不存在 */ public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; // 备份文件不存在 - // The data is not well formated, may be changed by other programs + /** 数据格式损坏,可能被其他程序修改 */ public static final int STATE_DATA_DESTROIED = 2; // 数据格式错误 - // Some run-time exception which causes restore or backup fails + /** 运行时异常导致恢复或备份失败 */ public static final int STATE_SYSTEM_ERROR = 3; // 系统错误 - // Backup or restore success + /** 备份或恢复成功 */ public static final int STATE_SUCCESS = 4; // 操作成功 - private TextExport mTextExport; // 文本导出工具实例 + /** 文本导出对象 */ + private TextExport mTextExport; /** * 私有构造方法 - 初始化文本导出工具 @@ -83,8 +85,8 @@ public class BackupUtils { } /** - * 检查外部存储是否可用 - * @return 外部存储是否可用 + * 检查外部存储是否已挂载。 + * @return 可用返回true */ private static boolean externalStorageAvailable() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); @@ -115,7 +117,7 @@ public class BackupUtils { } /** - * 文本导出工具类 - 负责将笔记数据转换为文本格式并保存到文件 + * 文本导出内部类:遍历 note/data 表,将结果写入 SD 卡上的 txt 文件。 */ private static class TextExport { // 笔记查询投影列 diff --git a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java index 238a4d4..d10fa87 100644 --- a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java @@ -34,7 +34,11 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; import java.util.HashSet; - +/** + * 数据工具类。 + *

职责:封装常用的数据库批量操作(删除、移动、查询校验等),统一错误处理与日志。

+ *

使用场景:列表/编辑/同步等需要对 note 表或 data 表做批量操作时复用。

+ */ /** * 数据工具 - 提供笔记数据的各种操作工具方法 * 包含批量删除、移动笔记、文件夹管理、小部件处理等功能 @@ -44,11 +48,13 @@ public class DataUtils { * 日志标签 */ public static final String TAG = "DataUtils"; + /** - * 批量删除笔记 - * @param resolver 内容解析器 + * 批量删除笔记。 + * + * @param resolver ContentResolver对象 * @param ids 要删除的笔记ID集合 - * @return 是否删除成功 + * @return 删除成功返回true,否则返回false */ public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { if (ids == null) { diff --git a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java index 6b602ea..14bae33 100644 --- a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java +++ b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java @@ -314,11 +314,6 @@ public class 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} - */ if (id >= TEXTAPPEARANCE_RESOURCES.length) { return BG_DEFAULT_FONT_SIZE; } diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java index afa589d..608db9f 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -39,7 +39,10 @@ import net.micode.notes.tool.DataUtils; import java.io.IOException; - +/** + * 闹钟提醒活动 + * 当笔记提醒时间到达时显示提醒界面 + */ /** * 闹钟提醒活动 * 用于显示笔记提醒对话框并播放闹钟声音 diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java index c316842..bee8e30 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java @@ -27,7 +27,10 @@ import android.database.Cursor; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * 闹钟初始化接收器 + * 在系统启动时重新设置所有笔记的提醒 + */ /** * 闹钟初始化广播接收器 * 用于系统启动或其他触发事件时重新设置所有笔记的闹钟提醒 diff --git a/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java index 9a4e9f6..030c3c1 100644 --- a/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java @@ -28,7 +28,10 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * 文件夹列表适配器 + * 用于在对话框中显示文件夹列表 + */ /** * 文件夹列表适配器 * 用于在列表中显示笔记文件夹的CursorAdapter diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java index 183e888..14f60be 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java @@ -25,7 +25,10 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.DataUtils; - +/** + * 笔记项数据类 + * 封装笔记列表项的数据信息 + */ /** * 笔记列表项数据 * 用于存储和管理笔记列表中每个项的数据 diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java index 84b6ed9..31b61b7 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java @@ -96,7 +96,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt // 用于存储应用介绍是否已添加的偏好设置键 private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; - // 列表编辑状态枚举 + /** + * 列表所处的编辑状态: + * NOTE_LIST 根目录;SUB_FOLDER 子文件夹;CALL_RECORD_FOLDER 通话记录专用文件夹。 + */ private enum ListEditState { NOTE_LIST, // 笔记列表状态 SUB_FOLDER, // 子文件夹状态 @@ -139,9 +142,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt setContentView(R.layout.note_list); // 设置布局 initResources(); // 初始化资源 - /** - * 当用户首次使用应用时插入介绍 - */ + // 首次进入时插入“介绍”笔记 setAppInfoFromRawRes(); // 设置应用信息(首次使用时添加介绍笔记) } @@ -401,22 +402,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt int newNoteViewHeight = mAddNewNote.getHeight(); int start = screenHeight - newNoteViewHeight; int eventY = start + (int) event.getY(); - /** - * Minus TitleBar's height - */ + // 子文件夹状态需减去标题栏高度 if (mState == ListEditState.SUB_FOLDER) { eventY -= mTitleBar.getHeight(); start -= mTitleBar.getHeight(); } - /** - * HACKME:When click the transparent part of "New Note" button, dispatch - * the event to the list view behind this button. The transparent part of - * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel) - * and the line top of the button. The coordinate based on left of the "New - * Note" button. The 94 represents maximum height of the transparent part. - * Notice that, if the background of the button changes, the formula should - * also change. This is very bad, just for the UI designer's strong requirement. - */ + // HACKME: 点击“新建”按钮透明区时,将事件派发给下方列表。 + // 透明区近似线性公式 y = -0.12x + 94(px),背景改动需同步更新该公式。 if (event.getY() < (event.getX() * (-0.12) + 94)) { View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 - mNotesListView.getFooterViewsCount()); diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java b/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java index 80bb846..3ca6cb2 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java @@ -30,26 +30,35 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; - +/** + * 笔记列表适配器。 + *

职责:为列表提供笔记/文件夹数据视图绑定,管理多选状态(批量删除/移动),并暴露选中项信息。

+ */ /** * 笔记列表适配器 * 继承自CursorAdapter,用于在列表视图中显示笔记数据 * 支持多选模式和笔记项的选择状态管理 */ public class NotesListAdapter extends CursorAdapter { - private static final String TAG = "NotesListAdapter"; // 日志标签 - private Context mContext; // 应用上下文 - private HashMap mSelectedIndex; // 存储选中项的索引映射 - private int mNotesCount; // 笔记总数 - private boolean mChoiceMode; // 是否处于选择模式 + private static final String TAG = "NotesListAdapter"; + /** 上下文对象 */ + private Context mContext; + /** 选中的索引映射(position -> 是否选中) */ + private HashMap mSelectedIndex; + /** 笔记数量 */ + private int mNotesCount; + /** 是否处于选择模式 */ + private boolean mChoiceMode; /** * 应用小部件属性类 * 用于存储应用小部件的ID和类型信息 */ public static class AppWidgetAttribute { - public int widgetId; // 小部件ID - public int widgetType; // 小部件类型 + /** 小部件ID */ + public int widgetId; + /** 小部件类型 */ + public int widgetType; }; /** diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java index 2282d94..8936af6 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java @@ -29,7 +29,10 @@ import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - +/** + * 笔记列表项视图 + * 用于在列表中显示单个笔记项 + */ /** * 笔记列表项视图 * 用于在笔记列表中显示单个笔记项的自定义视图 diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java index 139238e..bfd53d5 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java @@ -47,7 +47,11 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; - +/** + * 笔记设置页面。 + *

职责:承载账户绑定/切换、GTask 同步开关、上次同步时间展示、背景随机开关等设置。

+ *

关键点:绑定账户时需清理本地 gtask 关联字段;同步过程中禁止修改账户;页面通过广播实时刷新同步状态。

+ */ /** * 设置活动,用于管理同步账户、最后同步时间和背景颜色偏好 */ @@ -116,7 +120,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { protected void onResume() { super.onResume(); - // 如果用户添加了新账户,则自动设置同步账户 + // 若用户刚新增了 Google 账号,自动选中新账号为同步账号 if (mHasAddedAccount) { Account[] accounts = getGoogleAccounts(); if (mOriAccounts != null && accounts.length > mOriAccounts.length) { @@ -175,7 +179,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { // 首次设置账户,显示账户选择对话框 showSelectAccountAlertDialog(); } else { - // 已设置账户,显示更改账户确认对话框 + // 已绑定过账号,提示更换风险 showChangeAccountConfirmAlertDialog(); } } else { @@ -200,7 +204,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { Button syncButton = (Button) findViewById(R.id.preference_sync_button); TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - // 设置同步按钮状态 + // 根据同步状态配置按钮文案与行为 if (GTaskSyncService.isSyncing()) { // 同步中,按钮显示取消同步 syncButton.setText(getString(R.string.preferences_button_sync_cancel)); @@ -223,7 +227,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { // 只有设置了同步账户,按钮才可用 syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - // 设置最后同步时间显示 + // 展示最近同步时间或实时进度 if (GTaskSyncService.isSyncing()) { // 同步中,显示同步进度 lastSyncTimeView.setText(GTaskSyncService.getProgressString()); diff --git a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java index c49260a..ca6e7a7 100644 --- a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java +++ b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java @@ -33,7 +33,8 @@ import net.micode.notes.ui.NoteEditActivity; import net.micode.notes.ui.NotesListActivity; /** - * 抽象的笔记小部件提供者,用于创建和管理笔记应用的桌面小部件 + * 笔记小部件提供者抽象类 + * 提供笔记桌面小部件的基础功能 */ public abstract class NoteWidgetProvider extends AppWidgetProvider { /** 数据库查询投影,包含笔记ID、背景颜色ID和摘要 */ @@ -154,7 +155,7 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); // 传递背景颜色ID /** - * 生成小部件点击的PendingIntent + * 生成待处理的意图,用于启动小部件的主活动 */ PendingIntent pendingIntent = null; if (privacyMode) { diff --git a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java index d0f1d68..4088cca 100644 --- a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java +++ b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java @@ -23,7 +23,10 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * 2x2笔记小部件提供者 + * 提供2x2尺寸的桌面笔记小部件 + */ /** * 2x2 大小的笔记小部件提供者 */ diff --git a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java index 595d33f..bd04edd 100644 --- a/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java +++ b/src/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java @@ -23,7 +23,10 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * 4x4笔记小部件提供者 + * 提供4x4尺寸的桌面笔记小部件 + */ /** * 4x4 大小的笔记小部件提供者 */