From 007867c809ca600f306dfd5f2b6bd4b341bd7ef8 Mon Sep 17 00:00:00 2001 From: Mccranky83 Date: Thu, 11 May 2023 15:39:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=94=A1=E5=AE=89=E5=8D=97?= =?UTF-8?q?=E5=88=86=E6=94=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/.DS_Store | Bin 0 -> 6148 bytes doc/蔡安南——精读代码/.DS_Store | Bin 0 -> 6148 bytes .../data/Contact.java | 70 ++++ .../data/Notes.java | 268 ++++++++++++ .../data/NotesDatabaseHelper.java | 347 ++++++++++++++++ .../data/NotesProvider.java | 289 +++++++++++++ .../model/Note.java | 281 +++++++++++++ .../model/WorkingNote.java | 381 ++++++++++++++++++ doc/蔡安南——精读代码/res/.DS_Store | Bin 0 -> 6148 bytes .../res/values-zh-rCN/arrays.xml | 8 + .../res/values-zh-rCN/strings.xml | 112 +++++ .../res/values-zh-rTW/arrays.xml | 8 + .../res/values-zh-rTW/strings.xml | 112 +++++ .../res/values/arrays.xml | 16 + .../res/values/colors.xml | 5 + .../res/values/dimens.xml | 9 + .../res/values/strings.xml | 135 +++++++ .../res/values/styles.xml | 65 +++ .../res/xml/preferences.xml | 17 + .../res/xml/searchable.xml | 12 + .../res/xml/widget_2x_info.xml | 11 + .../res/xml/widget_4x_info.xml | 13 + .../tool/BackupUtils.java | 372 +++++++++++++++++ .../tool/DataUtils.java | 329 +++++++++++++++ .../tool/GTaskStringUtils.java | 113 ++++++ .../tool/ResourceParser.java | 181 +++++++++ .../widget/NoteWidgetProvider.java | 147 +++++++ .../widget/NoteWidgetProvider_2x.java | 60 +++ .../widget/NoteWidgetProvider_4x.java | 59 +++ model/.DS_Store | Bin 0 -> 6148 bytes model/CAN-UML图/分析类图.png | Bin 0 -> 59275 bytes model/CAN-UML图/分析类图.puml | 59 +++ model/CAN-UML图/泛读用例图.puml | 22 + model/CAN-UML图/用例图.png | Bin 0 -> 45288 bytes model/CAN-UML图/用例图.puml | 33 ++ model/CAN-UML图/顺序图.png | Bin 0 -> 51506 bytes model/CAN-UML图/顺序图.puml | 55 +++ model/CAN-UML图/顺序图2.jpeg | Bin 0 -> 45918 bytes model/CAN-UML图/顺序图3.jpeg | Bin 0 -> 56963 bytes 39 files changed, 3589 insertions(+) create mode 100644 doc/.DS_Store create mode 100644 doc/蔡安南——精读代码/.DS_Store create mode 100644 doc/蔡安南——精读代码/data/Contact.java create mode 100644 doc/蔡安南——精读代码/data/Notes.java create mode 100644 doc/蔡安南——精读代码/data/NotesDatabaseHelper.java create mode 100644 doc/蔡安南——精读代码/data/NotesProvider.java create mode 100644 doc/蔡安南——精读代码/model/Note.java create mode 100644 doc/蔡安南——精读代码/model/WorkingNote.java create mode 100644 doc/蔡安南——精读代码/res/.DS_Store create mode 100644 doc/蔡安南——精读代码/res/values-zh-rCN/arrays.xml create mode 100644 doc/蔡安南——精读代码/res/values-zh-rCN/strings.xml create mode 100644 doc/蔡安南——精读代码/res/values-zh-rTW/arrays.xml create mode 100644 doc/蔡安南——精读代码/res/values-zh-rTW/strings.xml create mode 100644 doc/蔡安南——精读代码/res/values/arrays.xml create mode 100644 doc/蔡安南——精读代码/res/values/colors.xml create mode 100644 doc/蔡安南——精读代码/res/values/dimens.xml create mode 100644 doc/蔡安南——精读代码/res/values/strings.xml create mode 100644 doc/蔡安南——精读代码/res/values/styles.xml create mode 100644 doc/蔡安南——精读代码/res/xml/preferences.xml create mode 100644 doc/蔡安南——精读代码/res/xml/searchable.xml create mode 100755 doc/蔡安南——精读代码/res/xml/widget_2x_info.xml create mode 100755 doc/蔡安南——精读代码/res/xml/widget_4x_info.xml create mode 100644 doc/蔡安南——精读代码/tool/BackupUtils.java create mode 100644 doc/蔡安南——精读代码/tool/DataUtils.java create mode 100644 doc/蔡安南——精读代码/tool/GTaskStringUtils.java create mode 100644 doc/蔡安南——精读代码/tool/ResourceParser.java create mode 100644 doc/蔡安南——精读代码/widget/NoteWidgetProvider.java create mode 100644 doc/蔡安南——精读代码/widget/NoteWidgetProvider_2x.java create mode 100644 doc/蔡安南——精读代码/widget/NoteWidgetProvider_4x.java create mode 100644 model/.DS_Store create mode 100644 model/CAN-UML图/分析类图.png create mode 100644 model/CAN-UML图/分析类图.puml create mode 100644 model/CAN-UML图/泛读用例图.puml create mode 100644 model/CAN-UML图/用例图.png create mode 100644 model/CAN-UML图/用例图.puml create mode 100644 model/CAN-UML图/顺序图.png create mode 100644 model/CAN-UML图/顺序图.puml create mode 100644 model/CAN-UML图/顺序图2.jpeg create mode 100644 model/CAN-UML图/顺序图3.jpeg diff --git a/doc/.DS_Store b/doc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..56fa7d20ae96cd1c83e08783b50dd4ae42b49f45 GIT binary patch literal 6148 zcmeHK%SyvQ6g|_H(&DCzE?mZ~Af@03#1ePfO;ABMeFX(uQ_>a`Tx6pl{)k`U&M)yZ z+<5NHP+FRTD-pRj+&MG%F*7*>xfuYavlz9327nq>uvBMLAmSI@kdn7liALrKnvd_V zU)|4pGrr!4R>NOpK+dlIw0HFqUj)t7^J~Y$bTYMDF7@Q33!)}z6b;7dfZp2v<=b;o z{W#hdIr?Gb^k!w{a*xv$tvsC%P8PFyM(-hFJYa@75=_v-IZ}+VU_YU?g$RB6`s|%? zoFKE-Qw;fJwBO;D`7LyrCv(hjz}!AjMj1ULdWOVpJL&qJ6fh*)S5XF(0cGINF~FKF zQrmH;tumktC<99dY!(|FPwiGi~O7Sk$3hjY(h@r>aAuSaB5wJ99 JqYV5i1K$SbZukHI literal 0 HcmV?d00001 diff --git a/doc/蔡安南——精读代码/.DS_Store b/doc/蔡安南——精读代码/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bf25a34ed812cb04a6756c765b4b7330a7803ccf GIT binary patch literal 6148 zcmeHKu};G<5Iwh{s$l8Bz?dDDu1ui{D@!*PNGWPTiBh152`Mu|;ujd$SQwCCWB@Vo zBS^6D1H7|MYd0+;s?eQezr^n@FMd+&n21#CwA&4r@xR}zLzm0)IPRo*2V?cy%ZK&%ujdV)@BYdU z`tI6rhf-RgjB;r2Q|c=xxzD=VU>?^#?^)Za&+@VQ^bB8LFHu!GhW3fCeer>M%ecDR zmGiBn_QJX&cC1-uJv|ko3_cGr-+Xem*RL+;YQ8o4H#`S6YJLKj1J&) z53?Qmvt2!!~k5)aj%mgVKuw;(+f!)!a6C|KFT_{`ZUIP8<*i{*?nNh}&@sQ?h$&X>z>RhG@HJ p9Gq7e)FtTbcC0UWD_%j<0WRbVU}Ui{h!KSR2xuFm69@j(fp778n4kav literal 0 HcmV?d00001 diff --git a/doc/蔡安南——精读代码/data/Contact.java b/doc/蔡安南——精读代码/data/Contact.java new file mode 100644 index 00000000..6f51d932 --- /dev/null +++ b/doc/蔡安南——精读代码/data/Contact.java @@ -0,0 +1,70 @@ +package net.micode.notes.data; + +import android.content.Context; +import android.database.Cursor; +import android.provider.ContactsContract.CommonDataKinds.Phone; +import android.provider.ContactsContract.Data; +import android.telephony.PhoneNumberUtils; +import android.util.Log; + +import java.util.HashMap; + +public class Contact { + private static HashMap sContactCache; + private static final String TAG = "Contact"; + + private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + + "(SELECT raw_contact_id " + + " FROM phone_lookup" + + " WHERE min_match = '+')"; + + /** + * 从通讯录中获取给定电话号码对应的联系人名字 + * @param context 应用程序上下文 + * @param phoneNumber 电话号码 + * @return 联系人名字,如果未找到则返回null + */ + public static String getContact(Context context, String phoneNumber) { + // 如果缓存为空,则初始化一个HashMap对象作为缓存 + if (sContactCache == null) { + sContactCache = new HashMap(); + } + + // 如果缓存中存在该电话号码对应的联系人名字,则直接返回 + if (sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber); + } + + // 构造查询条件,使用给定的电话号码作为参数 + String selection = CALLER_ID_SELECTION.replace("+", + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // 查询通讯录数据库,查询结果包含指定电话号码的联系人名字 + Cursor cursor = context.getContentResolver().query( + Data.CONTENT_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.e(TAG, " Cursor get string error " + e.toString()); + return null; + } finally { + cursor.close(); + } + } else { + // 如果查询结果为空,则记录日志并返回null + Log.d(TAG, "No contact matched with number:" + phoneNumber); + return null; + } + } + +} diff --git a/doc/蔡安南——精读代码/data/Notes.java b/doc/蔡安南——精读代码/data/Notes.java new file mode 100644 index 00000000..eac83b34 --- /dev/null +++ b/doc/蔡安南——精读代码/data/Notes.java @@ -0,0 +1,268 @@ +// 对便签本身进行操作 + +package net.micode.notes.data; + +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; + + /** + * Following IDs are system folders' identifiers + * {@link Notes#ID_ROOT_FOLDER } is default folder + * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder + * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records + */ + 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; + + 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"; + + public static final int TYPE_WIDGET_INVALIDE = -1; + public static final int TYPE_WIDGET_2X = 0; + 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; + } + + /** + * Uri to query all notes and folders + */ + public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); + + /** + * Uri to query data + */ + public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + + public interface NoteColumns { + // 建立便签独有id + /** + * The unique ID for a row + *

Type: INTEGER (long)

+ */ + public static final String ID = "_id"; + + // 确立母文件夹位置 + /** + * The parent's id for note or folder + *

Type: INTEGER (long)

+ */ + public static final String PARENT_ID = "parent_id"; + + // 写入便签数据 + /** + * Created data for note or folder + *

Type: INTEGER (long)

+ */ + public static final String CREATED_DATE = "created_date"; + + /** + * Latest modified date + *

Type: INTEGER (long)

+ */ + public static final String MODIFIED_DATE = "modified_date"; + + + /** + * Alert date + *

Type: INTEGER (long)

+ */ + public static final String ALERTED_DATE = "alert_date"; + + /** + * Folder's name or text content of note + *

Type: TEXT

+ */ + public static final String SNIPPET = "snippet"; + + /** + * Note's widget id + *

Type: INTEGER (long)

+ */ + public static final String WIDGET_ID = "widget_id"; + + /** + * Note's widget type + *

Type: INTEGER (long)

+ */ + public static final String WIDGET_TYPE = "widget_type"; + + /** + * Note's background color's id + *

Type: INTEGER (long)

+ */ + public static final String BG_COLOR_ID = "bg_color_id"; + + /** + * For text note, it doesn't has attachment, for multi-media + * note, it has at least one attachment + *

Type: INTEGER

+ */ + public static final String HAS_ATTACHMENT = "has_attachment"; + + /** + * Folder's count of notes + *

Type: INTEGER (long)

+ */ + public static final String NOTES_COUNT = "notes_count"; + + /** + * The file type: folder or note + *

Type: INTEGER

+ */ + public static final String TYPE = "type"; + + /** + * The last sync id + *

Type: INTEGER (long)

+ */ + public static final String SYNC_ID = "sync_id"; + + /** + * Sign to indicate local modified or not + *

Type: INTEGER

+ */ + public static final String LOCAL_MODIFIED = "local_modified"; + + /** + * Original parent id before moving into temporary folder + *

Type : INTEGER

+ */ + public static final String ORIGIN_PARENT_ID = "origin_parent_id"; + + /** + * The gtask id + *

Type : TEXT

+ */ + public static final String GTASK_ID = "gtask_id"; + + /** + * The version code + *

Type : INTEGER (long)

+ */ + public static final String VERSION = "version"; + } + + public interface DataColumns { + /** + * The unique ID for a row + *

Type: INTEGER (long)

+ */ + public static final String ID = "_id"; + + /** + * The MIME type of the item represented by this row. + *

Type: Text

+ */ + public static final String MIME_TYPE = "mime_type"; + + /** + * The reference id to note that this data belongs to + *

Type: INTEGER (long)

+ */ + public static final String NOTE_ID = "note_id"; + + /** + * Created data for note or folder + *

Type: INTEGER (long)

+ */ + public static final String CREATED_DATE = "created_date"; + + /** + * Latest modified date + *

Type: INTEGER (long)

+ */ + public static final String MODIFIED_DATE = "modified_date"; + + /** + * Data's content + *

Type: TEXT

+ */ + public static final String CONTENT = "content"; + + + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * integer data type + *

Type: INTEGER

+ */ + public static final String DATA1 = "data1"; + + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * integer data type + *

Type: INTEGER

+ */ + public static final String DATA2 = "data2"; + + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *

Type: TEXT

+ */ + public static final String DATA3 = "data3"; + + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *

Type: TEXT

+ */ + public static final String DATA4 = "data4"; + + /** + * Generic data column, the meaning is {@link #MIMETYPE} specific, used for + * TEXT data type + *

Type: TEXT

+ */ + public static final String DATA5 = "data5"; + } + + public static final class TextNote implements DataColumns { + /** + * Mode to indicate the text in check list mode or not + *

Type: Integer 1:check list mode 0: normal mode

+ */ + public static final String MODE = DATA1; + + public static final int MODE_CHECK_LIST = 1; + + 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"; + + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); + } + + public static final class CallNote implements DataColumns { + /** + * Call date for this record + *

Type: INTEGER (long)

+ */ + public static final String CALL_DATE = DATA1; + + /** + * Phone number for this record + *

Type: TEXT

+ */ + public static final String PHONE_NUMBER = DATA3; + + 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"; + + public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); + } +} diff --git a/doc/蔡安南——精读代码/data/NotesDatabaseHelper.java b/doc/蔡安南——精读代码/data/NotesDatabaseHelper.java new file mode 100644 index 00000000..0166eb1e --- /dev/null +++ b/doc/蔡安南——精读代码/data/NotesDatabaseHelper.java @@ -0,0 +1,347 @@ + +package net.micode.notes.data; + +import android.content.ContentValues; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +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"; + } + + private static final String TAG = "NotesDatabaseHelper"; + + private static NotesDatabaseHelper mInstance; + + private static final String CREATE_NOTE_TABLE_SQL = + "CREATE TABLE " + TABLE.NOTE + "(" + + NoteColumns.ID + " INTEGER PRIMARY KEY," + + NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + + NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + + NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + + ")"; + + private static final String CREATE_DATA_TABLE_SQL = + "CREATE TABLE " + TABLE.DATA + "(" + + DataColumns.ID + " INTEGER PRIMARY KEY," + + DataColumns.MIME_TYPE + " TEXT NOT NULL," + + DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + + NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + + DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + + DataColumns.DATA1 + " INTEGER," + + DataColumns.DATA2 + " INTEGER," + + DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + + DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + + ")"; + + private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = + "CREATE INDEX IF NOT EXISTS note_id_index ON " + + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; + + /** + * 把便签挪动进入数据库,便签数加一 + */ + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = + "CREATE TRIGGER increase_folder_count_on_update "+ + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + + " BEGIN " + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + + " END"; + + /** + * 把便签挪动进出数据库,便签数减一 + */ + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = + "CREATE TRIGGER decrease_folder_count_on_update " + + " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + + " BEGIN " + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + + " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + + " END"; + + /** + * 把便签挪动进入文件夹,便签数加一 + */ + private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = + "CREATE TRIGGER increase_folder_count_on_insert " + + " AFTER INSERT ON " + TABLE.NOTE + + " BEGIN " + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + + " END"; + + /** + * 把便签挪动进出文件夹,便签数减一 + */ + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = + "CREATE TRIGGER decrease_folder_count_on_delete " + + " AFTER DELETE ON " + TABLE.NOTE + + " BEGIN " + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + + " AND " + NoteColumns.NOTES_COUNT + ">0;" + + " END"; + + /** + * 更新便签数据类型1 {@link DataConstants#NOTE} + */ + private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = + "CREATE TRIGGER update_note_content_on_insert " + + " AFTER INSERT ON " + TABLE.DATA + + " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + + " END"; + + /** + * 更新便签数据类型2 {@link DataConstants#NOTE} + */ + private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = + "CREATE TRIGGER update_note_content_on_update " + + " AFTER UPDATE ON " + TABLE.DATA + + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + + " END"; + + /** + * 更新便签数据类型3 {@link DataConstants#NOTE} + */ + private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = + "CREATE TRIGGER update_note_content_on_delete " + + " AFTER delete ON " + TABLE.DATA + + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.SNIPPET + "=''" + + " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + + " END"; + + /** + * Delete datas belong to note which has been deleted + */ + private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = + "CREATE TRIGGER delete_data_on_delete " + + " AFTER DELETE ON " + TABLE.NOTE + + " BEGIN" + + " DELETE FROM " + TABLE.DATA + + " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + + " END"; + + /** + * Delete notes belong to folder which has been deleted + */ + private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = + "CREATE TRIGGER folder_delete_notes_on_delete " + + " AFTER DELETE ON " + TABLE.NOTE + + " BEGIN" + + " DELETE FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + + " END"; + + /** + * Move notes belong to folder which has been moved to trash folder + */ + private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = + "CREATE TRIGGER folder_move_notes_on_trash " + + " AFTER UPDATE ON " + TABLE.NOTE + + " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + + " END"; + + public NotesDatabaseHelper(Context context) { + super(context, DB_NAME, null, DB_VERSION); + } + + public void createNoteTable(SQLiteDatabase db) { + db.execSQL(CREATE_NOTE_TABLE_SQL); + reCreateNoteTableTriggers(db); + createSystemFolder(db); + Log.d(TAG, "note table has been created"); + } + + 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"); + db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); + db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); + + db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); + db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); + db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); + db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); + db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); + db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); + db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); + } + + private void createSystemFolder(SQLiteDatabase db) { + ContentValues values = new ContentValues(); + + /** + * call record foler for call notes + */ + values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * root folder which is default folder + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * temporary folder which is used for moving note + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * create trash folder + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + } + + public void createDataTable(SQLiteDatabase db) { + db.execSQL(CREATE_DATA_TABLE_SQL); + reCreateDataTableTriggers(db); + db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); + Log.d(TAG, "data table has been created"); + } + + 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"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); + + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); + db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); + } + + static synchronized NotesDatabaseHelper getInstance(Context context) { + if (mInstance == null) { + mInstance = new NotesDatabaseHelper(context); + } + return mInstance; + } + + @Override + public void onCreate(SQLiteDatabase db) { + createNoteTable(db); + createDataTable(db); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + boolean reCreateTriggers = false; + boolean skipV2 = false; + + if (oldVersion == 1) { + upgradeToV2(db); + skipV2 = true; // this upgrade including the upgrade from v2 to v3 + oldVersion++; + } + + if (oldVersion == 2 && !skipV2) { + upgradeToV3(db); + reCreateTriggers = true; + oldVersion++; + } + + if (oldVersion == 3) { + upgradeToV4(db); + oldVersion++; + } + + if (reCreateTriggers) { + reCreateNoteTableTriggers(db); + reCreateDataTableTriggers(db); + } + + if (oldVersion != newVersion) { + throw new IllegalStateException("Upgrade notes database to version " + newVersion + + "fails"); + } + } + + private void upgradeToV2(SQLiteDatabase db) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); + createNoteTable(db); + createDataTable(db); + } + + private void upgradeToV3(SQLiteDatabase db) { + // drop unused triggers + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); + db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); + // add a column for gtask id + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + + " TEXT NOT NULL DEFAULT ''"); + // add a trash system folder + ContentValues values = new ContentValues(); + values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + } + + private void upgradeToV4(SQLiteDatabase db) { + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + + " INTEGER NOT NULL DEFAULT 0"); + } +} diff --git a/doc/蔡安南——精读代码/data/NotesProvider.java b/doc/蔡安南——精读代码/data/NotesProvider.java new file mode 100644 index 00000000..99eea24f --- /dev/null +++ b/doc/蔡安南——精读代码/data/NotesProvider.java @@ -0,0 +1,289 @@ +package net.micode.notes.data; + + +import android.app.SearchManager; +import android.content.ContentProvider; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Intent; +import android.content.UriMatcher; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.NotesDatabaseHelper.TABLE; + + +public class NotesProvider extends ContentProvider { + private static final UriMatcher mMatcher; + + private NotesDatabaseHelper mHelper; + + private static final String TAG = "NotesProvider"; + + private static final int URI_NOTE = 1; + private static final int URI_NOTE_ITEM = 2; + private static final int URI_DATA = 3; + private static final int URI_DATA_ITEM = 4; + + private static final int URI_SEARCH = 5; + private static final int URI_SEARCH_SUGGEST = 6; + + static { + mMatcher = new UriMatcher(UriMatcher.NO_MATCH); + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); + } + + /** + * x'0A' represents the '\n' character in sqlite. For title and content in the search result, + * we will trim '\n' and white space in order to show more information. + */ + private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," + + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," + + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," + + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," + + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," + + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; + + private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + + " FROM " + TABLE.NOTE + + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" + + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; + + @Override + public boolean onCreate() { + mHelper = NotesDatabaseHelper.getInstance(getContext()); + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + Cursor c = null; + SQLiteDatabase db = mHelper.getReadableDatabase(); + String id = null; + switch (mMatcher.match(uri)) { + case URI_NOTE: + 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 + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_DATA: + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, + sortOrder); + break; + case URI_DATA_ITEM: + id = uri.getPathSegments().get(1); + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_SEARCH: + case URI_SEARCH_SUGGEST: + if (sortOrder != null || projection != null) { + throw new IllegalArgumentException( + "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); + } + + String searchString = null; + if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { + if (uri.getPathSegments().size() > 1) { + searchString = uri.getPathSegments().get(1); + } + } else { + searchString = uri.getQueryParameter("pattern"); + } + + if (TextUtils.isEmpty(searchString)) { + return null; + } + + try { + searchString = String.format("%%%s%%", searchString); + c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, + new String[] { searchString }); + } catch (IllegalStateException ex) { + Log.e(TAG, "got exception: " + ex.toString()); + } + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + if (c != null) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + SQLiteDatabase db = mHelper.getWritableDatabase(); + long dataId = 0, noteId = 0, insertedId = 0; + switch (mMatcher.match(uri)) { + case URI_NOTE: + insertedId = noteId = db.insert(TABLE.NOTE, null, values); + break; + case URI_DATA: + if (values.containsKey(DataColumns.NOTE_ID)) { + noteId = values.getAsLong(DataColumns.NOTE_ID); + } else { + Log.d(TAG, "Wrong data format without note id:" + values.toString()); + } + insertedId = dataId = db.insert(TABLE.DATA, null, values); + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + // Notify the note uri + if (noteId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); + } + + // Notify the data uri + if (dataId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); + } + + return ContentUris.withAppendedId(uri, insertedId); + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + int count = 0; + String id = null; + SQLiteDatabase db = mHelper.getWritableDatabase(); + boolean deleteData = false; + switch (mMatcher.match(uri)) { + case URI_NOTE: + selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; + count = db.delete(TABLE.NOTE, selection, selectionArgs); + break; + case URI_NOTE_ITEM: + id = uri.getPathSegments().get(1); + /** + * ID that smaller than 0 is system folder which is not allowed to + * trash + */ + long noteId = Long.valueOf(id); + if (noteId <= 0) { + break; + } + count = db.delete(TABLE.NOTE, + NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); + break; + case URI_DATA: + count = db.delete(TABLE.DATA, selection, selectionArgs); + deleteData = true; + break; + case URI_DATA_ITEM: + id = uri.getPathSegments().get(1); + count = db.delete(TABLE.DATA, + DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); + deleteData = true; + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + if (count > 0) { + if (deleteData) { + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + getContext().getContentResolver().notifyChange(uri, null); + } + return count; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + int count = 0; + String id = null; + SQLiteDatabase db = mHelper.getWritableDatabase(); + boolean updateData = false; + switch (mMatcher.match(uri)) { + case URI_NOTE: + increaseNoteVersion(-1, selection, selectionArgs); + count = db.update(TABLE.NOTE, values, selection, selectionArgs); + break; + case URI_NOTE_ITEM: + id = uri.getPathSegments().get(1); + increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); + count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); + break; + case URI_DATA: + count = db.update(TABLE.DATA, values, selection, selectionArgs); + updateData = true; + break; + case URI_DATA_ITEM: + id = uri.getPathSegments().get(1); + count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs); + updateData = true; + break; + default: + throw new IllegalArgumentException("Unknown URI " + uri); + } + + if (count > 0) { + if (updateData) { + getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); + } + getContext().getContentResolver().notifyChange(uri, null); + } + return count; + } + + private String parseSelection(String selection) { + return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); + } + + private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { + StringBuilder sql = new StringBuilder(120); + sql.append("UPDATE "); + sql.append(TABLE.NOTE); + sql.append(" SET "); + sql.append(NoteColumns.VERSION); + sql.append("=" + NoteColumns.VERSION + "+1 "); + + if (id > 0 || !TextUtils.isEmpty(selection)) { + sql.append(" WHERE "); + } + if (id > 0) { + sql.append(NoteColumns.ID + "=" + String.valueOf(id)); + } + if (!TextUtils.isEmpty(selection)) { + String selectString = id > 0 ? parseSelection(selection) : selection; + for (String args : selectionArgs) { + selectString = selectString.replaceFirst("\\?", args); + } + sql.append(selectString); + } + + mHelper.getWritableDatabase().execSQL(sql.toString()); + } + + @Override + public String getType(Uri uri) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/doc/蔡安南——精读代码/model/Note.java b/doc/蔡安南——精读代码/model/Note.java new file mode 100644 index 00000000..bff2a8db --- /dev/null +++ b/doc/蔡安南——精读代码/model/Note.java @@ -0,0 +1,281 @@ +package net.micode.notes.model; +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.OperationApplicationException; +import android.net.Uri; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; + +import java.util.ArrayList; + + +/* +这是一个Java类`Note`,它包含一个静态方法`getNewNoteId`。 + +`getNewNoteId`方法接受两个参数:一个`Context`对象和一个`long`类型的`folderId`。该方法的作用是为添加一个新笔记到数据库中创建一个新的笔记ID,并返回该ID。 + +具体来说,该方法创建一个`ContentValues`对象,用于指定新笔记的一些属性,例如创建时间、修改时间、类型、本地修改标志和父文件夹ID等。然后,该方法使用`ContentResolver.insert`方法将该笔记插入到数据库中,并返回一个`Uri`对象。 + +最后,该方法从`Uri`对象中提取笔记ID,并将其作为`long`类型返回。如果提取ID失败,则返回0。如果提取的ID为-1,则抛出一个`IllegalStateException`异常。 + +需要注意的是,该类中使用了一些未定义的变量和方法,例如`NoteColumns.CREATED_DATE`、`NoteColumns.MODIFIED_DATE`、`Notes.TYPE_NOTE`、`NoteColumns.LOCAL_MODIFIED`和`Notes.CONTENT_NOTE_URI`等。因此,无法确定该类的完整实现和调用方式。 +*/ + +public class Note { + private ContentValues mNoteDiffValues; + private NoteData mNoteData; + private static final String TAG = "Note"; + /** + * Create a new note id for adding a new note to databases + */ + public static synchronized long getNewNoteId(Context context, long folderId) { + // Create a new note in the database + ContentValues values = new ContentValues(); + long createdTime = System.currentTimeMillis(); + values.put(NoteColumns.CREATED_DATE, createdTime); + values.put(NoteColumns.MODIFIED_DATE, createdTime); + values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + values.put(NoteColumns.PARENT_ID, folderId); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + + long noteId = 0; + try { + noteId = Long.valueOf(uri.getPathSegments().get(1)); + } catch (NumberFormatException e) { + Log.e(TAG, "Get note id error :" + e.toString()); + noteId = 0; + } + if (noteId == -1) { + throw new IllegalStateException("Wrong note id:" + noteId); + } + return noteId; + } + + public Note() { + mNoteDiffValues = new ContentValues(); + mNoteData = new NoteData(); + } + + public void setNoteValue(String key, String value) { + mNoteDiffValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + public void setTextData(String key, String value) { + mNoteData.setTextData(key, value); + } + + public void setTextDataId(long id) { + mNoteData.setTextDataId(id); + } + + public long getTextDataId() { + return mNoteData.mTextDataId; + } + + public void setCallDataId(long id) { + mNoteData.setCallDataId(id); + } + + public void setCallData(String key, String value) { + mNoteData.setCallData(key, value); + } + + public boolean isLocalModified() { + return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); + } + + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + if (!isLocalModified()) { + 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 + */ + 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(); + + if (mNoteData.isLocalModified() + && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + return false; + } + + return true; + } + + /* + 这是一个Java类`Note`中的一个内部类`NoteData`,它包含一些成员变量和方法,用于处理笔记的文本数据和通话数据。 + +具体来说,`NoteData`类包含以下成员变量: + +- `mTextDataId`:文本数据的ID。 +- `mTextDataValues`:文本数据的`ContentValues`对象。 +- `mCallDataId`:通话数据的ID。 +- `mCallDataValues`:通话数据的`ContentValues`对象。 + +`NoteData`类包含以下方法: + +- `isLocalModified`:检查笔记的文本数据和通话数据是否已被修改。 +- `setTextDataId`:设置文本数据的ID。 +- `setCallDataId`:设置通话数据的ID。 +- `setCallData`:设置通话数据的键值对。 +- `setTextData`:设置文本数据的键值对。 +- `pushIntoContentResolver`:将笔记的文本数据和通话数据插入到数据库中,并返回插入操作的结果。 + +具体来说,`isLocalModified`方法检查文本数据和通话数据的`ContentValues`对象是否包含任何键值对。如果是,则说明数据已被修改,返回`true`,否则返回`false`。 + +`setTextDataId`和`setCallDataId`方法分别设置文本数据和通话数据的ID。如果指定的ID小于等于0,则抛出`IllegalArgumentException`异常。 + +`setCallData`和`setTextData`方法分别设置通话数据和文本数据的键值对。这些键值对将被添加到对应的`ContentValues`对象中,并将笔记的`LOCAL_MODIFIED`和`MODIFIED_DATE`属性设置为1和当前时间戳。 + +`pushIntoContentResolver`方法将笔记的文本数据和通话数据插入到数据库中,并返回插入操作的结果。该方法首先检查笔记的ID是否大于0,如果不是,则抛出`IllegalArgumentException`异常。 + +然后,该方法创建一个`ArrayList`对象,用于存储插入或更新操作。如果文本数据或通话数据的`ContentValues`对象包含任何键值对,则该方法将其添加到对应的插入或更新操作中。 + +最后,该方法使用`ContentResolver.applyBatch`方法将所有操作应用到数据库中,并返回插入操作的结果。如果操作失败,则返回`null`。 +*/ + + private class NoteData { + private long mTextDataId; + + private ContentValues mTextDataValues; + + private long mCallDataId; + + private ContentValues mCallDataValues; + + private static final String TAG = "NoteData"; + + public NoteData() { + mTextDataValues = new ContentValues(); + mCallDataValues = new ContentValues(); + mTextDataId = 0; + mCallDataId = 0; + } + + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("Text data id should larger than 0"); + } + mTextDataId = id; + } + + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("Call data id should larger than 0"); + } + mCallDataId = id; + } + + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * Check for safety + */ + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + ArrayList operationList = new ArrayList(); + ContentProviderOperation.Builder builder = null; + + if(mTextDataValues.size() > 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId); + if (mTextDataId == 0) { + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new text data fail with noteId" + noteId); + mTextDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); + } + + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); + if (mCallDataId == 0) { + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new call data fail with noteId" + noteId); + mCallDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); + } + + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } + } + return null; + } + } +} diff --git a/doc/蔡安南——精读代码/model/WorkingNote.java b/doc/蔡安南——精读代码/model/WorkingNote.java new file mode 100644 index 00000000..d0bc3a53 --- /dev/null +++ b/doc/蔡安南——精读代码/model/WorkingNote.java @@ -0,0 +1,381 @@ + +package net.micode.notes.model; + +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.tool.ResourceParser.NoteBgResources; + + +public class WorkingNote { + // Note for the working note + private Note mNote; + // Note Id + private long mNoteId; + // Note content + private String mContent; + // Note mode + private int mMode; + + private long mAlertDate; + + private long mModifiedDate; + + private int mBgColorId; + + private int mWidgetId; + + private int mWidgetType; + + 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, + DataColumns.CONTENT, + DataColumns.MIME_TYPE, + DataColumns.DATA1, + DataColumns.DATA2, + DataColumns.DATA3, + DataColumns.DATA4, + }; + + public static final String[] NOTE_PROJECTION = new String[] { + NoteColumns.PARENT_ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + NoteColumns.MODIFIED_DATE + }; + + private static final int DATA_ID_COLUMN = 0; + + private static final int DATA_CONTENT_COLUMN = 1; + + 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; +/* +这是一个Java类`Note`中的一个方法`loadNoteData`,它用于从数据库中加载笔记的数据。 + +具体来说,`loadNoteData`方法使用`ContentResolver.query`方法查询笔记的数据,并使用`DataColumns.NOTE_ID`作为查询条件。如果查询结果不为空,则该方法遍历所有结果行,并根据数据的MIME类型分别设置笔记的文本数据或通话数据。 + +如果数据的MIME类型为`DataConstants.NOTE`,则该方法获取数据的内容、模式和ID,并将其分别设置为笔记的文本数据、模式和文本数据的ID。 + +如果数据的MIME类型为`DataConstants.CALL_NOTE`,则该方法获取数据的ID,并将其设置为笔记的通话数据的ID。 + +如果数据的MIME类型不是笔记或通话数据,则该方法记录错误日志。 + +如果查询结果为空,则该方法抛出`IllegalArgumentException`异常。 + +需要注意的是,该类中使用了一些未定义的变量和方法,例如`Notes.CONTENT_DATA_URI`、`DataColumns.NOTE_ID`、`DataConstants.NOTE`、`DataConstants.CALL_NOTE`、`DATA_PROJECTION`、`DATA_MIME_TYPE_COLUMN`、`DATA_CONTENT_COLUMN`、`DATA_MODE_COLUMN`和`DATA_ID_COLUMN`等。因此,无法确定该类的完整实现和调用方式。 +*/ + // New note construct + private WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; + mModifiedDate = System.currentTimeMillis(); + mFolderId = folderId; + mNote = new Note(); + mNoteId = 0; + mIsDeleted = false; + mMode = 0; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + } + + // Existing note construct + private WorkingNote(Context context, long noteId, long folderId) { + mContext = context; + mNoteId = noteId; + mFolderId = folderId; + mIsDeleted = false; + mNote = new Note(); + loadNote(); + } + + private void loadNote() { + Cursor cursor = mContext.getContentResolver().query( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, + null, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); + mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); + mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); + mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); + mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + } + cursor.close(); + } else { + Log.e(TAG, "No note with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note with id " + mNoteId); + } + loadNoteData(); + } + +/* +这是一个Java类`Note`中的一个方法`loadNoteData`,它用于从数据库中加载笔记的数据。 + +具体来说,`loadNoteData`方法使用`ContentResolver.query`方法查询笔记的数据,并使用`DataColumns.NOTE_ID`作为查询条件。如果查询结果不为空,则该方法遍历所有结果行,并根据数据的MIME类型分别设置笔记的文本数据或通话数据。 + +如果数据的MIME类型为`DataConstants.NOTE`,则该方法获取数据的内容、模式和ID,并将其分别设置为笔记的文本数据、模式和文本数据的ID。 + +如果数据的MIME类型为`DataConstants.CALL_NOTE`,则该方法获取数据的ID,并将其设置为笔记的通话数据的ID。 + +如果数据的MIME类型不是笔记或通话数据,则该方法记录错误日志。 + +如果查询结果为空,则该方法抛出`IllegalArgumentException`异常。 + +*/ + private void loadNoteData() { + Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, + DataColumns.NOTE_ID + "=?", new String[] { + String.valueOf(mNoteId) + }, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + if (DataConstants.NOTE.equals(type)) { + mContent = cursor.getString(DATA_CONTENT_COLUMN); + mMode = cursor.getInt(DATA_MODE_COLUMN); + mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); + } else if (DataConstants.CALL_NOTE.equals(type)) { + mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); + } else { + Log.d(TAG, "Wrong note type with type:" + type); + } + } while (cursor.moveToNext()); + } + cursor.close(); + } else { + Log.e(TAG, "No data with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); + } + } + + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + note.setBgColorId(defaultBgColorId); + note.setWidgetId(widgetId); + note.setWidgetType(widgetType); + return note; + } + + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + public synchronized boolean saveNote() { + if (isWorthSaving()) { + if (!existInDatabase()) { + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + 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) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + public boolean existInDatabase() { + return mNoteId > 0; + } + + private boolean isWorthSaving() { + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; + } else { + return true; + } + } + + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + public void markDeleted(boolean mark) { + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + } + + public void setBgColorId(int id) { + if (id != mBgColorId) { + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + public void setCheckListMode(int mode) { + if (mMode != mode) { + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + public void setWidgetType(int type) { + if (type != mWidgetType) { + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + } + } + + public void setWidgetId(int id) { + if (id != mWidgetId) { + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + } + } + + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) { + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + public String getContent() { + return mContent; + } + + public long getAlertDate() { + return mAlertDate; + } + + public long getModifiedDate() { + return mModifiedDate; + } + + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + public int getBgColorId() { + return mBgColorId; + } + + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + public int getCheckListMode() { + return mMode; + } + + public long getNoteId() { + return mNoteId; + } + + public long getFolderId() { + return mFolderId; + } + + public int getWidgetId() { + return mWidgetId; + } + + public int getWidgetType() { + return mWidgetType; + } + + public interface NoteSettingChangedListener { + /** + * Called when the background color of current note has just changed + */ + void onBackgroundColorChanged(); + + /** + * Called when user set clock + */ + void onClockAlertChanged(long date, boolean set); + + /** + * Call when user create note from widget + */ + void onWidgetChanged(); + + /** + * Call when switch between check list mode and normal mode + * @param oldMode is previous mode before change + * @param newMode is new mode + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} diff --git a/doc/蔡安南——精读代码/res/.DS_Store b/doc/蔡安南——精读代码/res/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d90e65edb8c301371c135d6d4a98a87555a521e4 GIT binary patch literal 6148 zcmeHKy-EW?5S}$bLPUt2jd1n`%p06BwpyHECBzs>gu7gbB#6~Dc6N3?g%4rj8`xQE zC-?$>vpXbrUJ^~Ah|Ivww>Lk#vme>rED@Rduw5gn5K#$@u~>$hBJAgulO?gN0gWBw zj4r}XEjW#%elA)K%78NP*BIcvyG$cGp^%1@+rQP|vpyXkYHi6OFejDkTgjC&o}akkKEx<;zf6?LHpv`hQh6KCUkessG2yW8hSsejJ+ zQ9N1A_cF3;+eSe%>p!HU1?orig7w>sh3ZGfl==&FNfCwFTFWugzPjJV z*gL5q@6FEVGhZq{&j9Z$NNL5PYGptfPzJ^f@cH1OG5UguLwj^U*(U(72(uOR`7OaY zo}e$7ID`jcTq@9|8hK(EmkzrpalT;U(4~`+$A^)bjl58dogL$QHk^#_P_;6k3}hK7 zxX%jT|9i9F|Jfw{QU;WPf5m_)HiAYSOOm@aw>Z9QJ+vko3&$l6Z3>iJ$F{>)@j99n Y_&n|aeZj;bED-%8U};dL4E!nsAG|B6tpET3 literal 0 HcmV?d00001 diff --git a/doc/蔡安南——精读代码/res/values-zh-rCN/arrays.xml b/doc/蔡安南——精读代码/res/values-zh-rCN/arrays.xml new file mode 100644 index 00000000..07bd5463 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values-zh-rCN/arrays.xml @@ -0,0 +1,8 @@ + + + + + 短信 + 邮件 + + diff --git a/doc/蔡安南——精读代码/res/values-zh-rCN/strings.xml b/doc/蔡安南——精读代码/res/values-zh-rCN/strings.xml new file mode 100644 index 00000000..48ea2d35 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values-zh-rCN/strings.xml @@ -0,0 +1,112 @@ + + + + + 便签 + 便签2x2 + 便签4x4 + 没有关联内容,点击新建便签。 + 访客模式下,便签内容不可见 + ... + 新建便签 + 成功删除提醒 + 创建提醒 + 已过期 + yyyyMMdd + MM月dd日 kk:mm + 知道了 + 查看 + 呼叫电话 + 发送邮件 + 浏览网页 + 打开地图 + + 新建文件夹 + 导出文本 + 同步 + 取消同步 + 设置 + 搜索 + 删除 + 移动到文件夹 + 选中了 %d 项 + 没有选中项,操作无效 + 全选 + 取消全选 + 文字大小 + + 正常 + + 超大 + 进入清单模式 + 退出清单模式 + 查看文件夹 + 刪除文件夹 + 修改文件夹名称 + 文件夹 %1$s 已存在,请重新命名 + 分享 + 发送到桌面 + 提醒我 + 删除提醒 + 选择文件夹 + 上一级文件夹 + 已添加到桌面 + 删除 + 确认要删除所选的 %d 条便签吗? + 确认要删除该条便签吗? + 确认删除文件夹及所包含的便签吗? + 已将所选 %1$d 条便签移到 %2$s 文件夹 + + SD卡被占用,不能操作 + 导出文本时发生错误,请检查SD卡 + 要查看的便签不存在 + 不能为空便签设置闹钟提醒 + 不能将空便签发送到桌面 + 导出成功 + 导出失败 + 已将文本文件(%1$s)输出至SD卡(%2$s)目录 + + 同步便签... + 同步成功 + 同步失败 + 同步已取消 + 与%1$s同步成功 + 同步失败,请检查网络和帐号设置 + 同步失败,发生内部错误 + 同步已取消 + 登录%1$s... + 正在获取服务器便签列表... + 正在同步本地便签... + + 设置 + 同步账号 + 与google task同步便签记录 + 上次同步于 %1$s + 添加账号 + 更换账号 + 删除账号 + 取消 + 立即同步 + 取消同步 + 当前帐号 %1$s + 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复 + 同步便签 + 请选择google帐号,便签将与该帐号的google task内容同步。 + 正在同步中,不能修改同步帐号 + 同步帐号已设置为%1$s + 新建便签背景颜色随机 + 删除 + 通话便签 + 请输入名称 + 正在搜索便签 + 搜索便签 + 便签中的文字 + 便签 + 设置 + 取消 + + %1$s 条符合“%2$s”的搜索结果 + + + diff --git a/doc/蔡安南——精读代码/res/values-zh-rTW/arrays.xml b/doc/蔡安南——精读代码/res/values-zh-rTW/arrays.xml new file mode 100644 index 00000000..07bd5463 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values-zh-rTW/arrays.xml @@ -0,0 +1,8 @@ + + + + + 短信 + 邮件 + + diff --git a/doc/蔡安南——精读代码/res/values-zh-rTW/strings.xml b/doc/蔡安南——精读代码/res/values-zh-rTW/strings.xml new file mode 100644 index 00000000..72940e63 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values-zh-rTW/strings.xml @@ -0,0 +1,112 @@ + + + + + 便签 + 便签2x2 + 便签4x4 + 没有关联内容,点击新建便签。 + 访客模式下,便签内容不可见 + ... + 新建便签 + 成功删除提醒 + 创建提醒 + 已过期 + yyyyMMdd + MM月dd日 kk:mm + 知道了 + 查看 + 呼叫电话 + 发送邮件 + 浏览网页 + 打开地图 + + 新建文件夹 + 导出文本 + 同步 + 取消同步 + 设置 + 搜索 + 删除 + 移动到文件夹 + 选中了 %d 项 + 没有选中项,操作无效 + 全选 + 取消全选 + 文字大小 + + 正常 + + 超大 + 进入清单模式 + 退出清单模式 + 查看文件夹 + 刪除文件夹 + 修改文件夹名称 + 文件夹 %1$s 已存在,请重新命名 + 分享 + 发送到桌面 + 提醒我 + 删除提醒 + 选择文件夹 + 上一级文件夹 + 已添加到桌面 + 删除 + 确认要删除所选的 %d 条便签吗? + 确认要删除该条便签吗? + 确认删除文件夹及所包含的便签吗? + 已将所选 %1$d 条便签移到 %2$s 文件夹 + + SD卡被占用,不能操作 + 导出文本时发生错误,请检查SD卡 + 要查看的便签不存在 + 不能为空便签设置闹钟提醒 + 不能将空便签发送到桌面 + 导出成功 + 导出失败 + 已将文本文件(%1$s)输出至SD卡(%2$s)目录 + + 同步便签... + 同步成功 + 同步失败 + 同步已取消 + 与%1$s同步成功 + 同步失败,请检查网络和帐号设置 + 同步失败,发生内部错误 + 同步已取消 + 登录%1$s... + 正在获取服务器便签列表... + 正在同步本地便签... + + 设置 + 同步账号 + 与google task同步便签记录 + 上次同步于 %1$s + 添加账号 + 更换账号 + 删除账号 + 取消 + 立即同步 + 取消同步 + 当前帐号 %1$s + 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复 + 同步便签 + 请选择google帐号,便签将与该帐号的google task内容同步。 + 正在同步中,不能修改同步帐号 + 同步帐号已设置为%1$s + 新建便签背景颜色随机 + 删除 + 通话便签 + 请输入名称 + 正在搜索便签 + 搜索便签 + 便签中的文字 + 便签 + 设置 + 取消 + + %1$s 条符合“%2$s”的搜索结果 + + + diff --git a/doc/蔡安南——精读代码/res/values/arrays.xml b/doc/蔡安南——精读代码/res/values/arrays.xml new file mode 100644 index 00000000..3f6963fa --- /dev/null +++ b/doc/蔡安南——精读代码/res/values/arrays.xml @@ -0,0 +1,16 @@ + + + + + -%s + --%s + --%s + --%s + + + + + Messaging + Email + + diff --git a/doc/蔡安南——精读代码/res/values/colors.xml b/doc/蔡安南——精读代码/res/values/colors.xml new file mode 100644 index 00000000..91d8b8ca --- /dev/null +++ b/doc/蔡安南——精读代码/res/values/colors.xml @@ -0,0 +1,5 @@ + + + + #335b5b5b + diff --git a/doc/蔡安南——精读代码/res/values/dimens.xml b/doc/蔡安南——精读代码/res/values/dimens.xml new file mode 100644 index 00000000..b3b6b1f5 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values/dimens.xml @@ -0,0 +1,9 @@ + + + + 33sp + 26sp + 20sp + 17sp + 14sp + \ No newline at end of file diff --git a/doc/蔡安南——精读代码/res/values/strings.xml b/doc/蔡安南——精读代码/res/values/strings.xml new file mode 100644 index 00000000..ab056029 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values/strings.xml @@ -0,0 +1,135 @@ + + + + Notes + + + Notes 2x2 + Notes 4x4 + + + No associated note found, click to create associated note. + Privacy mode,can not see note content + + ... + + + Add note + Delete reminder successfully + Set reminder + Expired + yyyyMMdd + MMMd kk:mm + Got it + Take a look + Call + Send email + Browse web + Open map + + + /MIUI/notes/ + notes_%s.txt + + + (%d) + New Folder + Export text + Sync + Cancel syncing + Settings + Search + Delete + Move to folder + %d selected + Nothing selected, the operation is invalid + Select all + Deselect all + Font size + Small + Medium + Large + Super + Enter check list + Leave check list + View folder + Delete folder + Change folder name + The folder %1$s exist, please rename + Share + Send to home + Remind me + Delete reminder + Select folder + Parent folder + Note added to home + + + Confirm to delete folder and its notes? + Delete selected notes + Confirm to delete the selected %d notes? + Confirm to delete this note? + Have moved selected %1$d notes to %2$s folder + + + SD card busy, not available now + Export failed, please check SD card + The note is not exist + Sorry, can not set clock on empty note + Sorry, can not send and empty note to home + Export successful + Export fail + Export text file (%1$s) to SD (%2$s) directory + + + Syncing notes... + Sync is successful + Sync is failed + Sync is canceled + Sync is successful with account %1$s + Sync failed, please check network and account settings + Sync failed, internal error occurs + Sync is canceled + Logging into %1$s... + Getting remote note list... + Synchronize local notes with Google Task... + + + Settings + Sync account + Sync notes with google task + Last sync time %1$s + yyyy-MM-dd hh:mm:ss + Add account + Change sync account + Remove sync account + Cancel + Sync immediately + Cancel syncing + Current account %1$s + All sync related information will be deleted, which may result in duplicated items sometime + Sync notes + Please select a google account. Local notes will be synced with google task. + Cannot change the account because sync is in progress + %1$s has been set as the sync account + New note background color random + + Delete + Call notes + Input name + + + Searching Notes + Search notes + Text in your notes + Notes + set + cancel + + %1$s result for \"%2$s\" + + %1$s results for \"%2$s\" + + + diff --git a/doc/蔡安南——精读代码/res/values/styles.xml b/doc/蔡安南——精读代码/res/values/styles.xml new file mode 100644 index 00000000..eb803fa7 --- /dev/null +++ b/doc/蔡安南——精读代码/res/values/styles.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/蔡安南——精读代码/res/xml/preferences.xml b/doc/蔡安南——精读代码/res/xml/preferences.xml new file mode 100644 index 00000000..9940aedc --- /dev/null +++ b/doc/蔡安南——精读代码/res/xml/preferences.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/doc/蔡安南——精读代码/res/xml/searchable.xml b/doc/蔡安南——精读代码/res/xml/searchable.xml new file mode 100644 index 00000000..93a52de5 --- /dev/null +++ b/doc/蔡安南——精读代码/res/xml/searchable.xml @@ -0,0 +1,12 @@ + + + + android:hint="@string/search_hint" + android:searchMode="queryRewriteFromText" + + android:searchSuggestAuthority="notes" + android:searchSuggestIntentAction="android.intent.action.VIEW" + android:searchSettingsDescription="@string/search_setting_description" + android:includeInGlobalSearch="true" /> diff --git a/doc/蔡安南——精读代码/res/xml/widget_2x_info.xml b/doc/蔡安南——精读代码/res/xml/widget_2x_info.xml new file mode 100755 index 00000000..dc02caf5 --- /dev/null +++ b/doc/蔡安南——精读代码/res/xml/widget_2x_info.xml @@ -0,0 +1,11 @@ + + + + diff --git a/doc/蔡安南——精读代码/res/xml/widget_4x_info.xml b/doc/蔡安南——精读代码/res/xml/widget_4x_info.xml new file mode 100755 index 00000000..0bcd7265 --- /dev/null +++ b/doc/蔡安南——精读代码/res/xml/widget_4x_info.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/doc/蔡安南——精读代码/tool/BackupUtils.java b/doc/蔡安南——精读代码/tool/BackupUtils.java new file mode 100644 index 00000000..eea7d02c --- /dev/null +++ b/doc/蔡安南——精读代码/tool/BackupUtils.java @@ -0,0 +1,372 @@ +package net.micode.notes.tool; + +import android.content.Context; +import android.database.Cursor; +import android.os.Environment; +import android.text.TextUtils; +import android.text.format.DateFormat; +import android.util.Log; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; + +/* +这是一个Java类,名为`BackupUtils`,它包含一个静态方法`getInstance`,用于获取该类的单例实例。 + +该方法接受一个`Context`参数,并返回一个`BackupUtils`对象的实例。如果该类的单例实例已经存在,则直接返回该实例,否则创建一个新的实例并返回。 + +该类的作用是为了在应用程序中提供一种备份数据的方法。 +*/ + +public class BackupUtils { + private static final String TAG = "BackupUtils"; + // Singleton stuff + private static BackupUtils sInstance; + + public static synchronized BackupUtils getInstance(Context context) { + 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 + 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); + } + + private static boolean externalStorageAvailable() { + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + public int exportToText() { + return mTextExport.exportToText(); + } + + public String getExportedTextFileName() { + return mTextExport.mFileName; + } + + public String getExportedTextFileDir() { + return mTextExport.mFileDirectory; + } + +/* +这是一个Java类`TextExport`的静态内部类,其中定义了两个静态成员变量`NOTE_PROJECTION`和`DATA_PROJECTION`,它们分别是长度为4和长度为6的字符串数组。 + +`NOTE_PROJECTION`数组定义了用于查询笔记的列名。它包含笔记的ID、修改日期、片段和类型等信息。`DATA_PROJECTION`数组定义了用于查询数据的列名。它包含数据的内容、MIME类型和其他数据信息。 + +此外,该类还定义了4个静态常量`NOTE_COLUMN_ID`、`NOTE_COLUMN_MODIFIED_DATE`、`NOTE_COLUMN_SNIPPET`和`NOTE_COLUMN_TYPE`,它们分别表示`NOTE_PROJECTION`数组的索引位置。这些常量可能用于在查询结果中访问相应的列。 + +这个类用于导出文本数据,并将其保存到某个文件或数据库中。 +*/ + 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; + + public TextExport(Context context) { + TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + mContext = context; + mFileName = ""; + mFileDirectory = ""; + } + + private String getFormat(int id) { + return TEXT_FORMAT[id]; + } + + /** + * Export the folder identified by folder id to text + */ + + 这是一个Java类中的一个方法,名为`exportFolderToText`,它接受两个参数:一个字符串类型的`folderId`和一个`PrintStream`类型的`ps`。 + +/* +该方法的作用是将指定文件夹中的笔记导出到文本格式,并将结果输出到`PrintStream`对象中。它首先使用`ContentResolver`对象查询属于该文件夹的笔记,然后遍历查询结果,并为每个笔记输出最后修改日期和笔记内容。 + +具体来说,该方法使用`Notes.CONTENT_NOTE_URI`查询指定文件夹中的笔记,并使用`NOTE_PROJECTION`数组指定要查询的列。然后,它使用`NoteColumns.PARENT_ID`作为查询条件,该条件指定了笔记所属的文件夹。如果查询结果不为空,该方法遍历结果集并为每个笔记调用`exportNoteToText`方法,该方法将笔记的详细信息输出到`PrintStream`对象中。 +*/ + + private void exportFolderToText(String folderId, PrintStream ps) { + // Query notes belong to this folder + 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.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); + } while (notesCursor.moveToNext()); + } + notesCursor.close(); + } + } + + /** + * Export note identified by id to a print stream + */ + +/* +这是一个Java类中的一个方法,名为`exportNoteToText`,它接受两个参数:一个字符串类型的`noteId`和一个`PrintStream`类型的`ps`。 + +该方法的作用是将指定笔记导出到文本格式,并将结果输出到`PrintStream`对象中。它首先使用`ContentResolver`对象查询属于该笔记的数据,然后遍历查询结果,并为每个数据输出相应的内容。 + +具体来说,该方法使用`Notes.CONTENT_DATA_URI`查询指定笔记的数据,并使用`DATA_PROJECTION`数组指定要查询的列。然后,它使用`DataColumns.NOTE_ID`作为查询条件,该条件指定了数据所属的笔记。如果查询结果不为空,该方法遍历结果集并为每个数据输出相应的内容。 + +该方法支持两种类型的数据:一种是`DataConstants.CALL_NOTE`类型的数据,它包含电话号码、通话日期和通话附件位置等信息;另一种是`DataConstants.NOTE`类型的数据,它仅包含笔记内容。 +*/ + + 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) { + 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 + */ + public int exportToText() { + 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} + */ +/*这是一个Java类中的一个私有方法,名为`getExportToTextPrintStream`,它返回一个`PrintStream`对象。 + +该方法的作用是创建一个用于导出文本数据的文件,并返回一个`PrintStream`对象,以便将导出的数据输出到该文件中。 + +具体来说,该方法首先调用`generateFileMountedOnSDcard`方法创建一个文件对象,该方法使用`Context`对象、文件路径和文件名等参数生成一个文件对象,并将该文件保存在SD卡上。如果文件创建失败,则返回`null`。 + +然后,该方法使用`FileOutputStream`对象创建一个输出流,并将其传递给`PrintStream`对象。最后,该方法返回该`PrintStream`对象,以便将导出的数据输出到该文件中。 +*/ + 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); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } catch (NullPointerException e) { + e.printStackTrace(); + return null; + } + return ps; + } + } + + /** + * Generate the text file to store imported data + */ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); + sb.append(context.getString(filePathResId)); + File filedir = new File(sb.toString()); + 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(); + } + + return null; + } +} + + diff --git a/doc/蔡安南——精读代码/tool/DataUtils.java b/doc/蔡安南——精读代码/tool/DataUtils.java new file mode 100644 index 00000000..36f1dd3e --- /dev/null +++ b/doc/蔡安南——精读代码/tool/DataUtils.java @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.OperationApplicationException; +import android.database.Cursor; +import android.os.RemoteException; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; + +import java.util.ArrayList; +import java.util.HashSet; + + +/* +这是一个Java类`DataUtils`,它包含两个静态方法`batchDeleteNotes`和`moveNoteToFoler`。 + +`batchDeleteNotes`方法接受两个参数:一个`ContentResolver`对象和一个`HashSet`对象。该方法的作用是批量删除指定ID的笔记,并返回一个布尔值,指示删除操作是否成功。 + +具体来说,该方法首先检查输入参数`ids`是否为空或包含零个元素。如果是,则返回`true`。否则,该方法遍历`ids`集合,并创建一个`ContentProviderOperation`对象,用于删除指定ID的笔记。然后,该方法将该操作添加到`operationList`列表中,并使用`resolver.applyBatch`方法执行所有操作。如果操作成功,则返回`true`,否则返回`false`。 + +`moveNoteToFoler`方法接受三个参数:一个`ContentResolver`对象、一个`long`类型的`id`和两个`long`类型的`srcFolderId`和`desFolderId`。该方法的作用是将指定ID的笔记从一个文件夹移动到另一个文件夹。 + +具体来说,该方法创建一个`ContentValues`对象,用于指定笔记的新父文件夹ID和原始父文件夹ID。然后,该方法使用`resolver.update`方法更新指定ID的笔记,并将其移动到新的文件夹中。 +*/ + +public class DataUtils { + public static final String TAG = "DataUtils"; + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + if (ids.size() == 0) { + Log.d(TAG, "no id is in the hashset"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + if(id == Notes.ID_ROOT_FOLDER) { + Log.e(TAG, "Don't delete system folder root"); + continue; + } + ContentProviderOperation.Builder builder = ContentProviderOperation + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + operationList.add(builder.build()); + } + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); + values.put(NoteColumns.LOCAL_MODIFIED, 1); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); + } + + public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, + long folderId) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + return true; + } + + ArrayList operationList = new ArrayList(); + for (long id : ids) { + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + builder.withValue(NoteColumns.PARENT_ID, folderId); + builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); + operationList.add(builder.build()); + } + + try { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + if (results == null || results.length == 0 || results[0] == null) { + Log.d(TAG, "delete notes failed, ids:" + ids.toString()); + return false; + } + return true; + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + } + return false; + } + + /** + * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + */ + +/* +这是一个Java类`DataUtils`,它包含两个静态方法`getUserFolderCount`和`visibleInNoteDatabase`。 + +`getUserFolderCount`方法接受一个`ContentResolver`对象,用于查询用户创建的文件夹数量。该方法的作用是查询所有类型为`Notes.TYPE_FOLDER`且不属于回收站的笔记数量,并返回查询结果的数量。 + +具体来说,该方法使用`resolver.query`方法查询属于用户创建的文件夹的笔记数量,并使用`NoteColumns.TYPE`和`NoteColumns.PARENT_ID`作为查询条件。如果查询结果不为空,则该方法获取第一个结果行的第一个列的值,并将其作为文件夹数量返回。 + +`visibleInNoteDatabase`方法接受三个参数:一个`ContentResolver`对象、一个`long`类型的`noteId`和一个`int`类型的`type`。该方法的作用是检查指定ID的笔记是否可见,并返回一个布尔值。 + +具体来说,该方法使用`resolver.query`方法查询指定ID的笔记,并使用`NoteColumns.TYPE`和`NoteColumns.PARENT_ID`作为查询条件。如果查询结果不为空且结果行数大于0,则该方法返回`true`,否则返回`false`。 + +*/ + 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); + + int count = 0; + if(cursor != null) { + if(cursor.moveToFirst()) { + try { + count = cursor.getInt(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "get folder count failed:" + e.toString()); + } finally { + cursor.close(); + } + } + } + return count; + } + + 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); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + 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; + } + cursor.close(); + } + return exist; + } + + 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); + + HashSet set = null; + if (c != null) { + if (c.moveToFirst()) { + set = new HashSet(); + do { + try { + AppWidgetAttribute widget = new AppWidgetAttribute(); + widget.widgetId = c.getInt(0); + widget.widgetType = c.getInt(1); + set.add(widget); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, e.toString()); + } + } while (c.moveToNext()); + } + c.close(); + } + return set; + } + +/* +这是一个Java类`DataUtils`,它包含两个静态方法`getCallNumberByNoteId`和`getNoteIdByPhoneNumberAndCallDate`。 + +`getCallNumberByNoteId`方法接受两个参数:一个`ContentResolver`对象和一个`long`类型的`noteId`。该方法的作用是查询指定ID的笔记中的电话号码,并返回该电话号码的字符串表示形式。 + +具体来说,该方法使用`resolver.query`方法查询指定ID的笔记,并使用`CallNote.PHONE_NUMBER`作为查询的列名,以及`CallNote.NOTE_ID`和`CallNote.MIME_TYPE`作为查询条件。如果查询结果不为空,则该方法获取第一个结果行的电话号码,并将其作为字符串返回。 + +`getNoteIdByPhoneNumberAndCallDate`方法接受三个参数:一个`ContentResolver`对象、一个`String`类型的`phoneNumber`和一个`long`类型的`callDate`。该方法的作用是查询包含指定电话号码和通话日期的笔记,并返回该笔记的ID。 +*/ + 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); + + if (cursor != null && cursor.moveToFirst()) { + try { + return cursor.getString(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call number fails " + e.toString()); + } finally { + cursor.close(); + } + } + return ""; + } + + 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); + + if (cursor != null) { + if (cursor.moveToFirst()) { + try { + return cursor.getLong(0); + } catch (IndexOutOfBoundsException e) { + Log.e(TAG, "Get call note id fails " + e.toString()); + } + } + cursor.close(); + } + return 0; + } + + 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); + + if (cursor != null) { + String snippet = ""; + if (cursor.moveToFirst()) { + snippet = cursor.getString(0); + } + cursor.close(); + return snippet; + } + throw new IllegalArgumentException("Note is not found with id: " + noteId); + } + + 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); + } + } + return snippet; + } +} diff --git a/doc/蔡安南——精读代码/tool/GTaskStringUtils.java b/doc/蔡安南——精读代码/tool/GTaskStringUtils.java new file mode 100644 index 00000000..666b7290 --- /dev/null +++ b/doc/蔡安南——精读代码/tool/GTaskStringUtils.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +public class GTaskStringUtils { + + public final static String GTASK_JSON_ACTION_ID = "action_id"; + + public final static String GTASK_JSON_ACTION_LIST = "action_list"; + + public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + + public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; + + public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; + + public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; + + public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; + + public final static String GTASK_JSON_CREATOR_ID = "creator_id"; + + public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; + + public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; + + public final static String GTASK_JSON_COMPLETED = "completed"; + + public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; + + public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; + + public final static String GTASK_JSON_DELETED = "deleted"; + + public final static String GTASK_JSON_DEST_LIST = "dest_list"; + + public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; + + public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; + + public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; + + public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; + + public final static String GTASK_JSON_GET_DELETED = "get_deleted"; + + public final static String GTASK_JSON_ID = "id"; + + public final static String GTASK_JSON_INDEX = "index"; + + public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; + + public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; + + public final static String GTASK_JSON_LIST_ID = "list_id"; + + public final static String GTASK_JSON_LISTS = "lists"; + + public final static String GTASK_JSON_NAME = "name"; + + public final static String GTASK_JSON_NEW_ID = "new_id"; + + public final static String GTASK_JSON_NOTES = "notes"; + + public final static String GTASK_JSON_PARENT_ID = "parent_id"; + + public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; + + public final static String GTASK_JSON_RESULTS = "results"; + + public final static String GTASK_JSON_SOURCE_LIST = "source_list"; + + public final static String GTASK_JSON_TASKS = "tasks"; + + public final static String GTASK_JSON_TYPE = "type"; + + public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; + + public final static String GTASK_JSON_TYPE_TASK = "TASK"; + + public final static String GTASK_JSON_USER = "user"; + + public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + + public final static String FOLDER_DEFAULT = "Default"; + + public final static String FOLDER_CALL_NOTE = "Call_Note"; + + public final static String FOLDER_META = "METADATA"; + + public final static String META_HEAD_GTASK_ID = "meta_gid"; + + public final static String META_HEAD_NOTE = "meta_note"; + + public final static String META_HEAD_DATA = "meta_data"; + + public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; + +} diff --git a/doc/蔡安南——精读代码/tool/ResourceParser.java b/doc/蔡安南——精读代码/tool/ResourceParser.java new file mode 100644 index 00000000..1ad3ad60 --- /dev/null +++ b/doc/蔡安南——精读代码/tool/ResourceParser.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.tool; + +import android.content.Context; +import android.preference.PreferenceManager; + +import net.micode.notes.R; +import net.micode.notes.ui.NotesPreferenceActivity; + +public class ResourceParser { + + public static final int YELLOW = 0; + public static final int BLUE = 1; + public static final int WHITE = 2; + public static final int GREEN = 3; + public static final int RED = 4; + + public static final int BG_DEFAULT_COLOR = YELLOW; + + public static final int TEXT_SMALL = 0; + public static final int TEXT_MEDIUM = 1; + public static final int TEXT_LARGE = 2; + public static final int TEXT_SUPER = 3; + + public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + + public static class NoteBgResources { + private final static int [] BG_EDIT_RESOURCES = new int [] { + R.drawable.edit_yellow, + R.drawable.edit_blue, + R.drawable.edit_white, + R.drawable.edit_green, + R.drawable.edit_red + }; + + private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { + R.drawable.edit_title_yellow, + R.drawable.edit_title_blue, + R.drawable.edit_title_white, + R.drawable.edit_title_green, + R.drawable.edit_title_red + }; + + public static int getNoteBgResource(int id) { + return BG_EDIT_RESOURCES[id]; + } + + public static int getNoteTitleBgResource(int id) { + return BG_EDIT_TITLE_RESOURCES[id]; + } + } + + public static int getDefaultBgId(Context context) { + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( + NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); + } else { + return BG_DEFAULT_COLOR; + } + } + + public static class NoteItemBgResources { + private final static int [] BG_FIRST_RESOURCES = new int [] { + R.drawable.list_yellow_up, + R.drawable.list_blue_up, + R.drawable.list_white_up, + R.drawable.list_green_up, + R.drawable.list_red_up + }; + + private final static int [] BG_NORMAL_RESOURCES = new int [] { + R.drawable.list_yellow_middle, + R.drawable.list_blue_middle, + R.drawable.list_white_middle, + R.drawable.list_green_middle, + R.drawable.list_red_middle + }; + + private final static int [] BG_LAST_RESOURCES = new int [] { + R.drawable.list_yellow_down, + R.drawable.list_blue_down, + R.drawable.list_white_down, + R.drawable.list_green_down, + R.drawable.list_red_down, + }; + + private final static int [] BG_SINGLE_RESOURCES = new int [] { + R.drawable.list_yellow_single, + R.drawable.list_blue_single, + R.drawable.list_white_single, + R.drawable.list_green_single, + R.drawable.list_red_single + }; + + public static int getNoteBgFirstRes(int id) { + return BG_FIRST_RESOURCES[id]; + } + + public static int getNoteBgLastRes(int id) { + return BG_LAST_RESOURCES[id]; + } + + public static int getNoteBgSingleRes(int id) { + return BG_SINGLE_RESOURCES[id]; + } + + public static int getNoteBgNormalRes(int id) { + return BG_NORMAL_RESOURCES[id]; + } + + public static int getFolderBgRes() { + return R.drawable.list_folder; + } + } + + public static class WidgetBgResources { + private final static int [] BG_2X_RESOURCES = new int [] { + R.drawable.widget_2x_yellow, + R.drawable.widget_2x_blue, + R.drawable.widget_2x_white, + R.drawable.widget_2x_green, + R.drawable.widget_2x_red, + }; + + public static int getWidget2xBgResource(int id) { + return BG_2X_RESOURCES[id]; + } + + private final static int [] BG_4X_RESOURCES = new int [] { + R.drawable.widget_4x_yellow, + R.drawable.widget_4x_blue, + R.drawable.widget_4x_white, + R.drawable.widget_4x_green, + R.drawable.widget_4x_red + }; + + public static int getWidget4xBgResource(int id) { + return BG_4X_RESOURCES[id]; + } + } + + public static class TextAppearanceResources { + private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper + }; + + 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; + } + return TEXTAPPEARANCE_RESOURCES[id]; + } + + public static int getResourcesSize() { + return TEXTAPPEARANCE_RESOURCES.length; + } + } +} diff --git a/doc/蔡安南——精读代码/widget/NoteWidgetProvider.java b/doc/蔡安南——精读代码/widget/NoteWidgetProvider.java new file mode 100644 index 00000000..43e36036 --- /dev/null +++ b/doc/蔡安南——精读代码/widget/NoteWidgetProvider.java @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.util.Log; +import android.widget.RemoteViews; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.tool.ResourceParser; +import net.micode.notes.ui.NoteEditActivity; +import net.micode.notes.ui.NotesListActivity; + +public abstract class NoteWidgetProvider extends AppWidgetProvider { + public static final String [] PROJECTION = new String [] { + NoteColumns.ID, + NoteColumns.BG_COLOR_ID, + NoteColumns.SNIPPET + }; + + public static final int COLUMN_ID = 0; + public static final int COLUMN_BG_COLOR_ID = 1; + public static final int COLUMN_SNIPPET = 2; + + private static final String TAG = "NoteWidgetProvider"; + + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + for (int i = 0; i < appWidgetIds.length; i++) { + context.getContentResolver().update(Notes.CONTENT_NOTE_URI, + values, + NoteColumns.WIDGET_ID + "=?", + new String[] { String.valueOf(appWidgetIds[i])}); + } + } + +/* +这是一个Java类`NoteWidgetProvider`中的一个方法`update`,它用于更新小部件的内容和外观。 + +具体来说,`update`方法有两个重载版本:一个公共版本和一个私有版本。公共版本调用私有版本,并将`privacyMode`参数设置为`false`。 + +私有版本的`update`方法遍历所有小部件ID,并为每个小部件更新内容和外观。具体来说,该方法执行以下步骤: + +- 获取小部件的背景ID和内容片段。 +- 创建一个启动笔记编辑或查看活动的意图,并将小部件的ID和类型作为额外参数传递。 +- 如果数据库中存在与小部件ID相对应的笔记,则将意图的操作设置为`Intent.ACTION_VIEW`,并将笔记的ID作为额外参数传递。否则,将操作设置为`Intent.ACTION_INSERT_OR_EDIT`。 +- 根据小部件的背景ID和内容片段,创建一个`RemoteViews`对象,并设置小部件的背景图像和文本。 +- 为小部件的文本视图设置一个单击操作,该操作将启动上述意图。如果`privacyMode`为`true`,则文本视图将显示“正在访问模式”。 +- 使用`AppWidgetManager.updateAppWidget`方法更新小部件的内容和外观。 + +*/ + private Cursor getNoteWidgetInfo(Context context, int widgetId) { + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, + null); + } + + protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + update(context, appWidgetManager, appWidgetIds, false); + } + + private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, + boolean privacyMode) { + for (int i = 0; i < appWidgetIds.length; i++) { + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + int bgId = ResourceParser.getDefaultBgId(context); + String snippet = ""; + Intent intent = new Intent(context, NoteEditActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); + + Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); + if (c != null && c.moveToFirst()) { + if (c.getCount() > 1) { + Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); + c.close(); + return; + } + snippet = c.getString(COLUMN_SNIPPET); + bgId = c.getInt(COLUMN_BG_COLOR_ID); + intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); + intent.setAction(Intent.ACTION_VIEW); + } else { + snippet = context.getResources().getString(R.string.widget_havenot_content); + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); + } + + if (c != null) { + c.close(); + } + + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + /** + * Generate the pending intent to start host for the widget + */ + PendingIntent pendingIntent = null; + if (privacyMode) { + rv.setTextViewText(R.id.widget_text, + context.getString(R.string.widget_under_visit_mode)); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( + context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + } else { + rv.setTextViewText(R.id.widget_text, snippet); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, + PendingIntent.FLAG_UPDATE_CURRENT); + } + + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + } + } + + protected abstract int getBgResourceId(int bgId); + + protected abstract int getLayoutId(); + + protected abstract int getWidgetType(); +} diff --git a/doc/蔡安南——精读代码/widget/NoteWidgetProvider_2x.java b/doc/蔡安南——精读代码/widget/NoteWidgetProvider_2x.java new file mode 100644 index 00000000..4c8dbee0 --- /dev/null +++ b/doc/蔡安南——精读代码/widget/NoteWidgetProvider_2x.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + +/* +这是一个Java类`NoteWidgetProvider_2x`,它继承自`NoteWidgetProvider`类。 + +`NoteWidgetProvider_2x`类覆盖了`NoteWidgetProvider`类的三个方法:`onUpdate`、`getLayoutId`和`getBgResourceId`。 + +`onUpdate`方法调用了`NoteWidgetProvider`类的`update`方法,并传递了相同的参数。 + +`getLayoutId`方法返回小部件布局的资源ID,该布局用于在小部件上显示笔记的内容。 + +`getBgResourceId`方法返回小部件背景的资源ID,该背景用于在小部件上显示笔记的背景。 + +`getWidgetType`方法返回小部件的类型,该类型为`Notes.TYPE_WIDGET_2X`,表示这是一个2x2大小的小部件。 +*/ + +public class NoteWidgetProvider_2x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + @Override + protected int getLayoutId() { + return R.layout.widget_2x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_2X; + } +} diff --git a/doc/蔡安南——精读代码/widget/NoteWidgetProvider_4x.java b/doc/蔡安南——精读代码/widget/NoteWidgetProvider_4x.java new file mode 100644 index 00000000..4e2f8641 --- /dev/null +++ b/doc/蔡安南——精读代码/widget/NoteWidgetProvider_4x.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.widget; + +import android.appwidget.AppWidgetManager; +import android.content.Context; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.ResourceParser; + +/* +这是一个Java类`NoteWidgetProvider_2x`,它继承自`NoteWidgetProvider`类。 + +`NoteWidgetProvider_2x`类覆盖了`NoteWidgetProvider`类的三个方法:`onUpdate`、`getLayoutId`和`getBgResourceId`。 + +`onUpdate`方法调用了`NoteWidgetProvider`类的`update`方法,并传递了相同的参数。 + +`getLayoutId`方法返回小部件布局的资源ID,该布局用于在小部件上显示笔记的内容。 + +`getBgResourceId`方法返回小部件背景的资源ID,该背景用于在小部件上显示笔记的背景。 + +`getWidgetType`方法返回小部件的类型,该类型为`Notes.TYPE_WIDGET_2X`,表示这是一个2x2大小的小部件。 +*/ + +public class NoteWidgetProvider_4x extends NoteWidgetProvider { + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + protected int getLayoutId() { + return R.layout.widget_4x; + } + + @Override + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); + } + + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_4X; + } +} diff --git a/model/.DS_Store b/model/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8b8feb3021ef49385a53a30114e1badcb0135f71 GIT binary patch literal 6148 zcmeHKy-EZz5S}>~S+Kd%M#u{&>;nk7bM4e-(fT;=(Bh80#(tm6-e>S_#BYB5SxjN0 zh|ECpO)@{pey~Y~hz@05p9~ed-3^K5g0U{0 literal 0 HcmV?d00001 diff --git a/model/CAN-UML图/分析类图.png b/model/CAN-UML图/分析类图.png new file mode 100644 index 0000000000000000000000000000000000000000..198f7a75dbf91eb0284fea45b7f0d88703e005ec GIT binary patch literal 59275 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

-d!I%dLcVFxeQ7 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 z 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 G3;$mR(y`kB literal 0 HcmV?d00001 diff --git a/model/CAN-UML图/分析类图.puml b/model/CAN-UML图/分析类图.puml new file mode 100644 index 00000000..24506176 --- /dev/null +++ b/model/CAN-UML图/分析类图.puml @@ -0,0 +1,59 @@ +@startuml + +class 小米便签控制 { + -便签列表: 列表<便签> + -待做事项: 列表<待做事项> + +创建便签(): void + +添加图片到便签(): void + +保存便签(): void + +呈现便签(): void + +呈现待做事项(): void + +阅读待做事项(): void + +标记完成(): void +} + +class 小米便签边界 { + +展示(): void + +创建便签(): void + +添加图片到便签(): void + +保存便签(): void + +呈现便签(): void + +呈现待做事项(): void + +阅读待做事项(): void + +标记完成(): void +} + +class 便签 { + -标题: 字符串 + -内容: 字符串 + -图片列表: 列表<图片> + +设置标题(标题: 字符串): void + +设置内容(内容: 字符串): void + +add图片(图片: 图片): void + +获取标题(): 字符串 + +获取内容(): 字符串 + +获取图片列表(): 列表<图片> +} + +class 图片 { + -路径: 字符串 + +获取路径(): 字符串 +} + +class 待做事项 { + -标题: 字符串 + -描述: 字符串 + -状态: 字符串 + +设置标题(标题: 字符串): void + +设置描述(描述: 字符串): void + +获取状态(): 字符串 + +设置状态(状态: 字符串): void +} + +小米便签控制 --> 便签 +便签 --> 图片 +小米便签控制 --> 待做事项 + +小米便签边界 --> 小米便签控制 + +@enduml diff --git a/model/CAN-UML图/泛读用例图.puml b/model/CAN-UML图/泛读用例图.puml new file mode 100644 index 00000000..e05f94fb --- /dev/null +++ b/model/CAN-UML图/泛读用例图.puml @@ -0,0 +1,22 @@ +@startuml +left to right direction + +actor User + +rectangle "便签功能" { + User -> (创建新便签) + User -> (删除便签) + User -> (移动便签) + User -> (修改保存便签内容) + User -> (获取便签ID) + User -> (标记便签颜色) + User ---> (设置便签的提醒时间和日期) + User -> (监听笔记设置的更改) + User -> (新建文件夹) + User -> (导出便签内容) + User -> (同步便签信息) + User ---> (检索便签内容) + User --> (设置提醒时间) +} + +@enduml \ No newline at end of file diff --git a/model/CAN-UML图/用例图.png b/model/CAN-UML图/用例图.png new file mode 100644 index 0000000000000000000000000000000000000000..373c8931b58cb9ccbf69c1e2f9a4c24fea1d21c7 GIT binary patch literal 45288 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 RBBhCfk1%LH|42Zz>>si8$!7on literal 0 HcmV?d00001 diff --git a/model/CAN-UML图/用例图.puml b/model/CAN-UML图/用例图.puml new file mode 100644 index 00000000..70e53364 --- /dev/null +++ b/model/CAN-UML图/用例图.puml @@ -0,0 +1,33 @@ +@startuml + +left to right direction + +actor User + +rectangle 小米便签 { + usecase CreateNote as "创建便签" + usecase AddImageToNote as "添加图片" + usecase SaveNote as "保存便签" + usecase DisplayNote as "显示便签" + usecase DisplayToDoList as "显示待处理事件列表" + usecase ReadToDoItem as "朗读待处理事件" + usecase MarkToDoItemAsDone as "标记待处理事件为已完成" +} + +User ---> CreateNote +User --> AddImageToNote +User --> SaveNote +User -> DisplayNote +User --> DisplayToDoList +User --> ReadToDoItem +User ---> MarkToDoItemAsDone + +CreateNote --> 小米便签 +AddImageToNote --> 小米便签 +SaveNote --> 小米便签 +DisplayNote --> 小米便签 +DisplayToDoList --> 小米便签 +ReadToDoItem --> 小米便签 +MarkToDoItemAsDone --> 小米便签 + +@enduml diff --git a/model/CAN-UML图/顺序图.png b/model/CAN-UML图/顺序图.png new file mode 100644 index 0000000000000000000000000000000000000000..67a35f78d66cd298938a79d7ab3080cb1726a958 GIT binary patch literal 51506 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 zS64My 小米便签: 打开小米便签 + +activate 小米便签 + +用户 -> 小米便签: 创建新的便签 + +小米便签 -> 小米便签: 显示空白便签 + +用户 -> 小米便签: 添加图片 + +小米便签 -> 小米便签: 打开图片库 + +activate 图库 + +小米便签 -> 图库: 选择图片 + +图库 --> 小米便签: 返回所选图片 + +deactivate 图库 + +小米便签 -> 小米便签: 显示添加的图片 + +用户 -> 小米便签: 保存便签 + +小米便签 -> 小米便签: 保存便签内容 + +用户 -> 小米便签: 关闭便签 + +deactivate 小米便签 + +用户 -> 小米便签: 打开待处理事件 + +activate 小米便签 + +小米便签 -> 小米便签: 显示待处理事件列表 + +用户 -> 小米便签: 选择一个待处理事件 + +小米便签 -> 小米便签: 显示待处理事件的详细信息 + +小米便签 -> 小米便签: 朗读待处理事件 + +用户 -> 小米便签: 标记待处理事件为已完成 + +小米便签 -> 小米便签: 更新待处理事件的状态 + +用户 -> 小米便签: 关闭待处理事件 + +deactivate 小米便签 + +@enduml diff --git a/model/CAN-UML图/顺序图2.jpeg b/model/CAN-UML图/顺序图2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4c7da5e16e47b3b417b23139d2a1a4f2cdb67370 GIT binary patch literal 45918 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 JLHYFV{{Us9jEMjM literal 0 HcmV?d00001 diff --git a/model/CAN-UML图/顺序图3.jpeg b/model/CAN-UML图/顺序图3.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..0cd2575fd81fa82e464a197c018f527e6ee9a0dc GIT binary patch literal 56963 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