From 0497b83ef0727d087d3c086b4fbb3345aa2e5dae Mon Sep 17 00:00:00 2001 From: sleephardzz <3206652598@qq.com> Date: Sat, 19 Nov 2022 23:59:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/5.4.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 21107 -> 21143 bytes .../java/net/micode/notes/data/Contact.java | 2 + .../net/micode/notes/gtask/data/MetaData.java | 41 ++++- .../net/micode/notes/gtask/data/Node.java | 46 +++++- .../net/micode/notes/gtask/data/SqlData.java | 29 ++++ .../net/micode/notes/gtask/data/SqlNote.java | 18 ++- .../net/micode/notes/gtask/data/Task.java | 12 ++ .../net/micode/notes/gtask/data/TaskList.java | 12 ++ .../exception/ActionFailureException.java | 17 +++ .../exception/NetworkFailureException.java | 15 ++ .../notes/gtask/remote/GTaskASyncTask.java | 18 +++ .../notes/gtask/remote/GTaskClient.java | 143 ++++++++++++++++++ .../notes/gtask/remote/GTaskManager.java | 96 ++++++++++++ 16 files changed, 437 insertions(+), 12 deletions(-) diff --git a/.gradle/5.4.1/executionHistory/executionHistory.lock b/.gradle/5.4.1/executionHistory/executionHistory.lock index ba1d815992b50b60e2f0c8f60cd0014d9d61f724..2d492fcae33dc52da15308955606d0aa1c41d8aa 100644 GIT binary patch literal 17 UcmZQBUG=g4O@*{R0|Xoe065(R1^@s6 literal 17 UcmZQBUG=g4O@*{R0|e{=065eH{Qv*} diff --git a/.gradle/5.4.1/fileHashes/fileHashes.lock b/.gradle/5.4.1/fileHashes/fileHashes.lock index 193e56f92855610f31832a07ab492c208bc43dac..deba817f804697133da3b9067edbb3516aa30671 100644 GIT binary patch literal 17 VcmZR66Lgq~lRH9>0SuUK0stju1AG7g literal 17 VcmZR66Lgq~lRH9>0SuTf0{|sp19kua diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 2338b9b09f0e5ef9622f128c25273628f9a8a6ca..ff775df01f4a19b064194975a799d2336abf6c6d 100644 GIT binary patch literal 17 VcmZP$pJco9PMD?_0~j#+0{|_A1K0on literal 17 VcmZP$pJco9PMD?_0~j#60{|_21JD2f diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 55e86ca6397de4b471ae9eb384ab61b0fbceec44..23fddfd0410411c6493ecf380befa1f85e8ecfb7 100644 GIT binary patch delta 85 zcmeyogmL;(#tkMCl9L-gxgF53dfUSQ20^X=pOJ9-##O`abhKY4){D*#p0BWM5s delta 36 scmbQfl=1Tt#tkMCj1xEeN-SX7%qq>y&A4)-;t%nS1_fN39X*V=0QMIQT>t<8 diff --git a/app/src/main/java/net/micode/notes/data/Contact.java b/app/src/main/java/net/micode/notes/data/Contact.java index d97ac5d..5f27149 100644 --- a/app/src/main/java/net/micode/notes/data/Contact.java +++ b/app/src/main/java/net/micode/notes/data/Contact.java @@ -26,6 +26,8 @@ import android.util.Log; import java.util.HashMap; public class Contact { + + private static HashMap sContactCache; private static final String TAG = "Contact"; diff --git a/app/src/main/java/net/micode/notes/gtask/data/MetaData.java b/app/src/main/java/net/micode/notes/gtask/data/MetaData.java index 3a2050b..7cb9177 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/MetaData.java +++ b/app/src/main/java/net/micode/notes/gtask/data/MetaData.java @@ -26,54 +26,93 @@ import org.json.JSONObject; public class MetaData extends Task { + /** + * @Description: 得到的类名存入字符串TAG中 + */ private final static String TAG = MetaData.class.getSimpleName(); - private String mRelatedGid = null; + /** + * @Description: 设置元数据 + */ + public void setMeta(String gid, JSONObject metaInfo) { try { + /** + * @Description: 将属性值放入json对象中 + */ metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); } catch (JSONException e) { + /** + * @Description: 输出错误信息 + */ Log.e(TAG, "failed to put related gid"); + } setNotes(metaInfo.toString()); setName(GTaskStringUtils.META_NOTE_NAME); } + + /** + * @Description: 属性的GET方法 + */ public String getRelatedGid() { return mRelatedGid; } + /** + * @Description: 非空数据才保存 + * zyh + */ @Override public boolean isWorthSaving() { return getNotes() != null; } + /** + * @Description: 设置远程json对象设置元数据 + */ @Override public void setContentByRemoteJSON(JSONObject js) { super.setContentByRemoteJSON(js); if (getNotes() != null) { try { + /** + * @Description: json格式去除左右多余空格 + */ JSONObject metaInfo = new JSONObject(getNotes().trim()); mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); } catch (JSONException e) { + /** + * @Description: 抛出异常 + */ Log.w(TAG, "failed to get related gid"); mRelatedGid = null; } } } + /** + * @Description: json的SET方法 + */ @Override public void setContentByLocalJSON(JSONObject js) { // this function should not be called throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); } + /** + * @Description: json的GET方法 + */ @Override public JSONObject getLocalJSONFromContent() { throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); } + /** + * @Description: 同步获取消息的方法 + */ @Override public int getSyncAction(Cursor c) { throw new IllegalAccessError("MetaData:getSyncAction should not be called"); diff --git a/app/src/main/java/net/micode/notes/gtask/data/Node.java b/app/src/main/java/net/micode/notes/gtask/data/Node.java index 63950e0..fe7baa5 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/Node.java +++ b/app/src/main/java/net/micode/notes/gtask/data/Node.java @@ -21,32 +21,62 @@ import android.database.Cursor; import org.json.JSONObject; public abstract class Node { + /** + * @Description: 本地和云端都无可更新内容(即本地和云端内容一致) + */ public static final int SYNC_ACTION_NONE = 0; - + /** + * @Description: 需要在远程云端增加内容 + */ public static final int SYNC_ACTION_ADD_REMOTE = 1; - + /** + * @Description: 需要在本地增加内容 + */ public static final int SYNC_ACTION_ADD_LOCAL = 2; - + /** + * @Description: 需要在远程云端删除内容 + */ public static final int SYNC_ACTION_DEL_REMOTE = 3; - + /** + * @Description: 需要在本地删除内容 + */ public static final int SYNC_ACTION_DEL_LOCAL = 4; - + /** + * @Description: 要将远程云端内容更新到本地 + */ public static final int SYNC_ACTION_UPDATE_REMOTE = 5; - + /** + * @Description: 同步出现冲突 + */ public static final int SYNC_ACTION_UPDATE_LOCAL = 6; - + /** + * @Description: 需要将本地内容更新到远程云端 + */ public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; - + /** + * @Description: 同步出现错误 + */ public static final int SYNC_ACTION_ERROR = 8; private String mGid; private String mName; + /** + * @Description: 最后一次修改时间 + */ private long mLastModified; + /** + * @Description: 是否被删除,逻辑删除 + */ private boolean mDeleted; + + /** + * @Description: 构造和GET\SET方法 + * + */ public Node() { mGid = null; mName = ""; diff --git a/app/src/main/java/net/micode/notes/gtask/data/SqlData.java b/app/src/main/java/net/micode/notes/gtask/data/SqlData.java index d3ec3be..dd52396 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/app/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -35,16 +35,34 @@ import org.json.JSONException; import org.json.JSONObject; +/** + * @Description: 支持小米便签数据库相关的操作,和sqlnote的关系上是子集关系,即data是note的子集(节点) + * SqlData其实就是也就是所谓数据中的数据 +*/ public class SqlData { + /** + * @Description: 得到类的简写名称存入字符串TAG中 + */ private static final String TAG = SqlData.class.getSimpleName(); + /** + * @Description: 为mDataId置初始值-99999 + */ private static final int INVALID_ID = -99999; + /** + * @Description: 来自Notes类中定义的DataColumn中的一些常量 + */ public static final String[] PROJECTION_DATA = new String[] { DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, DataColumns.DATA3 }; + /** + * @Description: 以下五个变量作为sql表中5列的编号 + * @SQLTABLE + * + */ public static final int DATA_ID_COLUMN = 0; public static final int DATA_MIME_TYPE_COLUMN = 1; @@ -71,6 +89,11 @@ public class SqlData { private ContentValues mDiffDataValues; + /** + * @Description: 初始化数据库的构造方法 + * mContentResolver:上下文解析器 + * mIsCreate:创建标记 + */ public SqlData(Context context) { mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -144,6 +167,9 @@ public class SqlData { return js; } + /** + * @Description: commit函数用于把当前造作所做的修改保存到数据库 + */ public void commit(long noteId, boolean validateVersion, long version) { if (mIsCreate) { @@ -183,6 +209,9 @@ public class SqlData { mIsCreate = false; } + /** + * @Description: 获取当前id的 GET方法 + */ public long getId() { return mDataId; } diff --git a/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java index 79a4095..e330267 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -38,11 +38,21 @@ import org.json.JSONObject; import java.util.ArrayList; +/** + * @Description: note是data的子类 +*/ public class SqlNote { + /** + * @Description: 得到类的简写名称存入字符串TAG中 + */ private static final String TAG = SqlNote.class.getSimpleName(); - + /** + * @Description: 为mDataId置初始值-99999 + */ private static final int INVALID_ID = -99999; - + /** + * @Description: 来自Notes类中定义的DataColumn中的一些常量 + */ public static final String[] PROJECTION_NOTE = new String[] { NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, @@ -439,7 +449,9 @@ public class SqlNote { public boolean isNoteType() { return mType == Notes.TYPE_NOTE; } - + /** + * @Description: commit函数用于把当前造作所做的修改保存到数据库 + */ public void commit(boolean validateVersion) { if (mIsCreate) { if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { diff --git a/app/src/main/java/net/micode/notes/gtask/data/Task.java b/app/src/main/java/net/micode/notes/gtask/data/Task.java index 6a19454..3d1b52f 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/app/src/main/java/net/micode/notes/gtask/data/Task.java @@ -33,16 +33,28 @@ import org.json.JSONObject; public class Task extends Node { + /** + * @Description: 得到类的简写名称存入字符串TAG中 + */ private static final String TAG = Task.class.getSimpleName(); + /** + * @Description: 是否完成 + */ private boolean mCompleted; private String mNotes; private JSONObject mMetaInfo; + /** + * @Description: 兄弟指针 + */ private Task mPriorSibling; + /** + * @Description: 父类指针 + */ private TaskList mParent; public Task() { diff --git a/app/src/main/java/net/micode/notes/gtask/data/TaskList.java b/app/src/main/java/net/micode/notes/gtask/data/TaskList.java index 4ea21c5..cf1349f 100644 --- a/app/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/app/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -31,8 +31,12 @@ import java.util.ArrayList; public class TaskList extends Node { + /** + * @Description: 得到类的简写名称存入字符串TAG中 + */ private static final String TAG = TaskList.class.getSimpleName(); + /**当前TaskList的指针*/ private int mIndex; private ArrayList mChildren; @@ -43,6 +47,10 @@ public class TaskList extends Node { mIndex = 1; } + /** (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getCreateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); @@ -74,6 +82,10 @@ public class TaskList extends Node { return js; } + /** (non-Javadoc) + * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) + * 生成并返回一个包含了一定数据的JSONObject实体 + */ public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); diff --git a/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java b/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java index 15504be..ce2c9fe 100644 --- a/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java +++ b/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java @@ -16,13 +16,30 @@ package net.micode.notes.gtask.exception; +/** + * @Description: 支持小米便签运行过程中的运行异常处理。 +*/ public class ActionFailureException extends RuntimeException { private static final long serialVersionUID = 4425249765923293627L; + /** + * @Description: + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + */ + + public ActionFailureException() { super(); } + + /** + * @Description: 本质调用的是父类的方法 + * public RuntimeException(String message) { + * throw new RuntimeException("Stub!"); + * } + */ public ActionFailureException(String paramString) { super(paramString); } diff --git a/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java b/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java index b08cfb1..1c61e82 100644 --- a/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java +++ b/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -16,13 +16,28 @@ package net.micode.notes.gtask.exception; +/** + * @Description: 支持小米便签运行过程中的网络异常处理 +*/ public class NetworkFailureException extends Exception { private static final long serialVersionUID = 2107610287180234136L; + /** + * @Description: + * serialVersionUID相当于java类的身份证。主要用于版本控制。 + * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + */ + public NetworkFailureException() { super(); } + /** + * @Description: 本质调用的是父类的方法 + * public Exception(String message, Throwable cause) { + * throw new RuntimeException("Stub!"); + * } + */ public NetworkFailureException(String paramString) { super(paramString); } diff --git a/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java b/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java index 7c6754d..c74a2ac 100644 --- a/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java +++ b/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -29,6 +29,15 @@ import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * @Description: *异步操作类,实现GTask的异步操作过程 + *主要方法: + *private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 + *protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 + *protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 + *protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI + * @author zyh +*/ public class GTaskASyncTask extends AsyncTask { private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; @@ -57,6 +66,10 @@ public class GTaskASyncTask extends AsyncTask { mTaskManager.cancelSync(); } + /** + * @Description: 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + * @author zyh + */ public void publishProgess(String message) { publishProgress(new String[] { message @@ -82,6 +95,11 @@ public class GTaskASyncTask extends AsyncTask { // mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); // } + /** + * @Description: 利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext)) + * 的字符串内容传sync_progress_login中 + * @author zyh + */ @Override protected Integer doInBackground(Void... unused) { publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity diff --git a/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java b/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java index c67dfdf..f72fde0 100644 --- a/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java +++ b/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java @@ -61,9 +61,18 @@ import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; +/** + * @Description: 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 + * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid + * @author zyh +*/ public class GTaskClient { private static final String TAG = GTaskClient.class.getSimpleName(); + /** + * @Description: get\post方法 + * @author zyh + */ private static final String GTASK_URL = "https://mail.google.com/tasks/"; private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; @@ -90,6 +99,10 @@ public class GTaskClient { private JSONArray mUpdateArray; + /** + * @Description: 构造方法 + * @author zyh + */ private GTaskClient() { mHttpClient = null; mGetUrl = GTASK_GET_URL; @@ -102,6 +115,12 @@ public class GTaskClient { mUpdateArray = null; } + /** + * @Description: 用来获取的实例化对象 + * 使用 getInstance() + * 返回mInstance这个实例化对象 + * @author zyh + */ public static synchronized GTaskClient getInstance() { if (mInstance == null) { mInstance = new GTaskClient(); @@ -109,27 +128,54 @@ public class GTaskClient { return mInstance; } + /** + * @Description: 用来实现登录操作的函数,传入的参数是一个Activity + *设置登录操作限制时间,如果超时则需要重新登录 + *有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 + *返回true或者false,即最后是否登陆成功 + * @author zyh + */ public boolean login(Activity activity) { // we suppose that the cookie would expire after 5 minutes // then we need to re-login + /** + * @Description: 判断距离最后一次登录操作是否超过5分钟 + * @author zyh + */ final long interval = 1000 * 60 * 5; if (mLastLoginTime + interval < System.currentTimeMillis()) { mLoggedin = false; } // need to re-login after account switch + /** + * @Description: 重新登录操作 + * @author zyh + */ if (mLoggedin && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity .getSyncAccountName(activity))) { mLoggedin = false; } + /** + * @Description: 如果没超过时间,则不需要重新登录 + * @author zyh + */ if (mLoggedin) { Log.d(TAG, "already logged in"); return true; } + /** + * @Description: 更新最后登录时间,改为系统当前的时间 + * @author zyh + */ mLastLoginTime = System.currentTimeMillis(); + /** + * @Description: 判断是否登录到谷歌账户 + * @author zyh + */ String authToken = loginGoogleAccount(activity, false); if (authToken == null) { Log.e(TAG, "login google account failed"); @@ -137,13 +183,25 @@ public class GTaskClient { } // login with custom domain if necessary + /** + * @Description: 尝试使用用户自己的域名登录 + * @author zyh + */ if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() .endsWith("googlemail.com"))) { StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); int index = mAccount.name.indexOf('@') + 1; String suffix = mAccount.name.substring(index); url.append(suffix + "/"); + /** + * @Description: 设置用户对应的getUrl + * @author zyh + */ mGetUrl = url.toString() + "ig"; + /** + * @Description: 设置用户对应的postUrl + * @author zyh + */ mPostUrl = url.toString() + "r/ig"; if (tryToLoginGtask(activity, authToken)) { @@ -152,6 +210,10 @@ public class GTaskClient { } // try to login with google official url + /** + * @Description: 如果用户账户无法登录,则使用谷歌官方的URI进行登录 + * @author zyh + */ if (!mLoggedin) { mGetUrl = GTASK_GET_URL; mPostUrl = GTASK_POST_URL; @@ -164,9 +226,28 @@ public class GTaskClient { return true; } + /** + * @Description: 具体实现登录谷歌账户的方法 + *使用令牌机制 + *使用AccountManager来管理注册账号 + *返回值是账号的令牌 + * @author zyh + */ private String loginGoogleAccount(Activity activity, boolean invalidateToken) { + /** + * @Description: 令牌,是登录操作保证安全性的一个方法 + * @author zyh + */ String authToken; + /** + * @Description: AccountManager这个类给用户提供了集中注册账号的接口 + * @author zyh + */ AccountManager accountManager = AccountManager.get(activity); + /** + * @Description: 获取全部以com.google结尾的accoun + * @author zyh + */ Account[] accounts = accountManager.getAccountsByType("com.google"); if (accounts.length == 0) { @@ -176,6 +257,10 @@ public class GTaskClient { String accountName = NotesPreferenceActivity.getSyncAccountName(activity); Account account = null; + /** + * @Description: 遍历获得的accounts信息,寻找已经记录过的账户信息 + * @author zyh + */ for (Account a : accounts) { if (a.name.equals(accountName)) { account = a; @@ -190,11 +275,19 @@ public class GTaskClient { } // get the token now + /** + * @Description: 获取选中账号的令牌 + * @author zyh + */ AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, "goanna_mobile", null, activity, null, null); try { Bundle authTokenBundle = accountManagerFuture.getResult(); authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); + /** + * @Description: 如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token + * @author zyh + */ if (invalidateToken) { accountManager.invalidateAuthToken("com.google", authToken); loginGoogleAccount(activity, false); @@ -323,12 +416,24 @@ public class GTaskClient { } } + /** + * @Description: *通过JSON发送请求 + *请求的具体内容在json的实例化对象js中然后传入 + *利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 + *执行请求后使用getResponseContent方法得到返回的数据和资源 + *将资源再次放入json后返回 + * @author zyh + */ private JSONObject postRequest(JSONObject js) throws NetworkFailureException { if (!mLoggedin) { Log.e(TAG, "please login first"); throw new ActionFailureException("not logged in"); } + /** + * @Description: 实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 + * @author zyh + */ HttpPost httpPost = createHttpPost(); try { LinkedList list = new LinkedList(); @@ -337,6 +442,10 @@ public class GTaskClient { httpPost.setEntity(entity); // execute the post + /** + * @Description: 执行这个请求 + * @author zyh + */ HttpResponse response = mHttpClient.execute(httpPost); String jsString = getResponseContent(response.getEntity()); return new JSONObject(jsString); @@ -360,6 +469,14 @@ public class GTaskClient { } } + /** + * @Description: 创建单个任务 + * * 传入参数是一个.gtask.data.Task包里Task类的对象 + * * 利用json获取Task里的内容,并且创建相应的jsPost + * * 利用postRequest得到任务的返回信息 + * * 使用task.setGid设置task的new_ID + * @author zyh + */ public void createTask(Task task) throws NetworkFailureException { commitUpdate(); try { @@ -386,6 +503,10 @@ public class GTaskClient { } } + /** + * @Description: 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid + * @author zyh + */ public void createTaskList(TaskList tasklist) throws NetworkFailureException { commitUpdate(); try { @@ -412,6 +533,12 @@ public class GTaskClient { } } + /** + * @Description: 同步更新操作 + * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion + * 使用postRequest发送这个jspost,进行处理 + * @author zyh + */ public void commitUpdate() throws NetworkFailureException { if (mUpdateArray != null) { try { @@ -433,6 +560,11 @@ public class GTaskClient { } } + /** + * @Description: 添加更新的事项 + * 调用commitUpdate()实现 + * @author zyh + */ public void addUpdateNode(Node node) throws NetworkFailureException { if (node != null) { // too many update items may result in an error @@ -447,6 +579,13 @@ public class GTaskClient { } } + /** + * @Description: 移动task, 比如讲task移动到不同的task列表中去 + * 通过getGid获取task所属列表的gid + * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 + * 最后还是通过postRequest进行更新后的发送 + * @author zyh + */ public void moveTask(Task task, TaskList preParent, TaskList curParent) throws NetworkFailureException { commitUpdate(); @@ -547,6 +686,10 @@ public class GTaskClient { } } + /** + * @Description: 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 + * @author zyh + */ public JSONArray getTaskList(String listGid) throws NetworkFailureException { commitUpdate(); try { diff --git a/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java b/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java index d2b4082..638fe34 100644 --- a/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java +++ b/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java @@ -87,8 +87,20 @@ public class GTaskManager { private HashMap mNidToGid; + /** + * @Description: 对象初始化构造函数 + * @author zyh + */ private GTaskManager() { + /** + * @Description: flase代表未执行 + * @author zyh + */ mSyncing = false; + /** + * @Description: flase代表可以执行 + * @author zyh + */ mCancelled = false; mGTaskListHashMap = new HashMap(); mGTaskHashMap = new HashMap(); @@ -99,6 +111,10 @@ public class GTaskManager { mNidToGid = new HashMap(); } + /** + * @Description: 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下 + * @author zyh + */ public static synchronized GTaskManager getInstance() { if (mInstance == null) { mInstance = new GTaskManager(); @@ -106,13 +122,26 @@ public class GTaskManager { return mInstance; } + /** + * @Description: 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下 + * @author zyh + */ public synchronized void setActivityContext(Activity activity) { // used for getting authtoken mActivity = activity; } + + /** + * @Description: 实现了本地同步操作和远端同步操作 + * @author zyh + */ public int sync(Context context, GTaskASyncTask asyncTask) { if (mSyncing) { + /** + * @Description: 创建日志文件(调试信息),debug + * @author zyh + */ Log.d(TAG, "Sync is in progress"); return STATE_SYNC_IN_PROGRESS; } @@ -140,6 +169,10 @@ public class GTaskManager { // get the task list from google asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + /** + * @Description: 获取Google上的JSONtasklist转为本地TaskList + * @author zyh + */ initGTaskList(); // do content sync work @@ -168,17 +201,35 @@ public class GTaskManager { return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; } + /** + * @Description: 初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList + * @author zyh + */ private void initGTaskList() throws NetworkFailureException { if (mCancelled) return; GTaskClient client = GTaskClient.getInstance(); try { + /** + * @Description: Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 + * 其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 + * 因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用 + * @author zyh + */ JSONArray jsTaskLists = client.getTaskLists(); // init meta list first mMetaList = null; for (int i = 0; i < jsTaskLists.length(); i++) { + /** + * @Description: JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObjec + * @author zyh + */ JSONObject object = jsTaskLists.getJSONObject(i); + /** + * @Description: 通过工具类赋值GID和NAME + * @author zyh + */ String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); @@ -213,6 +264,10 @@ public class GTaskManager { // init task list for (int i = 0; i < jsTaskLists.length(); i++) { + /** + * @Description: 通过getString函数传入本地某个标志数据的名称,获取其在远端的名称 + * @author zyh + */ JSONObject object = jsTaskLists.getJSONObject(i); String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); @@ -247,6 +302,10 @@ public class GTaskManager { } } + /** + * @Description: 本地内容同步操作 + * @author zyh + */ private void syncContent() throws NetworkFailureException { int syncType; Cursor c = null; @@ -476,6 +535,11 @@ public class GTaskManager { GTaskClient.getInstance().commitUpdate(); } + /** + * @Description: syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode + * SWITCH CASE 选择功能 + * @author zyh + */ private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -522,6 +586,10 @@ public class GTaskManager { } } + /** + * @Description: 本地增加Node + * @author zyh + */ private void addLocalNode(Node node) throws NetworkFailureException { if (mCancelled) { return; @@ -596,6 +664,10 @@ public class GTaskManager { updateRemoteMeta(node.getGid(), sqlNote); } + /** + * @Description: update本地node + * @author zyh + */ private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -619,6 +691,10 @@ public class GTaskManager { updateRemoteMeta(node.getGid(), sqlNote); } + /** + * @Description: 远程增加Node + * @author zyh + */ private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -692,6 +768,10 @@ public class GTaskManager { mNidToGid.put(sqlNote.getId(), n.getGid()); } + /** + * @Description: 更新远端的Node,包含meta更新(updateRemoteMeta) + * @author zyh + */ private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -730,6 +810,10 @@ public class GTaskManager { sqlNote.commit(true); } + /** + * @Description: 升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据 + * @author zyh + */ private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { if (sqlNote != null && sqlNote.isNoteType()) { MetaData metaData = mMetaHashMap.get(gid); @@ -746,6 +830,10 @@ public class GTaskManager { } } + /** + * @Description: 刷新本地,给sync的ID对应上最后更改过的对象 + * @author zyh + */ private void refreshLocalSyncId() throws NetworkFailureException { if (mCancelled) { return; @@ -790,10 +878,18 @@ public class GTaskManager { } } + /** + * @Description: 获取同步账号,mAccount.name + * @author zyh + */ public String getSyncAccount() { return GTaskClient.getInstance().getSyncAccount().name; } + /** + * @Description: 取消同步,置mCancelled为true + * @author zyh + */ public void cancelSync() { mCancelled = true; }