完成了gtask包注释

pull/15/head
SheYu 11 months ago
parent 14c06ccf3e
commit c4f7bb4b1a

@ -24,12 +24,26 @@ import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: MetaData
* @Description:
* @Author: WuShuxian
* @CreateDate: 2023/12/22 21:45
* @Version: 1.0
*/
public class MetaData extends Task {
private final static String TAG = MetaData.class.getSimpleName();
private String mRelatedGid = null;
/**
* @method setMeta
* @description:
* @date: 2023/12/24 20:07
* @author: WuShuxian
* @param:
* @return:
*/
public void setMeta(String gid, JSONObject metaInfo) {
try {
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
@ -48,7 +62,14 @@ public class MetaData extends Task {
public boolean isWorthSaving() {
return getNotes() != null;
}
/**
* @method setContentByRemoteJSON
* @description: Json
* @date: 2023/12/24 20:11
* @author: WuShuxian
* @param:
* @return:
*/
@Override
public void setContentByRemoteJSON(JSONObject js) {
super.setContentByRemoteJSON(js);
@ -62,7 +83,14 @@ public class MetaData extends Task {
}
}
}
/**
* @method setContentByLocalJSON
* @description: Json
* @date: 2023/12/24 20:12
* @author: WuShuxian
* @param:
* @return:
*/
@Override
public void setContentByLocalJSON(JSONObject js) {
// this function should not be called

@ -19,24 +19,50 @@ package net.micode.notes.gtask.data;
import android.database.Cursor;
import org.json.JSONObject;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: Node
* @Description: Git
* @Author: WuShuxian
* @CreateDate: 2023/12/21 21:30
* @Version: 1.0
*/
public abstract class Node {
/**
*
*/
public static final int SYNC_ACTION_NONE = 0;
/**
*
*/
public static final int SYNC_ACTION_ADD_REMOTE = 1;
/**
*
*/
public static final int SYNC_ACTION_ADD_LOCAL = 2;
/**
*
*/
public static final int SYNC_ACTION_DEL_REMOTE = 3;
/**
*
*/
public static final int SYNC_ACTION_DEL_LOCAL = 4;
/**
*
*/
public static final int SYNC_ACTION_UPDATE_REMOTE = 5;
/**
*
*/
public static final int SYNC_ACTION_UPDATE_LOCAL = 6;
/**
*
*/
public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;
/**
*
*/
public static final int SYNC_ACTION_ERROR = 8;
private String mGid;

@ -34,7 +34,15 @@ import net.micode.notes.gtask.exception.ActionFailureException;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: SqlData
* @Description: 便sqlnotedatanote
* SqlData
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:13
* @Version: 1.0
*/
public class SqlData {
private static final String TAG = SqlData.class.getSimpleName();
@ -44,7 +52,9 @@ public class SqlData {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
/**
* sql5
*/
public static final int DATA_ID_COLUMN = 0;
public static final int DATA_MIME_TYPE_COLUMN = 1;
@ -70,7 +80,14 @@ public class SqlData {
private String mDataContentData3;
private ContentValues mDiffDataValues;
/**
* @method SqlData
* @description:
* @date: 2023/12/24 20:17
* @author: WuShuxian
* @param:
* @return:
*/
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;
@ -81,14 +98,28 @@ public class SqlData {
mDataContentData3 = "";
mDiffDataValues = new ContentValues();
}
/**
* @method SqlData
* @description:
* @date: 2023/12/24 20:17
* @author: WuShuxian
* @param:
* @return:
*/
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);
mDiffDataValues = new ContentValues();
}
/**
* @method loadFromCursor
* @description:
* @date: 2023/12/24 20:18
* @author: WuShuxian
* @param: c:
* @return: void
*/
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
@ -96,7 +127,14 @@ public class SqlData {
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
/**
* @method setContent
* @description:
* @date: 2023/12/24 20:19
* @author: WuShuxian
* @param: js: Json
* @return: void
*/
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
@ -143,7 +181,16 @@ public class SqlData {
js.put(DataColumns.DATA3, mDataContentData3);
return js;
}
/**
* @method commit
* @description: commit
* @date: 2023/12/24 20:21
* @author: WuShuxian
* @param: noteId便ID
* validateVersion
* version
* @return: void
*/
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {

@ -37,7 +37,14 @@ import org.json.JSONObject;
import java.util.ArrayList;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: SqlNote
* @Description: 便sqldatanotedata
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:23
* @Version: 1.0
*/
public class SqlNote {
private static final String TAG = SqlNote.class.getSimpleName();
@ -121,17 +128,24 @@ public class SqlNote {
private ContentValues mDiffNoteValues;
private ArrayList<SqlData> mDataList;
/**
* @method SqlNote
* @description: context
* @date: 2023/12/24 20:24
* @author: WuShuxian
* @param:
* @return:
*/
public SqlNote(Context context) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = true;
mIsCreate = true;//用于标识构造方法
mId = INVALID_ID;
mAlertDate = 0;
mBgColorId = ResourceParser.getDefaultBgId(context);
mCreatedDate = System.currentTimeMillis();
mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间
mHasAttachment = 0;
mModifiedDate = System.currentTimeMillis();
mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间
mParentId = 0;
mSnippet = "";
mType = Notes.TYPE_NOTE;
@ -142,22 +156,36 @@ public class SqlNote {
mDiffNoteValues = new ContentValues();
mDataList = new ArrayList<SqlData>();
}
/**
* @method SqlNote
* @description:
* @date: 2023/12/24 20:25
* @author: WuShuxian
* @param:
* @return:
*/
public SqlNote(Context context, Cursor c) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = false;
mIsCreate = false;//用于标识构造方法
loadFromCursor(c);
mDataList = new ArrayList<SqlData>();
if (mType == Notes.TYPE_NOTE)
loadDataContent();
mDiffNoteValues = new ContentValues();
}
/**
* @method SqlNote
* @description: ID
* @date: 2023/12/24 20:27
* @author: WuShuxian
* @param:
* @return:
*/
public SqlNote(Context context, long id) {
mContext = context;
mContentResolver = context.getContentResolver();
mIsCreate = false;
mIsCreate = false;//标识构造方法
loadFromCursor(id);
mDataList = new ArrayList<SqlData>();
if (mType == Notes.TYPE_NOTE)
@ -199,7 +227,14 @@ public class SqlNote {
mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
mVersion = c.getLong(VERSION_COLUMN);
}
/**
* @method loadDataContent
* @description: content
* @date: 2023/12/24 20:29
* @author: WuShuxian
* @param:
* @return:
*/
private void loadDataContent() {
Cursor c = null;
mDataList.clear();
@ -439,7 +474,14 @@ public class SqlNote {
public boolean isNoteType() {
return mType == Notes.TYPE_NOTE;
}
/**
* @method commit
* @description: commit
* @date: 2023/12/24 20:30
* @author: WuShuxian
* @param:
* @return:
*/
public void commit(boolean validateVersion) {
if (mIsCreate) {
if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {

@ -31,7 +31,14 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: Task
* @Description: Node
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:31
* @Version: 1.0
*/
public class Task extends Node {
private static final String TAG = Task.class.getSimpleName();
@ -53,22 +60,25 @@ public class Task extends Node {
mParent = null;
mMetaInfo = null;
}
/**
* @method getCreateAction
* @description: Json
* @date: 2023/12/24 20:33
* @author: WuShuxian
* @param:
* @return:
*/
public JSONObject getCreateAction(int actionId) {
JSONObject js = new JSONObject();
try {
// action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
// action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
// index
js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this));
// entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
@ -79,17 +89,13 @@ public class Task extends Node {
}
js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
// parent_id
js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid());
// dest_parent_type
js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE,
GTaskStringUtils.GTASK_JSON_TYPE_GROUP);
// list_id
js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid());
// prior_sibling_id
if (mPriorSibling != null) {
js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid());
}
@ -102,22 +108,25 @@ public class Task extends Node {
return js;
}
/**
* @method getUpdateAction
* @description: Json
* @date: 2023/12/24 20:34
* @author: WuShuxian
* @param:
* @return:
*/
public JSONObject getUpdateAction(int actionId) {
JSONObject js = new JSONObject();
try {
// action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
// action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
// id
js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
// entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
if (getNotes() != null) {
@ -138,32 +147,26 @@ public class Task extends Node {
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
// id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
}
// last_modified
if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
}
// name
if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
}
// notes
if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) {
setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES));
}
// deleted
if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) {
setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED));
}
// completed
if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) {
setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED));
}
@ -208,7 +211,6 @@ public class Task extends Node {
String name = getName();
try {
if (mMetaInfo == null) {
// new task created from web
if (name == null) {
Log.w(TAG, "the note seems to be an empty one");
return null;
@ -225,7 +227,6 @@ public class Task extends Node {
js.put(GTaskStringUtils.META_HEAD_NOTE, note);
return js;
} else {
// synced task
JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
@ -275,29 +276,24 @@ public class Task extends Node {
return SYNC_ACTION_UPDATE_LOCAL;
}
// validate the note id now
// 立即验证note id
if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) {
Log.w(TAG, "note id doesn't match");
return SYNC_ACTION_UPDATE_LOCAL;
}
if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
// there is no local update
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
// no update both side
return SYNC_ACTION_NONE;
} else {
// apply remote to local
return SYNC_ACTION_UPDATE_LOCAL;
}
} else {
// validate gtask id
if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {
Log.e(TAG, "gtask id doesn't match");
return SYNC_ACTION_ERROR;
}
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
// local modification only
return SYNC_ACTION_UPDATE_REMOTE;
} else {
return SYNC_ACTION_UPDATE_CONFLICT;

@ -29,7 +29,14 @@ import org.json.JSONObject;
import java.util.ArrayList;
/**
* @Package: net.micode.notes.gtask.data
* @ClassName: TaskList
* @Description: Node
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:40
* @Version: 1.0
*/
public class TaskList extends Node {
private static final String TAG = TaskList.class.getSimpleName();
@ -47,17 +54,13 @@ public class TaskList extends Node {
JSONObject js = new JSONObject();
try {
// action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);// 动作类型
// action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);// 动作编号
// index
js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex);
// entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
@ -78,17 +81,13 @@ public class TaskList extends Node {
JSONObject js = new JSONObject();
try {
// action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);//动作类型
// action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);//动作编号
// id
js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
// entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
@ -106,17 +105,14 @@ public class TaskList extends Node {
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
// id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
}
// last_modified
if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
}
// name
if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
}
@ -225,7 +221,6 @@ public class TaskList extends Node {
if (task != null && !mChildren.contains(task)) {
ret = mChildren.add(task);
if (ret) {
// need to set prior sibling and parent
task.setPriorSibling(mChildren.isEmpty() ? null : mChildren
.get(mChildren.size() - 1));
task.setParent(this);
@ -244,7 +239,7 @@ public class TaskList extends Node {
if (task != null && pos == -1) {
mChildren.add(index, task);
// update the task list
// 更新任务列表
Task preTask = null;
Task afterTask = null;
if (index != 0)
@ -267,11 +262,9 @@ public class TaskList extends Node {
ret = mChildren.remove(task);
if (ret) {
// reset prior sibling and parent
task.setPriorSibling(null);
task.setParent(null);
// update the task list
if (index != mChildren.size()) {
mChildren.get(index).setPriorSibling(
index == 0 ? null : mChildren.get(index - 1));

@ -15,8 +15,19 @@
*/
package net.micode.notes.gtask.exception;
/**
* @Package: net.micode.notes.gtask.exception
* @ClassName: ActionFailureException
* @Description: 便
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:45
* @Version: 1.0
*/
public class ActionFailureException extends RuntimeException {
/**
* serialVersionUIDjava
* serialVersionUID
*/
private static final long serialVersionUID = 4425249765923293627L;
public ActionFailureException() {

@ -15,8 +15,19 @@
*/
package net.micode.notes.gtask.exception;
/**
* @Package: net.micode.notes.gtask.exception
* @ClassName: NetworkFailureException
* @Description: 便
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:46
* @Version: 1.0
*/
public class NetworkFailureException extends Exception {
/**
* serialVersionUIDjava
* serialVersionUID
*/
private static final long serialVersionUID = 2107610287180234136L;
public NetworkFailureException() {

@ -28,7 +28,14 @@ import net.micode.notes.R;
import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;
/**
* @Package: net.micode.notes.gtask.remote
* @ClassName: GTaskASyncTask
* @Description: GTask
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:49
* @Version: 1.0
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
@ -62,13 +69,22 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
message
});
}
/**
* @method showNotification
* @description:
* @date: 2023/12/24 20:50
* @author: WuShuxian
* @param:
* @return:
*/
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;
PendingIntent pendingIntent;
//如果同步不成功那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象
//如果同步成功那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), 0);
@ -81,7 +97,14 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
//pendingIntent);
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
/**
* @method doInBackground
* @description: 线
* @date: 2023/12/24 20:51
* @author: WuShuxian
* @param:
* @return:
*/
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
@ -89,6 +112,14 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
return mTaskManager.sync(mContext, this);
}
/**
* @method onProgressUpdate
* @description: 使 线
* @date: 2023/12/24 20:51
* @author: WuShuxian
* @param:
* @return:
*/
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
@ -97,6 +128,14 @@ public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
}
}
/**
* @method onPostExecute
* @description: Handler UI使doInBackground UI
* @date: 2023/12/24 20:51
* @author: WuShuxian
* @param:
* @return:
*/
@Override
protected void onPostExecute(Integer result) {
if (result == GTaskManager.STATE_SUCCESS) {

@ -60,7 +60,14 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
/**
* @Package: net.micode.notes.gtask.remote
* @ClassName: GTaskClient
* @Description: GTASKGTASK
* @Author: WuShuxian
* @CreateDate: 2023/12/24 20:55
* @Version: 1.0
*/
public class GTaskClient {
private static final String TAG = GTaskClient.class.getSimpleName();
@ -90,6 +97,12 @@ public class GTaskClient {
private JSONArray mUpdateArray;
/**
* @method GTaskClient
* @description:
* @date: 2023/12/24 20:56
* @author: WuShuxian
*/
private GTaskClient() {
mHttpClient = null;
mGetUrl = GTASK_GET_URL;
@ -108,35 +121,40 @@ public class GTaskClient {
}
return mInstance;
}
/**
* @method login
* @description: 使URL使URL
* @date: 2023/12/24 21:15
* @author: WuShuxian
* @param: activity
* @return: boolean
*/
public boolean login(Activity activity) {
// we suppose that the cookie would expire after 5 minutes
// then we need to re-login
//判断距离最后一次登录操作是否超过5分钟
final long interval = 1000 * 60 * 5;
if (mLastLoginTime + interval < System.currentTimeMillis()) {
mLoggedin = false;
}
// need to re-login after account switch
// 重新登陆操作
if (mLoggedin
&& !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity
.getSyncAccountName(activity))) {
mLoggedin = false;
}
//如果没超过时间,则不需要重新登录
if (mLoggedin) {
Log.d(TAG, "already logged in");
return true;
}
mLastLoginTime = System.currentTimeMillis();
String authToken = loginGoogleAccount(activity, false);
mLastLoginTime = System.currentTimeMillis();//更新最后登录时间为系统当前的时间
String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户
if (authToken == null) {
Log.e(TAG, "login google account failed");
return false;
}
// login with custom domain if necessary
if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase()
.endsWith("googlemail.com"))) {
StringBuilder url = new StringBuilder(GTASK_URL).append("a/");
@ -150,8 +168,7 @@ public class GTaskClient {
mLoggedin = true;
}
}
// try to login with google official url
//如果用户账户无法登录则使用谷歌官方的URI进行登录
if (!mLoggedin) {
mGetUrl = GTASK_GET_URL;
mPostUrl = GTASK_POST_URL;
@ -163,7 +180,14 @@ public class GTaskClient {
mLoggedin = true;
return true;
}
/**
* @method loginGoogleAccount
* @description:
* @date: 2023/12/24 23:07
* @author: WuShuxian
* @param: activity
* @return: String
*/
private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
String authToken;
AccountManager accountManager = AccountManager.get(activity);
@ -176,6 +200,7 @@ public class GTaskClient {
String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
Account account = null;
//遍历获得的accounts信息寻找已经记录过的账户信息
for (Account a : accounts) {
if (a.name.equals(accountName)) {
account = a;
@ -189,7 +214,7 @@ public class GTaskClient {
return null;
}
// get the token now
//获取令牌
AccountManagerFuture<Bundle> accountManagerFuture = accountManager.getAuthToken(account,
"goanna_mobile", null, activity, null, null);
try {
@ -206,11 +231,16 @@ public class GTaskClient {
return authToken;
}
/**
* @method tryToLoginGtask
* @description: GtaskGTask,
* @date: 2023/12/24 21:01
* @author: WuShuxian
* @param:
* @return:
*/
private boolean tryToLoginGtask(Activity activity, String authToken) {
if (!loginGtask(authToken)) {
// maybe the auth token is out of date, now let's invalidate the
// token and try again
authToken = loginGoogleAccount(activity, true);
if (authToken == null) {
Log.e(TAG, "login google account failed");
@ -224,26 +254,33 @@ public class GTaskClient {
}
return true;
}
/**
* @method loginGtask
* @description:
* @date: 2023/12/24 21:05
* @author: WuShuxian
* @param:
* @return:
*/
private boolean loginGtask(String authToken) {
int timeoutConnection = 10000;
int timeoutSocket = 15000;
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口
HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间
mHttpClient = new DefaultHttpClient(httpParameters);
BasicCookieStore localBasicCookieStore = new BasicCookieStore();
mHttpClient.setCookieStore(localBasicCookieStore);
HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false);
// login gtask
//登录操作
try {
String loginUrl = mGetUrl + "?auth=" + authToken;
HttpGet httpGet = new HttpGet(loginUrl);
String loginUrl = mGetUrl + "?auth=" + authToken;//设置登录的URL
HttpGet httpGet = new HttpGet(loginUrl);//通过登录的uri实例化网页上资源的查找
HttpResponse response = null;
response = mHttpClient.execute(httpGet);
// get the cookie now
//获取CookieStore里存放的cookie,如果存有“GTL”则cookie有效
List<Cookie> cookies = mHttpClient.getCookieStore().getCookies();
boolean hasAuthCookie = false;
for (Cookie cookie : cookies) {
@ -255,7 +292,7 @@ public class GTaskClient {
Log.w(TAG, "it seems that there is no auth cookie");
}
// get the client version
//获取client的内容
String resString = getResponseContent(response.getEntity());
String jsBegin = "_setup(";
String jsEnd = ")}</script>";
@ -272,7 +309,6 @@ public class GTaskClient {
e.printStackTrace();
return false;
} catch (Exception e) {
// simply catch all exceptions
Log.e(TAG, "httpget gtask_url failed");
return false;
}
@ -283,14 +319,24 @@ public class GTaskClient {
private int getActionId() {
return mActionId++;
}
/**
* @method createHttpPost
* @description:
* @date: 2023/12/24 23:13
* @author: WuShuxian
*/
private HttpPost createHttpPost() {
HttpPost httpPost = new HttpPost(mPostUrl);
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
httpPost.setHeader("AT", "1");
return httpPost;
}
/**
* @method getResponseContent
* @description: URL
* @date: 2023/12/24 21:06
* @author: WuShuxian
*/
private String getResponseContent(HttpEntity entity) throws IOException {
String contentEncoding = null;
if (entity.getContentEncoding() != null) {
@ -322,13 +368,20 @@ public class GTaskClient {
input.close();
}
}
/**
* @method postRequest
* @description: Json
* @date: 2023/12/24 21:07
* @author: WuShuxian
* @param: js
* @return:
*/
private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
throw new ActionFailureException("not logged in");
}
//实例化一个httpPost的对象用来向服务器传输数据在这里就是发送请求而请求的内容在js里
HttpPost httpPost = createHttpPost();
try {
LinkedList<BasicNameValuePair> list = new LinkedList<BasicNameValuePair>();
@ -336,9 +389,8 @@ public class GTaskClient {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpPost.setEntity(entity);
// execute the post
HttpResponse response = mHttpClient.execute(httpPost);
String jsString = getResponseContent(response.getEntity());
String jsString = getResponseContent(response.getEntity());//得到返回的数据和资源
return new JSONObject(jsString);
} catch (ClientProtocolException e) {
@ -359,21 +411,25 @@ public class GTaskClient {
throw new ActionFailureException("error occurs when posting request");
}
}
/**
* @method createTask
* @description:
* @date: 2023/12/24 21:08
* @author: WuShuxian
* @param: task
* @return: void
*/
public void createTask(Task task) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
// action_list
actionList.put(task.getCreateAction(getActionId()));
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
// client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
// post
JSONObject jsResponse = postRequest(jsPost);
JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
@ -385,25 +441,29 @@ public class GTaskClient {
throw new ActionFailureException("create task: handing jsonobject failed");
}
}
/**
* @method createTaskList
* @description: createTasktasklistgid
* @date: 2023/12/24 21:09
* @author: WuShuxian
* @param: tasklist
* @return: void
*/
public void createTaskList(TaskList tasklist) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
// action_list
actionList.put(tasklist.getCreateAction(getActionId()));
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
// client version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
// post
JSONObject jsResponse = postRequest(jsPost);
JSONObject jsResponse = postRequest(jsPost);//得到任务的返回信息
JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));//设置task的new_id
} catch (JSONException e) {
Log.e(TAG, e.toString());
@ -417,10 +477,8 @@ public class GTaskClient {
try {
JSONObject jsPost = new JSONObject();
// action_list
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray);
// client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
postRequest(jsPost);
@ -432,11 +490,17 @@ public class GTaskClient {
}
}
}
/**
* @method addUpdateNode
* @description:
* @date: 2023/12/24 23:19
* @author: WuShuxian
* @param: node
* @return: void
*/
public void addUpdateNode(Node node) throws NetworkFailureException {
if (node != null) {
// too many update items may result in an error
// set max to 10 items
//设置更新同步项目数量上限10
if (mUpdateArray != null && mUpdateArray.length() > 10) {
commitUpdate();
}
@ -446,7 +510,14 @@ public class GTaskClient {
mUpdateArray.put(node.getUpdateAction(getActionId()));
}
}
/**
* @method moveTask
* @description: task,tasktask
* @date: 2023/12/24 23:19
* @author: WuShuxian
* @param: taskpreParentcurParent
* @return: void
*/
public void moveTask(Task task, TaskList preParent, TaskList curParent)
throws NetworkFailureException {
commitUpdate();
@ -455,26 +526,22 @@ public class GTaskClient {
JSONArray actionList = new JSONArray();
JSONObject action = new JSONObject();
// action_list
// 动作序列
action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE);
action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid());
if (preParent == curParent && task.getPriorSibling() != null) {
// put prioring_sibing_id only if moving within the tasklist and
// it is not the first one
action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());
action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());//设置优先级ID只有当移动是发生在文件中
}
action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid());
action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid());
if (preParent != curParent) {
// put the dest_list only if moving between tasklists
action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());
action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());//仅当在任务列表之间移动时才放入dest_list
}
actionList.put(action);
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);//将ACTION_LIST加入到jsPost中
// client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
postRequest(jsPost);
@ -485,22 +552,27 @@ public class GTaskClient {
throw new ActionFailureException("move task: handing jsonobject failed");
}
}
/**
* @method deleteNode
* @description:
* @date: 2023/12/24 23:22
* @author: WuShuxian
* @param: node
* @return: void
*/
public void deleteNode(Node node) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
// action_list
node.setDeleted(true);
actionList.put(node.getUpdateAction(getActionId()));
actionList.put(node.getUpdateAction(getActionId()));//获取删除操作的ID加入actionLiast
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
// client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
postRequest(jsPost);
postRequest(jsPost);//使用postRequest发送删除后的结果
mUpdateArray = null;
} catch (JSONException e) {
Log.e(TAG, e.toString());
@ -508,7 +580,14 @@ public class GTaskClient {
throw new ActionFailureException("delete node: handing jsonobject failed");
}
}
/**
* @method getTaskLists
* @description:
* @date: 2023/12/24 23:24
* @author: WuShuxian
* @param: void
* @return:
*/
public JSONArray getTaskLists() throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
@ -520,8 +599,8 @@ public class GTaskClient {
HttpResponse response = null;
response = mHttpClient.execute(httpGet);
// get the task list
String resString = getResponseContent(response.getEntity());
// 获取任务列表把筛选出的字符串放入jsString
String resString = getResponseContent(response.getEntity());//从网上获取数据
String jsBegin = "_setup(";
String jsEnd = ")}</script>";
int begin = resString.indexOf(jsBegin);
@ -546,7 +625,14 @@ public class GTaskClient {
throw new ActionFailureException("get task lists: handing jasonobject failed");
}
}
/**
* @method getTaskList
* @description: TASKListgid,
* @date: 2023/12/24 23:28
* @author: WuShuxian
* @param: listGid
* @return:
*/
public JSONArray getTaskList(String listGid) throws NetworkFailureException {
commitUpdate();
try {
@ -554,7 +640,6 @@ public class GTaskClient {
JSONArray actionList = new JSONArray();
JSONObject action = new JSONObject();
// action_list
action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL);
action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
@ -563,7 +648,6 @@ public class GTaskClient {
actionList.put(action);
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
// client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
JSONObject jsResponse = postRequest(jsPost);

@ -47,7 +47,14 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
/**
* @Package: net.micode.notes.gtask.remote
* @ClassName: GTaskManager
* @Description:
* @Author: WuShuxian
* @CreateDate: 2023/12/24 21:13
* @Version: 1.0
*/
public class GTaskManager {
private static final String TAG = GTaskManager.class.getSimpleName();
@ -86,10 +93,17 @@ public class GTaskManager {
private HashMap<String, Long> mGidToNid;
private HashMap<Long, String> mNidToGid;
/**
* @method GTaskManager
* @description:
* @date: 2023/12/24 23:30
* @author: WuShuxian
* @param: void
* @return: void
*/
private GTaskManager() {
mSyncing = false;
mCancelled = false;
mSyncing = false;//正在同步,flase代表未执行
mCancelled = false;//全局标识flase代表可以执行
mGTaskListHashMap = new HashMap<String, TaskList>();
mGTaskHashMap = new HashMap<String, Node>();
mMetaHashMap = new HashMap<String, MetaData>();
@ -98,7 +112,14 @@ public class GTaskManager {
mGidToNid = new HashMap<String, Long>();
mNidToGid = new HashMap<Long, String>();
}
/**
* @method getInstance
* @description: synchronized线
* @date: 2023/12/24 23:31
* @author: WuShuxian
* @param: void
* @return: GTaskManager
*/
public static synchronized GTaskManager getInstance() {
if (mInstance == null) {
mInstance = new GTaskManager();
@ -107,10 +128,17 @@ public class GTaskManager {
}
public synchronized void setActivityContext(Activity activity) {
// used for getting authtoken
mActivity = activity;
}
/**
* @method sync
* @description:
* @date: 2023/12/24 23:32
* @author: WuShuxian
* @param: context
* asyncTask
* @return: int
*/
public int sync(Context context, GTaskASyncTask asyncTask) {
if (mSyncing) {
Log.d(TAG, "Sync is in progress");
@ -127,8 +155,9 @@ public class GTaskManager {
mGidToNid.clear();
mNidToGid.clear();
//进行同步操作,并作异常处理:网络异常、操作异常
try {
GTaskClient client = GTaskClient.getInstance();
GTaskClient client = GTaskClient.getInstance();//创建一个实例client
client.resetUpdateArray();
// login google task
@ -139,18 +168,19 @@ public class GTaskManager {
}
// get the task list from google
//从google获取task list
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list));
initGTaskList();
// do content sync work
//进行同步操作
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));
syncContent();
} catch (NetworkFailureException e) {
Log.e(TAG, e.toString());
return STATE_NETWORK_ERROR;
return STATE_NETWORK_ERROR;//网络异常
} catch (ActionFailureException e) {
Log.e(TAG, e.toString());
return STATE_INTERNAL_ERROR;
return STATE_INTERNAL_ERROR;//操作异常
} catch (Exception e) {
Log.e(TAG, e.toString());
e.printStackTrace();
@ -167,7 +197,14 @@ public class GTaskManager {
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
}
/**
* @method initGTaskList
* @description: GtaskListGoogleJSONtasklistTaskList
* @date: 2023/12/24 23:39
* @author: WuShuxian
* @param:
* @return:
*/
private void initGTaskList() throws NetworkFailureException {
if (mCancelled)
return;
@ -175,7 +212,7 @@ public class GTaskManager {
try {
JSONArray jsTaskLists = client.getTaskLists();
// init meta list first
//初始化元列表
mMetaList = null;
for (int i = 0; i < jsTaskLists.length(); i++) {
JSONObject object = jsTaskLists.getJSONObject(i);

Loading…
Cancel
Save