From 00cbc30449b895377941833cafaec3367c3ae6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cxxx=E2=80=9D?= <651952673@qq.com> Date: Thu, 21 Dec 2023 00:35:55 +0800 Subject: [PATCH] =?UTF-8?q?Signed-off-by:=20=E2=80=9Czsy=E2=80=9D=20<65195?= =?UTF-8?q?2673@qq.com>=2012-21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/net/micode/notes/model/Note.java | 84 ++++++------ .../net/micode/notes/model/WorkingNote.java | 123 ++++++++++++----- .../net/micode/notes/tool/BackupUtils.java | 72 +++++----- .../src/net/micode/notes/tool/DataUtils.java | 97 ++++++++------ .../micode/notes/tool/GTaskStringUtils.java | 11 +- .../net/micode/notes/tool/ResourceParser.java | 125 +++++++++++------- 6 files changed, 312 insertions(+), 200 deletions(-) diff --git a/src/Notes-master/src/net/micode/notes/model/Note.java b/src/Notes-master/src/net/micode/notes/model/Note.java index 6706cf6..63fcbbf 100644 --- a/src/Notes-master/src/net/micode/notes/model/Note.java +++ b/src/Notes-master/src/net/micode/notes/model/Note.java @@ -13,19 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//单个便签项,提供了一个笔记模块的功能。包括管理和操作笔记的数据、插入、更新和查询笔记数据,并将数据存储到ContentResolver中 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 android.content.ContentProviderOperation;//用于描述对内容提供者的单个操作,例如插入、更新或删除数据。 +import android.content.ContentProviderResult;// 用于存储一组内容提供者操作的结果。 +import android.content.ContentUris;//包含用于处理内容URI的实用方法,例如从URI中提取ID等。 +import android.content.ContentValues;// 用于存储键值对形式的数据,通常用于向内容提供者插入新数据或更新现有数据。 +import android.content.Context;//用于访问应用程序全局的上下文信息,例如应用程序资源和类加载器等。 +import android.content.OperationApplicationException;//当应用多个操作到内容提供者时,可能会抛出此异常,表示其中一个操作失败。 +import android.net.Uri;//代表一个统一资源标识符,用于定位数据的位置,常用于访问内容提供者中的数据。 +import android.os.RemoteException;//可能会在跨进程通信时抛出,表示远程过程调用发生错误。 +import android.util.Log;//用于在Android系统中记录日志信息,帮助开发者调试应用程序。 +//上面为标准库,下面为在notes.data包里的用法 +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; @@ -35,8 +35,8 @@ import java.util.ArrayList; public class Note { - private ContentValues mNoteDiffValues; - private NoteData mNoteData; + private ContentValues mNoteDiffValues;// + private NoteData mNoteData;//note数据 private static final String TAG = "Note"; /** * Create a new note id for adding a new note to databases @@ -49,8 +49,10 @@ public class Note { 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); + values.put(NoteColumns.PARENT_ID, folderId);//将数据写入数据库表格 Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + //ContentResolver()主要是实现外部应用对ContentProvider中的数据 + //进行添加、删除、修改和查询操作 long noteId = 0; try { @@ -58,7 +60,7 @@ public class Note { } catch (NumberFormatException e) { Log.e(TAG, "Get note id error :" + e.toString()); noteId = 0; - } + }//try-catch异常处理 if (noteId == -1) { throw new IllegalStateException("Wrong note id:" + noteId); } @@ -68,40 +70,41 @@ public class Note { 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); } - + //设置文本数据的ID public long getTextDataId() { return mNoteData.mTextDataId; } + //得到文本数据的ID public void setCallDataId(long id) { mNoteData.setCallDataId(id); } - + //设置电话号码数据的ID public void setCallData(String key, String value) { mNoteData.setCallData(key, value); } - + //得到电话号码数据的ID public boolean isLocalModified() { return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - } + }//判断是否是本地修改 public boolean syncNote(Context context, long noteId) { - if (noteId <= 0) { + if (noteId <= 0) {//id<=0报错 throw new IllegalArgumentException("Wrong note id:" + noteId); } @@ -128,32 +131,32 @@ public class Note { } return true; - } + }//判断是否同步 - private class NoteData { + private class NoteData {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据 private long mTextDataId; - private ContentValues mTextDataValues; + private ContentValues mTextDataValues;//文本数据 private long mCallDataId; - private ContentValues mCallDataValues; + private ContentValues mCallDataValues;//电话号码数据 private static final String TAG = "NoteData"; - public NoteData() { + public NoteData() {//初始化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) { + if(id <= 0) {//id<=0报错 throw new IllegalArgumentException("Text data id should larger than 0"); } mTextDataId = id; @@ -178,18 +181,19 @@ public class Note { mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + //下面函数的作用是将新的数据通过Uri的操作存储到数据库 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; + ContentProviderOperation.Builder builder = null;//数据库的操作列表 - if(mTextDataValues.size() > 0) { + if(mTextDataValues.size() > 0) {//有文本数据 mTextDataValues.put(DataColumns.NOTE_ID, noteId); if (mTextDataId == 0) { mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); @@ -209,9 +213,9 @@ public class Note { operationList.add(builder.build()); } mTextDataValues.clear(); - } + }//把文本数据存入DataColumns - if(mCallDataValues.size() > 0) { + if(mCallDataValues.size() > 0) {//有电话号码 mCallDataValues.put(DataColumns.NOTE_ID, noteId); if (mCallDataId == 0) { mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); @@ -231,9 +235,9 @@ public class Note { operationList.add(builder.build()); } mCallDataValues.clear(); - } + }//把电话号码数据存入DataColumns - if (operationList.size() > 0) { + if (operationList.size() > 0) {//总长大于0 try { ContentProviderResult[] results = context.getContentResolver().applyBatch( Notes.AUTHORITY, operationList); @@ -248,6 +252,6 @@ public class Note { } } return null; - } + }//存储过程中的异常处理 } } diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index be081e4..c2c1b9e 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -16,12 +16,12 @@ 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 android.appwidget.AppWidgetManager;//用于管理Android应用中的小部件。 +import android.content.ContentUris;//提供了用于处理内容URI的实用方法,用于获取数据的URI。 +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; @@ -31,7 +31,7 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.Notes.TextNote; import net.micode.notes.tool.ResourceParser.NoteBgResources; - +//定义WorkingNote public class WorkingNote { // Note for the working note private Note mNote; @@ -41,27 +41,30 @@ public class WorkingNote { private String mContent; // Note mode private int mMode; - +//模式值,初始化为0 private long mAlertDate; - +//警戒值 private long mModifiedDate; - +//修改值 private int mBgColorId; - +//颜色 private int mWidgetId; - +//宽 ID private int mWidgetType; - +//宽大小 private long mFolderId; - +//文件夹ID private Context mContext; - +//内容 private static final String TAG = "WorkingNote"; - +//标签 private boolean mIsDeleted; - +//删除时改变 private NoteSettingChangedListener mNoteSettingStatusListener; +//判断设置是否改变,默认为0 + + // 声明 DATA_PROJECTION字符串数组 public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, DataColumns.CONTENT, @@ -72,6 +75,9 @@ public class WorkingNote { DataColumns.DATA4, }; + + + // 声明 NOTE_PROJECTION字符串数组 public static final String[] NOTE_PROJECTION = new String[] { NoteColumns.PARENT_ID, NoteColumns.ALERTED_DATE, @@ -101,6 +107,8 @@ public class WorkingNote { private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + +// WorkingNote的构造函数 // New note construct private WorkingNote(Context context, long folderId) { mContext = context; @@ -124,11 +132,15 @@ public class WorkingNote { loadNote(); } + // 加载Note + // 通过数据库调用query函数找到第一个条目 + 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); @@ -139,6 +151,7 @@ public class WorkingNote { 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); @@ -146,14 +159,18 @@ public class WorkingNote { loadNoteData(); } + + // 加载NoteData private void loadNoteData() { Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { String.valueOf(mNoteId) }, null); - +//根据ID加载note if (cursor != null) { + // 查到信息不为空 if (cursor.moveToFirst()) { + // 查看第一项是否存在 do { String type = cursor.getString(DATA_MIME_TYPE_COLUMN); if (DataConstants.NOTE.equals(type)) { @@ -166,37 +183,45 @@ public class WorkingNote { 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); } } + // 创建空的Note + // 传参:context,文件夹id,widget,背景颜色 public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, int widgetType, int defaultBgColorId) { WorkingNote note = new WorkingNote(context, folderId); + // 设定颜色,widget note.setBgColorId(defaultBgColorId); note.setWidgetId(widgetId); note.setWidgetType(widgetType); return note; } - +//根据id加载note public static WorkingNote load(Context context, long id) { return new WorkingNote(context, id, 0); } - +//保存Note public synchronized boolean saveNote() { if (isWorthSaving()) { + //是否值得保存 if (!existInDatabase()) { + //是否存在数据库中 if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + //ID为0,报错 Log.e(TAG, "Create new note fail with id:" + mNoteId); return false; } } - mNote.syncNote(mContext, mNoteId); + mNote.syncNote(mContext, mNoteId);//保存 /** * Update widget content if there exist any widget of this note @@ -204,7 +229,7 @@ public class WorkingNote { if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); + mNoteSettingStatusListener.onWidgetChanged();// 状态变为已保存 } return true; } else { @@ -212,11 +237,14 @@ public class WorkingNote { } } + //判断数据库是否存在该便签 public boolean existInDatabase() { return mNoteId > 0; } + //是否值得保存 private boolean isWorthSaving() { + // 被删除,或(不在数据库中 内容为空),或 本地已保存过 if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) || (existInDatabase() && !mNote.isLocalModified())) { return false; @@ -225,9 +253,12 @@ public class WorkingNote { } } + // 设置mNoteSettingStatusListener public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { mNoteSettingStatusListener = l; } + // 设置AlertDate + // 若 mAlertDate与data不同,则更改mAlertDate并设定NoteValue public void setAlertDate(long date, boolean set) { if (date != mAlertDate) { @@ -239,16 +270,20 @@ public class WorkingNote { } } + // 设定删除标记 public void markDeleted(boolean mark) { + //设定标记 mIsDeleted = mark; if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onWidgetChanged(); + // 调用mNoteSettingStatusListener的 onWidgetChanged方法 } } + // 设定背景颜色 public void setBgColorId(int id) { - if (id != mBgColorId) { + if (id != mBgColorId) {//设定条件 id != mBgColorId mBgColorId = id; if (mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onBackgroundColorChanged(); @@ -257,7 +292,10 @@ public class WorkingNote { } } + // 设定检查列表模式 + // 参数:mode public void setCheckListMode(int mode) { + //设定条件 mMode != mode,才改变 if (mMode != mode) { if (mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); @@ -266,82 +304,107 @@ public class WorkingNote { mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); } } - + // 设定WidgetType + // 参数:type public void setWidgetType(int type) { - if (type != mWidgetType) { + if (type != mWidgetType) {//设定条件 type != mWidgetType mWidgetType = type; mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + // 调用Note的setNoteValue方法更改WidgetType } } - + // 设定WidgetId + // 参数:id public void setWidgetId(int id) { if (id != mWidgetId) { mWidgetId = id; mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + // 调用Note的setNoteValue方法更改WidgetId + } } - + // 设定WorkingText + // 参数:更改的text public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) { + if (!TextUtils.equals(mContent, text)) {//设定条件 mContent, text内容不同 mContent = text; mNote.setTextData(DataColumns.CONTENT, mContent); + + // 调用Note的setTextData方法更改WorkingText + } } - + // 转变mNote的CallData及CallNote信息 + // 参数:String phoneNumber, long callDate 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); } + // 获取Content public String getContent() { return mContent; } + // 获取AlertDate public long getAlertDate() { return mAlertDate; } + // 获取ModifiedDate public long getModifiedDate() { return mModifiedDate; } + // 获取背景颜色来源id public int getBgColorResId() { return NoteBgResources.getNoteBgResource(mBgColorId); } + // 获取背景颜色id public int getBgColorId() { return mBgColorId; } + // 获取标题背景颜色id public int getTitleBgResId() { return NoteBgResources.getNoteTitleBgResource(mBgColorId); } + // 获取CheckListMode public int getCheckListMode() { return mMode; } + // 获取便签id public long getNoteId() { return mNoteId; } + + // 获取文件夹id public long getFolderId() { return mFolderId; } + // 获取WidgetId public int getWidgetId() { return mWidgetId; } + // 获取WidgetType public int getWidgetType() { return mWidgetType; } - + // 创建接口 NoteSettingChangedListener,便签更新监视 + // 为NoteEditActivity提供接口 + // 提供函数有 public interface NoteSettingChangedListener { /** * Called when the background color of current note has just changed diff --git a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java index 39f6ec4..5a7c0f4 100644 --- a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java @@ -16,12 +16,12 @@ 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 android.content.Context;//导入 Android 应用程序上下文(Context)类。 +import android.database.Cursor;//导入 Android 数据库查询结果集(Cursor)类。 +import android.os.Environment;//导入 Android 系统环境(Environment)类。 +import android.text.TextUtils;//导入 Android 文本工具(TextUtils)类。 +import android.text.format.DateFormat;//导入 Android 日期时间格式化(DateFormat)类。 +import android.util.Log;//导入 Android 日志(Log)类。 import net.micode.notes.R; import net.micode.notes.data.Notes; @@ -29,13 +29,13 @@ 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; - +import java.io.File;//导入 Java 的文件(File)类,用于表示文件和目录的抽象路径名。 +import java.io.FileNotFoundException;//导入 Java 的文件找不到异常(FileNotFoundException)类,用于处理文件未找到的异常情况。 +import java.io.FileOutputStream;//导入 Java 的文件输出流(FileOutputStream)类,用于将数据写入文件。 +import java.io.IOException;//导入 Java 的输入输出异常(IOException)类,用于处理输入输出操作中可能发生的异常情况。 +import java.io.PrintStream;//导入 Java 的打印流(PrintStream)类,用于向标准输出流打印输出。 +//备份的处理 public class BackupUtils { private static final String TAG = "BackupUtils"; // Singleton stuff @@ -43,6 +43,7 @@ public class BackupUtils { public static synchronized BackupUtils getInstance(Context context) { if (sInstance == null) { + //如果当前备份不存在,则新声明一个 sInstance = new BackupUtils(context); } return sInstance; @@ -52,27 +53,30 @@ public class BackupUtils { * Following states are signs to represents backup or restore * status */ - // Currently, the sdcard is not mounted + // Currently, the sdcard is not mounted SD卡没有被装入手机 public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist + // 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 + // 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 + // Some run-time exception which causes restore or backup fails超时异常 public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success + // 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() { + //外部存储功能是否可用 + private static boolean externalStorageAvailable() {//外部存储功能是否可用 return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } + // public int exportToText() { return mTextExport.exportToText(); } @@ -125,6 +129,7 @@ public class BackupUtils { private String mFileName; private String mFileDirectory; + //导出文本功能,将其作为字符串形式导出 public TextExport(Context context) { TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); mContext = context; @@ -140,22 +145,22 @@ public class BackupUtils { * Export the folder identified by folder id to text */ private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder + // Query notes belong to this folder通过查询parent id是文件夹id的note来选出制定ID文件夹下的Note Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { folderId }, null); - if (notesCursor != null) { + if (notesCursor != null) {//有内容 if (notesCursor.moveToFirst()) { do { - // Print note's last modified date + // Print note's last modified date ps里面保存有这份note的日期 ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( mContext.getString(R.string.format_datetime_mdhm), notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); // Query data belong to this note String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); + exportNoteToText(noteId, ps); //将文件导出到text } while (notesCursor.moveToNext()); } notesCursor.close(); @@ -171,17 +176,17 @@ public class BackupUtils { noteId }, null); - if (dataCursor != null) { + if (dataCursor != null) { //利用光标来扫描内容,区别为callnote和note两种,靠ps.printline输出 if (dataCursor.moveToFirst()) { do { String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); - if (DataConstants.CALL_NOTE.equals(mimeType)) { + 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)) { + if (!TextUtils.isEmpty(phoneNumber)) {//判断是否为空字符 ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), phoneNumber)); } @@ -218,7 +223,7 @@ public class BackupUtils { /** * Note will be exported as text which is user readable */ - public int exportToText() { + public int exportToText() {//总函数,调用上面的exportFolder和exportNote if (!externalStorageAvailable()) { Log.d(TAG, "Media was not mounted"); return STATE_SD_CARD_UNMOUONTED; @@ -229,7 +234,7 @@ public class BackupUtils { Log.e(TAG, "get print stream error"); return STATE_SYSTEM_ERROR; } - // First export folder and its notes + // First export folder and its notes 导出文件夹,就是导出里面包含的便签 Cursor folderCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -257,7 +262,7 @@ public class BackupUtils { folderCursor.close(); } - // Export notes in root's folder + // Export notes in root's folder 将根目录里的便签导出(由于不属于任何文件夹,因此无法通过文件夹导出来实现这一部分便签的导出) Cursor noteCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -287,7 +292,7 @@ public class BackupUtils { */ private PrintStream getExportToTextPrintStream() { File file = generateFileMountedOnSDcard(mContext, R.string.file_path, - R.string.file_name_txt_format); + R.string.file_name_txt_format);//导出后的文件路径 if (file == null) { Log.e(TAG, "create file to exported failed"); return null; @@ -314,16 +319,16 @@ public class BackupUtils { */ 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(Environment.getExternalStorageDirectory()); //外部(SD卡)的存储路径 + sb.append(context.getString(filePathResId));//文件的存储路径 + File filedir = new File(sb.toString());//filedir应该就是用来存储路径信息 sb.append(context.getString( fileNameFormatResId, DateFormat.format(context.getString(R.string.format_date_ymd), System.currentTimeMillis()))); File file = new File(sb.toString()); - try { + try { //如果这些文件不存在,则新建 if (!filedir.exists()) { filedir.mkdir(); } @@ -337,6 +342,7 @@ public class BackupUtils { e.printStackTrace(); } +// try catch 异常处理 return null; } } diff --git a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java index 2a14982..33e5f26 100644 --- a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java @@ -16,15 +16,15 @@ 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 android.content.ContentProviderOperation;//导入 Android 内容提供者操作(ContentProviderOperation)类,用于操作内容提供者中的数据。 +import android.content.ContentProviderResult;//导入 Android 内容提供者结果(ContentProviderResult)类,用于存储内容提供者操作的结果。 +import android.content.ContentResolver;//导入 Android 内容解析器(ContentResolver)类,用于访问应用程序中的各种内容提供者。 +import android.content.ContentUris;//导入 Android 内容 URI(ContentUris)类,用于处理内容提供者的 URI。 +import android.content.ContentValues;//导入 Android 内容值(ContentValues)类,用于封装要插入或更新到内容提供者中的数据。 +import android.content.OperationApplicationException;//导入 Android 操作应用程序异常(OperationApplicationException)类,用于处理内容提供者操作时可能出现的异常情况。 +import android.database.Cursor;//导入 Android 数据库查询结果集(Cursor)类,用于表示数据库查询结果集。 +import android.os.RemoteException;//导入 Android 远程操作异常(RemoteException)类,用于处理远程操作时可能出现的异常情况。 +import android.util.Log;//导入 Android 日志(Log)类,用于记录调试信息。 import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.CallNote; @@ -37,6 +37,8 @@ import java.util.HashSet; public class DataUtils { public static final String TAG = "DataUtils"; + + //删除多个note public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { if (ids == null) { Log.d(TAG, "the ids is null"); @@ -47,19 +49,20 @@ public class DataUtils { return true; } - ArrayList operationList = new ArrayList(); + 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)); + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //用newDelete实现删除功能 operationList.add(builder.build()); } try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 + //数据库事务,数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行 + if (results == null || results.length == 0 || results[0] == null) {//若为空则没必要删 Log.d(TAG, "delete notes failed, ids:" + ids.toString()); return false; } @@ -72,14 +75,16 @@ public class DataUtils { 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); + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);//对需要移动的便签进行数据更新,然后用update实现 } + //批量移动 public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, long folderId) { if (ids == null) { @@ -90,14 +95,14 @@ public class DataUtils { ArrayList operationList = new ArrayList(); for (long id : ids) { ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));//通过withAppendedId方法,为该Uri加上ID builder.withValue(NoteColumns.PARENT_ID, folderId); builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); operationList.add(builder.build()); - } + }//将ids里包含的每一列的数据逐次加入到operationList中,等待最后的批量处理 try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch一次性处理一个操作列表 if (results == null || results.length == 0 || results[0] == null) { Log.d(TAG, "delete notes failed, ids:" + ids.toString()); return false; @@ -114,12 +119,14 @@ public class DataUtils { /** * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} */ + //获取文件夹的编号 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); + null);//筛选条件:源文件不为trash folder + int count = 0; if(cursor != null) { @@ -136,23 +143,24 @@ public class DataUtils { return count; } + //查看是否有指定ID的note可见 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); + null);//查询条件:type符合,且不属于垃圾文件夹 boolean exist = false; if (cursor != null) { - if (cursor.getCount() > 0) { + if (cursor.getCount() > 0) {//用getcount函数判断cursor是否为空 exist = true; } cursor.close(); } return exist; } - +///判定是否有指定note,即不需条件条件:type符合,且不属于垃圾文件夹 public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, null, null, null); @@ -166,7 +174,7 @@ public class DataUtils { } return exist; } - +//判定是否有指定的data public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null, null, null, null); @@ -180,13 +188,14 @@ public class DataUtils { } return exist; } - +//判定是否有指定的可见folder 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) { @@ -197,12 +206,13 @@ public class DataUtils { 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); + null);//查询条件:父ID是传入的folderId; HashSet set = null; if (c != null) { @@ -211,8 +221,8 @@ public class DataUtils { do { try { AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); - widget.widgetType = c.getInt(1); + widget.widgetId = c.getInt(0);//0对应的NoteColumns.WIDGET_ID + widget.widgetType = c.getInt(1);//1对应的NoteColumns.WIDGET_TYPE set.add(widget); } catch (IndexOutOfBoundsException e) { Log.e(TAG, e.toString()); @@ -224,20 +234,21 @@ public class DataUtils { return set; } + //根据给定的便签ID(noteId)获取该便签中的电话号码(CallNote.PHONE_NUMBER) 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); + null);//在查询条件中限定了便签ID(NoteId)和便签类型(CallNote.MIME_TYPE),使用了占位符(?)和参数数组,避免了SQL注入攻击 - if (cursor != null && cursor.moveToFirst()) { + if (cursor != null && cursor.moveToFirst()) {//如果查询结果非空且有记录,则尝试获取第一条记录的电话号码,并将其返回。 try { return cursor.getString(0); } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); + Log.e(TAG, "Get call number fails " + e.toString());//如果获取电话号码失败,则在日志中打印错误信息,并返回空字符串 } finally { - cursor.close(); + cursor.close();//关闭游标(Cursor)对象 } } return ""; @@ -249,19 +260,19 @@ public class DataUtils { 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); - + null);//在查询条件中限定了通话日期(CallNote.CALL_DATE)、便签类型(CallNote.MIME_TYPE)以及电话号码(CallNote.PHONE_NUMBER)。//使用了占位符(?)和参数数组来避免SQL注入攻击,并使用PHONE_NUMBERS_EQUAL函数来比较电话号码。 +//通过数据库操作,查询条件是(callDate和phoneNumber匹配传入参数的值) if (cursor != null) { if (cursor.moveToFirst()) { try { - return cursor.getLong(0); + return cursor.getLong(0);//0对应的CallNote.NOTE_ID } catch (IndexOutOfBoundsException e) { Log.e(TAG, "Get call note id fails " + e.toString()); } } cursor.close(); } - return 0; + return 0;//如果查询结果为空,则返回0作为默认值。 } public static String getSnippetById(ContentResolver resolver, long noteId) { @@ -269,8 +280,8 @@ public class DataUtils { new String [] { NoteColumns.SNIPPET }, NoteColumns.ID + "=?", new String [] { String.valueOf(noteId)}, - null); - + null);//查询条件:noteId + //如果查询结果非空,则尝试获取第一条记录的便签片段,并将其赋值给变量snippet。 if (cursor != null) { String snippet = ""; if (cursor.moveToFirst()) { @@ -279,17 +290,17 @@ public class DataUtils { cursor.close(); return snippet; } - throw new IllegalArgumentException("Note is not found with id: " + noteId); + throw new IllegalArgumentException("Note is not found with id: " + noteId);//如果查询结果为空,则抛出IllegalArgumentException异常,提示便签ID不存在。 } - public static String getFormattedSnippet(String snippet) { - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); + public static String getFormattedSnippet(String snippet) { //对字符串进行格式处理,将字符串两头的空格去掉,同时将换行符去掉 + if (snippet != null) {//首先判断传入的便签片段(snippet)是否为空。如果不为空,则执行下一步;否则直接返回空字符串 + snippet = snippet.trim();//对便签片段进行trim操作,去除字符串前后的空格。 + int index = snippet.indexOf('\n');//查找便签片段中第一个换行符(\n)的索引位置,如果找到了,则截取从开头到该索引位置的子字符串;否则保留原始字符串。 if (index != -1) { snippet = snippet.substring(0, index); } } - return snippet; + return snippet;//返回格式化后的便签片段。 } } diff --git a/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java b/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java index 666b729..3dae2b5 100644 --- a/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +//定义了很多的静态字符串,目的就是为了提供jsonObject中相应字符串的"key"。把这些静态的定义单独写到了一个类里面,这是非常好的编程规范 package net.micode.notes.tool; - +//这个类就是定义了一堆static string,实际就是为jsonObject提供Key,把这些定义全部写到一个类里,方便查看管理 public class GTaskStringUtils { +// 前面一部分常量名称都以"GTASK_JSON_"开头,表示它们是Google Tasks API中JSON格式的字段名称。 + public final static String GTASK_JSON_ACTION_ID = "action_id";//操作的ID - 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_LIST = "action_list";//操作列表 - public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + public final static String GTASK_JSON_ACTION_TYPE = "action_type";//操作类型 public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; diff --git a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java index 1ad3ad6..7e656a5 100644 --- a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java +++ b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java @@ -16,14 +16,30 @@ package net.micode.notes.tool; -import android.content.Context; -import android.preference.PreferenceManager; +import android.content.Context;//Context是一个Android系统级别的类,它提供了访问应用程序资源和执行应用程序操作的方法。通过使用Context,开发者可以获取应用程序的上下文环境,例如访问应用程序的资源文件、启动活动、发送广播等。 +import android.preference.PreferenceManager;//PreferenceManager是Android提供的一个管理应用程序偏好设置的类。偏好设置是一种存储和检索简单数据的机制,例如用户首选项、应用程序设置等。PreferenceManager提供了一些方便的方法来读取和写入偏好设置,并且可以自动处理数据类型转换和持久化存储。 import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; -public class ResourceParser { +////*简介:字面意义是资源分析器,实际上就是获取资源并且在程序中使用,比如颜色图片等 +// * 实现方法:主要利用R.java这个类,其中包括 +// * R.id 组件资源引用 +// * R.drawable 图片资源 (被使用) +// * R.layout 布局资源 +// * R.menu 菜单资源 +// * R.String 文字资源 +// * R.style 主题资源 (被使用) +// * 在按顺序设置好相应的id后,就可以编写简单的getXXX函数获取需要的资源 +// * +// * 特殊的变量 : +// * @BG_DEFAULT_COLOR 默认背景颜色(黄) +// * BG_DEFAULT_FONT_SIZE 默认文本大小(中) + + +public class ResourceParser { +//定义颜色编号 public static final int YELLOW = 0; public static final int BLUE = 1; public static final int WHITE = 2; @@ -31,7 +47,7 @@ public class ResourceParser { 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; @@ -40,20 +56,21 @@ public class ResourceParser { 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 + 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 + 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) { @@ -64,7 +81,9 @@ public class ResourceParser { return BG_EDIT_TITLE_RESOURCES[id]; } } + //直接获取默认的背景颜色。这个PREFERENCE_SET_BG_COLOR_KEY是个final string,也就是说getBoolean肯定执行else,为什么要这么写 +// getDefaultBgId方法是一个公共静态方法,它接收一个Context对象作为参数,并根据应用程序的偏好设置确定默认的背景颜色ID。如果偏好设置中设置了背景颜色,则随机选择一个背景颜色ID;否则,返回一个默认的背景颜色ID。 public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { @@ -74,37 +93,38 @@ public class ResourceParser { } } +// NoteItemBgResources类类似于NoteBgResources类,它也包含一个私有的静态整型数组BG_FIRST_RESOURCES,用于表示笔记列表项的不同背景颜色。这些资源文件ID代表了笔记列表项在不同状态下的背景样式。 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 + 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 + 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, + 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 + 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) { @@ -128,13 +148,14 @@ public class ResourceParser { } } +// 这些数组存储了一组资源文件的ID,用于表示小部件(widget)的不同背景颜色。其中,BG_2X_RESOURCES数组存储了用于2x尺寸的小部件背景颜色的资源文件ID,而BG_4X_RESOURCES数组存储了用于4x尺寸的小部件背景颜色的资源文件ID。 public static class WidgetBgResources { private final static int [] BG_2X_RESOURCES = new int [] { - R.drawable.widget_2x_yellow, - R.drawable.widget_2x_blue, - R.drawable.widget_2x_white, - R.drawable.widget_2x_green, - R.drawable.widget_2x_red, + 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) { @@ -142,11 +163,11 @@ public class ResourceParser { } 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 + 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) { @@ -154,14 +175,18 @@ public class ResourceParser { } } +// 用于存储一组文本外观(TextAppearance)的资源文件ID。这些资源文件ID代表了不同文本样式的设置,如正常字体、中等字体、大号字体、超大号字体等 public static class TextAppearanceResources { +// 可以根据给定的索引获取对应的文本样式的资源文件ID。注意这里有一个容错的函数,当传入的索引大于等于资源数量时,会返回默认的字体大小设置。 private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { - R.style.TextAppearanceNormal, - R.style.TextAppearanceMedium, - R.style.TextAppearanceLarge, - R.style.TextAppearanceSuper + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper }; + //这里有一个容错的函数,防止输入的id大于资源总量,若如此,则自动返回默认的设置结果 +// getResourcesSize方法返回文本外观资源文件ID数组的长度,也就是资源文件的总数。 public static int getTexAppearanceResource(int id) { /** * HACKME: Fix bug of store the resource id in shared preference. @@ -179,3 +204,5 @@ public class ResourceParser { } } } + +