diff --git a/src/java/net/micode/notes/data/Contact.java b/src/java/net/micode/notes/data/Contact.java index 878fe67..92953df 100644 --- a/src/java/net/micode/notes/data/Contact.java +++ b/src/java/net/micode/notes/data/Contact.java @@ -31,8 +31,8 @@ import java.util.HashMap; * @Package: net.micode.notes.data * @ClassName: Contact * @Description: 该类实现建立联系人数据库的功能 - * @Author: 郑鲲鹏 - * @Date: 2023-12-16 17:57 + * @Author: 齐景熙 + * @Date: 2024-12-20 19:42 */ public class Contact { private static HashMap sContactCache; @@ -44,11 +44,11 @@ public class Contact { + "(SELECT raw_contact_id " + " FROM phone_lookup" + " WHERE min_match = '+')"; - /** + /** * @method getContact * @description 该方法用于识别电话号码对应的联系人 - * @date: 2023-12-16 19:24 - * @author: 郑鲲鹏 + * @date: 2024-12-20 20:02 + * @author: 齐景熙 * @return string */ public static String getContact(Context context, String phoneNumber) { @@ -57,7 +57,7 @@ public class Contact { } // 查找HashMap中是否有phoneNumber的信息 - // 2023-12-16 19:43 + // 2024-12-20 20:04 if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } @@ -66,7 +66,7 @@ public class Contact { PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); // 查找数据库中phoneNumber的信息 - // 2023-12-16 19:43 + // 2024-12-20 20:06 Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, new String [] { Phone.DISPLAY_NAME }, @@ -75,7 +75,7 @@ public class Contact { null); // 检查是否查询到联系人,找到则将相关信息加入HashMap中,未找到则处理异常 - // 2023-12-16 19:41 + // 2024-12-20 20:07 if (cursor != null && cursor.moveToFirst()) { try { String name = cursor.getString(0); diff --git a/src/java/net/micode/notes/data/Notes.java b/src/java/net/micode/notes/data/Notes.java index d40776d..7079d8f 100644 --- a/src/java/net/micode/notes/data/Notes.java +++ b/src/java/net/micode/notes/data/Notes.java @@ -14,6 +14,29 @@ * limitations under the License. */ + +/** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: Notes + * @Description: 该类主要定义了与笔记相关的常量、枚举类型、接口和嵌套类,用于描述笔记的基本属性、类型、系统文件夹标识符、Intent、 + 额外数据键、小部件类型等,以及提供查询笔记和数据的 URI。它为笔记应用提供了数据结构和访问接口的基础框架,使得笔记 + 的创建、管理、查询等功能得以实现。 + * @Author: 齐景熙 + * @Date: 2024-12-21 19:42 + */ + + +/* + 主要成员变量和常量: +AUTHORITY:定义了内容提供者的权威名称,用于构建 URI。 +TAG:用于日志记录的标签。 +TYPE_NOTE、TYPE_FOLDER、TYPE_SYSTEM:定义了笔记的类型枚举,分别表示普通笔记、文件夹和系统文件夹。 +ID_ROOT_FOLDER、ID_TEMPARAY_FOLDER、ID_CALL_RECORD_FOLDER、ID_TRASH_FOLER:定义了系统文件夹的标识符,分别表示根文件夹、临时文件夹、通话记录文件夹和回收站文件夹。 +INTENT_EXTRA_ALERT_DATE、INTENT_EXTRA_BACKGROUND_ID 等:定义了 Intent 额外数据的键,用于在 Intent 中传递相关数据。 +TYPE_WIDGET_INVALIDE、TYPE_WIDGET_2X、TYPE_WIDGET_4X:定义了小部件的类型枚举。 + */ package net.micode.notes.data; import android.net.Uri; @@ -46,6 +69,19 @@ public class Notes { public static final int TYPE_WIDGET_2X = 0; public static final int TYPE_WIDGET_4X = 1; + + /** + * @method DataConstants + * @description 该嵌套类定义了笔记数据的常量,主要用于表示笔记数据的 MIME 类型。 + * @date: 2024-12-21 20:02 + * @author: 齐景熙 + */ + + /* + 主要成员变量和常量: + NOTE:表示文本笔记的 MIME 类型。 + CALL_NOTE:表示通话记录笔记的 MIME 类型。 + */ public static class DataConstants { public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; @@ -61,6 +97,38 @@ public class Notes { */ public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + + /** + * @method NoteColumns + * @description 该接口定义了笔记列的名称和类型,用于描述笔记的基本属性,如 ID、父 ID、创建日期、修改日期、 + 提醒日期、摘要、小部件 ID、小部件类型、背景颜色 ID、是否有附件、笔记数量、类型、同步 ID、 + 本地修改标志、原始父 ID、GTask ID、版本号、置顶状态等。这些列名称和类型为笔记数据的存储和查 + 询提供了标准的字段定义。 + * @date: 2024-12-21 20:04 + * @author: 齐景熙 + */ + + /* + 要成员变量和常量: + ID:笔记的唯一 ID。 + PARENT_ID:笔记或文件夹的父 ID。 + CREATED_DATE:笔记或文件夹的创建日期。 + MODIFIED_DATE:笔记或文件夹的最新修改日期。 + ALERTED_DATE:提醒日期。 + SNIPPET:文件夹的名称或笔记的文本内容。 + WIDGET_ID:笔记的小部件 ID。 + WIDGET_TYPE:笔记的小部件类型。 + BG_COLOR_ID:笔记的背景颜色 ID。 + HAS_ATTACHMENT:笔记是否有附件。 + NOTES_COUNT:文件夹的笔记数量。 + TYPE:文件类型(文件夹或笔记)。 + SYNC_ID:最后同步 ID。 + LOCAL_MODIFIED:本地修改标志。 + ORIGIN_PARENT_ID:移动到临时文件夹之前的原始父 ID。 + GTASK_ID:GTask ID。 + VERSION:版本号。 + TOP:置顶状态。 + */ public interface NoteColumns { /** * The unique ID for a row @@ -173,6 +241,26 @@ public class Notes { public static final String TOP = "top"; } + + /** + * @method DataColumns + * @description 该接口定义了数据列的名称和类型,用于描述数据的基本属性,如 ID、MIME 类型、所属笔记的 + ID、创建日期、修改日期、数据内容、通用数据列等。这些列名称和类型为数据的存储和查询提 + 供了标准的字段定义。 + * @date: 2024-12-21 20:05 + * @author: 齐景熙 + */ + + /* + 主要成员变量和常量: +ID:数据的唯一 ID。 +MIME_TYPE:数据项的 MIME 类型。 +NOTE_ID:数据所属笔记的 ID。 +CREATED_DATE:数据的创建日期。 +MODIFIED_DATE:数据的最新修改日期。 +CONTENT:数据的内容。 +DATA1、DATA2、DATA3、DATA4、DATA5:通用数据列,具体含义取决于 MIME 类型。 + */ public interface DataColumns { /** * The unique ID for a row @@ -247,6 +335,23 @@ public class Notes { public static final String DATA5 = "data5"; } + + /** + * @method TextNote + * @description 该嵌套类实现了 DataColumns 接口,定义了文本笔记的特定属性和 MIME 类型。 + 它用于描述文本笔记的模式(如清单模式或普通模式)以及文本笔记的 MIME 类型和 URI。 + * @date: 2024-12-21 20:07 + * @author: 齐景熙 + */ + + /* +主要成员变量和常量: +MODE:文本笔记的模式,使用 DATA1 列来表示。 +MODE_CHECK_LIST:表示清单模式的值。 +CONTENT_TYPE:文本笔记的 MIME 类型,用于目录。 +CONTENT_ITEM_TYPE:文本笔记的 MIME 类型,用于单个项。 +CONTENT_URI:文本笔记的 URI,用于查询文本笔记数据。 + */ public static final class TextNote implements DataColumns { /** * Mode to indicate the text in check list mode or not @@ -263,6 +368,23 @@ public class Notes { public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); } + /** + * @method CallNote + * @description 该嵌套类实现了 DataColumns 接口,定义了通话记录笔记的特定属性和 MIME 类型。它用于描述通 + 话记录笔记的通话日期、电话号码以及通话记录笔记的 MIME 类型和 URI。 + * @date: 2024-12-21 20:10 + * @author: 齐景熙 + */ + + + /* +主要成员变量和常量: +CALL_DATE:通话记录笔记的通话日期,使用 DATA1 列来表示。 +PHONE_NUMBER:通话记录笔记的电话号码,使用 DATA3 列来表示。 +CONTENT_TYPE:通话记录笔记的 MIME 类型,用于目录。 +CONTENT_ITEM_TYPE:通话记录笔记的 MIME 类型,用于单个项。 +CONTENT_URI:通话记录笔记的 URI,用于查询通话记录笔记数据。 + */ public static final class CallNote implements DataColumns { /** * Call date for this record diff --git a/src/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/java/net/micode/notes/data/NotesDatabaseHelper.java index a96128b..2f9b0a3 100644 --- a/src/java/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -14,6 +14,27 @@ * limitations under the License. */ + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: NotesDatabaseHelper + * @Description: 该类继承自 SQLiteOpenHelper,用于创建和管理笔记应用的数据库。 + 它定义了数据库的名称、版本、表名、创建表和触发器的 SQL 语句,并 + 实现了数据库的创建、升级等操作。通过该类,可以方便地进行笔记数据的存储和管理。 + * @Author: 齐景熙 + * @Date: 2024-12-21 22:10 + */ + +/*主要成员变量和常量: +DB_NAME:数据库的名称。 +DB_VERSION:数据库的版本号。 +TABLE:定义了数据库表名的接口。 +TAG:用于日志记录的标签。 +mInstance:用于实现单例模式的静态实例变量。 +CREATE_NOTE_TABLE_SQL、CREATE_DATA_TABLE_SQL 等:创建笔记表和数据表的 SQL 语句。 +NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER 等:定义了数据库触发器的 SQL 语句,用于在特定操作后自动更新数据。 */ package net.micode.notes.data; import android.content.ContentValues; @@ -207,10 +228,29 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + " END"; + + /** + * @method NotesDatabaseHelper + * @description 构造函数,用于初始化 NotesDatabaseHelper 实例。调用父类的构造函数,传入上下文、 + 数据库名称、工厂和数据库版本号,完成数据库帮助者的创建。 + * @date: 2024-12-21 22:10 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 */ public NotesDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } + /** + * @method createNoteTable + * @description 创建笔记表。执行创建笔记表的 SQL 语句,并调用 reCreateNoteTableTriggers 方法重新 + 创建笔记表的触发器,最后创建系统文件夹。 + * @date: 2024-12-21 22:13 + * @author: 齐景熙 + */ + /*参数: +db:可写的数据库对象,用于执行 SQL 语句。 */ public void createNoteTable(SQLiteDatabase db) { db.execSQL(CREATE_NOTE_TABLE_SQL); reCreateNoteTableTriggers(db); @@ -218,6 +258,16 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { Log.d(TAG, "note table has been created"); } + + /** + * @method reCreateNoteTableTriggers + * @description 重新创建笔记表的触发器。先删除已存在的触发器,然后依次创建增加文件夹笔记数量、减少文件 + 夹笔记数量、删除笔记数据、移动笔记到回收站等触发器。 + * @date: 2024-12-21 22:15 + * @author: 齐景熙 + */ + /*参数: +db:可写的数据库对象,用于执行 SQL 语句。 */ private void reCreateNoteTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); @@ -236,6 +286,15 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); } + /** + * @method createSystemFolder + * @description 创建系统文件夹。使用 ContentValues 设置系统文件夹的 ID 和类型,然后依次插入通话记录 + 文件夹、根文件夹、临时文件夹和回收站文件夹到笔记表中。 + * @date: 2024-12-21 22:20 + * @author: 齐景熙 + */ + /*参数: +db:可写的数据库对象,用于执行插入操作。 */ private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); @@ -271,6 +330,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } + /** + * @method createDataTable + * @description 创建数据表。执行创建数据表的 SQL 语句,调用 reCreateDataTableTriggers 方法重新创建数据表的触发器,并创建数据表的索引。 + * @date: 2024-12-21 22:23 + * @author: 齐景熙 + */ public void createDataTable(SQLiteDatabase db) { db.execSQL(CREATE_DATA_TABLE_SQL); reCreateDataTableTriggers(db); @@ -278,6 +343,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { Log.d(TAG, "data table has been created"); } + + /** + * @method reCreateDataTableTriggers + * @description 重新创建数据表的触发器。先删除已存在的触发器,然后依次创建更新笔记内容的触发器。 + * @date: 2024-12-21 22:25 + * @author: 齐景熙 + */ private void reCreateDataTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); @@ -288,6 +360,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); } + /** + * @method getInstance + * @description 获取 NotesDatabaseHelper 的单例实例。如果实例不存在,则创建一个新的实例;否则,返回已存在的实例。 + * @date: 2024-12-21 22:30 + * @author: 齐景熙 + */ static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); @@ -295,12 +373,31 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { return mInstance; } + + /** + * @method onCreate + * @description 数据库创建时的回调方法。调用 createNoteTable 和 createDataTable 方法创建笔记表和数据表。 + * @date: 2024-12-21 22:40 + * @author: 齐景熙 + */ @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); } + + /** + * @method onUpgrade + * @description 数据库版本升级时的回调方法。根据旧版本号和新版本号,依次调用相应的升级方法 + (如 upgradeToV2、upgradeToV3 等),并在需要时重新创建触发器。如果旧版本号和新版本号不匹配,则抛出异常。 + * @date: 2024-12-21 22:47 + * @author: 齐景熙 + */ + /*参数: +db:可写的数据库对象,用于执行升级操作。 +oldVersion:旧的数据库版本号。 +newVersion:新的数据库版本号。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { boolean reCreateTriggers = false; @@ -339,6 +436,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { } } + + /** + * @method upgradeToV2 + * @description 升级数据库到版本 2。删除旧的笔记表和数据表,然后重新创建笔记表和数据表。 + * @date: 2024-12-21 22:51 + * @author: 齐景熙 + */ private void upgradeToV2(SQLiteDatabase db) { db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); @@ -346,6 +450,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { createDataTable(db); } + + /** + * @method upgradeToV3 + * @description 升级数据库到版本 3。删除不再使用的触发器,为笔记表添加 gtask_id 列,并创建回收站系统文件夹。 + * @date: 2024-12-21 22:55 + * @author: 齐景熙 + */ private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); @@ -361,11 +472,25 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { db.insert(TABLE.NOTE, null, values); } + + /** + * @method upgradeToV4 + * @description 升级数据库到版本 4。为笔记表添加 version 列。 + * @date: 2024-12-21 22:57 + * @author: 齐景熙 + */ private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); } + + /** + * @method upgradeToV5 + * @description 升级数据库到版本 5。为笔记表添加 top 列。 + * @date: 2024-12-21 23:00 + * @author: 齐景熙 + */ private void upgradeToV5(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.TOP + " INTEGER NOT NULL DEFAULT 0"); diff --git a/src/java/net/micode/notes/data/NotesProvider.java b/src/java/net/micode/notes/data/NotesProvider.java index 8b23d6e..17488ef 100644 --- a/src/java/net/micode/notes/data/NotesProvider.java +++ b/src/java/net/micode/notes/data/NotesProvider.java @@ -14,6 +14,24 @@ * limitations under the License. */ + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: NotesProvider + * @Description: 该类继承自 ContentProvider,用于实现笔记数据的访问和管理。它定义了 URI 匹配器、数据库帮助者 + 等成员变量,并重写了 ContentProvider 的主要方法,如 onCreate、query、insert、delete、update 等, + 实现了对笔记和数据表的查询、插入、删除和更新操作。通过该类,其他组件可以方便地访问和操作笔记数据。 + * @Author: 齐景熙 + * @Date: 2024-12-21 23:10 + */ + + /*主要成员变量和常量: +mMatcher:URI 匹配器,用于匹配不同的 URI。 +mHelper:数据库帮助者对象,用于访问数据库。 +TAG:用于日志记录的标签。 +URI_NOTE、URI_NOTE_ITEM 等:定义了不同 URI 的匹配码。 */ package net.micode.notes.data; @@ -34,7 +52,12 @@ import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.NotesDatabaseHelper.TABLE; - +/** + * @method NotesProvider + * @description 默认构造函数,无特殊功能。 + * @date: 2024-12-21 23:12 + * @author: 齐景熙 + */ public class NotesProvider extends ContentProvider { private static final UriMatcher mMatcher; @@ -80,12 +103,37 @@ public class NotesProvider extends ContentProvider { + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + + +/** + * @method onCreate + * @description ContentProvider 创建时的回调方法。获取上下文,调用 NotesDatabaseHelper.getInstance + 方法创建数据库帮助者对象 mHelper,并返回 true 表示创建成功。 + * @date: 2024-12-21 23:13 + * @author: 齐景熙 + */ @Override public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } +/** + * @method query + * @description 查询数据。根据匹配的 URI,执行不同的查询操作: + URI_NOTE:查询笔记表。 + URI_NOTE_ITEM:查询特定 ID 的笔记。 + URI_DATA:查询数据表。 + URI_DATA_ITEM:查询特定 ID 的数据。 + URI_SEARCH、URI_SEARCH_SUGGEST:执行搜索查询,根据搜索字符串查询笔记的摘要。 + * @date: 2024-12-21 23:15 + * @author: 齐景熙 + */ +/*uri:要查询的 URI。 +projection:要查询的列。 +selection:查询条件。 +selectionArgs:查询条件参数。 +sortOrder:排序顺序。 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { @@ -147,7 +195,18 @@ public class NotesProvider extends ContentProvider { } return c; } - +/** + * @method insert + * @description 插入数据。根据匹配的 URI,执行不同的插入操作: + URI_NOTE:向笔记表插入笔记。 + URI_DATA:向数据表插入数据。 + 插入成功后,通知相关的 URI 发生变化。 + * @date: 2024-12-21 23:17 + * @author: 齐景熙 + */ +/* 参数: +uri:要插入的 URI。 +values:要插入的数据。*/ @Override public Uri insert(Uri uri, ContentValues values) { SQLiteDatabase db = mHelper.getWritableDatabase(); @@ -182,6 +241,23 @@ public class NotesProvider extends ContentProvider { return ContentUris.withAppendedId(uri, insertedId); } +/** + * @method delete + * @description 删除数据。根据匹配的 URI,执行不同的删除操作: + URI_NOTE:删除笔记表中的笔记。 + URI_NOTE_ITEM:删除特定 ID 的笔记。 + URI_DATA:删除数据表中的数据。 + URI_DATA_ITEM:删除特定 ID 的数据。 + 删除成功后,通知相关的 URI 发生变化。 + * @date: 2024-12-21 23:20 + * @author: 齐景熙 + */ + +/*参数: +uri:要删除的 URI。 +selection:删除条件。 +selectionArgs:删除条件参数。 + */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; @@ -227,7 +303,22 @@ public class NotesProvider extends ContentProvider { } return count; } - +/** + * @method update + * @description 更新数据。根据匹配的 URI,执行不同的更新操作: + URI_NOTE:更新笔记表中的笔记。 + URI_NOTE_ITEM:更新特定 ID 的笔记。 + URI_DATA:更新数据表中的数据。 + URI_DATA_ITEM:更新特定 ID 的数据。 + 更新成功后,通知相关的 URI 发生变化。 + * @date: 2024-12-21 23:22 + * @author: 齐景熙 + */ +/*参数: +uri:要更新的 URI。 +values:更新的数据。 +selection:更新条件。 +selectionArgs:更新条件参数。 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; @@ -267,11 +358,30 @@ public class NotesProvider extends ContentProvider { } return count; } +/** + * @method parseSelection + * @description 解析查询条件。如果查询条件不为空,则返回包含查询条件的字符串;否则返回空字符串。 + * @date: 2024-12-21 23:25 + * @author: 齐景熙 + */ +/*参数: +selection:查询条件。 */ private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } + + /** + * @method increaseNoteVersion + * @description 增加笔记版本号。根据笔记 ID 或查询条件,更新笔记表中相应笔记的版本号。 + * @date: 2024-12-21 23:27 + * @author: 齐景熙 + */ + /*参数: +id:笔记 ID。 +selection:更新条件。 +selectionArgs:更新条件参数。 */ private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -297,6 +407,13 @@ public class NotesProvider extends ContentProvider { mHelper.getWritableDatabase().execSQL(sql.toString()); } + + /** + * @method getType + * @description 获取 MIME 类型。该方法未实现,返回 null + * @date: 2024-12-21 23:30 + * @author: 齐景熙 + */ @Override public String getType(Uri uri) { // TODO Auto-generated method stub diff --git a/src/java/net/micode/notes/tool/BackupUtils.java b/src/java/net/micode/notes/tool/BackupUtils.java index 74e27e7..8aaa2d8 100644 --- a/src/java/net/micode/notes/tool/BackupUtils.java +++ b/src/java/net/micode/notes/tool/BackupUtils.java @@ -14,7 +14,468 @@ * limitations under the License. */ +<<<<<<< HEAD package net.micode.notes.tool; +======= + +/** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: BackupUtils + * @Description: 该类用于备份笔记数据到文本文件。它定义了备份状态码、单例模 + 式的实现、外部存储可用性检查、导出到文本文件的方法等。通过该类, + 可以方便地将笔记数据备份到外部存储的文本文件中。 + * @Author: 齐景熙 + */ + + + package net.micode.notes.tool; + + public class BackupUtils { + private static final String TAG = "BackupUtils"; + // Singleton stuff + private static BackupUtils sInstance; //类里面为什么可以定义自身类的对象? + + + /** + * @method getInstance + * @description 获取 BackupUtils 的单例实例。如果实例不存在,则创建一个新的实例;否则,返回已存在的实例。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +返回值:BackupUtils 的单例实例。 */ + + public static synchronized BackupUtils getInstance(Context context) { + //ynchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A) + //运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。 + //它包括两种用法:synchronized 方法和 synchronized 块。 + if (sInstance == null) { + //如果当前备份不存在,则新声明一个 + sInstance = new BackupUtils(context); + } + 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; + // 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 BackupUtils(Context context) { //初始化函数 + mTextExport = new TextExport(context); + } + +/** + * @method externalStorageAvailable + * @description 检查外部存储是否可用。通过比较外部存储状态与 Environment.MEDIA_MOUNTED,判断外部存储是否已挂载。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +返回值:BackupUtils 的单例实例。 +功能介绍:检查外部存储是否可用。通过比较外部存储状态与 Environment.MEDIA_MOUNTED,判断外部存储是否已挂载。 +返回值:true 表示外部存储可用,false 表示不可用。 */ + + private static boolean externalStorageAvailable() { //外部存储功能是否可用 + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + /** + * @method exportToText + * @description 导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +返回值:BackupUtils 的单例实例。 +功能介绍:导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。*/ + + public int exportToText() { + return mTextExport.exportToText(); + } + + /** + * @method getExportedTextFileName + * @description 获取导出的文本文件名。返回 TextExport 类中保存的导出文本文件名。 + 导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +返回值:BackupUtils 的单例实例。 +功能介绍:导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。 +功能介绍:获取导出的文本文件名。返回 TextExport 类中保存的导出文本文件名。 +返回值:导出的文本文件名。*/ + + public String getExportedTextFileName() { + return mTextExport.mFileName; + } + + /** + * @method getExportedTextFileDir + * @description 获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 + 导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +功能介绍:获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 +返回值:导出的文本文件目录。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。 +功能介绍:获取导出的文本文件名。返回 TextExport 类中保存的导出文本文件名。 +返回值:导出的文本文件名。*/ + public String getExportedTextFileDir() { + return mTextExport.mFileDirectory; + } + + private static class TextExport { + private static final String[] NOTE_PROJECTION = { + NoteColumns.ID, + NoteColumns.MODIFIED_DATE, + NoteColumns.SNIPPET, + NoteColumns.TYPE + }; + + private static final int NOTE_COLUMN_ID = 0; + + private static final int NOTE_COLUMN_MODIFIED_DATE = 1; + + private static final int NOTE_COLUMN_SNIPPET = 2; + + private static final String[] DATA_PROJECTION = { + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + private static final int DATA_COLUMN_CONTENT = 0; + + private static final int DATA_COLUMN_MIME_TYPE = 1; + + private static final int DATA_COLUMN_CALL_DATE = 2; + + private static final int DATA_COLUMN_PHONE_NUMBER = 4; + + private final String [] TEXT_FORMAT; + private static final int FORMAT_FOLDER_NAME = 0; + private static final int FORMAT_NOTE_DATE = 1; + private static final int FORMAT_NOTE_CONTENT = 2; + + private Context mContext; + private String mFileName; + private String mFileDirectory; + + + /** + * @method getExportedTextFileDir + * @description 该内部类用于将笔记数据导出到文本文件。它定义了导出所需的列、格式、文件名、文件目录等,并实现了导出笔记数据到文本文件的具体逻辑。 + 获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 + 导出笔记数据到文本文件。调用 TextExport 类的 exportToText 方法,将笔记数据导出到文本文件,并返回导出状态码。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +功能介绍:获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 +返回值:导出的文本文件目录。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。 +该内部类用于将笔记数据导出到文本文件。它定义了导出所需的列、格式、文件名、文件目录等,并实现了导出笔记数据到文本文件的具体逻辑。*/ + public TextExport(Context context) { + TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + mContext = context; + mFileName = ""; //为什么为空? + mFileDirectory = ""; + } + + /** + * @method getFormat + * @description 获取导出格式字符串。根据传入的格式 ID,从 TEXT_FORMAT 数组中获取对应的格式字符串 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +功能介绍:获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 +返回值:导出的文本文件目录。 +功能介绍:获取导出格式字符串。根据传入的格式 ID,从 TEXT_FORMAT 数组中获取对应的格式字符串。 +参数: +id:格式 ID。 +返回值:对应的格式字符串。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。 +该内部类用于将笔记数据导出到文本文件。它定义了导出所需的列、格式、文件名、文件目录等,并实现了导出笔记数据到文本文件的具体逻辑。*/ + private String getFormat(int id) { //获取文本的组成部分 + return TEXT_FORMAT[id]; + } + + /** + * Export the folder identified by folder id to text + */ + private void exportFolderToText(String folderId, PrintStream ps) { + // Query notes belong to this folder 通过查询parent id是文件夹id的note来选出制定ID文件夹下的Note + Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { + folderId + }, null); + + if (notesCursor != null) { + if (notesCursor.moveToFirst()) { + do { + // Print note's last modified date ps里面保存有这份note的日期 + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = notesCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); //将文件导出到text + } while (notesCursor.moveToNext()); + } + notesCursor.close(); + } + } + + /** + * Export note identified by id to a print stream + */ + private void exportNoteToText(String noteId, PrintStream ps) { + Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, + DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { + noteId + }, null); + + if (dataCursor != null) { //利用光标来扫描内容,区别为callnote和note两种,靠ps.printline输出 + if (dataCursor.moveToFirst()) { + do { + String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); + if (DataConstants.CALL_NOTE.equals(mimeType)) { + // Print phone number + String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); + long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); + String location = dataCursor.getString(DATA_COLUMN_CONTENT); + + if (!TextUtils.isEmpty(phoneNumber)) { //判断是否为空字符 + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + phoneNumber)); + } + // Print call date + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat + .format(mContext.getString(R.string.format_datetime_mdhm), + callDate))); + // Print call attachment location + if (!TextUtils.isEmpty(location)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + location)); + } + } else if (DataConstants.NOTE.equals(mimeType)) { + String content = dataCursor.getString(DATA_COLUMN_CONTENT); + if (!TextUtils.isEmpty(content)) { + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), + content)); + } + } + } while (dataCursor.moveToNext()); + } + dataCursor.close(); + } + // print a line separator between note + try { + ps.write(new byte[] { + Character.LINE_SEPARATOR, Character.LETTER_NUMBER + }); + } catch (IOException e) { + Log.e(TAG, e.toString()); + } + } + + /** + * Note will be exported as text which is user readable + */ + +/** + * @method exportToText + * @description 导出指定笔记到文本文件。查询属于该笔记的数据,根据数据的 MIME 类型,将数据内容(如电话号码、通话日期、文本内容等)格式化后输出到文本文件。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +功能介绍:获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 +功能介绍:导出笔记数据到文本文件。检查外部存储是否可用,然后获取打印流,依次导出文件夹和笔记到文本文件。 +返回值:导出状态码 +noteId:笔记 ID。 +ps:打印流,用于输出到文本文件。 +返回值:导出状态码,如 STATE_SUCCESS 表示成功,STATE_SD_CARD_UNMOUONTED 表示外部存储未挂载等。 +该内部类用于将笔记数据导出到文本文件。它定义了导出所需的列、格式、文件名、文件目录等,并实现了导出笔记数据到文本文件的具体逻辑。*/ + public int exportToText() { //总函数,调用上面的exportFolder和exportNote + if (!externalStorageAvailable()) { + Log.d(TAG, "Media was not mounted"); + return STATE_SD_CARD_UNMOUONTED; + } + + PrintStream ps = getExportToTextPrintStream(); + if (ps == null) { + Log.e(TAG, "get print stream error"); + return STATE_SYSTEM_ERROR; + } + // First export folder and its notes 导出文件夹,就是导出里面包含的便签 + Cursor folderCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " + + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " + + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); + + if (folderCursor != null) { + if (folderCursor.moveToFirst()) { + do { + // Print folder's name + String folderName = ""; + if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { + folderName = mContext.getString(R.string.call_record_folder_name); + } else { + folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); + } + if (!TextUtils.isEmpty(folderName)) { + ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); + } + String folderId = folderCursor.getString(NOTE_COLUMN_ID); + exportFolderToText(folderId, ps); + } while (folderCursor.moveToNext()); + } + folderCursor.close(); + } + + // Export notes in root's folder 将根目录里的便签导出(由于不属于任何文件夹,因此无法通过文件夹导出来实现这一部分便签的导出) + Cursor noteCursor = mContext.getContentResolver().query( + Notes.CONTENT_NOTE_URI, + NOTE_PROJECTION, + NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID + + "=0", null, null); + + if (noteCursor != null) { + if (noteCursor.moveToFirst()) { + do { + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // Query data belong to this note + String noteId = noteCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (noteCursor.moveToNext()); + } + noteCursor.close(); + } + ps.close(); + + return STATE_SUCCESS; + } + + /** + * Get a print stream pointed to the file {@generateExportedTextFile} + */ + + + +/** + * @method getExportToTextPrintStream + * @description 获取指向导出文本文件的打印流。生成导出文本文件,然后创建指向该文件的打印流。 + * @author: 齐景熙 + */ + /*参数: +context:上下文对象,用于访问应用程序的资源和功能。 +功能介绍:获取导出的文本文件目录。返回 TextExport 类中保存的导出文本文件目录。 +功能介绍:导出笔记数据到文本文件。检查外部存储是否可用,然后获取打印流,依次导出文件夹和笔记到文本文件。 +返回值:导出状态码 +noteId:笔记 ID。 +ps:打印流,用于输出到文本文件。 +功能介绍:获取指向导出文本文件的打印流。生成导出文本文件,然后创建指向该文件的打印流。 +返回值:打印流,用于输出到文本文件。*/ + + private PrintStream getExportToTextPrintStream() { + File file = generateFileMountedOnSDcard(mContext, R.string.file_path, + R.string.file_name_txt_format); + if (file == null) { + Log.e(TAG, "create file to exported failed"); + return null; + } + mFileName = file.getName(); + mFileDirectory = mContext.getString(R.string.file_path); + PrintStream ps = null; + try { + FileOutputStream fos = new FileOutputStream(file); + ps = new PrintStream(fos); //将ps输出流输出到特定的文件,目的就是导出到文件,而不是直接输出 + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } catch (NullPointerException e) { + e.printStackTrace(); + return null; + } + return ps; + } + } + + /** + * Generate the text file to store imported data + */ + +/** + * @method generateFileMountedOnSDcard + * @description 生成导出文本文件。根据传入的文件路径和文件名格式资源 ID,生成导出文本文件的完整路径,并创建该文件。 + * @author: 齐景熙 + */ + /*参数: +功能介绍:生成导出文本文件。根据传入的文件路径和文件名格式资源 ID,生成导出文本文件的完整路径,并创建该文件。 +参数: +context:上下文对象,用于访问应用程序的资源。 +filePathResId:文件路径资源 ID。 +fileNameFormatResId:文件名格式资源 ID。 +返回值:生成的导出文本文件对象。*/ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); //外部(SD卡)的存储路径 + sb.append(context.getString(filePathResId)); //文件的存储路径 + File filedir = new File(sb.toString()); //filedir应该就是用来存储路径信息 + sb.append(context.getString( + fileNameFormatResId, + DateFormat.format(context.getString(R.string.format_date_ymd), + System.currentTimeMillis()))); + File file = new File(sb.toString()); + + try { //如果这些文件不存在,则新建 + if (!filedir.exists()) { + filedir.mkdir(); + } + if (!file.exists()) { + file.createNewFile(); + } + return file; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + // try catch 异常处理 + return null; + } + } + +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 import android.content.Context; import android.database.Cursor; diff --git a/src/java/net/micode/notes/tool/DataUtils.java b/src/java/net/micode/notes/tool/DataUtils.java index 99cc4cc..b9ea655 100644 --- a/src/java/net/micode/notes/tool/DataUtils.java +++ b/src/java/net/micode/notes/tool/DataUtils.java @@ -13,6 +13,33 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +<<<<<<< HEAD +======= +/*该类定义在 net.micode.notes.tool 包下,并导入了Android和Java的一些核心类。这些导入的类提供了对内容提供者操作、日志记录、游标以及存储值的支持。 */ + + + + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: DataUtils + * @Description: 该类提供了一系列与笔记数据操作相关的工具方法。它包含了批量删除笔记、移动笔记到文件夹、 + 获取用户文件夹数量、检查笔记或数据是否存在、获取通话记录号码、获取笔记摘要等功能。通过 + 这些方法,可以方便地对笔记数据进行批量操作和查询。 + * @Author: 齐景熙 + */ + +/*主要成员变量和常量: +DB_NAME:数据库的名称。 +DB_VERSION:数据库的版本号。 +TABLE:定义了数据库表名的接口。 +TAG:用于日志记录的标签。 +mInstance:用于实现单例模式的静态实例变量。 +CREATE_NOTE_TABLE_SQL、CREATE_DATA_TABLE_SQL 等:创建笔记表和数据表的 SQL 语句。 +NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER 等:定义了数据库触发器的 SQL 语句,用于在特定操作后自动更新数据。 */ +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 package net.micode.notes.tool; import android.content.ContentProviderOperation; @@ -33,10 +60,32 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; import java.util.HashSet; +<<<<<<< HEAD /** * DataUtils 类提供了一系列用于操作便签数据的工具方法。 * 包括批量删除便签、移动便签、查询便签等。 */ +======= +/*这个方法实现了根据一组ID批量删除笔记的功能。 +它首先检查ID集合是否为空,并创建一个操作列表。 +通过 ContentResolver 执行删除操作,成功后返回 true,失败则返回 false。 */ + + /** + * @method batchDeleteNotes + * @description 批量删除笔记。根据传入的笔记 ID 集合,构建批量删除操 + 作的 ContentProviderOperation 列表,然后通过 ContentResolver + 的 applyBatch 方法执行批量删除操作。如果删除操作成功,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:批量删除笔记。根据传入的笔记 ID 集合,构建批量删除操作的 ContentProviderOperation 列表,然后通过 ContentResolver +的 applyBatch 方法执行批量删除操作。如果删除操作成功,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +ids:要删除的笔记 ID 集合。 +返回值:true 表示删除成功,false 表示删除失败。 */ +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 public class DataUtils { public static final String TAG = "DataUtils"; @@ -80,6 +129,7 @@ public class DataUtils { } return false; } +<<<<<<< HEAD /** * 将便签移动到指定文件夹。 @@ -88,6 +138,31 @@ public class DataUtils { * @param srcFolderId 源文件夹ID * @param desFolderId 目标文件夹ID */ +======= +/*此方法将指定的笔记移动到目标文件夹。 +更新笔记的父文件夹ID并标记为本地修改。 */ +/*查询非系统文件夹的数量。异常处理用于确保在查询失败时释放游标资源。 */ + +/*这个方法实现了根据一组ID批量删除笔记的功能。 +它首先检查ID集合是否为空,并创建一个操作列表。 +通过 ContentResolver 执行删除操作,成功后返回 true,失败则返回 false。 */ + + /** + * @method moveNoteToFoler + * @description 将笔记移动到指定文件夹。根据传入的笔记 ID、源文件夹 ID 和目标文件夹 ID,更新笔记的父 ID、原始父 ID + 和本地修改标志。通过 ContentResolver 的 update 方法执行更新操作。 + * @author: 齐景熙 + */ + +/* +功能介绍:将笔记移动到指定文件夹。根据传入的笔记 ID、源文件夹 ID 和目标文件夹 ID,更新笔记的父 ID、原始父 ID +和本地修改标志。通过 ContentResolver 的 update 方法执行更新操作。 +参数: +resolver:内容解析器,用于访问内容提供者。 +id:要移动的笔记 ID。 +srcFolderId:源文件夹 ID。 +desFolderId:目标文件夹 ID*/ +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { ContentValues values = new ContentValues(); values.put(NoteColumns.PARENT_ID, desFolderId); @@ -96,6 +171,7 @@ public class DataUtils { resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); } +<<<<<<< HEAD /** * 批量将便签移动到指定文件夹。 * @param resolver ContentResolver对象 @@ -108,6 +184,29 @@ public class DataUtils { Log.d(TAG, "the ids is null"); return true; } +======= + + /** + * @method batchMoveToFolder + * @description 批量移动笔记到指定文件夹。根据传入的笔记 ID 集合和目标文件夹 ID,构建批量更新操作的 ContentProviderOperation + 列表,然后通过 ContentResolver 的 applyBatch 方法执行批量更新操作。如果移动操作成功,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:批量移动笔记到指定文件夹。根据传入的笔记 ID 集合和目标文件夹 ID,构建批量更新操作的 ContentProviderOperation +列表,然后通过 ContentResolver 的 applyBatch 方法执行批量更新操作。如果移动操作成功,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +ids:要移动的笔记 ID 集合。 +folderId:目标文件夹 ID。 +返回值:true 表示移动成功,false 表示移动失败。*/ +public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 ArrayList operationList = new ArrayList(); for (long id : ids) { @@ -133,6 +232,7 @@ public class DataUtils { return false; } +<<<<<<< HEAD /** * 获取用户文件夹的数量(不包括系统文件夹)。 * @param resolver ContentResolver对象 @@ -144,6 +244,32 @@ public class DataUtils { NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLDER)}, null); +======= +/** + * 获取用户文件夹的数量(不包括系统文件夹) + * @param resolver ContentResolver对象 + * @return 用户文件夹的数量 + */ + + /** + * @method getUserFolderCount + * @description 获取用户文件夹数量。查询笔记表,统计类型为文件夹且父 ID 不等于回收站文件夹 ID 的笔记数量。返回查询结果中的数量。 + * @author: 齐景熙 + */ + +/* +方法 getUserFolderCount(ContentResolver resolver) +功能介绍:获取用户文件夹数量。查询笔记表,统计类型为文件夹且父 ID 不等于回收站文件夹 ID 的笔记数量。返回查询结果中的数量。 +参数: +resolver:内容解析器,用于访问内容提供者。 +返回值:用户文件夹数量。*/ +public static int getUserFolderCount(ContentResolver resolver) { + 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)}, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 int count = 0; if(cursor != null) { @@ -160,6 +286,7 @@ public class DataUtils { return count; } +<<<<<<< HEAD /** * 检查数据库中是否存在指定ID和类型的便签。 * @param resolver ContentResolver对象 @@ -173,6 +300,35 @@ public class DataUtils { NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLDER, new String [] {String.valueOf(type)}, null); +======= +/** + * 检查数据库中是否存在指定ID和类型的便签 + * @param resolver ContentResolver对象 + * @param noteId 便签ID + * @param type 便签类型 + * @return 是否存在 + */ + + /** + * @method visibleInNoteDatabase + * @description 检查指定类型的笔记是否存在。根据传入的笔记 ID 和类型,查询笔记表,检查是否存在符合条件的笔记。如果存在,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:检查指定类型的笔记是否存在。根据传入的笔记 ID 和类型,查询笔记表,检查是否存在符合条件的笔记。如果存在,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +noteId:要检查的笔记 ID。 +type:笔记类型。 +返回值:true 表示笔记存在,false 表示笔记不存在。*/ +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)}, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 boolean exist = false; if (cursor != null) { @@ -184,6 +340,7 @@ public class DataUtils { return exist; } +<<<<<<< HEAD /** * 检查数据库中是否存在指定ID的便签。 * @param resolver ContentResolver对象 @@ -193,6 +350,32 @@ public class DataUtils { public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, null, null, null); +======= +/** + * 检查数据库中是否存在指定ID的便签 + * @param resolver ContentResolver对象 + * @param noteId 便签ID + * @return 是否存在 + */ + + + + /** + * @method existInNoteDatabase + * @description 检查笔记是否存在。根据传入的笔记 ID,查询笔记表,检查是否存在该笔记。如果存在,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:检查笔记是否存在。根据传入的笔记 ID,查询笔记表,检查是否存在该笔记。如果存在,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +noteId:要检查的笔记 ID。 +返回值:true 表示笔记存在,false 表示笔记不存在。*/ +public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 boolean exist = false; if (cursor != null) { @@ -204,6 +387,7 @@ public class DataUtils { return exist; } +<<<<<<< HEAD /** * 检查数据库中是否存在指定ID的数据。 * @param resolver ContentResolver对象 @@ -213,6 +397,32 @@ public class DataUtils { public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null, null, null, null); +======= +/** + * 检查数据库中是否存在指定ID的数据 + * @param resolver ContentResolver对象 + * @param dataId 数据ID + * @return 是否存在 + */ + + /** + * @method existInNoteDatabase + * @description 检查数据是否存在。根据传入的数据 ID,查询数据表,检查是否存在该数据。如果存在,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:检查数据是否存在。根据传入的数据 ID,查询数据表,检查是否存在该数据。如果存在,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +dataId:要检查的数据 ID。 +返回值:true 表示数据存在,false 表示数据不存在。 +*/ + +public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 boolean exist = false; if (cursor != null) { @@ -224,6 +434,7 @@ public class DataUtils { return exist; } +<<<<<<< HEAD /** * 检查数据库中是否存在指定名称的可见文件夹。 * @param resolver ContentResolver对象 @@ -243,10 +454,48 @@ public class DataUtils { exist = true; } cursor.close(); +======= +/** + * 检查数据库中是否存在指定名称的可见文件夹 + * @param resolver ContentResolver对象 + * @param name 文件夹名称 + * @return 是否存在 + */ + + + /** + * @method checkVisibleFolderName + * @description 检查数据是否存在。根据传入的数据 ID,查询数据表,检查是否存在该数据。如果存在,返回 true;否则,返回 false。 + * @author: 齐景熙 + */ + +/* +功能介绍:检查数据是否存在。根据传入的数据 ID,查询数据表,检查是否存在该数据。如果存在,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +dataId:要检查的数据 ID。 +返回值:true 表示数据存在,false 表示数据不存在。功能介绍:检查可见文件夹名称是否存在。根据传入的文件夹名称,查询笔记表,检查是否存在类型为文件夹、父 ID 不等于回收站文件夹 ID 且名称等于指定名称的文件夹。如果存在,返回 true;否则,返回 false。 +参数: +resolver:内容解析器,用于访问内容提供者。 +name:要检查的文件夹名称。 +返回值:true 表示文件夹名称存在,false 表示文件夹名称不存在。 +*/ +public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.SNIPPET + "=?", + new String[] { name }, null); + boolean exist = false; + if(cursor != null) { + if(cursor.getCount() > 0) { + exist = true; +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 } return exist; } +<<<<<<< HEAD /** * 获取指定文件夹中的小部件属性集合。 * @param resolver ContentResolver对象 @@ -259,6 +508,37 @@ public class DataUtils { NoteColumns.PARENT_ID + "=?", new String[] { String.valueOf(folderId) }, null); +======= +/** + * 获取指定文件夹中的小部件属性集合 + * @param resolver ContentResolver对象 + * @param folderId 文件夹ID + * @return 小部件属性集合 + */ + + /** + * @method getFolderNoteWidget + * @description 获取指定文件夹的笔记小部件属性。根据传入的文件夹 ID,查询笔记表,获取该文件夹下所有笔记的小部件 ID 和类型, + 并将它们封装成 AppWidgetAttribute 对象,存入 HashSet 中返回。 + * @author: 齐景熙 + */ + +/* +功能介绍:获取指定文件夹的笔记小部件属性。根据传入的文件夹 ID,查询笔记表,获取该文件夹下所有笔记的小部件 ID 和类型, +并将它们封装成 AppWidgetAttribute 对象,存入 HashSet 中返回。 +参数: +resolver:内容解析器,用于访问内容提供者。 +folderId:文件夹 ID。 +返回值:包含笔记小部件属性的 HashSet。 +*/ + +public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + NoteColumns.PARENT_ID + "=?", + new String[] { String.valueOf(folderId) }, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 HashSet set = null; if (c != null) { @@ -280,6 +560,7 @@ public class DataUtils { return set; } +<<<<<<< HEAD /** * 根据便签ID获取电话号码。 * @param resolver ContentResolver对象 @@ -292,6 +573,43 @@ public class DataUtils { CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, null); +======= +/** + * 根据便签ID获取电话号码 + * @param resolver ContentResolver对象 + * @param noteId 便签ID + * @return 电话号码 + */ + + /** + * @method getCallNumberByNoteId + * @description 根据笔记 ID 获取通话记录号码。根据传入的笔记 ID,查询数据表,获取该笔记对应的通话记录号码。 + 如果查询成功且存在号码,返回号码字符串;否则,返回空字符串。 + * @author: 齐景熙 + */ + +/* +功能介绍:获取指定文件夹的笔记小部件属性。根据传入的文件夹 ID,查询笔记表,获取该文件夹下所有笔记的小部件 ID 和类型, +并将它们封装成 AppWidgetAttribute 对象,存入 HashSet 中返回。 +功能介绍:根据笔记 ID 获取通话记录号码。根据传入的笔记 ID,查询数据表,获取该笔记对应的通话记录号码。如果查询成功且存 +在号码,返回号码字符串;否则,返回空字符串。 +参数: +resolver:内容解析器,用于访问内容提供者。 +noteId:笔记 ID。 +返回值:通话记录号码字符串。 +参数: +resolver:内容解析器,用于访问内容提供者。 +folderId:文件夹 ID。 +返回值:包含笔记小部件属性的 HashSet。 +*/ + +public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", + new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 if (cursor != null && cursor.moveToFirst()) { try { @@ -305,6 +623,7 @@ public class DataUtils { return ""; } +<<<<<<< HEAD /** * 根据电话号码和通话日期获取便签ID。 * @param resolver ContentResolver对象 @@ -319,6 +638,40 @@ public class DataUtils { + CallNote.PHONE_NUMBER + ",?)", new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, null); +======= +/** + * 根据电话号码和通话日期获取便签ID + * @param resolver ContentResolver对象 + * @param phoneNumber 电话号码 + * @param callDate 通话日期 + * @return 便签ID + */ + + /** + * @method getNoteIdByPhoneNumberAndCallDate + * @description 根据电话号码和通话日期获取笔记 ID。根据传入的电话号码和通话日期,查询数据表,获取匹配的笔记 ID。如果查询成功 + 且存在笔记 ID,返回笔记 ID;否则,返回 0。 + * @author: 齐景熙 + */ + +/* +功能介绍: +根据电话号码和通话日期获取笔记 ID。根据传入的电话号码和通话日期,查询数据表,获取匹配的笔记 ID。如果查询成功 +且存在笔记 ID,返回笔记 ID;否则,返回 0。 +参数: +resolver:内容解析器,用于访问内容提供者。 +phoneNumber:电话号码。 +callDate:通话日期。 +返回值:笔记 ID。 +*/ +public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + 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 }, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 if (cursor != null) { if (cursor.moveToFirst()) { @@ -333,6 +686,7 @@ public class DataUtils { return 0; } +<<<<<<< HEAD /** * 根据便签ID获取便签摘要。 * @param resolver ContentResolver对象 @@ -345,6 +699,40 @@ public class DataUtils { NoteColumns.ID + "=?", new String [] { String.valueOf(noteId)}, null); +======= +/** + * 根据便签ID获取便签摘要 + * @param resolver ContentResolver对象 + * @param noteId 便签ID + * @return 便签摘要 + */ + + + /** + * @method getSnippetById + * @description 根据笔记 ID 获取笔记摘要。根据传入的笔记 ID,查询笔记表,获取该笔记的摘要字符串。如果查询成功且存在摘要, + 返回摘要字符串;否则,抛出 IllegalArgumentException 异常。 + * @author: 齐景熙 + */ + +/* +功能介绍: +根据电话号码和通话日期获取笔记 ID。根据传入的电话号码和通话日期,查询数据表,获取匹配的笔记 ID。如果查询成功 +且存在笔记 ID,返回笔记 ID;否则,返回 0。 +功能介绍:根据笔记 ID 获取笔记摘要。根据传入的笔记 ID,查询笔记表,获取该笔记的摘要字符串。如果查询成功且存在摘要, +返回摘要字符串;否则,抛出 IllegalArgumentException 异常。 +参数: +resolver:内容解析器,用于访问内容提供者。 +noteId:笔记 ID。 +返回值:笔记摘要字符串。 +*/ +public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + NoteColumns.ID + "=?", + new String [] { String.valueOf(noteId)}, + null); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 if (cursor != null) { String snippet = ""; @@ -357,6 +745,7 @@ public class DataUtils { throw new IllegalArgumentException("Note is not found with id: " + noteId); } +<<<<<<< HEAD /** * 格式化便签摘要。 * @param snippet 便签摘要 @@ -369,10 +758,39 @@ public class DataUtils { if (index != -1) { snippet = snippet.substring(0, index); } +======= +/** + * 格式化便签摘要 + * @param snippet 便签摘要 + * @return 格式化后的便签摘要 + */ + + /** + * @method getFormattedSnippet + * @description 格式化笔记摘要。根据传入的笔记摘要字符串,去除首尾空白字符,然后查找第一个换行符,如果存在换行符,则截取换行符之 + 前的内容作为格式化后的摘要。 + * @author: 齐景熙 + */ + +/* +功能介绍:格式化笔记摘要。根据传入的笔记摘要字符串,去除首尾空白字符,然后查找第一个换行符,如果存在换行符,则截取换行符之 +前的内容作为格式化后的摘要。 +参数: +snippet:笔记摘要字符串。 +返回值:格式化后的笔记摘要字符串。 +*/ +public static String getFormattedSnippet(String snippet) { + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 } return snippet; } +<<<<<<< HEAD /** * 在数据库中搜索包含指定查询内容的便签。 * @param resolver ContentResolver对象 @@ -387,4 +805,34 @@ public class DataUtils { null); return cursor; } +======= +/** + * 在数据库中搜索包含指定查询内容的便签 + * @param resolver ContentResolver对象 + * @param query 查询内容 + * @return 包含查询结果的Cursor对象 + */ + + /** + * @method searchInNoteDatabase + * @description 在笔记数据库中搜索。根据传入的查询字符串,查询数据表,获取内容包含查询字符串的笔记 ID。返回查询结果的 Cursor 对象。 + * @author: 齐景熙 + */ + +/* +功能介绍:在笔记数据库中搜索。根据传入的查询字符串,查询数据表,获取内容包含查询字符串的笔记 ID。返回查询结果的 Cursor 对象。 +参数: +resolver:内容解析器,用于访问内容提供者。 +query:查询字符串。 +返回值:查询结果的 Cursor 对象。 +*/ + +public static Cursor searchInNoteDatabase(ContentResolver resolver, String query) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String[]{NoteColumns.ID}, + Notes.DataColumns.CONTENT + " LIKE'%" + query +"%'", + null, + null); + return cursor; +>>>>>>> 623b8465a7bfcf05a3ca2ec250315ad6977a9eb0 } \ No newline at end of file diff --git a/src/java/net/micode/notes/tool/GTaskStringUtils.java b/src/java/net/micode/notes/tool/GTaskStringUtils.java index 694d849..db8e0a5 100644 --- a/src/java/net/micode/notes/tool/GTaskStringUtils.java +++ b/src/java/net/micode/notes/tool/GTaskStringUtils.java @@ -14,6 +14,74 @@ * limitations under the License. */ +/** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: GTaskStringUtils + * @Author: 齐景熙 + */ + + /* + 文件中包含了一系列的静态常量字符串。这些常量字符串主要用于表示与 GTask(Google Tasks)相关的 JSON 键和 + 一些特定的字符串前缀。以下是对这些常量的详细功能介绍: + + 常量介绍 +GTASK JSON 键 +GTASK_JSON_ACTION_ID:用于表示 GTask 操作的 ID。 +GTASK_JSON_ACTION_LIST:用于表示 GTask 操作的列表。 +GTASK_JSON_ACTION_TYPE:用于表示 GTask 操作的类型。 +GTASK_JSON_ACTION_TYPE_CREATE:创建操作类型。 +GTASK_JSON_ACTION_TYPE_GETALL:获取全部操作类型。 +GTASK_JSON_ACTION_TYPE_MOVE:移动操作类型。 +GTASK_JSON_ACTION_TYPE_UPDATE:更新操作类型。 +GTASK_JSON_CREATOR_ID:用于表示创建者的 ID。 +GTASK_JSON_CHILD_ENTITY:用于表示子实体。 +GTASK_JSON_CLIENT_VERSION:用于表示客户端版本。 +GTASK_JSON_COMPLETED:用于表示任务是否已完成。 +GTASK_JSON_CURRENT_LIST_ID:用于表示当前列表的 ID。 +GTASK_JSON_DEFAULT_LIST_ID:用于表示默认列表的 ID。 +GTASK_JSON_DELETED:用于表示实体是否已被删除。 +GTASK_JSON_DEST_LIST:用于表示目标列表。 +GTASK_JSON_DEST_PARENT:用于表示目标父实体。 +GTASK_JSON_DEST_PARENT_TYPE:用于表示目标父实体的类型。 +GTASK_JSON_ENTITY_DELTA:用于表示实体的变更信息。 +GTASK_JSON_ENTITY_TYPE:用于表示实体的类型。 +GTASK_JSON_GET_DELETED:用于表示是否获取已删除的实体。 +GTASK_JSON_ID:用于表示实体的 ID。 +GTASK_JSON_INDEX:用于表示实体的索引。 +GTASK_JSON_LAST_MODIFIED:用于表示实体最后修改的时间。 +GTASK_JSON_LATEST_SYNC_POINT:用于表示最新的同步点。 +GTASK_JSON_LIST_ID:用于表示列表的 ID。 +GTASK_JSON_LISTS:用于表示列表的集合。 +GTASK_JSON_NAME:用于表示实体的名称。 +GTASK_JSON_NEW_ID:用于表示新实体的 ID。 +GTASK_JSON_NOTES:用于表示笔记信息。 +GTASK_JSON_PARENT_ID:用于表示父实体的 ID。 +GTASK_JSON_PRIOR_SIBLING_ID:用于表示前一个兄弟实体的 ID。 +GTASK_JSON_RESULTS:用于表示操作的结果。 +GTASK_JSON_SOURCE_LIST:用于表示源列表。 +GTASK_JSON_TASKS:用于表示任务的集合。 +GTASK_JSON_TYPE:用于表示实体的类型。 +GTASK_JSON_TYPE_GROUP:组类型。 +GTASK_JSON_TYPE_TASK:任务类型。 +GTASK_JSON_USER:用于表示用户信息。 + +其他字符串常量 +MIUI_FOLDER_PREFFIX:用于表示 MIUI 笔记文件夹的前缀。 +FOLDER_DEFAULT:用于表示默认文件夹。 +FOLDER_CALL_NOTE:用于表示通话记录笔记文件夹。 +FOLDER_META:用于表示元数据文件夹。 +META_HEAD_GTASK_ID:用于表示 GTask ID 的元数据头部。 +META_HEAD_NOTE:用于表示笔记的元数据头部。 +META_HEAD_DATA:用于表示数据的元数据头部。 +META_NOTE_NAME:用于表示元数据笔记的名称,提示不要更新和删除。 + + +这些常量字符串在处理与 GTask 相关的 JSON 数据时非常有用,可以方便地获取和设置 JSON 对象中的各种属性。 +同时,它们也用于定义一些特定的文件夹名称和元数据头部,以便在笔记应用中进行相应的处理和标识。 + */ + package net.micode.notes.tool; // 该类用于定义 Google 任务相关的 JSON 字段常量 diff --git a/src/java/net/micode/notes/tool/ResourceParser.java b/src/java/net/micode/notes/tool/ResourceParser.java index 0fc6a61..8784e5f 100644 --- a/src/java/net/micode/notes/tool/ResourceParser.java +++ b/src/java/net/micode/notes/tool/ResourceParser.java @@ -14,6 +14,17 @@ * limitations under the License. */ + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: ResourceParser + * @Description: 该类用于解析和获取应用中的资源。它定义了多种资源的常量和静态方法,用于获取笔记背景、笔记项 + 背景、小部件背景和文本样式等资源。通过这些方法,可以方便地根据不同的条件获取相应的资源 ID, + 从而在应用中使用这些资源。 + * @Author: 齐景熙 + */ package net.micode.notes.tool; import android.content.Context; @@ -42,6 +53,18 @@ public class ResourceParser { public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; // 备忘录背景资源类 + + /** + * @method NoteBgResources + * @description 该内部类用于获取笔记编辑背景和标题背景的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:该内部类用于获取笔记编辑背景和标题背景的资源 ID。 +成员变量: +BG_EDIT_RESOURCES:存储不同颜色的笔记编辑背景资源 ID 的数组。 +BG_EDIT_TITLE_RESOURCES:存储不同颜色的笔记编辑标题背景资源 ID 的数组。 */ + public static class NoteBgResources { private final static int [] BG_EDIT_RESOURCES = new int [] { R.drawable.edit_yellow, @@ -60,17 +83,56 @@ public class ResourceParser { }; // 获取备忘录背景资源 + + /** + * @method getNoteBgResource + * @description 根据传入的 ID 获取笔记编辑背景的资源 ID。通过索引访问 BG_EDIT_RESOURCES 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记编辑背景的资源 ID。通过索引访问 BG_EDIT_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记编辑背景的资源 ID。 + */ + public static int getNoteBgResource(int id) { return BG_EDIT_RESOURCES[id]; } // 获取备忘录标题背景资源 + + /** + * @method getNoteTitleBgResource + * @description 根据传入的 ID 获取笔记编辑标题背景的资源 ID。通过索引访问 BG_EDIT_TITLE_RESOURCES 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记编辑标题背景的资源 ID。通过索引访问 BG_EDIT_TITLE_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记编辑标题背景的资源 ID。 + */ + public static int getNoteTitleBgResource(int id) { return BG_EDIT_TITLE_RESOURCES[id]; } } // 获取默认背景ID + + /** + * @method getDefaultBgId + * @description 获取默认的笔记背景颜色 ID。首先检查是否设置了背景颜色的偏好设置,如果设置了,则随机生成一个背 + 景颜色 ID;否则,返回默认的背景颜色 ID(黄色)。 + * @author: 齐景熙 + */ + /* +功能介绍:获取默认的笔记背景颜色 ID。首先检查是否设置了背景颜色的偏好设置,如果设置了,则随机生成一个背景颜色 ID;否则,返回默认的背景颜色 ID(黄色)。 +参数: +context:上下文对象,用于访问偏好设置。 +返回值:默认的笔记背景颜色 ID。 + */ public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { @@ -81,6 +143,21 @@ public class ResourceParser { } // 备忘录项目背景资源类 + + /** + * @method NoteItemBgResources + * @description 该内部类用于获取笔记项背景的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:该内部类用于获取笔记项背景的资源 ID。 +成员变量: +BG_FIRST_RESOURCES:存储不同颜色的笔记项第一个背景资源 ID 的数组。 +BG_NORMAL_RESOURCES:存储不同颜色的笔记项普通背景资源 ID 的数组。 +BG_LAST_RESOURCES:存储不同颜色的笔记项最后一个背景资源 ID 的数组。 +BG_SINGLE_RESOURCES:存储不同颜色的笔记项单个背景资源 ID 的数组。 + */ + public static class NoteItemBgResources { private final static int [] BG_FIRST_RESOURCES = new int [] { R.drawable.list_yellow_up, @@ -115,32 +192,116 @@ public class ResourceParser { }; // 获取备忘录第一个背景资源 + + /** + * @method getNoteBgFirstRes + * @description 该内部类用于获取笔记项背景的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:该内部类用于获取笔记项背景的资源 ID。 +成员变量: +参数: +id:笔记背景颜色的 ID。 +返回值:笔记项第一个背景的资源 ID。 + */ + public static int getNoteBgFirstRes(int id) { return BG_FIRST_RESOURCES[id]; } // 获取备忘录最后一个背景资源 + + /** + * @method getNoteBgLastRes + * @description 根据传入的 ID 获取笔记项第一个背景的资源 ID。通过索引访问 BG_FIRST_RESOURCES + 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记项第一个背景的资源 ID。通过索引访问 BG_FIRST_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记项第一个背景的资源 ID。 + */ + public static int getNoteBgLastRes(int id) { return BG_LAST_RESOURCES[id]; } // 获取备忘录单独背景资源 + + /** + * @method getNoteBgSingleRes + * @description 根据传入的 ID 获取笔记项第一个背景的资源 ID。通过索引访问 BG_FIRST_RESOURCES + 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记项最后一个背景的资源 ID。通过索引访问 BG_LAST_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记项最后一个背景的资源 ID。 + */ public static int getNoteBgSingleRes(int id) { return BG_SINGLE_RESOURCES[id]; } // 获取备忘录正常背景资源 + + /** + * @method getNoteBgNormalRes + * @description 根据传入的 ID 获取笔记项第一个背景的资源 ID。通过索引访问 BG_FIRST_RESOURCES + 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记项单个背景的资源 ID。通过索引访问 BG_SINGLE_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记项单个背景的资源 ID。 + */ + public static int getNoteBgNormalRes(int id) { return BG_NORMAL_RESOURCES[id]; } // 获取文件夹背景资源 + /** + * @method getFolderBgRes + * @description 根据传入的 ID 获取笔记项第一个背景的资源 ID。通过索引访问 BG_FIRST_RESOURCES + 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取笔记项普通背景的资源 ID。通过索引访问 BG_NORMAL_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:笔记背景颜色的 ID。 +返回值:笔记项普通背景的资源 ID。 + */ public static int getFolderBgRes() { return R.drawable.list_folder; } } // 小部件背景资源类 + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: WidgetBgResources + * @Description: 该内部类用于获取小部件背景的资源 ID。 + * @Author: 齐景熙 + */ + + /* +功能介绍:该内部类用于获取小部件背景的资源 ID。 +成员变量: +BG_2X_RESOURCES:存储不同颜色的 2x 小部件背景资源 ID 的数组。 +BG_4X_RESOURCES:存储不同颜色的 4x 小部件背景资源 ID 的数组。 +*/ + public static class WidgetBgResources { private final static int [] BG_2X_RESOURCES = new int [] { R.drawable.widget_2x_yellow, @@ -151,6 +312,18 @@ public class ResourceParser { }; // 获取2x小部件背景资源 + + /** + * @method getWidget2xBgResource + * @description 根据传入的 ID 获取 2x 小部件背景的资源 ID。通过索引访问 BG_2X_RESOURCES 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取 2x 小部件背景的资源 ID。通过索引访问 BG_2X_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:小部件背景颜色的 ID。 +返回值:2x 小部件背景的资源 ID。 + */ public static int getWidget2xBgResource(int id) { return BG_2X_RESOURCES[id]; } @@ -164,12 +337,39 @@ public class ResourceParser { }; // 获取4x小部件背景资源 + + /** + * @method getWidget4xBgResource + * @description 根据传入的 ID 获取 4x 小部件背景的资源 ID。通过索引访问 BG_4X_RESOURCES 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取 4x 小部件背景的资源 ID。通过索引访问 BG_4X_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:小部件背景颜色的 ID。 +返回值:4x 小部件背景的资源 ID。 + */ public static int getWidget4xBgResource(int id) { return BG_4X_RESOURCES[id]; } } // 文本外观资源类 + + /** + * + * @ProjectName: minode + * @Package: net.micode.notes.data + * @ClassName: TextAppearanceResources + * @Description: 该内部类用于获取文本样式的资源 ID。 + * @Author: 齐景熙 + */ + + /* +功能介绍:该内部类用于获取文本样式的资源 ID。 +成员变量: +TEXTAPPEARANCE_RESOURCES:存储不同大小的文本样式资源 ID 的数组。 +*/ public static class TextAppearanceResources { private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { R.style.TextAppearanceNormal, @@ -179,6 +379,20 @@ public class ResourceParser { }; // 获取文本外观资源 + + /** + * @method getTexAppearanceResource + * @description 根据传入的 ID 获取文本样式的资源 ID。首先检查 ID 是否超出数组长度,如果超出,则返回默认的文本样式 ID; + 否则,通过索引访问 TEXTAPPEARANCE_RESOURCES 数组,返回对应的资源 ID。 + * @author: 齐景熙 + */ + /* +功能介绍:根据传入的 ID 获取文本样式的资源 ID。首先检查 ID 是否超出数组长度,如果超出,则返回默认的文本样式 ID; +否则,通过索引访问 TEXTAPPEARANCE_RESOURCES 数组,返回对应的资源 ID。 +参数: +id:文本样式大小的 ID。 +返回值:文本样式的资源 ID。 + */ public static int getTexAppearanceResource(int id) { /** * HACKME: Fix bug of store the resource id in shared preference. @@ -192,6 +406,16 @@ public class ResourceParser { } // 获取资源大小 + + /** + * @method getResourcesSize + * @description 获取文本样式资源的大小。返回 TEXTAPPEARANCE_RESOURCES 数组的长度。 + * @author: 齐景熙 + */ + /* +功能介绍:获取文本样式资源的大小。返回 TEXTAPPEARANCE_RESOURCES 数组的长度。 +返回值:文本样式资源的大小。 + */ public static int getResourcesSize() { return TEXTAPPEARANCE_RESOURCES.length; }