From b9e5d499ac17aa241089824f2853637284c012c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Wed, 13 Dec 2023 15:50:15 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=89=B9=E6=B3=A8gtask=E5=8C=85=E4=B8=AD?= =?UTF-8?q?=E7=9A=84data=E9=87=8C=E9=9D=A2=E7=9A=844=E4=B8=AA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/micode/notes/gtask/data/MetaData.java | 12 ++++----- .../net/micode/notes/gtask/data/Node.java | 5 ++-- .../net/micode/notes/gtask/data/SqlData.java | 24 ++++++++--------- .../net/micode/notes/gtask/data/SqlNote.java | 26 ++++++++++--------- 4 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/micode/notes/gtask/data/MetaData.java b/src/main/java/net/micode/notes/gtask/data/MetaData.java index e7f8fb7..e713ad7 100644 --- a/src/main/java/net/micode/notes/gtask/data/MetaData.java +++ b/src/main/java/net/micode/notes/gtask/data/MetaData.java @@ -24,8 +24,8 @@ import net.micode.notes.tool.GTaskStringUtils; import org.json.JSONException; import org.json.JSONObject; - -public class MetaData extends Task { +//主要是定义用于处理元数据 +public class MetaData extends Task {//继承task,是task的子类 private final static String TAG = MetaData.class.getSimpleName(); private String mRelatedGid = null; @@ -34,7 +34,7 @@ public class MetaData extends Task { try { metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); + Log.e(TAG, "failed to put related gid");//记录错误日志 } setNotes(metaInfo.toString()); setName(GTaskStringUtils.META_NOTE_NAME); @@ -47,10 +47,10 @@ public class MetaData extends Task { @Override public boolean isWorthSaving() { return getNotes() != null; - } + }//用于判断数据是否值得保存 @Override - public void setContentByRemoteJSON(JSONObject js) {//用远程的json + public void setContentByRemoteJSON(JSONObject js) {//用远程的json设置内容,基础操作元 super.setContentByRemoteJSON(js); if (getNotes() != null) { try { @@ -66,7 +66,7 @@ public class MetaData extends Task { @Override public void setContentByLocalJSON(JSONObject js) {//这几个函数都是通过一部分已知的项推算其他未知的 // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");//抛出了IllegalAccessError异常,表明它不应该被直接调用 } @Override diff --git a/src/main/java/net/micode/notes/gtask/data/Node.java b/src/main/java/net/micode/notes/gtask/data/Node.java index 3a11067..c520c06 100644 --- a/src/main/java/net/micode/notes/gtask/data/Node.java +++ b/src/main/java/net/micode/notes/gtask/data/Node.java @@ -20,7 +20,7 @@ import android.database.Cursor; import org.json.JSONObject; -public abstract class Node { +public abstract class Node {//主要定义一些获取属性值的方法 public static final int SYNC_ACTION_NONE = 0; public static final int SYNC_ACTION_ADD_REMOTE = 1; @@ -38,6 +38,7 @@ public abstract class Node { public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; public static final int SYNC_ACTION_ERROR = 8; + //为不同的同步类型添加调用编号 private String mGid; @@ -45,7 +46,7 @@ public abstract class Node { private long mLastModified; - private boolean mDeleted; + private boolean mDeleted;//设置基础值,定义获取参数的方法 public Node() { mGid = null; diff --git a/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/main/java/net/micode/notes/gtask/data/SqlData.java index d3ec3be..7fdfd17 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -71,9 +71,9 @@ public class SqlData { private ContentValues mDiffDataValues; - public SqlData(Context context) { + public SqlData(Context context) {//初始化对象,用于存储数据 mContentResolver = context.getContentResolver(); - mIsCreate = true; + mIsCreate = true;//一类型的变量为true mDataId = INVALID_ID; mDataMimeType = DataConstants.NOTE; mDataContent = ""; @@ -82,14 +82,14 @@ public class SqlData { mDiffDataValues = new ContentValues(); } - public SqlData(Context context, Cursor c) { + public SqlData(Context context, Cursor c) {//同样是存储数据,另外定义支持冲cursor读入 mContentResolver = context.getContentResolver(); - mIsCreate = false; + mIsCreate = false;//二类型的变量为false loadFromCursor(c); mDiffDataValues = new ContentValues(); } - private void loadFromCursor(Cursor c) { + private void loadFromCursor(Cursor c) {//上面用到的从cursor读取的函数,从存储的各个列获取数据 mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); mDataContent = c.getString(DATA_CONTENT_COLUMN); @@ -97,9 +97,9 @@ public class SqlData { mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - public void setContent(JSONObject js) throws JSONException { - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { + public void setContent(@androidx.annotation.NonNull JSONObject js) throws JSONException {//获取json类型的参数,并且根据它更新自定义的数据单元中的值 + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;//如果有id直接赋值,没有则需要在获取 + if (mIsCreate || mDataId != dataId) {//初始未设置的数据单元通过它设置内容,通过cursor产生的数据元可通过它完成更新 mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; @@ -131,7 +131,7 @@ public class SqlData { } public JSONObject getContent() throws JSONException { - if (mIsCreate) { + if (mIsCreate) {//同样的只有通过cursor产生的数据单元可通过这个函数获取数据 Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } @@ -144,7 +144,7 @@ public class SqlData { return js; } - public void commit(long noteId, boolean validateVersion, long version) { + public void commit(long noteId, boolean validateVersion, long version) {//提交数据,并且打上类似于标签的版本号以及验证值 if (mIsCreate) { if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { @@ -162,10 +162,10 @@ public class SqlData { } else { if (mDiffDataValues.size() > 0) { int result = 0; - if (!validateVersion) { + if (!validateVersion) { // 不验证版本的情况下,直接使用ContentResolver更新指定ID的数据 result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { + } else { // 需要验证版本的情况下,使用ContentResolver进行条件更新操作 result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE diff --git a/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/main/java/net/micode/notes/gtask/data/SqlNote.java index 79a4095..48891a6 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -122,7 +122,7 @@ public class SqlNote { private ArrayList mDataList; - public SqlNote(Context context) { + public SqlNote(Context context) {//定义数据单元存储数据 mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -135,7 +135,7 @@ public class SqlNote { mParentId = 0; mSnippet = ""; mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;//直接从设置的属性中获取值 mWidgetType = Notes.TYPE_WIDGET_INVALIDE; mOriginParent = 0; mVersion = 0; @@ -147,14 +147,14 @@ public class SqlNote { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; - loadFromCursor(c); + loadFromCursor(c);//从cursor中直接获取变量值 mDataList = new ArrayList(); if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); } - public SqlNote(Context context, long id) { + public SqlNote(Context context, long id) {//根据id初始化数据单元 mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; @@ -175,7 +175,7 @@ public class SqlNote { }, null); if (c != null) { c.moveToNext(); - loadFromCursor(c); + loadFromCursor(c);//通过调用减少重复代码编写 } else { Log.w(TAG, "loadFromCursor: cursor = null"); } @@ -185,7 +185,7 @@ public class SqlNote { } } - private void loadFromCursor(Cursor c) { + private void loadFromCursor(Cursor c) {//直接使用get获得变量值 mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); @@ -200,7 +200,7 @@ public class SqlNote { mVersion = c.getLong(VERSION_COLUMN); } - private void loadDataContent() { + private void loadDataContent() {//这个函数判别查询的数据是否存在,并且读取到数据列表中存储 Cursor c = null; mDataList.clear(); try { @@ -210,12 +210,12 @@ public class SqlNote { }, null); if (c != null) { if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); + Log.w(TAG, "it seems that the note has not data");//遇到文件为空抛出对应的异常 return; } while (c.moveToNext()) { SqlData data = new SqlData(mContext, c); - mDataList.add(data); + mDataList.add(data);//向Datalist中加入读取到的数据 } } else { Log.w(TAG, "loadDataContent: cursor = null"); @@ -226,7 +226,8 @@ public class SqlNote { } } - public boolean setContent(JSONObject js) { + public boolean setContent(JSONObject js) {//设置数据单元中变量的值 + //如果所需的值存在,直接赋值使用,否则再先进行一步读取 try { JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { @@ -359,7 +360,7 @@ public class SqlNote { return true; } - public JSONObject getContent() { + public JSONObject getContent() {//直接读取的方式将所需的数据读到对应变量 try { JSONObject js = new JSONObject(); @@ -412,6 +413,7 @@ public class SqlNote { mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } + //定义一些简单的获取取值的方法 public void setGtaskId(String gid) { mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } @@ -440,7 +442,7 @@ public class SqlNote { return mType == Notes.TYPE_NOTE; } - public void commit(boolean validateVersion) { + public void commit(boolean validateVersion) {//将数据做一定修改提交 if (mIsCreate) { if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { mDiffNoteValues.remove(NoteColumns.ID); From 60f54c08db0187fae61fa3e661d1b6a962367e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Wed, 13 Dec 2023 21:08:28 +0800 Subject: [PATCH 2/5] =?UTF-8?q?gtask=E5=8C=85=E4=B8=AD=E7=9A=84data?= =?UTF-8?q?=E5=8C=85=E6=89=B9=E6=B3=A8=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../net/micode/notes/gtask/data/Task.java | 28 +++++++-------- .../net/micode/notes/gtask/data/TaskList.java | 34 +++++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/micode/notes/gtask/data/Task.java b/src/main/java/net/micode/notes/gtask/data/Task.java index 6a19454..4d68293 100644 --- a/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/src/main/java/net/micode/notes/gtask/data/Task.java @@ -32,7 +32,7 @@ import org.json.JSONException; import org.json.JSONObject; -public class Task extends Node { +public class Task extends Node {//继承Node类的属性 private static final String TAG = Task.class.getSimpleName(); private boolean mCompleted; @@ -54,7 +54,7 @@ public class Task extends Node { mMetaInfo = null; } - public JSONObject getCreateAction(int actionId) { + public JSONObject getCreateAction(int actionId) {//创建一个初始的任务对象,并对它赋初值 JSONObject js = new JSONObject(); try { @@ -103,7 +103,7 @@ public class Task extends Node { return js; } - public JSONObject getUpdateAction(int actionId) { + public JSONObject getUpdateAction(int actionId) {//更新任务 JSONObject js = new JSONObject(); try { @@ -120,7 +120,7 @@ public class Task extends Node { // entity_delta JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { + if (getNotes() != null) {//如果笔记不为空,更新笔记 entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); @@ -135,11 +135,11 @@ public class Task extends Node { return js; } - public void setContentByRemoteJSON(JSONObject js) { + public void setContentByRemoteJSON(JSONObject js) {//通过远端的json设置内容的值 if (js != null) { try { // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {//如果值已经被json对象所具备,则直接进行设置 setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } @@ -175,7 +175,7 @@ public class Task extends Node { } } - public void setContentByLocalJSON(JSONObject js) { + public void setContentByLocalJSON(JSONObject js) {//通过本地的json文件来设置内容 if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); @@ -204,7 +204,7 @@ public class Task extends Node { } } - public JSONObject getLocalJSONFromContent() { + public JSONObject getLocalJSONFromContent() {//通过本地的内容,生成json文件 String name = getName(); try { if (mMetaInfo == null) { @@ -216,7 +216,7 @@ public class Task extends Node { JSONObject js = new JSONObject(); JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); + JSONArray dataArray = new JSONArray();//声明所有所要用到的变量 JSONObject data = new JSONObject(); data.put(DataColumns.CONTENT, name); dataArray.put(data); @@ -227,7 +227,7 @@ public class Task extends Node { } else { // synced task JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);//提取出所有的信息 for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); @@ -258,11 +258,11 @@ public class Task extends Node { } } - public int getSyncAction(Cursor c) { + public int getSyncAction(Cursor c) {//同步缓存 try { JSONObject noteInfo = null; if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);//更新到最新的笔记信息 } if (noteInfo == null) { @@ -311,14 +311,14 @@ public class Task extends Node { return SYNC_ACTION_ERROR; } - public boolean isWorthSaving() { + public boolean isWorthSaving() {//只要有信息就认为是值得保存的,返回true return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } public void setCompleted(boolean completed) { this.mCompleted = completed; - } + }//进行前面使用过的调用函数返回值的对应 public void setNotes(String notes) { this.mNotes = notes; diff --git a/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/main/java/net/micode/notes/gtask/data/TaskList.java index 4ea21c5..95d6bf5 100644 --- a/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -30,17 +30,17 @@ import org.json.JSONObject; import java.util.ArrayList; -public class TaskList extends Node { +public class TaskList extends Node {//同Task一样,继承了Node private static final String TAG = TaskList.class.getSimpleName(); private int mIndex; - private ArrayList mChildren; + private ArrayList mChildren;//内部含有一个Task的列,是任务的序列 public TaskList() { super(); mChildren = new ArrayList(); - mIndex = 1; + mIndex = 1;//初始化 } public JSONObject getCreateAction(int actionId) { @@ -74,7 +74,7 @@ public class TaskList extends Node { return js; } - public JSONObject getUpdateAction(int actionId) { + public JSONObject getUpdateAction(int actionId) {//更新行动与Task中定义的基本一样 JSONObject js = new JSONObject(); try { @@ -104,7 +104,7 @@ public class TaskList extends Node { } public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { + if (js != null) {//类似的通过远端更新内容 try { // id if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { @@ -129,7 +129,7 @@ public class TaskList extends Node { } } - public void setContentByLocalJSON(JSONObject js) { + public void setContentByLocalJSON(JSONObject js) {//通过本地文件更新内容 if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } @@ -215,26 +215,26 @@ public class TaskList extends Node { return SYNC_ACTION_ERROR; } - +//以上都与task定义类似 public int getChildTaskCount() { return mChildren.size(); } public boolean addChildTask(Task task) { boolean ret = false; - if (task != null && !mChildren.contains(task)) { + if (task != null && !mChildren.contains(task)) {//任务不为空,并且还不在列表中,则将其加入 ret = mChildren.add(task); - if (ret) { + if (ret) {//成功加入以后继续设置关系 // need to set prior sibling and parent task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); - task.setParent(this); + task.setParent(this);//设置任务的父子关系 } } return ret; } - public boolean addChildTask(Task task, int index) { + public boolean addChildTask(Task task, int index) {//更进一步的实现在指定索引位置插入任务 if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); return false; @@ -260,9 +260,9 @@ public class TaskList extends Node { return true; } - public boolean removeChildTask(Task task) { + public boolean removeChildTask(Task task) {//移除子任务 boolean ret = false; - int index = mChildren.indexOf(task); + int index = mChildren.indexOf(task);//查找其索引 if (index != -1) { ret = mChildren.remove(task); @@ -281,7 +281,7 @@ public class TaskList extends Node { return ret; } - public boolean moveChildTask(Task task, int index) { + public boolean moveChildTask(Task task, int index) {//定向移除对应位置的任务 if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "move child task: invalid index"); @@ -299,7 +299,7 @@ public class TaskList extends Node { return (removeChildTask(task) && addChildTask(task, index)); } - public Task findChildTaskByGid(String gid) { + public Task findChildTaskByGid(String gid) {//通过Gid查找任务 for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); if (t.getGid().equals(gid)) { @@ -309,7 +309,7 @@ public class TaskList extends Node { return null; } - public int getChildTaskIndex(Task task) { + public int getChildTaskIndex(Task task) {//获取任务对应的索引 return mChildren.indexOf(task); } @@ -323,7 +323,7 @@ public class TaskList extends Node { public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { - if (task.getGid().equals(gid)) + if (task.getGid().equals(gid))//找到一个gid相符的即为所要的任务 return task; } return null; From ee0e553b4f83eadfb5ec74eedc2cd847236b103b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Wed, 13 Dec 2023 21:13:10 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=89=B9?= =?UTF-8?q?=E6=B3=A8=E7=9A=84=E8=A1=8C=E6=95=B0=E7=9A=84=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/report.docx | Bin 424989 -> 428070 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/report.docx b/doc/report.docx index 14a16d56b42e9f8e5668f4565d63c8a9194726e1..932d44530a6bdee12af6607e1ec2cb4b581fdd9e 100644 GIT binary patch delta 18007 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 delta 14885 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 UyPmo$_&OZG2GDi?2U!sR7uCm+e*gdg From d9b9dde803af3ef918f686490c8a08ae564b3134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Sat, 23 Dec 2023 11:16:03 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=A0=87=E5=87=86=E6=89=B9=E6=B3=A8?= =?UTF-8?q?=E4=BA=86exception=E4=B8=A4=E4=B8=AA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/report.docx | Bin 428070 -> 427839 bytes .../java/net/micode/notes/data/Contact.java | 50 ++++++++++++------ .../exception/ActionFailureException.java | 23 +++++--- .../exception/NetworkFailureException.java | 23 +++++--- 4 files changed, 66 insertions(+), 30 deletions(-) diff --git a/doc/report.docx b/doc/report.docx index 932d44530a6bdee12af6607e1ec2cb4b581fdd9e..16fb34e646a1e46c490cf363f6498bbb359b355c 100644 GIT binary patch delta 17750 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%0AUpV2E%DH0U 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 diff --git a/src/main/java/net/micode/notes/data/Contact.java b/src/main/java/net/micode/notes/data/Contact.java index 1e04184..b42deca 100644 --- a/src/main/java/net/micode/notes/data/Contact.java +++ b/src/main/java/net/micode/notes/data/Contact.java @@ -22,42 +22,57 @@ 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 {//定义一个Contact类,类别标签为Contact,包含一个用于存储用户信息的HashMap - 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 " +// 该代码是一个名为Contact的类,用于获取联系人信息。 +//代码中定义了一个静态的HashMap变量sContactCache,用于缓存联系人信息。sContactCache的键是电话号码,值是联系人姓名。 +//定义了一个字符串常量CALLER_ID_SELECTION,用于查询联系人信息的条件。该条件是通过拼接字符串而得到的,包含了查询电话号码相等、数据类型为电话号码、联系人ID在指定范围内等条件。 +//代码中定义了一个静态方法getContact,用于根据电话号码获取联系人姓名。 +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 = '+')"; -//定义一个静态方法getContact,可以通过Contact对象以及电话号码查询联系人。 + + " WHERE min_match = '+')"; // 查询联系人信息的条件 + + /** + * 根据电话号码获取联系人姓名 + * @param context 上下文对象 + * @param phoneNumber 电话号码 + * @return 联系人姓名,如果未找到则返回null + */ +// 该方法首先检查缓存中是否已有该电话号码对应的联系人姓名,如果有则返回缓存中的值。如果缓存中没有该电话号码对应的联系人姓名,则通过查询数据库来获取联系人姓名。 +// 查询数据库的条件是根据电话号码生成的CALLER_ID_SELECTION。如果查询结果不为空且移动到第一条记录,则从结果中提取联系人姓名,并将其存入缓存中。如果查询结果为空,则返回null。 public static String getContact(Context context, String phoneNumber) { - if(sContactCache == null) {//不存在这个联系人则新建一个存储信息 + if (sContactCache == null) { sContactCache = new HashMap(); } - if(sContactCache.containsKey(phoneNumber)) {//如果已经包含电话号码作为关键字对应的用户 - return sContactCache.get(phoneNumber);//直接返回用户的名字,get返回名字 + // 查找HashMap中是否已有phoneNumber信息 + if (sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber);//直接根据键值(电话号码)找到姓名 } String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));//最小匹配原则查找电话号码 + + // 查找数据库中phoneNumber的信息 Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, + 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); + sContactCache.put(phoneNumber, name);//放入缓存块 return name; } catch (IndexOutOfBoundsException e) { Log.e(TAG, " Cursor get string error " + e.toString()); @@ -66,7 +81,8 @@ public class Contact {//定义一个Contact类,类别标签为Contact,包含 cursor.close(); } } else { - Log.d(TAG, "No contact matched with number:" + phoneNumber); + // 未找到相关信息 + Log.d(TAG, "No contact matched with number:" + phoneNumber);//给出反馈信息 return null; } } diff --git a/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java index 83424dc..1909174 100644 --- a/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java +++ b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java @@ -15,19 +15,28 @@ */ package net.micode.notes.gtask.exception; +/** + * @method: ActionFailureException + * @description:ActionFailureException 继承了 RuntimeException 类,用于扩展抛错机制,显示具体错误类型 + * 这个类采取直接执行父类构造方法来完成类的构造,总计完成了有参数以及无参数情况下的三种构造方法 + * 定义了私有参数serialVersionUID,是序列化,用于验证版本一致性 + * @date: 11:05 + * @author: Xia Yanbo +*/ -public class ActionFailureException extends RuntimeException {//异常处理程序,定义了全部可能参数下抛出错误 - private static final long serialVersionUID = 4425249765923293627L; - +public class ActionFailureException extends RuntimeException { + private static final long serialVersionUID = 4425249765923293627L;//序列化,用于验证版本一致性 + //构造方法 public ActionFailureException() { - super(); + super();//用构造方法赋初值,调用父类无参数的构造方法 } - + //构造方法 public ActionFailureException(String paramString) { - super(paramString); + super(paramString);//调用父类有参数的构造方法 } - + //构造方法 public ActionFailureException(String paramString, Throwable paramThrowable) { super(paramString, paramThrowable); } } + diff --git a/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java index 66d6749..331588d 100644 --- a/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java +++ b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -15,18 +15,29 @@ */ package net.micode.notes.gtask.exception;//调用完成异常处理 +/** + * @method: NetworkFailureException + * @description:NetworkFailureException 继承了 Exception 类,用于扩展抛错机制,显示具体错误类型 + * 这个类采取直接执行父类构造方法来完成类的构造,总计完成了有参数以及无参数情况下的三种构造方法 + * //定义了私有参数serialVersionUID,是序列化,用于验证版本一致性 + * @date: 11:07 + * @author: Xia Yanbo + * @param: + * @param: + * @param: +*/ public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - + private static final long serialVersionUID = 2107610287180234136L;//序列化,用于验证版本一致性 + //构造方法 public NetworkFailureException() { - super(); + super();//用构造方法赋初值,调用父类无参数的构造方法 } - + //构造方法 public NetworkFailureException(String paramString) { - super(paramString); + super(paramString);//调用父类有参数的构造方法 } - + //构造方法 public NetworkFailureException(String paramString, Throwable paramThrowable) { super(paramString, paramThrowable); } From 127e07ab58675a8a858215b94c676d44a1e29cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=8F=E5=BD=A6=E5=8D=9A?= <1139346339@qq.com> Date: Sun, 24 Dec 2023 11:07:41 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=89=B9=E6=B3=A8=E4=BA=86NoteEditText?= =?UTF-8?q?=E5=92=8CGTaskASyncTask=E4=B8=A4=E4=B8=AA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/report.docx | Bin 427839 -> 428098 bytes .../notes/gtask/remote/GTaskASyncTask.java | 87 ++++++++++--- .../net/micode/notes/ui/NoteEditText.java | 118 +++++++++++++----- 3 files changed, 161 insertions(+), 44 deletions(-) diff --git a/doc/report.docx b/doc/report.docx index 16fb34e646a1e46c490cf363f6498bbb359b355c..dedc5fa830e49094c0cd4e868107aee2000fba3d 100644 GIT binary patch delta 17962 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 RemZA6n*m#0Be2WI008RYmE8aU delta 17785 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 BX_Fd~9%Y?V34iUc&>B}fZThvU#AQYS*7 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 bI#@mZTsxZ$Q)%6Fo(?txw(168c3}VjRowjf diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java index 0ea27b7..b5a9e75 100644 --- a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java +++ b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -29,10 +29,21 @@ import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * @method: GTaskASyncTask + * @description:GTaskASyncTask 类继承 AsyncTask 类而来,负责同步任务读取的账户准备, + * 完成消息报文的读取,取消任务同步,以及显示任务的进度信息,完成信息的任务。 + * 总计定义了4个私有的变量 + * mcontext 用于访问特定资源和类的context对象 + * mOnCompleteListener 回调接口,将传递结果给调用者 + * mNotifiManager 通过调用 mTaskManager 控制和调度异步任务 + * @date: 9:01 + * @author: Xia Yanbo +*/ public class GTaskASyncTask extends AsyncTask { - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;//序列化,用于验证版本 +//声明定义一个接口OnCompleteListener,实现放在后面 public interface OnCompleteListener { void onComplete(); } @@ -44,7 +55,16 @@ public class GTaskASyncTask extends AsyncTask { private GTaskManager mTaskManager; private OnCompleteListener mOnCompleteListener; - +/** + * @method: GTaskASyncTask + * @description:GTaskASyncTask类的构造函数,完成构造 + * @date: 16:11 + * @author: Xia Yanbo + * @param: mcontext 用于访问特定资源和类的context对象 + * @param: mOnCompleteListener 回调接口,将传递结果给调用者 + * @param: mNotifiManager 通过调用 + * @param: mTaskManager 控制和调度异步任务 +*/ public GTaskASyncTask(Context context, OnCompleteListener listener) { mContext = context; mOnCompleteListener = listener; @@ -52,22 +72,42 @@ public class GTaskASyncTask extends AsyncTask { .getSystemService(Context.NOTIFICATION_SERVICE); mTaskManager = GTaskManager.getInstance(); } - + /** + * @method: GTaskASyncTask + * @description:取消异步任务 + * @date: 8:32 + * @author: Xia Yanbo + */ public void cancelSync() { mTaskManager.cancelSync(); } + /** + * @method: GTaskASyncTask + * @description:更新异步任务的进度 + * @date: 8:33 + * @author: Xia Yanbo + * @param: message 进度的报文 + */ public void publishProgess(String message) { publishProgress(new String[] { message }); } - + /** + * @method: GTaskASyncTask + * @description:显示系统通知 + * @date: 8:35 + * @author: Xia Yanbo + * @param:tickerId通知的文本资源的ID + * @param:content通知的具体文本内容 + * @return:NULL + */ private void showNotification(int tickerId, String content) { Notification notification = new Notification(R.drawable.notification, mContext .getString(tickerId), System.currentTimeMillis()); notification.defaults = Notification.DEFAULT_LIGHTS; - notification.flags = Notification.FLAG_AUTO_CANCEL; + notification.flags = Notification.FLAG_AUTO_CANCEL;//打上标识,用于判断发送报错信息和通知操作等 PendingIntent pendingIntent; if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, @@ -79,24 +119,43 @@ public class GTaskASyncTask extends AsyncTask { } // notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, // pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//直接调用父类的方法 } - + /** + * @method: GTaskASyncTask + * @description:运行在后台,执行同步操作前准备 + * @date: 8:46 + * @author: Xia Yanbo + * @return: 状态码,用于检验同步是否完成 + */ @Override protected Integer doInBackground(Void... unused) { publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); + .getSyncAccountName(mContext)));//获取用户的状态信息 return mTaskManager.sync(mContext, this); } - + /** + * @method: GTaskASyncTask + * @description:同步过程中发送传输同步信息的报文 + * @date: 8:50 + * @author: Xia Yanbo + * @param:Progress 正在进行的任务的进度信息 + */ @Override protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { + showNotification(R.string.ticker_syncing, progress[0]);//显示正在进行同步操作的通知 + if (mContext instanceof GTaskSyncService) {//检查是否是GTaskSyncService的实例。 ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + // 如果是,就调用该服务的sendBroadcast方法发送广播,通知其他组件同步的进度。 } } - + /** + * @method: GTaskASyncTask + * @description:将执行完毕的任务的完成信息,错误信息以及取消信息显示出来 + * @date: 8:57 + * @author: Xia Yanbo + * @param:result 进程运行的结果信息 + */ @Override protected void onPostExecute(Integer result) { if (result == GTaskManager.STATE_SUCCESS) { @@ -111,7 +170,7 @@ public class GTaskASyncTask extends AsyncTask { showNotification(R.string.ticker_cancel, mContext .getString(R.string.error_sync_cancelled)); } - if (mOnCompleteListener != null) { + if (mOnCompleteListener != null) {//如果监听到了报文,创建一个新的线程来通知任务完成(减少主进程时间浪费) new Thread(new Runnable() { public void run() { diff --git a/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java index 2afe2a8..39592b5 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -36,16 +36,26 @@ import net.micode.notes.R; import java.util.HashMap; import java.util.Map; - +/** + * @classname: NoteEditText + * @methodname + * @description: + * @date: 2023/12/24 9:22 + * @author: Xia Yanbo + * @param: + * @param: + * @param: + * @return: +*/ public class NoteEditText extends EditText { - private static final String TAG = "NoteEditText"; - private int mIndex; + private static final String TAG = "NoteEditText";//标签,分类接收特定信息 + private int mIndex;//声明文本的索引 private int mSelectionStartBeforeDelete; - + //声明字符串常量,标志电话、网址、邮件 private static final String SCHEME_TEL = "tel:" ; private static final String SCHEME_HTTP = "http:" ; private static final String SCHEME_EMAIL = "mailto:" ; - + //设置映射,将文本内容拼接成完整的网址 private static final Map sSchemaActionResMap = new HashMap(); static { sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); @@ -55,53 +65,65 @@ public class NoteEditText extends EditText { /** * Call by the {@link NoteEditActivity} to delete or add edit text + * 可以用作往整个文本里添加以及删除文本,会被NoteEditActivity时常调用 */ public interface OnTextViewChangeListener { /** * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens * and the text is null + * 当按下delete时删除编辑的文字 */ void onEditTextDelete(int index, String text); /** * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} * happen + * 当按下enter时添加编辑的文本到文本中 */ void onEditTextEnter(int index, String text); /** * Hide or show item option when text change + * 当文字发生变化时显示或者隐藏起设置 */ void onTextChange(int index, boolean hasText); } - + //声明文本视图变化的监听器 private OnTextViewChangeListener mOnTextViewChangeListener; - + //实例化NoteEditText对象, public NoteEditText(Context context) { super(context, null); mIndex = 0; } - + //为本本编辑设置一个索引 public void setIndex(int index) { mIndex = index; } - + //直接调用父类,定义好文本视图变化的监听器 public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } - + //NoteEditText的构造函数,通过文本编辑风格的参数集实例化 public NoteEditText(Context context, AttributeSet attrs) { super(context, attrs, android.R.attr.editTextStyle); } - + //NoteEditText的构造函数,通过文本编辑风格的参数集实例化,支持用户自定义风格 public NoteEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); + super(context, attrs, defStyle);//允许自定义风格 // TODO Auto-generated constructor stub } - + /** + * @classname: NoteEditText + * @methodname onTouchEvent + * @description:根据得到的用户采取的动作(事件)类型进行相应的光标的设置 + * @date: 2023/12/24 10:05 + * @author: Xia Yanbo + * @param:event 具体的动作动作事件 + * @return:boolean 表示是否成功 + */ @Override public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { + switch (event.getAction()) {//对动作事件进行分类的判别 case MotionEvent.ACTION_DOWN: int x = (int) event.getX(); @@ -112,15 +134,24 @@ public class NoteEditText extends EditText { y += getScrollY(); Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); + int line = layout.getLineForVertical(y);//直接获取行数 + int off = layout.getOffsetForHorizontal(line, x);//从边界起数获得偏移 Selection.setSelection(getText(), off); break; } - return super.onTouchEvent(event); + return super.onTouchEvent(event);//再调用父类的方法进行后续的处理 } - + /** + * @classname: NoteEditText + * @methodname onKeyDown + * @description:监听键盘按键按下 + * @date: 2023/12/24 10:15 + * @author: Xia Yanbo + * @param:keyCode 按键的编码值 + * @param:event 按键的具体事件 + * @return:boolean 表示判断执行的过程是否顺利 + */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { @@ -137,7 +168,16 @@ public class NoteEditText extends EditText { } return super.onKeyDown(keyCode, event); } - + /** + * @classname: NoteEditText + * @methodname onKeyUp + * @description:监听键盘按键抬起 + * @date: 2023/12/24 10:15 + * @author: Xia Yanbo + * @param:keyCode 按键的编码值 + * @param:event 按键的具体事件 + * @return:boolean 表示判断执行的过程是否顺利 + */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch(keyCode) { @@ -166,11 +206,20 @@ public class NoteEditText extends EditText { } return super.onKeyUp(keyCode, event); } - + /** + * @classname: NoteEditText + * @methodname onFocusChanged + * @description:对应当前视图的焦点改变 + * @date: 2023/12/24 10:25 + * @author: Xia Yanbo + * @param:focused 焦点改变或者还未改变 + * @param:direction 改变方向? + * @param:reviouslyFocusedRect 上一个焦点所关注的视图 + */ @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { + if (!focused && TextUtils.isEmpty(getText())) {//当没有输入,关注的视图也发生改变,设置隐藏 mOnTextViewChangeListener.onTextChange(mIndex, false); } else { mOnTextViewChangeListener.onTextChange(mIndex, true); @@ -178,19 +227,27 @@ public class NoteEditText extends EditText { } super.onFocusChanged(focused, direction, previouslyFocusedRect); } - + /** + * @classname: NoteEditText + * @methodname onCreateContextMenu + * @description:创建文本的上下文菜单 + * @date: 2023/12/24 10:34 + * @author: Xia Yanbo + * @param:contextMenu 现有的上下文菜单 + */ @Override protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - + if (getText() instanceof Spanned) {//检查文本的类型 Spanned是一个接口 + int selStart = getSelectionStart();//所选择文本的开始位置 + int selEnd = getSelectionEnd();//所选择文本的结束位置 + //确定选择开始的较小值和较大值,方便直接做差 int min = Math.min(selStart, selEnd); int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + //获取选择的文本范围内获取所有的 URLSpan 对象。URLSpan 是用于表示文本中的链接的。 + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);//获取范围 if (urls.length == 1) { int defaultResId = 0; + //根据URL获取资源 for(String schema: sSchemaActionResMap.keySet()) { if(urls[0].getURL().indexOf(schema) >= 0) { defaultResId = sSchemaActionResMap.get(schema); @@ -201,9 +258,10 @@ public class NoteEditText extends EditText { if (defaultResId == 0) { defaultResId = R.string.note_link_other; } - + //添加菜单项 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() { + //设置监听器,放菜单项被点击,触发链接 public boolean onMenuItemClick(MenuItem item) { // goto a new intent urls[0].onClick(NoteEditText.this); @@ -212,6 +270,6 @@ public class NoteEditText extends EditText { }); } } - super.onCreateContextMenu(menu); + super.onCreateContextMenu(menu);//调用父类方法 } }