diff --git a/README.md b/README.md
deleted file mode 100644
index e784bed..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-what can i say
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/.gitignore b/zz_code/gtask/data/.idea/.gitignore
deleted file mode 100644
index 01b5f8c..0000000
--- a/zz_code/gtask/data/.idea/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-# 默认忽略的文件
-/shelf/
-/workspace.xml
-# 基于编辑器的 HTTP 客户端请求
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
-# GitHub Copilot persisted chat sessions
-/copilot/chatSessions
diff --git a/zz_code/gtask/data/.idea/misc.xml b/zz_code/gtask/data/.idea/misc.xml
deleted file mode 100644
index 639900d..0000000
--- a/zz_code/gtask/data/.idea/misc.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/modules.xml b/zz_code/gtask/data/.idea/modules.xml
deleted file mode 100644
index 9db1d29..0000000
--- a/zz_code/gtask/data/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/2/9/299b8fefb8e07955453bf475fb724aefbb521c56 b/zz_code/gtask/data/.idea/sonarlint/issuestore/2/9/299b8fefb8e07955453bf475fb724aefbb521c56
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/6/c/6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd b/zz_code/gtask/data/.idea/sonarlint/issuestore/6/c/6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd
deleted file mode 100644
index 6ceb1d7..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/6/c/6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd
+++ /dev/null
@@ -1,17 +0,0 @@
-
-u
-java:S2293"YReplace the type specification in this constructor call with the diamond operator ("<>").(
-u
-java:S2293"YReplace the type specification in this constructor call with the diamond operator ("<>").(
-u
-java:S2293"YReplace the type specification in this constructor call with the diamond operator ("<>").(
-
-java:S1598"This file "SqlNote.java" should be located in "net\micode\notes\gtask\data" directory, not in "E:\software\java\zz_code\gtask\data".(
-2
-java:S2386/"Make this member "protected".(u
-n
-java:S3776"RRefactor this method to reduce its Cognitive Complexity from 91 to the 15 allowed.(
-h
-java:S3776"RRefactor this method to reduce its Cognitive Complexity from 32 to the 15 allowed.(
-
-java:S6541"A "Brain Method" was detected. Refactor it to reduce at least one of the following metrics: LOC from 116 to 64, Complexity from 51 to 14, Nesting Level from 6 to 2, Number of Variables from 23 to 6.(
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/a/8/a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04 b/zz_code/gtask/data/.idea/sonarlint/issuestore/a/8/a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04
deleted file mode 100644
index 8756022..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/a/8/a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04
+++ /dev/null
@@ -1,7 +0,0 @@
-
-t
-java:S2293+"YReplace the type specification in this constructor call with the diamond operator ("<>").(ʩ
-
-java:S1598"This file "TaskList.java" should be located in "net\micode\notes\gtask\data" directory, not in "E:\software\java\zz_code\gtask\data".(
-r
-java:S3923"[Remove this conditional structure or edit its code blocks so that they're not all the same.(ԡ
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/e/d/ed02129552b2e83baf49343541491561975ba1ea b/zz_code/gtask/data/.idea/sonarlint/issuestore/e/d/ed02129552b2e83baf49343541491561975ba1ea
deleted file mode 100644
index 52cf303..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/e/d/ed02129552b2e83baf49343541491561975ba1ea
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-java:S1598"This file "Node.java" should be located in "net\micode\notes\gtask\data" directory, not in "E:\software\java\zz_code\gtask\data".(
-O
-java:S59933"9Change the visibility of this constructor to "protected".(
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/f/9/f97a970974b4caa5a4cebaa56b3baae5059b6324 b/zz_code/gtask/data/.idea/sonarlint/issuestore/f/9/f97a970974b4caa5a4cebaa56b3baae5059b6324
deleted file mode 100644
index 02c7a1e..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/f/9/f97a970974b4caa5a4cebaa56b3baae5059b6324
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-java:S1598"This file "SqlData.java" should be located in "net\micode\notes\gtask\data" directory, not in "E:\software\java\zz_code\gtask\data".(
-2
-java:S2386/"Make this member "protected".(X
-8 java:S131""Add a default case to this switch.(Ӂ
-n
-java:S3776"RRefactor this method to reduce its Cognitive Complexity from 16 to the 15 allowed.(
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/f/a/fa2ac87563a7f02291ea933ffc96fff7ca749e80 b/zz_code/gtask/data/.idea/sonarlint/issuestore/f/a/fa2ac87563a7f02291ea933ffc96fff7ca749e80
deleted file mode 100644
index ddea60e..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/f/a/fa2ac87563a7f02291ea933ffc96fff7ca749e80
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-java:S1598"This file "MetaData.java" should be located in "net\micode\notes\gtask\data" directory, not in "E:\software\java\zz_code\gtask\data".(
-[
-java:S1124"EReorder the modifiers to comply with the Java Language Specification.(
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/issuestore/index.pb b/zz_code/gtask/data/.idea/sonarlint/issuestore/index.pb
deleted file mode 100644
index 4eff3c4..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/issuestore/index.pb
+++ /dev/null
@@ -1,13 +0,0 @@
-
-=
-
MetaData.java,f\a\fa2ac87563a7f02291ea933ffc96fff7ca749e80
-9
- Node.java,e\d\ed02129552b2e83baf49343541491561975ba1ea
-<
-SqlData.java,f\9\f97a970974b4caa5a4cebaa56b3baae5059b6324
-<
-SqlNote.java,6\c\6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd
-9
- Task.java,2\9\299b8fefb8e07955453bf475fb724aefbb521c56
-=
-
TaskList.java,a\8\a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/2/9/299b8fefb8e07955453bf475fb724aefbb521c56 b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/2/9/299b8fefb8e07955453bf475fb724aefbb521c56
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/6/c/6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/6/c/6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/a/8/a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04 b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/a/8/a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/e/d/ed02129552b2e83baf49343541491561975ba1ea b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/e/d/ed02129552b2e83baf49343541491561975ba1ea
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/f/9/f97a970974b4caa5a4cebaa56b3baae5059b6324 b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/f/9/f97a970974b4caa5a4cebaa56b3baae5059b6324
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/f/a/fa2ac87563a7f02291ea933ffc96fff7ca749e80 b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/f/a/fa2ac87563a7f02291ea933ffc96fff7ca749e80
deleted file mode 100644
index e69de29..0000000
diff --git a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/index.pb b/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/index.pb
deleted file mode 100644
index 4eff3c4..0000000
--- a/zz_code/gtask/data/.idea/sonarlint/securityhotspotstore/index.pb
+++ /dev/null
@@ -1,13 +0,0 @@
-
-=
-
MetaData.java,f\a\fa2ac87563a7f02291ea933ffc96fff7ca749e80
-9
- Node.java,e\d\ed02129552b2e83baf49343541491561975ba1ea
-<
-SqlData.java,f\9\f97a970974b4caa5a4cebaa56b3baae5059b6324
-<
-SqlNote.java,6\c\6cb06ae04ce8f51c8bb9004d1daa08b7819cabcd
-9
- Task.java,2\9\299b8fefb8e07955453bf475fb724aefbb521c56
-=
-
TaskList.java,a\8\a8f9d13ce198840c1f6a37c4e30b69f5d3e9ab04
\ No newline at end of file
diff --git a/zz_code/gtask/data/.idea/vcs.xml b/zz_code/gtask/data/.idea/vcs.xml
deleted file mode 100644
index c2365ab..0000000
--- a/zz_code/gtask/data/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/zz_code/gtask/data/SqlNote.java b/zz_code/gtask/data/SqlNote.java
deleted file mode 100644
index b631785..0000000
--- a/zz_code/gtask/data/SqlNote.java
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.appwidget.AppWidgetManager;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-import net.micode.notes.tool.ResourceParser;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-
-//定义一个类,类名为SqlNote,作用:处理便签数据
-public class SqlNote {
- //定义一个字符串,表示类名
- private static final String TAG = SqlNote.class.getSimpleName();
- //定义一个整型变量,表示无效ID
- private static final int INVALID_ID = -99999;
- //定义一个字符串数组,表示便签的列名
- 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,
- NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE,
- NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID,
- NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,
- NoteColumns.VERSION
- };
- //定义一个整型变量,表示ID列
- public static final int ID_COLUMN = 0;
- //定义一个整型变量,表示提醒日期列
- public static final int ALERTED_DATE_COLUMN = 1;
- // 定义一个整型变量,表示背景颜色ID列
- public static final int BG_COLOR_ID_COLUMN = 2;
- //定义一个整型变量,表示创建日期列
- public static final int CREATED_DATE_COLUMN = 3;
- //定义一个整型变量,表示是否有附件列
- public static final int HAS_ATTACHMENT_COLUMN = 4;
- //定义一个整型变量,表示修改日期列
- public static final int MODIFIED_DATE_COLUMN = 5;
- //定义一个整型变量,表示便签数量列
- public static final int NOTES_COUNT_COLUMN = 6;
- //定义一个整型变量,表示父ID列
- public static final int PARENT_ID_COLUMN = 7;
- //定义一个整型变量,表示摘要列
- public static final int SNIPPET_COLUMN = 8;
- //定义一个整型变量,表示类型列
- public static final int TYPE_COLUMN = 9;
- //定义一个整型变量,表示小部件ID列
- public static final int WIDGET_ID_COLUMN = 10;
- //定义一个整型变量,表示小部件类型列
- public static final int WIDGET_TYPE_COLUMN = 11;
- //定义一个整型变量,表示同步ID列
- public static final int SYNC_ID_COLUMN = 12;
- //定义一个整型变量,表示本地修改列
- public static final int LOCAL_MODIFIED_COLUMN = 13;
- //定义一个整型变量,表示原始父ID列
- public static final int ORIGIN_PARENT_ID_COLUMN = 14;
- //定义一个整型变量,表示GTask ID列
- public static final int GTASK_ID_COLUMN = 15;
- //定义一个整型变量,表示版本列
- public static final int VERSION_COLUMN = 16;
- //定义一个上下文对象
- private Context mContext;
- //定义一个内容解析器对象
- private ContentResolver mContentResolver;
- //定义一个布尔型变量,表示是否创建
- private boolean mIsCreate;
-
- private long mId;
-
- private long mAlertDate;
-
- private int mBgColorId;
-
- private long mCreatedDate;
-
- private int mHasAttachment;
-
- private long mModifiedDate;
-
- private long mParentId;
-
- private String mSnippet;
-
- private int mType;
-
- private int mWidgetId;
-
- private int mWidgetType;
-
- private long mOriginParent;
-
- private long mVersion;
-
- private ContentValues mDiffNoteValues;
-
- private ArrayList mDataList;
- //定义一个构造函数,参数为上下文对象 作用:初始化便签数据
- public SqlNote(Context context) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = true;
- mId = INVALID_ID;
- mAlertDate = 0;
- mBgColorId = ResourceParser.getDefaultBgId(context);
- mCreatedDate = System.currentTimeMillis();
- mHasAttachment = 0;
- mModifiedDate = System.currentTimeMillis();
- mParentId = 0;
- mSnippet = "";
- mType = Notes.TYPE_NOTE;
- mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
- mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
- mOriginParent = 0;
- mVersion = 0;
- mDiffNoteValues = new ContentValues();
- mDataList = new ArrayList();
- }
- //定义一个构造函数,参数为上下文对象和游标对象 作用:初始化便签数据
- public SqlNote(Context context, Cursor c) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = false;
- loadFromCursor(c);
- mDataList = new ArrayList();
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
- mDiffNoteValues = new ContentValues();
- }
- //定义一个构造函数,参数为上下文对象和ID 作用:初始化便签数据
- public SqlNote(Context context, long id) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = false;
- loadFromCursor(id);
- mDataList = new ArrayList();
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
- mDiffNoteValues = new ContentValues();
-
- }
- //定义一个方法,参数为JSONObject对象,返回值为布尔型 作用:设置便签内容
- private void loadFromCursor(long id) {
- Cursor c = null;
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)",
- new String[] {
- String.valueOf(id)
- }, null);
- if (c != null) {
- c.moveToNext();
- loadFromCursor(c);
- } else {
- Log.w(TAG, "loadFromCursor: cursor = null");
- }
- } finally {
- if (c != null)
- c.close();
- }
- }
- //定义一个方法,参数为游标对象 作用:从游标中加载数据
- private void loadFromCursor(Cursor c) {
- mId = c.getLong(ID_COLUMN);
- mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
- mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);
- mCreatedDate = c.getLong(CREATED_DATE_COLUMN);
- mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN);
- mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN);
- mParentId = c.getLong(PARENT_ID_COLUMN);
- mSnippet = c.getString(SNIPPET_COLUMN);
- mType = c.getInt(TYPE_COLUMN);
- mWidgetId = c.getInt(WIDGET_ID_COLUMN);
- mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
- mVersion = c.getLong(VERSION_COLUMN);
- }
- //定义一个方法,参数为游标对象 作用:从游标中加载数据
- private void loadDataContent() {
- Cursor c = null;
- mDataList.clear();
- try {
- //查询数据表
- c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,
- "(note_id=?)", new String[] {
- String.valueOf(mId)
- }, null);
- if (c != null) {//如果游标不为空,则遍历游标
- if (c.getCount() == 0) {
- Log.w(TAG, "it seems that the note has not data");
- return;
- }//如果游标的数量为0,则打印日志信息
- while (c.moveToNext()) {
- SqlData data = new SqlData(mContext, c);
- mDataList.add(data);
- }
- } else { //如果游标为空,则打印日志信息
- Log.w(TAG, "loadDataContent: cursor = null");
- }
- } finally {//关闭游标
- if (c != null)
- c.close();
- }
- }
- //定义一个方法,参数为JSONObject对象,返回值为布尔型 作用:设置内容
- public boolean setContent(JSONObject js) {
- try {//捕获异常
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
- Log.w(TAG, "cannot set system folder");
- } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {
- //对于文件夹,我们只能更新 snnipet 并键入
- String snippet = note.has(NoteColumns.SNIPPET) ? note
- .getString(NoteColumns.SNIPPET) : "";
- if (mIsCreate || !mSnippet.equals(snippet)) {
- mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
- }
- mSnippet = snippet;
- //对于文件夹,我们只能更新类型
- int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
- : Notes.TYPE_NOTE;
- //如果是创建或者类型不同,则将类型放入差异便签值中
- if (mIsCreate || mType != type) {
- mDiffNoteValues.put(NoteColumns.TYPE, type);
- }
- mType = type;
- //对于文件夹,我们只能更新小部件类型
- } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
- long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID;
- if (mIsCreate || mId != id) {
- mDiffNoteValues.put(NoteColumns.ID, id);
- }
- mId = id;
- //如果是创建或者提醒日期不同,则将提醒日期放入差异便签值中
- long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note
- .getLong(NoteColumns.ALERTED_DATE) : 0;
- if (mIsCreate || mAlertDate != alertDate) {
- mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate);
- }
- mAlertDate = alertDate;
- //如果是创建或者背景颜色ID不同,则将背景颜色ID放入差异便签值中
- int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note
- .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext);
- if (mIsCreate || mBgColorId != bgColorId) {
- mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId);
- }
- mBgColorId = bgColorId;
- //如果是创建或者创建日期不同,则将创建日期放入差异便签值中
- long createDate = note.has(NoteColumns.CREATED_DATE) ? note
- .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis();
- if (mIsCreate || mCreatedDate != createDate) {//如果是创建或者创建日期不同,则将创建日期放入差异便签值中
- mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate);
- }
- mCreatedDate = createDate;
- //如果是创建或者是否有附件不同,则将是否有附件放入差异便签值中
- int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note
- .getInt(NoteColumns.HAS_ATTACHMENT) : 0;
- if (mIsCreate || mHasAttachment != hasAttachment) {
- mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment);
- }
- mHasAttachment = hasAttachment;
- //如果是创建或者修改日期不同,则将修改日期放入差异便签值中
- long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note
- .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis();
- if (mIsCreate || mModifiedDate != modifiedDate) {
- mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate);
- }
- mModifiedDate = modifiedDate;
- //如果是创建或者父ID不同,则将父ID放入差异便签值中
- long parentId = note.has(NoteColumns.PARENT_ID) ? note
- .getLong(NoteColumns.PARENT_ID) : 0;
- if (mIsCreate || mParentId != parentId) {
- mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId);
- }
- mParentId = parentId;
- //如果是创建或者摘要不同,则将摘要放入差异便签值中
- String snippet = note.has(NoteColumns.SNIPPET) ? note
- .getString(NoteColumns.SNIPPET) : "";
- if (mIsCreate || !mSnippet.equals(snippet)) {
- mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
- }
- mSnippet = snippet;
- //如果是创建或者类型不同,则将类型放入差异便签值中
- int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
- : Notes.TYPE_NOTE;
- if (mIsCreate || mType != type) {
- mDiffNoteValues.put(NoteColumns.TYPE, type);
- }
- mType = type;
- //如果是创建或者小部件ID不同,则将小部件ID放入差异便签值中
- int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID)
- : AppWidgetManager.INVALID_APPWIDGET_ID;
- if (mIsCreate || mWidgetId != widgetId) {
- mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId);
- }
- mWidgetId = widgetId;
- //如果是创建或者小部件类型不同,则将小部件类型放入差异便签值中
- int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note
- .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE;
- if (mIsCreate || mWidgetType != widgetType) {
- mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType);
- }
- mWidgetType = widgetType;
-
- long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note
- .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0;
- if (mIsCreate || mOriginParent != originParent) {
- mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent);
- }
- mOriginParent = originParent;
- //如果是创建或者GTask ID不同,则将GTask ID放入差异便签值中,否则将GTask ID放入差异便签值中
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- SqlData sqlData = null;
- if (data.has(DataColumns.ID)) {
- long dataId = data.getLong(DataColumns.ID);
- for (SqlData temp : mDataList) {
- if (dataId == temp.getId()) {
- sqlData = temp;
- }
- }
- }
- //如果sqlData为空,则创建一个新的SqlData对象
- if (sqlData == null) {
- sqlData = new SqlData(mContext);
- mDataList.add(sqlData);
- }
-
- sqlData.setContent(data);
- }
- }
- //捕获异常,打印异常信息作用:设置内容
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return false;
- }
- return true;
- }
- //定义一个方法,返回JSONObject对象 作用:获取内容
- public JSONObject getContent() {
- try {
- JSONObject js = new JSONObject();
- //如果是创建,则打印日志信息
- if (mIsCreate) {
- Log.e(TAG, "it seems that we haven't created this in database yet");
- return null;
- }
- //创建一个JSONObject对象
- JSONObject note = new JSONObject();
- if (mType == Notes.TYPE_NOTE) {
- note.put(NoteColumns.ID, mId);
- note.put(NoteColumns.ALERTED_DATE, mAlertDate);
- note.put(NoteColumns.BG_COLOR_ID, mBgColorId);
- note.put(NoteColumns.CREATED_DATE, mCreatedDate);
- note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment);
- note.put(NoteColumns.MODIFIED_DATE, mModifiedDate);
- note.put(NoteColumns.PARENT_ID, mParentId);
- note.put(NoteColumns.SNIPPET, mSnippet);
- note.put(NoteColumns.TYPE, mType);
- note.put(NoteColumns.WIDGET_ID, mWidgetId);
- note.put(NoteColumns.WIDGET_TYPE, mWidgetType);
- note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
-
- JSONArray dataArray = new JSONArray();
- for (SqlData sqlData : mDataList) {
- JSONObject data = sqlData.getContent();
- if (data != null) {
- dataArray.put(data);
- }
- }
- js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
- //如果是文件夹,则打印日志信息
- } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {
- note.put(NoteColumns.ID, mId);
- note.put(NoteColumns.TYPE, mType);
- note.put(NoteColumns.SNIPPET, mSnippet);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
- }
-
- return js;
- //捕获异常,打印异常信息
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- return null;
- }
- //定义一个方法,返回JSONObject对象 作用:获取内容
- public void setParentId(long id) {
- mParentId = id;
- mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
- }
- //定义一个方法,返回JSONObject对象 作用:获取内容
- public void setGtaskId(String gid) {
- mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
- }
- //定义一个方法,返回JSONObject对象 作用:获取内容
- public void setSyncId(long syncId) {
- mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);
- }
- //定义一个方法,返回JSONObject对象 作用:获取内容
- public void resetLocalModified() {
- mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0);
- }
-
- public long getId() {
- return mId;
- }
-
- public long getParentId() {
- return mParentId;
- }
-
- public String getSnippet() {
- return mSnippet;
- }
-
- public boolean isNoteType() {
- return mType == Notes.TYPE_NOTE;
- }
- //定义一个方法,返回布尔型 作用:是否是文件夹类型
- public void commit(boolean validateVersion) {
- if (mIsCreate) {//如果是创建,则打印日志信息
- if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
- mDiffNoteValues.remove(NoteColumns.ID);
- }
- //如果是创建,则插入数据
- Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues);
- try {//捕获异常,打印异常信息
- mId = Long.valueOf(uri.getPathSegments().get(1));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Get note id error :" + e.toString());
- throw new ActionFailureException("create note failed");
- }
- if (mId == 0) {
- throw new IllegalStateException("Create thread id failed");
- }
- //如果是便签类型,则插入数据
- if (mType == Notes.TYPE_NOTE) {
- for (SqlData sqlData : mDataList) {
- sqlData.commit(mId, false, -1);
- }
- }
- //如果是文件夹类型,则打印日志信息
- } else {
- if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) {
- Log.e(TAG, "No such note");
- throw new IllegalStateException("Try to update note with invalid id");
- }
- //如果是便签类型,则更新数据
- if (mDiffNoteValues.size() > 0) {
- mVersion ++;
- int result = 0;
- if (!validateVersion) {
- result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
- + NoteColumns.ID + "=?)", new String[] {
- String.valueOf(mId)
- });
- } else {
- //如果是便签类型,则更新数据
- result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
- + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)",
- new String[] {
- String.valueOf(mId), String.valueOf(mVersion)
- });
- }
- //如果结果为0,则打印日志信息
- if (result == 0) {
- Log.w(TAG, "there is no update. maybe user updates note when syncing");
- }
- }
- //如果是便签类型,则更新数据
- if (mType == Notes.TYPE_NOTE) {
- for (SqlData sqlData : mDataList) {
- sqlData.commit(mId, validateVersion, mVersion);
- }
- }
- }
- //如果是便签类型,则打印日志信息
- // refresh local info
- loadFromCursor(mId);
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
- //如果是便签类型,则清空差异便签值
- mDiffNoteValues.clear();
- mIsCreate = false;
- }
-}
diff --git a/zz_code/gtask/data/Task.java b/zz_code/gtask/data/Task.java
deleted file mode 100644
index 07a3638..0000000
--- a/zz_code/gtask/data/Task.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.database.Cursor;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-//任务类,继承自Node类
-public class Task extends Node {
- //定义一个字符串,表示任务类的简单名称
- private static final String TAG = Task.class.getSimpleName();
- //定义一个布尔型变量,表示任务是否已完成
- private boolean mCompleted;
-
- private String mNotes;
-
- private JSONObject mMetaInfo;
-
- private Task mPriorSibling;
-
- private TaskList mParent;
- //定义一个整型变量,表示同步操作为更新本地
- public Task() {
- super();
- mCompleted = false;
- mNotes = null;
- mPriorSibling = null;
- mParent = null;
- mMetaInfo = null;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public JSONObject getCreateAction(int actionId) {
- JSONObject js = new JSONObject();
- // try catch语句,捕获异常
- 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");
- entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE,
- GTaskStringUtils.GTASK_JSON_TYPE_TASK);
- // notes,作用:获取任务的备注
- if (getNotes() != null) {
- entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
- }
- // deleted,作用:获取任务是否已删除
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
- // parent_id,作用:获取任务的父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());
- }
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate task-create jsonobject");
- }
-
- return js;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public JSONObject getUpdateAction(int actionId) {
- JSONObject js = new JSONObject();
- // try catch语句,捕获异常
- 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());
- // notes,作用:获取任务的备注
- if (getNotes() != null) {
- entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
- }
- entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
- //捕获异常
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate task-update jsonobject");
- }
-
- return js;
- }
- //定义一个整型变量,表示同步操作为更新本地
- 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));
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to get task content from jsonobject");
- }
- }
- }
- //定义一个整型变量,表示同步操作为更新本地
- public void setContentByLocalJSON(JSONObject js) {
- if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)
- || !js.has(GTaskStringUtils.META_HEAD_DATA)) {
- Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
- }
- // try catch语句,捕获异常
- try {
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
-
- if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) {
- Log.e(TAG, "invalid type");
- return;
- }
-
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {
- setName(data.getString(DataColumns.CONTENT));
- break;
- }
- }
- //捕获异常
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to get task content from jsonobject");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
- //定义一个整型变量,表示同步操作为更新本地
- public JSONObject getLocalJSONFromContent() {
- 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;
- }
- //创建一个JSONObject对象
- JSONObject js = new JSONObject();
- JSONObject note = new JSONObject();
- JSONArray dataArray = new JSONArray();
- JSONObject data = new JSONObject();
- data.put(DataColumns.CONTENT, name);
- dataArray.put(data);
- js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
- note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
- return js;
- } else {
-
- 同步任务
- JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
- //遍历JSONArray数组,获取数据
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {
- data.put(DataColumns.CONTENT, getName());
- break;
- }
- }
- //创建一个JSONObject对象
- note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
- return mMetaInfo;
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return null;
- }
- }
- //定义一个整型变量,表示同步操作为更新本地
- public void setMetaInfo(MetaData metaData) {
- // try catch语句,捕获异常
- if (metaData != null && metaData.getNotes() != null) {
- try {
- mMetaInfo = new JSONObject(metaData.getNotes());
- } catch (JSONException e) {
- Log.w(TAG, e.toString());
- mMetaInfo = null;
- }
- }
- }
- //定义一个整型变量,表示同步操作为更新本地
- public int getSyncAction(Cursor c) {
- try {
- JSONObject noteInfo = null;
- //判断JSONObject对象是否为空
- if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) {
- noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- }
- //判断Cursor对象是否为空
- if (noteInfo == null) {
- Log.w(TAG, "it seems that note meta has been deleted");
- return SYNC_ACTION_UPDATE_REMOTE;
- }
- //判断JSONObject对象是否包含指定的键
- if (!noteInfo.has(NoteColumns.ID)) {
- Log.w(TAG, "remote note id seems to be deleted");
- return SYNC_ACTION_UPDATE_LOCAL;
- }
- //判断Cursor对象是否包含指定的列
- // validate the note id now
- if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) {
- Log.w(TAG, "note id doesn't match");
- return SYNC_ACTION_UPDATE_LOCAL;
- }
- //判断Cursor对象是否包含指定的列
- 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;
- }
- // Cursor对象是否包含指定的列
- } 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;
- }
- // Cursor对象是否包含指定的列,获取任务的最后修改时间
- if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // local modification only
- return SYNC_ACTION_UPDATE_REMOTE;
- } else {
- return SYNC_ACTION_UPDATE_CONFLICT;
- }
- }
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
-
- return SYNC_ACTION_ERROR;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public boolean isWorthSaving() {
- 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;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public void setPriorSibling(Task priorSibling) {
- this.mPriorSibling = priorSibling;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public void setParent(TaskList parent) {
- this.mParent = parent;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public boolean getCompleted() {
- return this.mCompleted;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public String getNotes() {
- return this.mNotes;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public Task getPriorSibling() {
- return this.mPriorSibling;
- }
- //定义一个整型变量,表示同步操作为更新本地
- public TaskList getParent() {
- return this.mParent;
- }
-
-}
diff --git a/zz_code/gtask/data/data.iml b/zz_code/gtask/data/data.iml
deleted file mode 100644
index 5278d65..0000000
--- a/zz_code/gtask/data/data.iml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/zz_code/gtask/exception/ActionFailureException.java b/zz_code/gtask/exception/ActionFailureException.java
deleted file mode 100644
index 1617271..0000000
--- a/zz_code/gtask/exception/ActionFailureException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.exception;
-
-public class ActionFailureException extends RuntimeException {
- //定义一个长整型变量,表示序列化版本号
- private static final long serialVersionUID = 4425249765923293627L;
-
- //构造函数,无参数
- public ActionFailureException() {
- super();
- }
-
- //构造函数,参数为字符串
- public ActionFailureException(String paramString) {
- super(paramString);
- }
-
- //构造函数,参数为字符串和Throwable对象
- public ActionFailureException(String paramString, Throwable paramThrowable) {
- super(paramString, paramThrowable);
- }
-}
diff --git a/zz_code/gtask/exception/NetworkFailureException.java b/zz_code/gtask/exception/NetworkFailureException.java
deleted file mode 100644
index 60e6bf9..0000000
--- a/zz_code/gtask/exception/NetworkFailureException.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.exception;
-
-public class NetworkFailureException extends Exception {
- //定义一个长整型变量,表示序列化版本号
- private static final long serialVersionUID = 2107610287180234136L;
-
- //构造函数,无参数
- public NetworkFailureException() {
- super();
- }
-
- //构造函数,参数为字符串
- public NetworkFailureException(String paramString) {
- super(paramString);
- }
-
- //构造函数,参数为字符串和Throwable对象
- public NetworkFailureException(String paramString, Throwable paramThrowable) {
- super(paramString, paramThrowable);
- }
-}
diff --git a/zz_code/gtask/remote/GTaskASyncTask.java b/zz_code/gtask/remote/GTaskASyncTask.java
deleted file mode 100644
index b5c10a1..0000000
--- a/zz_code/gtask/remote/GTaskASyncTask.java
+++ /dev/null
@@ -1,140 +0,0 @@
-//GTask异步任务,方法包括任务同步和取消,显示同步任务的进程、通知和结果
-///*异步操作类,实现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
-
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-//引入工具类
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncTask;
-
-import net.micode.notes.R;
-import net.micode.notes.ui.NotesListActivity;
-import net.micode.notes.ui.NotesPreferenceActivity;
-
-// GTask异步任务类,继承自Android的AsyncTask类
-public class GTaskASyncTask extends AsyncTask {
-
- // 定义同步通知的唯一ID
- private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
-
- // 定义同步完成的监听器接口
- public interface OnCompleteListener {
- void onComplete();
- }//定义一个接口,接口名OnCompleteListener,参数类型为void,返回类型为void
- //接口不提供具体实现,一个个接口可以有多个实现类,一个类可以继承多个接口,实现多态
-
- //GTaskASyncTask类中实例化的Context对象
- private Context mContext;//上下文对象
-
- private NotificationManager mNotifiManager;//通知管理器
-
- private GTaskManager mTaskManager;//GTaskManager对象,用于处理同步任务
-
- private OnCompleteListener mOnCompleteListener;//同步完成的监听器
-
- //构造函数,参数为Context对象和OnCompleteListener接口的实现类对象
- public GTaskASyncTask(Context context, OnCompleteListener listener) {
- mContext = context;
- mOnCompleteListener = listener;
- mNotifiManager = (NotificationManager) mContext
- .getSystemService(Context.NOTIFICATION_SERVICE);
- mTaskManager = GTaskManager.getInstance();
- }
-
- //定义方法:取消同步任务
- public void cancelSync() {
- mTaskManager.cancelSync();
- }
-
- //定义方法:显示进度
- public void publishProgess(String message) {
- publishProgress(new String[] {
- message
- });
- }
-
- //定义方法:显示通知
- 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;
- if (tickerId != R.string.ticker_success) {
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesPreferenceActivity.class), 0);
-
- } else {
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesListActivity.class), 0);
- }
- notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
- pendingIntent);
- mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
- }
-
- //重写异步操作类,在后台执行同步任务
- @Override
- protected Integer doInBackground(Void... unused) {
- publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
- .getSyncAccountName(mContext)));
- return mTaskManager.sync(mContext, this);
- }
-
- //重写异步操作类,更新同步进度
- @Override
- protected void onProgressUpdate(String... progress) {
- showNotification(R.string.ticker_syncing, progress[0]);
- if (mContext instanceof GTaskSyncService) {
- ((GTaskSyncService) mContext).sendBroadcast(progress[0]);
- }
- }
-
- //重写异步操作类,同步任务完成后执行
- @Override
- protected void onPostExecute(Integer result) {
- if (result == GTaskManager.STATE_SUCCESS) {
- showNotification(R.string.ticker_success, mContext.getString(
- R.string.success_sync_account, mTaskManager.getSyncAccount()));
- NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
- } else if (result == GTaskManager.STATE_NETWORK_ERROR) {
- showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
- } else if (result == GTaskManager.STATE_INTERNAL_ERROR) {
- showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
- } else if (result == GTaskManager.STATE_SYNC_CANCELLED) {
- showNotification(R.string.ticker_cancel, mContext
- .getString(R.string.error_sync_cancelled));
- }
- if (mOnCompleteListener != null) {
- new Thread(new Runnable() {
-
- public void run() {
- mOnCompleteListener.onComplete();
- }
- }).start();
- }
- }
-}
diff --git a/zz_code/gtask/remote/GTaskClient.java b/zz_code/gtask/remote/GTaskClient.java
deleted file mode 100644
index 7d9eea4..0000000
--- a/zz_code/gtask/remote/GTaskClient.java
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容
-
-package net.micode.notes.gtask.remote;
-//引入工具类
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.app.Activity;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.gtask.data.Node;
-import net.micode.notes.gtask.data.Task;
-import net.micode.notes.gtask.data.TaskList;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.gtask.exception.NetworkFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-import net.micode.notes.ui.NotesPreferenceActivity;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-
-public class GTaskClient {
- //定义一个字符串常量,表示同步任务的标签
- private static final String TAG = GTaskClient.class.getSimpleName();
- //定义一个字符串常量,表示GTASK的URL,谷歌邮箱的任务列表
- private static final String GTASK_URL = "https://mail.google.com/tasks/";
- //定义一个字符串常量,表示获取GTASK的URL,谷歌邮箱的任务列表,ig表示获取任务列表
- private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig";
- //定义一个字符串常量,表示提交GTASK的URL,谷歌邮箱的任务列表,r表示提交任务列表
- private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig";
-
- //定义类内的成员变量
- private static GTaskClient mInstance = null;
-
- //定义一个DefaultHttpClient对象,表示HTTP客户端
- private DefaultHttpClient mHttpClient;
-
- //定义一个字符串变量,表示获取GTASK的URL
- private String mGetUrl;
-
- //定义一个字符串变量,表示提交GTASK的URL
- private String mPostUrl;
-
- //定义一个长整型变量,表示客户端的版本
- private long mClientVersion;
-
- //定义一个布尔型变量,表示是否登录
- private boolean mLoggedin;
-
- //定义一个长整型变量,表示最后一次登录的时间
- private long mLastLoginTime;
-
- //定义一个整型变量,表示操作的ID
- private int mActionId;
-
- //定义一个Account对象,表示同步的账户
- private Account mAccount;
-
- //定义一个JSONArray对象,表示更新的数组
- private JSONArray mUpdateArray;
-
- //构造函数
- private GTaskClient() {
- mHttpClient = null;
- mGetUrl = GTASK_GET_URL;
- mPostUrl = GTASK_POST_URL;
- mClientVersion = -1;
- mLoggedin = false;
- mLastLoginTime = 0;
- mActionId = 1;
- mAccount = null;
- mUpdateArray = null;
- }
- //定义一个同步方法,表示获取GTaskClient对象
- public static synchronized GTaskClient getInstance() {
- if (mInstance == null) {
- mInstance = new GTaskClient();
- }
- return mInstance;
- }
- //定义一个同步方法,表示登录(boolean,返回true or false)
- public boolean login(Activity activity) {
- // we suppose that the cookie would expire after 5 minutes
-
- // then we need to re-login
- 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;
- }
- // 如果已经登录,返回true
- if (mLoggedin) {
- Log.d(TAG, "already logged in");
- return true;
- }
- //获取账户的token
- mLastLoginTime = System.currentTimeMillis();
- String authToken = loginGoogleAccount(activity, false);
- if (authToken == null) {
- Log.e(TAG, "login google account failed");
- return false;
- }
- //如果账户的名称不是以gmail.com或googlemail.com结尾
- // 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/");
- int index = mAccount.name.indexOf('@') + 1;
- String suffix = mAccount.name.substring(index);
- url.append(suffix + "/");
- mGetUrl = url.toString() + "ig";
- mPostUrl = url.toString() + "r/ig";
-
- if (tryToLoginGtask(activity, authToken)) {
- mLoggedin = true;
- }
- }
-
- //尝试登录谷歌官方的URL
- // try to login with google official url
- if (!mLoggedin) {
- mGetUrl = GTASK_GET_URL;
- mPostUrl = GTASK_POST_URL;
- if (!tryToLoginGtask(activity, authToken)) {
- return false;
- }
- }
-
- mLoggedin = true;
- return true;
- }
- //定义一个同步方法,表示登录谷歌账户
- private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
- String authToken;
- AccountManager accountManager = AccountManager.get(activity);
- Account[] accounts = accountManager.getAccountsByType("com.google");
-
- //如果没有可用的谷歌账户,返回null
- if (accounts.length == 0) {
- Log.e(TAG, "there is no available google account");
- return null;
- }
- //获取同步账户的名称,如果没有获取到,返回null
- String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
- Account account = null;
- for (Account a : accounts) {
- if (a.name.equals(accountName)) {
- account = a;
- break;
- }
- }
- //如果账户不为空,返回账户
- if (account != null) {
- mAccount = account;
- } else {
- Log.e(TAG, "unable to get an account with the same name in the settings");
- return null;
- }
-
- // get the token now
- AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account,
- "goanna_mobile", null, activity, null, null);
- try {
- Bundle authTokenBundle = accountManagerFuture.getResult();
- authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
- if (invalidateToken) {
- accountManager.invalidateAuthToken("com.google", authToken);
- loginGoogleAccount(activity, false);
- }
- } catch (Exception e) {
- Log.e(TAG, "get auth token failed");
- authToken = null;
- }
-
- return authToken;
- }
-
- // 尝试登录GTASK,返回true or false
- 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");
- return false;
- }
-
- if (!loginGtask(authToken)) {
- Log.e(TAG, "login gtask failed");
- return false;
- }
- }
- return true;
- }
-
- //登录GTASK,返回true or false
- private boolean loginGtask(String authToken) {
-
- int timeoutConnection = 10000;
- int timeoutSocket = 15000;
- HttpParams httpParameters = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
- HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
- mHttpClient = new DefaultHttpClient(httpParameters);
- BasicCookieStore localBasicCookieStore = new BasicCookieStore();
- mHttpClient.setCookieStore(localBasicCookieStore);
- HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false);
-
- //登录GTASK
- // login gtask
- try {
- String loginUrl = mGetUrl + "?auth=" + authToken;
- HttpGet httpGet = new HttpGet(loginUrl);
- HttpResponse response = null;
- response = mHttpClient.execute(httpGet);
- //获取cookie
- // get the cookie now
- List cookies = mHttpClient.getCookieStore().getCookies();
- boolean hasAuthCookie = false;
- for (Cookie cookie : cookies) {
- if (cookie.getName().contains("GTL")) {
- hasAuthCookie = true;
- }
- }
- if (!hasAuthCookie) {
- Log.w(TAG, "it seems that there is no auth cookie");
- }
- //获取客户端的版本
- // get the client version
- String resString = getResponseContent(response.getEntity());
- String jsBegin = "_setup(";
- String jsEnd = ")}";
- int begin = resString.indexOf(jsBegin);
- int end = resString.lastIndexOf(jsEnd);
- String jsString = null;
- if (begin != -1 && end != -1 && begin < end) {
- jsString = resString.substring(begin + jsBegin.length(), end);
- }
- JSONObject js = new JSONObject(jsString);
- mClientVersion = js.getLong("v");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return false;
- } catch (Exception e) {
- //简化处理所有的异常,返回false
- // simply catch all exceptions
- Log.e(TAG, "httpget gtask_url failed");
- return false;
- }
-
- return true;
- }
-
- //获取操作的ID
- private int getActionId() {
- return mActionId++;
- }
-
- //创建HttpPost对象
- 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;
- }
-
- //获取响应的内容,返回字符串,抛出异常
- private String getResponseContent(HttpEntity entity) throws IOException {
- String contentEncoding = null;
- if (entity.getContentEncoding() != null) {
- contentEncoding = entity.getContentEncoding().getValue();
- Log.d(TAG, "encoding: " + contentEncoding);
- }
-
- InputStream input = entity.getContent();
- if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {
- input = new GZIPInputStream(entity.getContent());
- } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {
- Inflater inflater = new Inflater(true);
- input = new InflaterInputStream(entity.getContent(), inflater);
- }
-
- //读取输入流,返回字符串
- try {
- InputStreamReader isr = new InputStreamReader(input);
- BufferedReader br = new BufferedReader(isr);
- StringBuilder sb = new StringBuilder();
-
- while (true) {
- String buff = br.readLine();
- if (buff == null) {
- return sb.toString();
- }
- sb = sb.append(buff);
- }
- } finally {
- input.close();
- }
- }
- //提交请求,返回JSONObject对象,抛出异常
- private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
- if (!mLoggedin) {
- Log.e(TAG, "please login first");
- throw new ActionFailureException("not logged in");
- }
-
- HttpPost httpPost = createHttpPost();
- //提交请求,返回JSONObject对象
- try {
- LinkedList list = new LinkedList();
- list.add(new BasicNameValuePair("r", js.toString()));
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
- httpPost.setEntity(entity);
-
- // execute the post
- HttpResponse response = mHttpClient.execute(httpPost);
- String jsString = getResponseContent(response.getEntity());
- return new JSONObject(jsString);
-
- } catch (ClientProtocolException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("postRequest failed");
- } catch (IOException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("postRequest failed");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("unable to convert response content to jsonobject");
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("error occurs when posting request");
- }
- }
-
- //创建任务,抛出异常
- 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);
- task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("create task: handing jsonobject failed");
- }
- }
-
- //创建任务列表,抛出网络异常
- 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 jsResult = (JSONObject) jsResponse.getJSONArray(
- GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
- tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("create tasklist: handing jsonobject failed");
- }
- }
-
- //提交更新,抛出网络异常
- public void commitUpdate() throws NetworkFailureException {
- if (mUpdateArray != null) {
- 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);
- mUpdateArray = null;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("commit update: handing jsonobject failed");
- }
- }
- }
-
- //添加更新节点,抛出网络异常
- public void addUpdateNode(Node node) throws NetworkFailureException {
- if (node != null) {
- // too many update items may result in an error
- // set max to 10 items
- if (mUpdateArray != null && mUpdateArray.length() > 10) {
- commitUpdate();
- }
-
- if (mUpdateArray == null)
- mUpdateArray = new JSONArray();
- mUpdateArray.put(node.getUpdateAction(getActionId()));
- }
- }
-
- //移动任务,抛出网络异常
- public void moveTask(Task task, TaskList preParent, TaskList curParent)
- throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- 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_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());
- }
- actionList.put(action);
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- postRequest(jsPost);
- //处理异常
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("move task: handing jsonobject failed");
- }
- }
- //删除节点,抛出网络异常
- 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()));
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- postRequest(jsPost);
- mUpdateArray = null;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("delete node: handing jsonobject failed");
- }
- }
-
- //获取任务列表,抛出网络异常
- public JSONArray getTaskLists() throws NetworkFailureException {
- if (!mLoggedin) {
- Log.e(TAG, "please login first");
- throw new ActionFailureException("not logged in");
- }
-
- try {
- HttpGet httpGet = new HttpGet(mGetUrl);
- HttpResponse response = null;
- response = mHttpClient.execute(httpGet);
-
- // get the task list
- String resString = getResponseContent(response.getEntity());
- String jsBegin = "_setup(";
- String jsEnd = ")}";
- //获取客户端的版本
- int begin = resString.indexOf(jsBegin);
- int end = resString.lastIndexOf(jsEnd);
- String jsString = null;
- if (begin != -1 && end != -1 && begin < end) {
- jsString = resString.substring(begin + jsBegin.length(), end);
- }
- //获取任务列表
- JSONObject js = new JSONObject(jsString);
- return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS);
- } catch (ClientProtocolException e) {//处理异常
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("gettasklists: httpget failed");
- } catch (IOException e) {//处理异常
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("gettasklists: httpget failed");
- } catch (JSONException e) {//处理异常
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("get task lists: handing jasonobject failed");
- }
- }
-
- //获取任务列表,抛出网络异常
- public JSONArray getTaskList(String listGid) throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- 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());
- action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid);
- action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false);
- actionList.put(action);
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // 把客户端版本
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
- //提交请求,返回JSONObject对象
- JSONObject jsResponse = postRequest(jsPost);
- return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS);
- } catch (JSONException e) {//处理异常
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("get task list: handing jsonobject failed");
- }
- }
-
- //获取同步账户,返回Account对象
- public Account getSyncAccount() {
- return mAccount;
- }
-
- //重置更新数组
- public void resetUpdateArray() {
- mUpdateArray = null;
- }
-}
diff --git a/zz_code/gtask/remote/GTaskManager.java b/zz_code/gtask/remote/GTaskManager.java
deleted file mode 100644
index 1abe22a..0000000
--- a/zz_code/gtask/remote/GTaskManager.java
+++ /dev/null
@@ -1,813 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.util.Log;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.data.MetaData;
-import net.micode.notes.gtask.data.Node;
-import net.micode.notes.gtask.data.SqlNote;
-import net.micode.notes.gtask.data.Task;
-import net.micode.notes.gtask.data.TaskList;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.gtask.exception.NetworkFailureException;
-import net.micode.notes.tool.DataUtils;
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-
-public class GTaskManager {
- // 定义同步状态常量
- private static final String TAG = GTaskManager.class.getSimpleName();
- // 定义同步状态常量
- public static final int STATE_SUCCESS = 0;
- // 定义同步状态常量
- public static final int STATE_NETWORK_ERROR = 1;
- // 定义同步状态常量
- public static final int STATE_INTERNAL_ERROR = 2;
- // 定义同步状态常量
- public static final int STATE_SYNC_IN_PROGRESS = 3;
- // 定义同步状态常量
- public static final int STATE_SYNC_CANCELLED = 4;
- // 定义GTaskManager实例
- private static GTaskManager mInstance = null;
- // 定义Activity实例
- private Activity mActivity;
- // 定义Context实例
- private Context mContext;
- // 定义ContentResolver实例
- private ContentResolver mContentResolver;
- // 定义是否正在同步
- private boolean mSyncing;
- // 定义是否取消同步
- private boolean mCancelled;
- // 定义GTaskList实例
- private HashMap mGTaskListHashMap;
- // 定义GTask实例
- private HashMap mGTaskHashMap;
- // 定义MetaData实例
- private HashMap mMetaHashMap;
- // 定义MetaData实例
- private TaskList mMetaList;
- // 定义本地删除ID集合
- private HashSet mLocalDeleteIdMap;
- // 定义GID到NID的映射
- private HashMap mGidToNid;
- // 定义NID到GID的映射
- private HashMap mNidToGid;
-
- // 构造函数
- private GTaskManager() {
- mSyncing = false;
- mCancelled = false;
- mGTaskListHashMap = new HashMap();
- mGTaskHashMap = new HashMap();
- mMetaHashMap = new HashMap();
- mMetaList = null;
- mLocalDeleteIdMap = new HashSet();
- mGidToNid = new HashMap();
- mNidToGid = new HashMap();
- }
-// 获取GTaskManager实例
- public static synchronized GTaskManager getInstance() {
- if (mInstance == null) {
- mInstance = new GTaskManager();
- }
- return mInstance;
- }
- // 设置Activity上下文
- public synchronized void setActivityContext(Activity activity) {
- // used for getting authtoken
- mActivity = activity;
- }
- // 同步
- public int sync(Context context, GTaskASyncTask asyncTask) {
- if (mSyncing) {
- Log.d(TAG, "Sync is in progress");
- return STATE_SYNC_IN_PROGRESS;
- }
- mContext = context;
- mContentResolver = mContext.getContentResolver();
- mSyncing = true;
- mCancelled = false;
- mGTaskListHashMap.clear();
- mGTaskHashMap.clear();
- mMetaHashMap.clear();
- mLocalDeleteIdMap.clear();
- mGidToNid.clear();
- mNidToGid.clear();
-
- try {
- GTaskClient client = GTaskClient.getInstance();
- client.resetUpdateArray();
-
- // login google task
- if (!mCancelled) {
- if (!client.login(mActivity)) {
- throw new NetworkFailureException("login google task failed");
- }
- }
-
- // get the task list from google
- 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;
- } catch (ActionFailureException e) {
- Log.e(TAG, e.toString());
- return STATE_INTERNAL_ERROR;
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return STATE_INTERNAL_ERROR;
- } finally {
- mGTaskListHashMap.clear();
- mGTaskHashMap.clear();
- mMetaHashMap.clear();
- mLocalDeleteIdMap.clear();
- mGidToNid.clear();
- mNidToGid.clear();
- mSyncing = false;
- }
-
- return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
- }
- // 取消同步
- private void initGTaskList() throws NetworkFailureException {
- if (mCancelled)
- return;
- GTaskClient client = GTaskClient.getInstance();
- try {
- JSONArray jsTaskLists = client.getTaskLists();
-
- // init meta list first
- mMetaList = null;
- for (int i = 0; i < jsTaskLists.length(); i++) {
- JSONObject object = jsTaskLists.getJSONObject(i);
- String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
-
- if (name
- .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
- mMetaList = new TaskList();
- mMetaList.setContentByRemoteJSON(object);
-
- // load meta data
- JSONArray jsMetas = client.getTaskList(gid);
- for (int j = 0; j < jsMetas.length(); j++) {
- object = (JSONObject) jsMetas.getJSONObject(j);
- MetaData metaData = new MetaData();
- metaData.setContentByRemoteJSON(object);
- if (metaData.isWorthSaving()) {
- mMetaList.addChildTask(metaData);
- if (metaData.getGid() != null) {
- mMetaHashMap.put(metaData.getRelatedGid(), metaData);
- }
- }
- }
- }
- }
-
- // create meta list if not existed
- if (mMetaList == null) {
- mMetaList = new TaskList();
- mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_META);
- GTaskClient.getInstance().createTaskList(mMetaList);
- }
-
- // init task list
- for (int i = 0; i < jsTaskLists.length(); i++) {
- JSONObject object = jsTaskLists.getJSONObject(i);
- String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
-
- if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)
- && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_META)) {
- TaskList tasklist = new TaskList();
- tasklist.setContentByRemoteJSON(object);
- mGTaskListHashMap.put(gid, tasklist);
- mGTaskHashMap.put(gid, tasklist);
-
- // load tasks
- JSONArray jsTasks = client.getTaskList(gid);
- for (int j = 0; j < jsTasks.length(); j++) {
- object = (JSONObject) jsTasks.getJSONObject(j);
- gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- Task task = new Task();
- task.setContentByRemoteJSON(object);
- if (task.isWorthSaving()) {
- task.setMetaInfo(mMetaHashMap.get(gid));
- tasklist.addChildTask(task);
- mGTaskHashMap.put(gid, task);
- }
- }
- }
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("initGTaskList: handing JSONObject failed");
- }
- }
- // 同步内容
- private void syncContent() throws NetworkFailureException {
- int syncType;
- Cursor c = null;
- String gid;
- Node node;
-
- mLocalDeleteIdMap.clear();
-
- if (mCancelled) {
- return;
- }
-
- // for local deleted note
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type<>? AND parent_id=?)", new String[] {
- String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)
- }, null);
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c);
- }
-
- mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
- }
- } else {
- Log.w(TAG, "failed to query trash folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // sync folder first
- syncFolder();
-
- // 异步操作类发布进度
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type=? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));
- mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);
- syncType = node.getSyncAction(c);
- } else {
- if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
- // local add
- syncType = Node.SYNC_ACTION_ADD_REMOTE;
- } else {
- // remote delete
- syncType = Node.SYNC_ACTION_DEL_LOCAL;
- }
- }
- doContentSync(syncType, node, c);
- }
- } else {
- Log.w(TAG, "failed to query existing note in database");
- }
-
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // go through remaining items
- Iterator> iter = mGTaskHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- node = entry.getValue();
- doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
- }
-
- // mCancelled can be set by another thread, so we neet to check one by
- // one
- // clear local delete table
- if (!mCancelled) {
- if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) {
- throw new ActionFailureException("failed to batch-delete local deleted notes");
- }
- }
-
- //更新本地同步ID
- if (!mCancelled) {
- GTaskClient.getInstance().commitUpdate();
- refreshLocalSyncId();
- }
-
- }
-
- //功能:同步文件夹
- private void syncFolder() throws NetworkFailureException {
- Cursor c = null;
- String gid;
- Node node;
- int syncType;
-
- if (mCancelled) {
- return;
- }
- try {
- c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
- Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null);
- if (c != null) {
- c.moveToNext();
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER);
- mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid);
- // for system folder, only update remote name if necessary
- if (!node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT))
- doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
- } else {
- doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
- }
- } else {
- Log.w(TAG, "failed to query root folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // 为了避免文件夹的同步操作被取消,这里不再检查mCancelled
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)",
- new String[] {
- String.valueOf(Notes.ID_CALL_RECORD_FOLDER)
- }, null);
- if (c != null) {
- if (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER);
- mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid);
- // for system folder, only update remote name if
- // necessary
- if (!node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_CALL_NOTE))
- doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
- } else {
- doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
- }
- }
- } else {
- Log.w(TAG, "failed to query call note folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // 为了避免文件夹的同步操作被取消,这里不再检查mCancelled
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type=? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));
- mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);
- syncType = node.getSyncAction(c);
- } else {
- if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
- // local add
- syncType = Node.SYNC_ACTION_ADD_REMOTE;
- } else {
- // remote delete
- syncType = Node.SYNC_ACTION_DEL_LOCAL;
- }
- }
- doContentSync(syncType, node, c);
- }
- } else {
- Log.w(TAG, "failed to query existing folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // 已有的文件夹
- Iterator> iter = mGTaskListHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- gid = entry.getKey();
- node = entry.getValue();
- if (mGTaskHashMap.containsKey(gid)) {
- mGTaskHashMap.remove(gid);
- doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
- }
- }
-
- if (!mCancelled)
- GTaskClient.getInstance().commitUpdate();
- }
-
- private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- MetaData meta;
- switch (syncType) {
- case Node.SYNC_ACTION_ADD_LOCAL:
- addLocalNode(node);
- break;
- case Node.SYNC_ACTION_ADD_REMOTE:
- addRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_DEL_LOCAL:
- meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN));
- if (meta != null) {
- GTaskClient.getInstance().deleteNode(meta);
- }
- mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
- break;
- case Node.SYNC_ACTION_DEL_REMOTE:
- meta = mMetaHashMap.get(node.getGid());
- if (meta != null) {
- GTaskClient.getInstance().deleteNode(meta);
- }
- GTaskClient.getInstance().deleteNode(node);
- break;
- case Node.SYNC_ACTION_UPDATE_LOCAL:
- updateLocalNode(node, c);
- break;
- case Node.SYNC_ACTION_UPDATE_REMOTE:
- updateRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_UPDATE_CONFLICT:
-
- updateRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_NONE:
- break;
- case Node.SYNC_ACTION_ERROR:
- default:
- throw new ActionFailureException("unkown sync action type");
- }
- }
- //添加本地节点
- private void addLocalNode(Node node) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote;
- // 添加本地任务
- if (node instanceof TaskList) {//文件夹
- if (node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) {
- sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER);
- } else if (node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) {
- sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER);
- // call note folder
- } else {//文件夹
- sqlNote = new SqlNote(mContext);
- sqlNote.setContent(node.getLocalJSONFromContent());
- sqlNote.setParentId(Notes.ID_ROOT_FOLDER);
- }
- } else {
- sqlNote = new SqlNote(mContext);
- JSONObject js = node.getLocalJSONFromContent();
- try {
- if (js.has(GTaskStringUtils.META_HEAD_NOTE)) {
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- if (note.has(NoteColumns.ID)) {
- long id = note.getLong(NoteColumns.ID);
- if (DataUtils.existInNoteDatabase(mContentResolver, id)) {
- //这个id不可用,必须创建一个新的
- note.remove(NoteColumns.ID);
- }
- }
- }
- //检查data的id是否可用
- if (js.has(GTaskStringUtils.META_HEAD_DATA)) {
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (data.has(DataColumns.ID)) {
- long dataId = data.getLong(DataColumns.ID);
- if (DataUtils.existInDataDatabase(mContentResolver, dataId)) {
- //这个id不可用,必须创建一个新的
- data.remove(DataColumns.ID);
- }
- }
- }
-
- }
- //检查widget的id是否可用
- } catch (JSONException e) {
- Log.w(TAG, e.toString());
- e.printStackTrace();
- }
- //设置内容
- sqlNote.setContent(js);
- //设置父节点
- Long parentId = mGidToNid.get(((Task) node).getParent().getGid());
- if (parentId == null) {
- Log.e(TAG, "cannot find task's parent id locally");
- throw new ActionFailureException("cannot add local node");
- }
- //设置父节点
- sqlNote.setParentId(parentId.longValue());
- }
-
- // 更新本地任务
- sqlNote.setGtaskId(node.getGid());
- sqlNote.commit(false);
-
- // 更新映射
- mGidToNid.put(node.getGid(), sqlNote.getId());
- mNidToGid.put(sqlNote.getId(), node.getGid());
-
- // 更新meta
- updateRemoteMeta(node.getGid(), sqlNote);
- }
-
- // 更新本地节点
- private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote;
- // 更新本地任务
- sqlNote = new SqlNote(mContext, c);
- sqlNote.setContent(node.getLocalJSONFromContent());
-
- Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid())
- : new Long(Notes.ID_ROOT_FOLDER);
- if (parentId == null) {
- Log.e(TAG, "cannot find task's parent id locally");
- throw new ActionFailureException("cannot update local node");
- }
- sqlNote.setParentId(parentId.longValue());
- sqlNote.commit(true);
-
- // 更新映射
- updateRemoteMeta(node.getGid(), sqlNote);
- }
- //添加远程节点
- private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote = new SqlNote(mContext, c);
- Node n;
-
- // 添加远程任务
- if (sqlNote.isNoteType()) {
- Task task = new Task();
- task.setContentByLocalJSON(sqlNote.getContent());
-
- String parentGid = mNidToGid.get(sqlNote.getParentId());
- if (parentGid == null) {
- Log.e(TAG, "cannot find task's parent tasklist");
- throw new ActionFailureException("cannot add remote task");
- }
- mGTaskListHashMap.get(parentGid).addChildTask(task);
-
- GTaskClient.getInstance().createTask(task);
- n = (Node) task;
-
- // add meta
- updateRemoteMeta(task.getGid(), sqlNote);
- } else {
- TaskList tasklist = null;
-
- //找到对应的文件夹
- String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;
- //根文件夹
- if (sqlNote.getId() == Notes.ID_ROOT_FOLDER)
- folderName += GTaskStringUtils.FOLDER_DEFAULT;
- else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER)//通话记录文件夹
- folderName += GTaskStringUtils.FOLDER_CALL_NOTE;
- else//文件夹
- folderName += sqlNote.getSnippet();
- //遍历文件夹
- Iterator> iter = mGTaskListHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- String gid = entry.getKey();
- TaskList list = entry.getValue();
-
- if (list.getName().equals(folderName)) {
- tasklist = list;
- if (mGTaskHashMap.containsKey(gid)) {
- mGTaskHashMap.remove(gid);
- }
- break;
- }
- }
-
- //没有找到对应的文件夹
- if (tasklist == null) {
- tasklist = new TaskList();
- tasklist.setContentByLocalJSON(sqlNote.getContent());
- GTaskClient.getInstance().createTaskList(tasklist);
- mGTaskListHashMap.put(tasklist.getGid(), tasklist);
- }
- n = (Node) tasklist;
- }
-
- // 跟新本地数据库
- sqlNote.setGtaskId(n.getGid());
- sqlNote.commit(false);
- sqlNote.resetLocalModified();
- sqlNote.commit(true);
-
- // 更新映射
- mGidToNid.put(n.getGid(), sqlNote.getId());
- mNidToGid.put(sqlNote.getId(), n.getGid());
- }
-
- // 更新节点,节点类型为Task
- private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote = new SqlNote(mContext, c);
-
- // 更新远程节点
- node.setContentByLocalJSON(sqlNote.getContent());
- GTaskClient.getInstance().addUpdateNode(node);
-
- // 更新meta
- updateRemoteMeta(node.getGid(), sqlNote);
-
- // 更新父节点
- if (sqlNote.isNoteType()) {
- Task task = (Task) node;
- TaskList preParentList = task.getParent();
-
- String curParentGid = mNidToGid.get(sqlNote.getParentId());
- if (curParentGid == null) {
- Log.e(TAG, "cannot find task's parent tasklist");
- throw new ActionFailureException("cannot update remote task");
- }
- TaskList curParentList = mGTaskListHashMap.get(curParentGid);
-
- if (preParentList != curParentList) {
- preParentList.removeChildTask(task);
- curParentList.addChildTask(task);
- GTaskClient.getInstance().moveTask(task, preParentList, curParentList);
- }
- }
-
- // 更新本地数据库
- sqlNote.resetLocalModified();
- sqlNote.commit(true);
- }
-
- //更新本地meta
- private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
- if (sqlNote != null && sqlNote.isNoteType()) {
- MetaData metaData = mMetaHashMap.get(gid);
- if (metaData != null) {
- metaData.setMeta(gid, sqlNote.getContent());
- GTaskClient.getInstance().addUpdateNode(metaData);
- //更新本地数据库
- } else {
- metaData = new MetaData();
- metaData.setMeta(gid, sqlNote.getContent());
- mMetaList.addChildTask(metaData);
- mMetaHashMap.put(gid, metaData);
- GTaskClient.getInstance().createTask(metaData);
- }
- }
- }
-
- //异步线程
- private void refreshLocalSyncId() throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- //清空数据
- mGTaskHashMap.clear();
- mGTaskListHashMap.clear();
- mMetaHashMap.clear();
- initGTaskList();
-
- Cursor c = null;
- try {
- //查询本地数据
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type<>? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- //遍历数据
- if (c != null) {
- while (c.moveToNext()) {
- String gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- Node node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- ContentValues values = new ContentValues();
- values.put(NoteColumns.SYNC_ID, node.getLastModified());
- mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
- c.getLong(SqlNote.ID_COLUMN)), values, null, null);
- } else {
- Log.e(TAG, "something is missed");
- throw new ActionFailureException(
- "some local items don't have gid after sync");
- }
- }
- } else {
- Log.w(TAG, "failed to query local note to refresh sync id");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
- }
- // 获取账户
- public String getSyncAccount() {
- return GTaskClient.getInstance().getSyncAccount().name;
- }
-
- //取消同步
- public void cancelSync() {
- mCancelled = true;
- }
-}
diff --git a/zz_code/gtask/remote/GTaskSyncService.java b/zz_code/gtask/remote/GTaskSyncService.java
deleted file mode 100644
index 65aadad..0000000
--- a/zz_code/gtask/remote/GTaskSyncService.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//sync (同步)任务:主线程上排队执行的任务
-//async (异步)任务:不进入主线程,而进入任务队列的任务
-//gtask:远程任务系统
-
-/*Service是在一段不定的时间运行在后台,不和用户交互的应用组件
- * 主要方法:
- * private void startSync() 启动一个同步工作
- * private void cancelSync() 取消同步
- * public void onCreate()
- * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service
- * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service
- * public IBinder onBind()
- * public void sendBroadcast(String msg) 发送同步的相关通知
- * public static void startSync(Activity activity)
- * public static void cancelSync(Context context)
- * public static boolean isSyncing() 判读是否在进行同步
- * public static String getProgressString() 获取当前进度的信息
-*/
-
-package net.micode.notes.gtask.remote;
-
-//引入工具类
-import android.app.Activity;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-
-//GTask同步服务类,继承自Android的Service类
-public class GTaskSyncService extends Service {
- //final修饰的变量表示常量,static表示静态变量,表示这个变量是类变量,而不是实例变量,所有的实例共享这个变量
- //定义一个字符串常量,表示同步操作的类型
- public final static String ACTION_STRING_NAME = "sync_action_type";
- //标识启动同步任务的操作
- public final static int ACTION_START_SYNC = 0;
- //标识取消同步任务的操作
- public final static int ACTION_CANCEL_SYNC = 1;
- //标识无效的操作
- public final static int ACTION_INVALID = 2;
- //定义一个字符串常量,表示同步服务的广播名称
- public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
- //定义一个字符串常量,表示是否正在同步的广播名称
- public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
- //定义一个字符串常量,表示同步进度的广播名称
- public final static String GTASK_SERVICE_BROAD CAST_PROGRESS_MSG = "progressMsg";
- //定义一个GTaskASyncTask对象
- private static GTaskASyncTask mSyncTask = null;
- //定义一个字符串变量,表示同步进度
- private static String mSyncProgress = "";
-
- //定义方法:启动同步任务
- private void startSync() {
- if (mSyncTask == null) {
- mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
- public void onComplete() {
- mSyncTask = null;
- sendBroadcast("");
- stopSelf();
- }
- });
- sendBroadcast("");
- mSyncTask.execute();
- }
- }
-
- //定义方法:取消同步任务
- private void cancelSync() {
- if (mSyncTask != null) {
- mSyncTask.cancelSync();
- }
- }
-
- //重写方法:创建服务
- @Override
- public void onCreate() {
- mSyncTask = null;
- }
-
- //重写方法:Service 启动时的回调方法
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Bundle bundle = intent.getExtras();
- if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) {
- switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {
- case ACTION_START_SYNC:
- startSync();
- break;
- case ACTION_CANCEL_SYNC:
- cancelSync();
- break;
- default:
- break;
- }
- return START_STICKY;
- }
- return super.onStartCommand(intent, flags, startId);
- }
-
- //重写方法:在没有内存的情况下如果存在service则结束掉这的service
- @Override
- public void onLowMemory() {
- if (mSyncTask != null) {
- mSyncTask.cancelSync();
- }
- }
-
- //Service 绑定时调用的方法
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- //定义方法:广播同步的相关通知
- public void sendBroadcast(String msg) {
- mSyncProgress = msg;
- Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
- intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null);
- intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
- sendBroadcast(intent);
- }
-
- //静态方法:启动同步任务
- public static void startSync(Activity activity) {
- GTaskManager.getInstance().setActivityContext(activity);
- Intent intent = new Intent(activity, GTaskSyncService.class);
- intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
- activity.startService(intent);
- }
-
- //静态方法:取消同步任务
- public static void cancelSync(Context context) {
- Intent intent = new Intent(context, GTaskSyncService.class);
- intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);
- context.startService(intent);
- }
-
- //静态方法:判读是否在进行同步
- public static boolean isSyncing() {
- return mSyncTask != null;
- }
-
- //静态方法:获取当前进度的信息
- public static String getProgressString() {
- return mSyncProgress;
- }
-}