diff --git a/doc/gtask文件夹泛读报告/data文件.pdf b/doc/gtask文件夹泛读报告/data文件.pdf
new file mode 100644
index 0000000..ef9609e
Binary files /dev/null and b/doc/gtask文件夹泛读报告/data文件.pdf differ
diff --git a/doc/gtask文件夹泛读报告/exception文件.pdf b/doc/gtask文件夹泛读报告/exception文件.pdf
new file mode 100644
index 0000000..711bd21
Binary files /dev/null and b/doc/gtask文件夹泛读报告/exception文件.pdf differ
diff --git a/doc/gtask文件夹泛读报告/remote文件.pdf b/doc/gtask文件夹泛读报告/remote文件.pdf
new file mode 100644
index 0000000..9c30a9c
Binary files /dev/null and b/doc/gtask文件夹泛读报告/remote文件.pdf differ
diff --git a/doc/gtask用例交互图.drawio b/doc/gtask用例交互图.drawio
new file mode 100644
index 0000000..2565f56
--- /dev/null
+++ b/doc/gtask用例交互图.drawio
@@ -0,0 +1 @@
+7R1bb6O4+tfw2AqDweYxNOletCONdqQ9Z/eNJDRhh4SI0ml7fv2xzSVgm0AIJoHMaqQFYz4Tf/ebq5lPu49fYu+w/RKt/VAz9PWHZs41wwC6icn/6MhnOmJDJx3YxME6m3Qc+Bb8z8/fzEbfgrX/WpmYRFGYBIfq4Cra7/1VUhnz4jh6r057icLqqgdv4wsD31ZeKI7+J1gn22wU6Prxwa9+sNlmS2Mre7D0Vt83cfS2z9bbR3s/fbLzcjDZ1Nett47eS0PmQjOf4ihK0qvdx5Mf0m3Ndyx977nmafHJsb9P2ryAlt7SAyu4XBnoBS71ByOF8MML37Jt0BZYcxea62gLpDmWhp+yT08+850iv+JAL9924R/Bix8G5Pea7sGPg52f+DF5EmbDX49j7vs2SPxvB29FX30nNETGtskuJHeAXBK0Jh55JS7uw9A7vAZLtqpORmJ/9Ra/Bj/8P/3XlHroaPSW0JWeCqpgUyk2/HUGqth1ncHdBavsOvSWfugW6HuKwoguzxBIXkvi6HtBCxTQC/nGZ28XhJTE//Ljtbf3suGMngFBqeuFwWZPblYEK+yni2jKMPfDjxP/ozSUoe0XPyLbFn+SKdlTA2YklHEXzm7fS6SaU+q2RKUA5bTnZfyxKWAfCYVcZLTSkm5ypi0TDk8mJeQeomCfsPUtV7PmHLVEcbKNNtHeC8v0csShfps4rGWm1kiFVjNOJSi1YQ8oXf72xfzL/j2J/zGTf5P47dfg6/MDQFJ5MHvWXKQtbM0FGhYR7e/XMyqA6XaF3usrxU2ZtauYTF/314I0bt7ZxIs3ft0cYMr3OvZDLyFSo6owJDuXvfqV0uoRR1aV7wDPTq/RW7zys5fKopeDA5oApT9OAMTwWPyc7qg1JaL+SojsH0d2ZWsdiLvhyNCtR+s0KNVYMjsxIMHBH1QOMi1JlKN31Jol9AkyjUqqgFhAs+zBLliv6YtuxdLKgB2tGEHAVZF+gvwuwPxFcg21UFejJf4qxQIrt7vPp3742ARLMfkjIOJpEuSP9AtxfxH5W879kL9pGb2RvwBLMfnbEjE1CfJPCfBa5I/h3ZA/0u2u1O88NoBSTPzYkhA/1NxnzZlrC0ubzTUHj5H4U/IbgPgFkpMZk0ibLbQZYNEdXcM23VrH0Wbi1v4M8wwf5oH6bYV5JBTEk8ndhXnMs5F6c2Gem7AH1cRr7CoDwVz5nx2vwbxCFEApVohGK2swVZFUoNsaBvTpCFUkuNQ+lOPwgXsjenl59dXEbW7CxFQUAUUVNnDsjtE1gG0+usaDUh1dk5mY0+QocyijU7o6bGXL0xGX/iMjeEZ3/IRtwe/dMkqSaEcelNhqGUar743GQkvTgCL5W/YpfriM3hfHAZcNkAf5V/XLsHn8IcN/zxESoLdjYLKr3mdpWmbd1a5TZDT4heoEAqeqgW5gjvLST6gTJ02/q0aaHCGp1wvQnq5eIAjgA2bA7KgbHoDeBKoGm+dS6YMB5Qud/2lSOu2NcuSpWCpCIfPZXc1ZSERoqs9mNtNepkaYhHr6bNrCoeJ3NsoIYspI/VuINkcNnMulTjLYxpQlg/1ocEwDgdFZNMBmaL1JB7N2rU4fqFRG2PJscbOMIBdYcxATFoDG/ohoIBeudZQRC2IUP9Hqr3TyTGePyDQoA0hGsIbnVOg4rH6MxhnJ4GyMsiZlzQnJGtS7rCEbGH/+l94QEyC7/ZvdIjO/n3+UJ88/y3elCOCNyS6+TMdCHdPpwBEg4cdh/V0kkw82FQsuZBfE5dVl7IzohZvaEDp1glMGJ+xM5hBf2TWYF7dg8sFmwkQXKer2OR31zOmfhUYYjLUnHHgCmOMgG3TkxQfiHPK+igBMNTPKYiJERz8x/ZvXWh/1b6pSGccRBnTSC8R4EDEWxowZZ0zX21RB41ShLyhTj5EZrxqywreTEyFrMrqumQPUuEI8t6GuhTSCwyxAUsxpjixxUnBayiGLTIFRvrKpKUy1ncMuIJuDmA9NWI4Y02ko+JkqOTIHk/mj9KHxUFU4AslKlFQalaAIYfYDDcCn0swUtvZnIcLwhQhWx34TC6uoQ8Bt6Ocn2VyfbMBt1a+00Ol3V76Cz8XpzZWv3ISllm3jyZYkNXEkPm3mcPvcOkDRBEixmSbrIZRYBSycSKwCaosRk82S5Oep5eAwCw7RBD7tXU19JXcaFaSKqmM4h3iwmIUhUedXYmDVzOkYnYtl+PIzAVRPKQ9gyj9ZaebCkMhwCfMimoNw7FwIiAUiI2Be41JCu6wS5yY639TwmiU07BiQA9Ke3Zog9cVtsGYhtcUEsr46kd2ETN8I2Q1etdPOnrBqs7j0pdU1Gg9wEyTVfXYy7eOwVJfDrEpXmznt8uYsSk8MS2q4zjScptXSSGH6aCYrc7RDgjp3GZOrDb2SMyNhQJpSL30YeRfbY+RKWw1J5gXeRd6NoyOFebfeC/tKKXVQTakbRBgPlFMfxCi2UMcmRYBtDhB6tIcVHUhWlicyb5FkILdzej2JBAK6NPN0WYbOmLBurVqFNu7MIbzbKIBS3cYrbzrlozqithUYRJKXs+h4miUnjIbnJS2ZVrMwHqR1a6Ns2sA9BwyVlqPU5KXvO9p+fp6NdzztIcPrIg5l6u0uGnckWOQUg4jDfvt0IKcETAO1UgLnhiAsrk8nX6dOp0DOfDMg4mjsVJsOT+DCrxq2S0fM0cj1lSSNoMgXvCHO6c4Jl9YecaRv5U06Zx9jwhUxCYD6s35E2XlGkM1hF5QUFNLE0aOs+JPjk7M9UxfI6+HPpy4eEHh0Sv/l6wxBbLKSKkhNXxq/LXKmJ1KlDpVH1JZmDWP4tiTRcLSVR5L0R2Dmpy/mwqMXtW44nALUO1IfhA2AekpRmFwLRL5Og74fIG8skrxy/1+NRDI5E8wwO9KEqTcA6okmIJSvozRrVdO9Uu0va6NPJ9EB23NsIJd7iCsCGqwKRGYujZSdLSHqZlrtfDeJtnBOA+pLyHOGcr7Oud+lVADkTb4N/a33IgGAGuq9Xl8qkLREjVQEGIIIsCzO9Wxv5zWCUmTp5euoZWpJmHgSh9ym1Nw/e3K4V2hftzjtcSTsKGpkmxdr7TVyA6CemNHiTPl8nVoxgc6cb56cr6jOUxamEDV4izip5IQK4aSbEQoNQ03rdHHkw+A63bzGiVeqhAjvGzld/7CIII5EWH156vyxE/lCal31rqdViQHKKXC1edVCGShzm+49NtxFfgweGwag6+GqfHBYhKTIZygWunp4GE7HfAVWf0crCkmrticr9oaXdt3/qThKjUHIUqZ31+cHFRmD12r0g9fohlCUseG8s+5/ZwjyArTtXxnqIKnr/qCR2mYjWXfFFAI8UFETw2ABHksiicfKj/xh02bXog6Rs3lIinKoxUK1X8Y36HMvqGFfSxKUl6RdEat6W2StDjMoOyd0CkmXlGcUBGiulXe1JK76SIUAEDuAYdfqGsFMFiD1JAb481SKhdRytfwIpUYeHiPHoguJ7bIOYFkVaIsjlPmNvo8Ii9oKegBbGumXltAXC7WtoT+tyhuL6MUfdgN/6wJN19uzu3as8mE5AVBfvh7kA0b5Skq1Cpqqq4fG7urlqasJMCPPQ8jo+jduudSYAEh1a6zMNBA9K7ERVuwmF5LhI+QxfNWTWvB03CBoVY9FwF3/CLSVn7BVB0g1g8iclCkE9rEil4TcxlGUlLEQe4ftl2hNd2Pxfw==
\ No newline at end of file
diff --git a/doc/gtask用例描述-刘锦样.pdf b/doc/gtask用例描述-刘锦样.pdf
new file mode 100644
index 0000000..f0d37fd
Binary files /dev/null and b/doc/gtask用例描述-刘锦样.pdf differ
diff --git a/小米便签源码/src/net/micode/notes/data/Contact.java b/src/data/Contact.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/data/Contact.java
rename to src/data/Contact.java
diff --git a/小米便签源码/src/net/micode/notes/data/Notes.java b/src/data/Notes.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/data/Notes.java
rename to src/data/Notes.java
diff --git a/小米便签源码/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/data/NotesDatabaseHelper.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/data/NotesDatabaseHelper.java
rename to src/data/NotesDatabaseHelper.java
diff --git a/小米便签源码/src/net/micode/notes/data/NotesProvider.java b/src/data/NotesProvider.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/data/NotesProvider.java
rename to src/data/NotesProvider.java
diff --git a/小米便签源码/src/net/micode/notes/gtask/data/MetaData.java b/src/gtask/data/MetaData.java
similarity index 64%
rename from 小米便签源码/src/net/micode/notes/gtask/data/MetaData.java
rename to src/gtask/data/MetaData.java
index 3a2050b..4802c00 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/MetaData.java
+++ b/src/gtask/data/MetaData.java
@@ -26,29 +26,54 @@ import org.json.JSONObject;
public class MetaData extends Task {
+ /*
+ * 功能描述:得到类的简写名称存入字符串TAG中
+ * 实现过程:调用getSimpleName ()函数
+ */
private final static String TAG = MetaData.class.getSimpleName();
private String mRelatedGid = null;
-
- public void setMeta(String gid, JSONObject metaInfo) {
+ /*
+ * 功能描述:设置数据,即生成元数据库
+ * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数
+ * 参数注解
+ */
+ public void setMeta(String gid, JSONObject metaInfo)
+ {
+ //对函数块进行注释
try {
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
+ /*
+ * 将这对键值放入metaInfo这个jsonobject对象中
+ */
} catch (JSONException e) {
Log.e(TAG, "failed to put related gid");
+ /*
+ * 输出错误信息
+ */
}
setNotes(metaInfo.toString());
setName(GTaskStringUtils.META_NOTE_NAME);
}
-
+ /*
+ * 功能描述:获取相关联的Gid
+ */
public String getRelatedGid() {
return mRelatedGid;
}
+ /*
+ * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存
+ */
@Override
public boolean isWorthSaving() {
return getNotes() != null;
}
-
+ /*
+ * 功能描述:使用远程json数据对象设置元数据内容
+ * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并
+ * 参数注解:
+ */
@Override
public void setContentByRemoteJSON(JSONObject js) {
super.setContentByRemoteJSON(js);
@@ -62,18 +87,24 @@ public class MetaData extends Task {
}
}
}
-
+ /*
+ * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常
+ */
@Override
public void setContentByLocalJSON(JSONObject js) {
// this function should not be called
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
-
+ /*
+ * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常
+ */
@Override
public JSONObject getLocalJSONFromContent() {
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
-
+ /*
+ * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常
+ */
@Override
public int getSyncAction(Cursor c) {
throw new IllegalAccessError("MetaData:getSyncAction should not be called");
diff --git a/小米便签源码/src/net/micode/notes/gtask/data/Node.java b/src/gtask/data/Node.java
similarity index 61%
rename from 小米便签源码/src/net/micode/notes/gtask/data/Node.java
rename to src/gtask/data/Node.java
index 63950e0..cf95eac 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/Node.java
+++ b/src/gtask/data/Node.java
@@ -15,87 +15,92 @@
*/
package net.micode.notes.gtask.data;
-
+
import android.database.Cursor;
-
+
import org.json.JSONObject;
-
+
+/*
+ * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量
+ * 关键字:abstract
+ */
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;
-
+ //定义了各种用于表征同步状态的常量
+ 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;
-
+
private String mName;
-
- private long mLastModified;
-
- private boolean mDeleted;
-
+
+ private long mLastModified;//记录最后一次修改时间
+
+ private boolean mDeleted;//表征是否被删除
+
public Node() {
mGid = null;
mName = "";
mLastModified = 0;
mDeleted = false;
}
-
+
public abstract JSONObject getCreateAction(int actionId);
-
+
public abstract JSONObject getUpdateAction(int actionId);
-
+
public abstract void setContentByRemoteJSON(JSONObject js);
-
+
public abstract void setContentByLocalJSON(JSONObject js);
-
+
public abstract JSONObject getLocalJSONFromContent();
-
+
public abstract int getSyncAction(Cursor c);
-
+
public void setGid(String gid) {
this.mGid = gid;
}
-
+
public void setName(String name) {
this.mName = name;
}
-
+
public void setLastModified(long lastModified) {
this.mLastModified = lastModified;
}
-
+
public void setDeleted(boolean deleted) {
this.mDeleted = deleted;
}
-
+
public String getGid() {
return this.mGid;
}
-
+
public String getName() {
return this.mName;
}
-
+
public long getLastModified() {
return this.mLastModified;
}
-
+
public boolean getDeleted() {
return this.mDeleted;
}
-
-}
+
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/data/SqlData.java b/src/gtask/data/SqlData.java
similarity index 77%
rename from 小米便签源码/src/net/micode/notes/gtask/data/SqlData.java
rename to src/gtask/data/SqlData.java
index d3ec3be..de934b4 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/SqlData.java
+++ b/src/gtask/data/SqlData.java
@@ -35,60 +35,95 @@ import org.json.JSONException;
import org.json.JSONObject;
-public class SqlData {
- private static final String TAG = SqlData.class.getSimpleName();
+/*
+ * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。
+ * SqlData其实就是也就是所谓数据中的数据
+ */
- private static final int INVALID_ID = -99999;
+
+public class SqlData {
+ /*
+ * 功能描述:得到类的简写名称存入字符串TAG中
+ * 实现过程:调用getSimpleName ()函数
+ */
+ private static final String TAG = SqlData.class.getSimpleName();
+
+ private static final int INVALID_ID = -99999;//为mDataId置初始值-99999
+
+
+ /**
+ * 来自Notes类中定义的DataColumn中的一些常量
+ */
+
+ // 集合了interface DataColumns中所有SF常量
public static final String[] PROJECTION_DATA = new String[] {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
-
+
+ /**
+ * 以下五个变量作为sql表中5列的编号
+ */
public static final int DATA_ID_COLUMN = 0;
-
+
public static final int DATA_MIME_TYPE_COLUMN = 1;
-
+
public static final int DATA_CONTENT_COLUMN = 2;
-
+
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
-
+
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
-
+
private ContentResolver mContentResolver;
-
+ //判断是否直接用Content生成,是为true,否则为false
private boolean mIsCreate;
-
+
private long mDataId;
-
+
private String mDataMimeType;
-
+
private String mDataContent;
-
+
private long mDataContentData1;
-
+
private String mDataContentData3;
-
+
private ContentValues mDiffDataValues;
-
+
+ /*
+ * 功能描述:构造函数,用于初始化数据
+ * 参数注解:mContentResolver用于获取ContentProvider提供的数据
+ * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同)
+ */
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;
- mDataId = INVALID_ID;
+ mDataId = INVALID_ID;//mDataId置初始值-99999
mDataMimeType = DataConstants.NOTE;
mDataContent = "";
mDataContentData1 = 0;
mDataContentData3 = "";
mDiffDataValues = new ContentValues();
}
-
+
+
+ /*
+ * 功能描述:构造函数,初始化数据
+ * 参数注解:mContentResolver用于获取ContentProvider提供的数据
+ * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同)
+ */
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);
mDiffDataValues = new ContentValues();
}
-
+
+ /*
+ * 功能描述:从光标处加载数据
+ * 从当前的光标处将五列的数据加载到该类的对象
+ */
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
@@ -96,45 +131,55 @@ public class SqlData {
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
-
+
+
+ /*
+ * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制
+ */
public void setContent(JSONObject js) throws JSONException {
+ //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId);
}
mDataId = dataId;
-
+
String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE;
if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
}
mDataMimeType = dataMimeType;
-
+
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
if (mIsCreate || !mDataContent.equals(dataContent)) {
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
}
mDataContent = dataContent;
-
+
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
if (mIsCreate || mDataContentData1 != dataContentData1) {
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
}
mDataContentData1 = dataContentData1;
-
+
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
}
mDataContentData3 = dataContentData3;
}
-
+
+
+ /*
+ * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制
+ */
public JSONObject getContent() throws JSONException {
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
}
+ //创建JSONObject对象。并将相关数据放入其中,并返回。
JSONObject js = new JSONObject();
js.put(DataColumns.ID, mDataId);
js.put(DataColumns.MIME_TYPE, mDataMimeType);
@@ -143,14 +188,17 @@ public class SqlData {
js.put(DataColumns.DATA3, mDataContentData3);
return js;
}
-
+
+ /*
+ * 功能描述:commit函数用于把当前造作所做的修改保存到数据库
+ */
public void commit(long noteId, boolean validateVersion, long version) {
-
+
if (mIsCreate) {
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
mDiffDataValues.remove(DataColumns.ID);
}
-
+
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
try {
@@ -178,12 +226,15 @@ public class SqlData {
}
}
}
-
+
mDiffDataValues.clear();
mIsCreate = false;
}
-
+
+ /*
+ * 功能描述:获取当前id
+ */
public long getId() {
return mDataId;
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/data/SqlNote.java b/src/gtask/data/SqlNote.java
similarity index 85%
rename from 小米便签源码/src/net/micode/notes/gtask/data/SqlNote.java
rename to src/gtask/data/SqlNote.java
index 79a4095..9db477f 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/SqlNote.java
+++ b/src/gtask/data/SqlNote.java
@@ -38,11 +38,21 @@ import org.json.JSONObject;
import java.util.ArrayList;
+/*
+ * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。
+ * 和SqlData相比,SqlNote算是真正意义上的数据了。
+ */
+
+
public class SqlNote {
+ /*
+ * 功能描述:得到类的简写名称存入字符串TAG中
+ * 实现过程:调用getSimpleName ()函数
+ */
private static final String TAG = SqlNote.class.getSimpleName();
-
+
private static final int INVALID_ID = -99999;
-
+ // 集合了interface NoteColumns中所有SF常量(17个)
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,
@@ -51,77 +61,84 @@ public class SqlNote {
NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,
NoteColumns.VERSION
};
-
+
+ //以下设置17个列的编号
public static final int ID_COLUMN = 0;
-
+
public static final int ALERTED_DATE_COLUMN = 1;
-
+
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;
-
+
public static final int PARENT_ID_COLUMN = 7;
-
+
public static final int SNIPPET_COLUMN = 8;
-
+
public static final int TYPE_COLUMN = 9;
-
+
public static final int WIDGET_ID_COLUMN = 10;
-
+
public static final int WIDGET_TYPE_COLUMN = 11;
-
+
public static final int SYNC_ID_COLUMN = 12;
-
+
public static final int LOCAL_MODIFIED_COLUMN = 13;
-
+
public static final int ORIGIN_PARENT_ID_COLUMN = 14;
-
+
public static final int GTASK_ID_COLUMN = 15;
-
+
public static final int VERSION_COLUMN = 16;
-
+
+ //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new
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;
-
+
+ /*
+ * 功能描述:构造函数
+ * 参数注解: mIsCreate用于标示构造方式
+ */
+ //构造函数只有context,对所有的变量进行初始化
public SqlNote(Context context) {
mContext = context;
mContentResolver = context.getContentResolver();
@@ -129,9 +146,9 @@ public class SqlNote {
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,18 +159,30 @@ public class SqlNote {
mDiffNoteValues = new ContentValues();
mDataList = new ArrayList();
}
-
+
+
+ /*
+ * 功能描述:构造函数
+ * 参数注解: mIsCreate用于标示构造方式
+ */
+ //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化
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();
}
-
+
+
+ /*
+ * 功能描述:构造函数
+ * 参数注解: mIsCreate用于标示构造方式
+ */
public SqlNote(Context context, long id) {
mContext = context;
mContentResolver = context.getContentResolver();
@@ -163,19 +192,23 @@ public class SqlNote {
if (mType == Notes.TYPE_NOTE)
loadDataContent();
mDiffNoteValues = new ContentValues();
-
+
}
-
+
+ /*
+ * 功能描述:通过id从光标处加载数据
+ */
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);
+ }, null);//通过id获得对应的ContentResolver中的cursor
if (c != null) {
c.moveToNext();
- loadFromCursor(c);
+ loadFromCursor(c);//然后加载数据进行初始化,这样函数
+ //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同
} else {
Log.w(TAG, "loadFromCursor: cursor = null");
}
@@ -184,8 +217,12 @@ public class SqlNote {
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);
@@ -199,7 +236,10 @@ public class SqlNote {
mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
mVersion = c.getLong(VERSION_COLUMN);
}
-
+
+ /*
+ * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处
+ */
private void loadDataContent() {
Cursor c = null;
mDataList.clear();
@@ -225,7 +265,10 @@ public class SqlNote {
c.close();
}
}
-
+
+ /*
+ * 功能描述:设置通过content机制用于共享的数据信息
+ */
public boolean setContent(JSONObject js) {
try {
JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
@@ -239,7 +282,7 @@ public class SqlNote {
mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
}
mSnippet = snippet;
-
+
int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
: Notes.TYPE_NOTE;
if (mIsCreate || mType != type) {
@@ -253,84 +296,83 @@ public class SqlNote {
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;
-
+
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;
-
+
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;
-
+
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;
-
+
for (int i = 0; i < dataArray.length(); i++) {
JSONObject data = dataArray.getJSONObject(i);
SqlData sqlData = null;
@@ -342,12 +384,12 @@ public class SqlNote {
}
}
}
-
+
if (sqlData == null) {
sqlData = new SqlData(mContext);
mDataList.add(sqlData);
}
-
+
sqlData.setContent(data);
}
}
@@ -358,18 +400,21 @@ public class SqlNote {
}
return true;
}
-
+
+ /*
+ * 功能描述:获取content机制提供的数据并加载到note中
+ */
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 note = new JSONObject();
- if (mType == Notes.TYPE_NOTE) {
+ if (mType == Notes.TYPE_NOTE) {//类型为note时
note.put(NoteColumns.ID, mId);
note.put(NoteColumns.ALERTED_DATE, mAlertDate);
note.put(NoteColumns.BG_COLOR_ID, mBgColorId);
@@ -383,7 +428,7 @@ public class SqlNote {
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();
@@ -392,13 +437,13 @@ public class SqlNote {
}
}
js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
- } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {
+ } 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());
@@ -406,46 +451,73 @@ public class SqlNote {
}
return null;
}
-
+
+ /*
+ * 功能描述:给当前id设置父id
+ */
public void setParentId(long id) {
mParentId = id;
mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
}
-
+
+ /*
+ * 功能描述:给当前id设置Gtaskid
+ */
public void setGtaskId(String gid) {
mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
}
-
+
+ /*
+ * 功能描述:给当前id设置同步id
+ */
public void setSyncId(long syncId) {
mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);
}
-
+
+ /*
+ * 功能描述:初始化本地修改,即撤销所有当前修改
+ */
public void resetLocalModified() {
mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0);
}
-
+
+ /*
+ * 功能描述:获得当前id
+ */
public long getId() {
return mId;
}
-
+
+ /*
+ * 功能描述:获得当前id的父id
+ */
public long getParentId() {
return mParentId;
}
-
+
+ /*
+ * 功能描述:获取小片段即用于显示的部分便签内容
+ */
public String getSnippet() {
return mSnippet;
}
-
+
+ /*
+ * 功能描述:判断是否为便签类型
+ */
public boolean isNoteType() {
return mType == Notes.TYPE_NOTE;
}
-
+
+ /*
+ * 功能描述:commit函数用于把当前造作所做的修改保存到数据库
+ */
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));
@@ -456,9 +528,9 @@ public class SqlNote {
if (mId == 0) {
throw new IllegalStateException("Create thread id failed");
}
-
+
if (mType == Notes.TYPE_NOTE) {
- for (SqlData sqlData : mDataList) {
+ for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现
sqlData.commit(mId, false, -1);
}
}
@@ -470,7 +542,7 @@ public class SqlNote {
if (mDiffNoteValues.size() > 0) {
mVersion ++;
int result = 0;
- if (!validateVersion) {
+ if (!validateVersion) {//构造字符串
result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
+ NoteColumns.ID + "=?)", new String[] {
String.valueOf(mId)
@@ -486,19 +558,19 @@ public class SqlNote {
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/小米便签源码/src/net/micode/notes/gtask/data/Task.java b/src/gtask/data/Task.java
similarity index 94%
rename from 小米便签源码/src/net/micode/notes/gtask/data/Task.java
rename to src/gtask/data/Task.java
index 6a19454..127f3f9 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/Task.java
+++ b/src/gtask/data/Task.java
@@ -32,42 +32,43 @@ import org.json.JSONException;
import org.json.JSONObject;
+
public class Task extends Node {
private static final String TAG = Task.class.getSimpleName();
-
- private boolean mCompleted;
-
+
+ private boolean mCompleted;//是否完成
+
private String mNotes;
-
- private JSONObject mMetaInfo;
-
- private Task mPriorSibling;
-
- private TaskList mParent;
-
+
+ private JSONObject mMetaInfo;//将在实例中存储数据的类型
+
+ private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善)
+
+ private TaskList mParent;//所在的任务列表的指针
+
public Task() {
super();
mCompleted = false;
mNotes = null;
- mPriorSibling = null;
- mParent = null;
+ mPriorSibling = null;//TaskList中当前Task前面的Task的指针
+ mParent = null;//当前Task所在的TaskList
mMetaInfo = null;
}
-
+
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());
@@ -78,45 +79,49 @@ public class Task extends Node {
entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
}
js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
+
// parent_id
+ if (mParent!= null) {
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
+ if (mParent!= null) {
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 {
// 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());
@@ -125,16 +130,16 @@ public class Task extends Node {
}
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 {
@@ -142,27 +147,27 @@ public class Task extends Node {
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));
@@ -174,22 +179,22 @@ public class Task extends Node {
}
}
}
-
- public void setContentByLocalJSON(JSONObject js) {
+
+ public void setContentByLocalJSON(JSONObject js) { //��metadata����ʵʩ
if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)
|| !js.has(GTaskStringUtils.META_HEAD_DATA)) {
Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
}
-
+
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");
+ 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)) {
@@ -197,13 +202,13 @@ public class Task extends Node {
break;
}
}
-
+
} catch (JSONException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
}
}
-
+
public JSONObject getLocalJSONFromContent() {
String name = getName();
try {
@@ -213,7 +218,7 @@ public class Task extends Node {
Log.w(TAG, "the note seems to be an empty one");
return null;
}
-
+
JSONObject js = new JSONObject();
JSONObject note = new JSONObject();
JSONArray dataArray = new JSONArray();
@@ -228,7 +233,7 @@ public class Task extends Node {
// synced task
JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
-
+
for (int i = 0; i < dataArray.length(); i++) {
JSONObject data = dataArray.getJSONObject(i);
if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {
@@ -236,7 +241,7 @@ public class Task extends Node {
break;
}
}
-
+
note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
return mMetaInfo;
}
@@ -246,7 +251,7 @@ public class Task extends Node {
return null;
}
}
-
+
public void setMetaInfo(MetaData metaData) {
if (metaData != null && metaData.getNotes() != null) {
try {
@@ -257,30 +262,30 @@ public class Task extends Node {
}
}
}
-
+
public int getSyncAction(Cursor c) {
try {
JSONObject noteInfo = null;
if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) {
noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
}
-
+
if (noteInfo == null) {
Log.w(TAG, "it seems that note meta has been deleted");
return SYNC_ACTION_UPDATE_REMOTE;
}
-
+
if (!noteInfo.has(NoteColumns.ID)) {
Log.w(TAG, "remote note id seems to be deleted");
return SYNC_ACTION_UPDATE_LOCAL;
}
-
+
// 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;
}
-
+
if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
// there is no local update
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
@@ -307,45 +312,45 @@ public class Task extends Node {
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;
}
-
-}
+
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/data/TaskList.java b/src/gtask/data/TaskList.java
similarity index 84%
rename from 小米便签源码/src/net/micode/notes/gtask/data/TaskList.java
rename to src/gtask/data/TaskList.java
index 4ea21c5..ec6cdd9 100644
--- a/小米便签源码/src/net/micode/notes/gtask/data/TaskList.java
+++ b/src/gtask/data/TaskList.java
@@ -30,79 +30,88 @@ import org.json.JSONObject;
import java.util.ArrayList;
+
public class TaskList extends Node {
- private static final String TAG = TaskList.class.getSimpleName();
-
- private int mIndex;
-
- private ArrayList mChildren;
-
+ private static final String TAG = TaskList.class.getSimpleName();//tag标记
+
+ private int mIndex;//当前TaskList的指针
+
+ private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList
+
public TaskList() {
super();
mChildren = new ArrayList();
mIndex = 1;
}
-
+
+ /* (non-Javadoc)
+ * @see net.micode.notes.gtask.data.Node#getCreateAction(int)
+ * 生成并返回一个包含了一定数据的JSONObject实体
+ */
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, mIndex);
-
+
// entity_delta
- JSONObject entity = new JSONObject();
+ JSONObject entity = new JSONObject();//entity实体
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_GROUP);
js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
+
} catch (JSONException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
throw new ActionFailureException("fail to generate tasklist-create jsonobject");
}
-
+
return js;
}
-
+
+ /* (non-Javadoc)
+ * @see net.micode.notes.gtask.data.Node#getUpdateAction(int)
+ * 生成并返回一个包含了一定数据的JSONObject实体
+ */
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());
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 tasklist-update jsonobject");
}
-
+
return js;
}
-
+
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
@@ -110,17 +119,17 @@ public class TaskList extends Node {
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));
}
-
+
} catch (JSONException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
@@ -128,15 +137,15 @@ public class TaskList extends Node {
}
}
}
-
+
public void setContentByLocalJSON(JSONObject js) {
if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) {
Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
}
-
+
try {
JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
-
+
if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {
String name = folder.getString(NoteColumns.SNIPPET);
setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name);
@@ -156,12 +165,12 @@ public class TaskList extends Node {
e.printStackTrace();
}
}
-
+
public JSONObject getLocalJSONFromContent() {
try {
JSONObject js = new JSONObject();
JSONObject folder = new JSONObject();
-
+
String folderName = getName();
if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX))
folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(),
@@ -172,9 +181,9 @@ public class TaskList extends Node {
folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
else
folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
-
+
js.put(GTaskStringUtils.META_HEAD_NOTE, folder);
-
+
return js;
} catch (JSONException e) {
Log.e(TAG, e.toString());
@@ -182,7 +191,7 @@ public class TaskList extends Node {
return null;
}
}
-
+
public int getSyncAction(Cursor c) {
try {
if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
@@ -212,14 +221,23 @@ public class TaskList extends Node {
Log.e(TAG, e.toString());
e.printStackTrace();
}
-
+
return SYNC_ACTION_ERROR;
}
-
+
+ /**
+ * @return
+ * 功能:获得TaskList的大小,即mChildren的大小
+ */
public int getChildTaskCount() {
return mChildren.size();
}
-
+
+ /**
+ * @param task
+ * @return 返回值为是否成功添加任务。
+ * 功能:在当前任务表末尾添加新的任务。
+ */
public boolean addChildTask(Task task) {
boolean ret = false;
if (task != null && !mChildren.contains(task)) {
@@ -229,21 +247,29 @@ public class TaskList extends Node {
task.setPriorSibling(mChildren.isEmpty() ? null : mChildren
.get(mChildren.size() - 1));
task.setParent(this);
+ //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改
+ //,接下来几个函数都有相关操作
}
}
return ret;
}
-
+
+ /**
+ * @param task
+ * @param index
+ * @return
+ * 功能:在当前任务表的指定位置添加新的任务。
+ */
public boolean addChildTask(Task task, int index) {
if (index < 0 || index > mChildren.size()) {
Log.e(TAG, "add child task: invalid index");
return false;
}
-
+
int pos = mChildren.indexOf(task);
if (task != null && pos == -1) {
mChildren.add(index, task);
-
+
// update the task list
Task preTask = null;
Task afterTask = null;
@@ -251,26 +277,31 @@ public class TaskList extends Node {
preTask = mChildren.get(index - 1);
if (index != mChildren.size() - 1)
afterTask = mChildren.get(index + 1);
-
+
task.setPriorSibling(preTask);
if (afterTask != null)
afterTask.setPriorSibling(task);
}
-
+
return true;
}
-
+
+ /**
+ * @param task
+ * @return 返回删除是否成功
+ * 功能:删除TaskList中的一个Task
+ */
public boolean removeChildTask(Task task) {
boolean ret = false;
int index = mChildren.indexOf(task);
if (index != -1) {
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(
@@ -280,25 +311,37 @@ public class TaskList extends Node {
}
return ret;
}
-
+
+ /**
+ * @param task
+ * @param index
+ * @return
+ * 功能:将当前TaskList中含有的某个Task移到index位置
+ */
public boolean moveChildTask(Task task, int index) {
-
+
if (index < 0 || index >= mChildren.size()) {
Log.e(TAG, "move child task: invalid index");
return false;
}
-
+
int pos = mChildren.indexOf(task);
if (pos == -1) {
Log.e(TAG, "move child task: the task should in the list");
return false;
}
-
+
if (pos == index)
return true;
return (removeChildTask(task) && addChildTask(task, index));
+ //利用已实现好的功能完成当下功能;
}
-
+
+ /**
+ * @param gid
+ * @return返回寻找结果
+ * 功能:按gid寻找Task
+ */
public Task findChildTaskByGid(String gid) {
for (int i = 0; i < mChildren.size(); i++) {
Task t = mChildren.get(i);
@@ -308,11 +351,21 @@ public class TaskList extends Node {
}
return null;
}
-
+
+ /**
+ * @param task
+ * @return
+ * 功能:返回指定Task的index
+ */
public int getChildTaskIndex(Task task) {
return mChildren.indexOf(task);
}
-
+
+ /**
+ * @param index
+ * @return
+ * 功能:返回指定index的Task
+ */
public Task getChildTaskByIndex(int index) {
if (index < 0 || index >= mChildren.size()) {
Log.e(TAG, "getTaskByIndex: invalid index");
@@ -320,24 +373,29 @@ public class TaskList extends Node {
}
return mChildren.get(index);
}
-
+
+ /**
+ * @param gid
+ * @return
+ * 功能:返回指定gid的Task
+ */
public Task getChilTaskByGid(String gid) {
- for (Task task : mChildren) {
+ for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记)
if (task.getGid().equals(gid))
return task;
}
return null;
}
-
+
public ArrayList getChildTaskList() {
return this.mChildren;
}
-
+
public void setIndex(int index) {
this.mIndex = index;
}
-
+
public int getIndex() {
return this.mIndex;
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/exception/ActionFailureException.java b/src/gtask/exception/ActionFailureException.java
similarity index 59%
rename from 小米便签源码/src/net/micode/notes/gtask/exception/ActionFailureException.java
rename to src/gtask/exception/ActionFailureException.java
index 15504be..16d041e 100644
--- a/小米便签源码/src/net/micode/notes/gtask/exception/ActionFailureException.java
+++ b/src/gtask/exception/ActionFailureException.java
@@ -14,19 +14,32 @@
* limitations under the License.
*/
+/*
+ * Description:支持小米便签运行过程中的运行异常处理。
+ */
+
package net.micode.notes.gtask.exception;
-
+
public class ActionFailureException extends RuntimeException {
private static final long serialVersionUID = 4425249765923293627L;
-
+ /*
+ * serialVersionUID相当于java类的身份证。主要用于版本控制。
+ * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
+ */
+
public ActionFailureException() {
super();
}
-
+ /*
+ * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象.
+ * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。
+ * 怎么去引用里面的父类对象呢?使用super来引用
+ * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString)
+ */
public ActionFailureException(String paramString) {
super(paramString);
}
-
+
public ActionFailureException(String paramString, Throwable paramThrowable) {
super(paramString, paramThrowable);
}
diff --git a/小米便签源码/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/gtask/exception/NetworkFailureException.java
similarity index 59%
rename from 小米便签源码/src/net/micode/notes/gtask/exception/NetworkFailureException.java
rename to src/gtask/exception/NetworkFailureException.java
index b08cfb1..d4ab156 100644
--- a/小米便签源码/src/net/micode/notes/gtask/exception/NetworkFailureException.java
+++ b/src/gtask/exception/NetworkFailureException.java
@@ -14,19 +14,33 @@
* limitations under the License.
*/
+/*
+ * Description:支持小米便签运行过程中的网络异常处理。
+ */
+
package net.micode.notes.gtask.exception;
-
+
public class NetworkFailureException extends Exception {
private static final long serialVersionUID = 2107610287180234136L;
-
+ /*
+ * serialVersionUID相当于java类的身份证。主要用于版本控制。
+ * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
+ */
+
public NetworkFailureException() {
super();
}
-
+
+ /*
+ * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象.
+ * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。
+ * 怎么去引用里面的父类对象呢?使用super来引用
+ * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString)
+ */
public NetworkFailureException(String paramString) {
super(paramString);
}
-
+
public NetworkFailureException(String paramString, Throwable paramThrowable) {
super(paramString, paramThrowable);
}
diff --git a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/gtask/remote/GTaskASyncTask.java
similarity index 60%
rename from 小米便签源码/src/net/micode/notes/gtask/remote/GTaskASyncTask.java
rename to src/gtask/remote/GTaskASyncTask.java
index b3b61e7..dac2169 100644
--- a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskASyncTask.java
+++ b/src/gtask/remote/GTaskASyncTask.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package net.micode.notes.gtask.remote;
+
import android.app.Notification;
import android.app.NotificationManager;
@@ -29,22 +29,32 @@ import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;
+package net.micode.notes.gtask.remote;
+
+/*异步操作类,实现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
+ */
public class GTaskASyncTask extends AsyncTask {
-
+
+
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
-
+
public interface OnCompleteListener {
void onComplete();
}
-
+
private Context mContext;
-
+
private NotificationManager mNotifiManager;
-
+
private GTaskManager mTaskManager;
-
+
private OnCompleteListener mOnCompleteListener;
-
+
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context;
mOnCompleteListener = listener;
@@ -52,57 +62,57 @@ public class GTaskASyncTask extends AsyncTask {
.getSystemService(Context.NOTIFICATION_SERVICE);
mTaskManager = GTaskManager.getInstance();
}
-
+
public void cancelSync() {
mTaskManager.cancelSync();
}
-
- public void publishProgess(String message) {
+
+ public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值
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;
+ notification.defaults = Notification.DEFAULT_LIGHTS; // 调用系统自带灯光
+ notification.flags = Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失
+ PendingIntent pendingIntent; //一个描述了想要启动一个Activity、Broadcast或是Service的意图
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesPreferenceActivity.class), 0);
-
+ NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象
+
} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesListActivity.class), 0);
+ NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象
}
notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
pendingIntent);
- mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
+ mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息
}
-
+
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
- .getSyncAccountName(mContext)));
- return mTaskManager.sync(mContext, this);
+ .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中
+ return mTaskManager.sync(mContext, this); //进行后台同步具体操作
}
-
+
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
- if (mContext instanceof GTaskSyncService) {
+ if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
-
+
@Override
- protected void onPostExecute(Integer result) {
+ protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果
if (result == GTaskManager.STATE_SUCCESS) {
showNotification(R.string.ticker_success, mContext.getString(
R.string.success_sync_account, mTaskManager.getSyncAccount()));
- NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
+ 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) {
@@ -110,14 +120,14 @@ public class GTaskASyncTask extends AsyncTask {
} 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();
+ new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思
+
+ public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作
+ mOnCompleteListener.onComplete();
}
}).start();
}
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskClient.java b/src/gtask/remote/GTaskClient.java
similarity index 74%
rename from 小米便签源码/src/net/micode/notes/gtask/remote/GTaskClient.java
rename to src/gtask/remote/GTaskClient.java
index c67dfdf..cd0de8e 100644
--- a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskClient.java
+++ b/src/gtask/remote/GTaskClient.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-package net.micode.notes.gtask.remote;
import android.accounts.Account;
import android.accounts.AccountManager;
@@ -61,35 +60,41 @@ import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
+package net.micode.notes.gtask.remote;
+
+/*
+ * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容
+ * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid
+ */
public class GTaskClient {
private static final String TAG = GTaskClient.class.getSimpleName();
-
- private static final String GTASK_URL = "https://mail.google.com/tasks/";
-
+
+ private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL
+
private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig";
-
+
private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig";
-
+
private static GTaskClient mInstance = null;
-
+
private DefaultHttpClient mHttpClient;
-
+
private String mGetUrl;
-
+
private String mPostUrl;
-
+
private long mClientVersion;
-
+
private boolean mLoggedin;
-
+
private long mLastLoginTime;
-
+
private int mActionId;
-
+
private Account mAccount;
-
+
private JSONArray mUpdateArray;
-
+
private GTaskClient() {
mHttpClient = null;
mGetUrl = GTASK_GET_URL;
@@ -101,81 +106,100 @@ public class GTaskClient {
mAccount = null;
mUpdateArray = null;
}
-
+
+ /*用来获取的实例化对象
+ * 使用 getInstance()
+ * 返回mInstance这个实例化对象
+ */
public static synchronized GTaskClient getInstance() {
if (mInstance == null) {
mInstance = new GTaskClient();
}
return mInstance;
}
-
+
+ /*用来实现登录操作的函数,传入的参数是一个Activity
+ * 设置登录操作限制时间,如果超时则需要重新登录
+ * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录
+ * 返回true或者false,即最后是否登陆成功
+ */
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
+
+ // 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()
+ //尝试使用用户自己的域名登录
+ 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";
-
+ mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl
+ mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl
+
if (tryToLoginGtask(activity, authToken)) {
mLoggedin = true;
}
}
-
+
// try to login with google official url
+ //如果用户账户无法登录,则使用谷歌官方的URI进行登录
if (!mLoggedin) {
- mGetUrl = GTASK_GET_URL;
+ mGetUrl = GTASK_GET_URL;
mPostUrl = GTASK_POST_URL;
if (!tryToLoginGtask(activity, authToken)) {
return false;
}
}
-
+
mLoggedin = true;
return true;
}
-
+
+ /*具体实现登录谷歌账户的方法
+ * 使用令牌机制
+ * 使用AccountManager来管理注册账号
+ * 返回值是账号的令牌
+ */
private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
- String authToken;
- AccountManager accountManager = AccountManager.get(activity);
- Account[] accounts = accountManager.getAccountsByType("com.google");
-
+ String authToken; //令牌,是登录操作保证安全性的一个方法
+ AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口
+ Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account
+
if (accounts.length == 0) {
Log.e(TAG, "there is no available google account");
return null;
}
-
+
String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
Account account = null;
+ //遍历获得的accounts信息,寻找已经记录过的账户信息
for (Account a : accounts) {
if (a.name.equals(accountName)) {
account = a;
@@ -188,13 +212,15 @@ public class GTaskClient {
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);
+ //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token
if (invalidateToken) {
accountManager.invalidateAuthToken("com.google", authToken);
loginGoogleAccount(activity, false);
@@ -203,20 +229,22 @@ public class GTaskClient {
Log.e(TAG, "get auth token failed");
authToken = null;
}
-
+
return authToken;
}
-
+
+ //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法
private boolean tryToLoginGtask(Activity activity, String authToken) {
- if (!loginGtask(authToken)) {
- // maybe the auth token is out of date, now let's invalidate the
+ if (!loginGtask(authToken)) {
+ // maybe the auth token is out of authTokedate, now let's invalidate the
// token and try again
+ //删除过一个无效的authToken,申请一个新的后再次尝试登陆
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;
@@ -224,26 +252,28 @@ public class GTaskClient {
}
return true;
}
-
+
+ //实现登录GTask的具体操作
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();
+ BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie
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 cookies = mHttpClient.getCookieStore().getCookies();
boolean hasAuthCookie = false;
for (Cookie cookie : cookies) {
@@ -254,8 +284,9 @@ public class GTaskClient {
if (!hasAuthCookie) {
Log.w(TAG, "it seems that there is no auth cookie");
}
-
+
// get the client version
+ //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容
String resString = getResponseContent(response.getEntity());
String jsBegin = "_setup(";
String jsEnd = ")}";
@@ -276,41 +307,49 @@ public class GTaskClient {
Log.e(TAG, "httpget gtask_url failed");
return false;
}
-
+
return true;
}
-
+
private int getActionId() {
return mActionId++;
}
-
+
+ /*实例化创建一个用于向网络传输数据的对象
+ * 使用HttpPost类
+ * 返回一个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;
}
-
+
+ /*通过URL获取响应后返回的数据,也就是网络上的数据和资源
+ * 使用getContentEncoding()获取网络上的资源和数据
+ * 返回值就是获取到的资源
+ */
private String getResponseContent(HttpEntity entity) throws IOException {
String contentEncoding = null;
- if (entity.getContentEncoding() != null) {
+ if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来
contentEncoding = entity.getContentEncoding().getValue();
Log.d(TAG, "encoding: " + contentEncoding);
}
-
+
InputStream input = entity.getContent();
- if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {
+ if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库
input = new GZIPInputStream(entity.getContent());
- } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {
+ } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩
Inflater inflater = new Inflater(true);
input = new InflaterInputStream(entity.getContent(), inflater);
}
-
+
try {
InputStreamReader isr = new InputStreamReader(input);
- BufferedReader br = new BufferedReader(isr);
+ BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的
StringBuilder sb = new StringBuilder();
-
+
while (true) {
String buff = br.readLine();
if (buff == null) {
@@ -322,25 +361,33 @@ public class GTaskClient {
input.close();
}
}
-
+
+ /*通过JSON发送请求
+ * 请求的具体内容在json的实例化对象js中然后传入
+ * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中
+ * 执行请求后使用getResponseContent方法得到返回的数据和资源
+ * 将资源再次放入json后返回
+ */
private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
- if (!mLoggedin) {
+ if (!mLoggedin) {//未登录
Log.e(TAG, "please login first");
throw new ActionFailureException("not logged in");
}
-
+
+ //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里
HttpPost httpPost = createHttpPost();
try {
LinkedList list = new LinkedList();
list.add(new BasicNameValuePair("r", js.toString()));
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
+ UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对
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();
@@ -359,70 +406,84 @@ public class GTaskClient {
throw new ActionFailureException("error occurs when posting request");
}
}
-
+
+ /*创建单个任务
+ * 传入参数是一个.gtask.data.Task包里Task类的对象
+ * 利用json获取Task里的内容,并且创建相应的jsPost
+ * 利用postRequest得到任务的返回信息
+ * 使用task.setGid设置task的new_ID
+ */
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");
}
}
-
+
+ /*
+ * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid
+ */
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");
}
}
-
+
+ /*
+ * 同步更新操作
+ * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion
+ * 使用postRequest发送这个jspost,进行处理
+ */
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) {
@@ -432,7 +493,11 @@ public class GTaskClient {
}
}
}
-
+
+ /*
+ * 添加更新的事项
+ * 调用commitUpdate()实现
+ */
public void addUpdateNode(Node node) throws NetworkFailureException {
if (node != null) {
// too many update items may result in an error
@@ -440,13 +505,19 @@ public class GTaskClient {
if (mUpdateArray != null && mUpdateArray.length() > 10) {
commitUpdate();
}
-
+
if (mUpdateArray == null)
mUpdateArray = new JSONArray();
mUpdateArray.put(node.getUpdateAction(getActionId()));
}
}
-
+
+ /*
+ * 移动task,比如讲task移动到不同的task列表中去
+ * 通过getGid获取task所属列表的gid
+ * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的
+ * 最后还是通过postRequest进行更新后的发送
+ */
public void moveTask(Task task, TaskList preParent, TaskList curParent)
throws NetworkFailureException {
commitUpdate();
@@ -454,7 +525,7 @@ public class GTaskClient {
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);
@@ -463,43 +534,50 @@ public class GTaskClient {
if (preParent == curParent && task.getPriorSibling() != null) {
// put prioring_sibing_id only if moving within the tasklist and
// it is not the first one
+ //设置优先级ID,只有当移动是发生在文件中
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());
+ 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);
+ //最后将ACTION_LIST加入到jsPost中
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");
}
}
-
+
+ /*
+ * 删除操作节点
+ * 还是利用JSON
+ * 删除过后使用postRequest发送删除后的结果
+ */
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);
mUpdateArray = null;
} catch (JSONException e) {
@@ -508,19 +586,25 @@ public class GTaskClient {
throw new ActionFailureException("delete node: handing jsonobject failed");
}
}
-
+
+ /*
+ * 获取任务列表
+ * 首先通过GetURI使用getResponseContent从网上获取数据
+ * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回
+ */
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
+ //筛选工作,把筛选出的字符串放入jsString
String resString = getResponseContent(response.getEntity());
String jsBegin = "_setup(";
String jsEnd = ")}";
@@ -531,6 +615,7 @@ public class GTaskClient {
jsString = resString.substring(begin + jsBegin.length(), end);
}
JSONObject js = new JSONObject(jsString);
+ //获取GTASK_JSON_LISTS
return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS);
} catch (ClientProtocolException e) {
Log.e(TAG, e.toString());
@@ -546,26 +631,29 @@ public class GTaskClient {
throw new ActionFailureException("get task lists: handing jasonobject failed");
}
}
-
+
+ /*
+ * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务
+ */
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_ACTION_ID, getActionId());
+ action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid
action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false);
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);
return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS);
} catch (JSONException e) {
@@ -574,12 +662,13 @@ public class GTaskClient {
throw new ActionFailureException("get task list: handing jsonobject failed");
}
}
-
+
public Account getSyncAccount() {
return mAccount;
}
-
+
+ //重置更新的内容
public void resetUpdateArray() {
mUpdateArray = null;
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskManager.java b/src/gtask/remote/GTaskManager.java
similarity index 75%
rename from 小米便签源码/src/net/micode/notes/gtask/remote/GTaskManager.java
rename to src/gtask/remote/GTaskManager.java
index d2b4082..cc02a2a 100644
--- a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskManager.java
+++ b/src/gtask/remote/GTaskManager.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-package net.micode.notes.gtask.remote;
import android.app.Activity;
import android.content.ContentResolver;
@@ -48,72 +47,76 @@ import java.util.Iterator;
import java.util.Map;
+package net.micode.notes.gtask.remote;
+
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;
-
+ public static final int STATE_SYNC_CANCELLED = 4;
private static GTaskManager mInstance = null;
-
+
private Activity mActivity;
-
private Context mContext;
-
private ContentResolver mContentResolver;
-
private boolean mSyncing;
-
private boolean mCancelled;
-
private HashMap mGTaskListHashMap;
-
private HashMap mGTaskHashMap;
-
private HashMap mMetaHashMap;
-
private TaskList mMetaList;
-
- private HashSet mLocalDeleteIdMap;
-
+ private HashSet mLocalDeleteIdMap;
private HashMap mGidToNid;
-
private HashMap mNidToGid;
-
- private GTaskManager() {
- mSyncing = false;
- mCancelled = false;
- mGTaskListHashMap = new HashMap();
+
+ private GTaskManager() { //对象初始化函数
+ mSyncing = false; //正在同步,flase代表未执行
+ mCancelled = false; //全局标识,flase代表可以执行
+ mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。
mGTaskHashMap = new HashMap();
mMetaHashMap = new HashMap();
mMetaList = null;
mLocalDeleteIdMap = new HashSet();
- mGidToNid = new HashMap();
- mNidToGid = new HashMap();
+ mGidToNid = new HashMap(); //GoogleID to NodeID??
+ mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射
}
-
- public static synchronized GTaskManager getInstance() {
+
+ /**
+ * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。
+ * 功能:类初始化函数
+ * @author TTS
+ * @return GtaskManger
+ */
+ public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized
if (mInstance == null) {
mInstance = new GTaskManager();
}
return mInstance;
}
-
+
+ /**
+ * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。
+ * @author TTS
+ * @param activity
+ */
public synchronized void setActivityContext(Activity activity) {
- // used for getting authtoken
+ // used for getting auth token
mActivity = activity;
}
-
- public int sync(Context context, GTaskASyncTask asyncTask) {
+
+ /**
+ * 核心函数
+ * 功能:实现了本地同步操作和远端同步操作
+ * @author TTS
+ * @param context-----获取上下文
+ * @param asyncTask-------用于同步的异步操作类
+ * @return int
+ */
+ public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数
if (mSyncing) {
- Log.d(TAG, "Sync is in progress");
+ Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug
return STATE_SYNC_IN_PROGRESS;
}
mContext = context;
@@ -126,29 +129,29 @@ public class GTaskManager {
mLocalDeleteIdMap.clear();
mGidToNid.clear();
mNidToGid.clear();
-
+
try {
- GTaskClient client = GTaskClient.getInstance();
- client.resetUpdateArray();
-
+ GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机
+ client.resetUpdateArray(); //JSONArray类型,reset即置为NULL
+
// 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();
-
+ initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList
+
// do content sync work
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));
syncContent();
- } catch (NetworkFailureException e) {
- Log.e(TAG, e.toString());
+ } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常
+ Log.e(TAG, e.toString()); //创建日志文件(调试信息),error
return STATE_NETWORK_ERROR;
- } catch (ActionFailureException e) {
+ } catch (ActionFailureException e) { //此类异常为操作异常
Log.e(TAG, e.toString());
return STATE_INTERNAL_ERROR;
} catch (Exception e) {
@@ -164,36 +167,45 @@ public class GTaskManager {
mNidToGid.clear();
mSyncing = false;
}
-
+
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
}
-
+
+ /**
+ *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。
+ *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap
+ *@author TTS
+ *@exception NetworkFailureException
+ *@return void
+ */
private void initGTaskList() throws NetworkFailureException {
if (mCancelled)
return;
- GTaskClient client = GTaskClient.getInstance();
+ GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机
try {
- JSONArray jsTaskLists = client.getTaskLists();
-
+ //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。
+ //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。
+ //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。
+ JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists???
+
// init meta list first
- mMetaList = null;
+ mMetaList = null; //TaskList类型
for (int i = 0; i < jsTaskLists.length(); i++) {
- JSONObject object = jsTaskLists.getJSONObject(i);
+ JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject
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);
-
+
+ if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
+ mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化
+ mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname...
+
// load meta data
- JSONArray jsMetas = client.getTaskList(gid);
+ JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list???
for (int j = 0; j < jsMetas.length(); j++) {
object = (JSONObject) jsMetas.getJSONObject(j);
- MetaData metaData = new MetaData();
+ MetaData metaData = new MetaData(); //继承自Node
metaData.setContentByRemoteJSON(object);
- if (metaData.isWorthSaving()) {
+ if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList
mMetaList.addChildTask(metaData);
if (metaData.getGid() != null) {
mMetaHashMap.put(metaData.getRelatedGid(), metaData);
@@ -202,7 +214,7 @@ public class GTaskManager {
}
}
}
-
+
// create meta list if not existed
if (mMetaList == null) {
mMetaList = new TaskList();
@@ -210,21 +222,21 @@ public class GTaskManager {
+ 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 gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。
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 tasklist = new TaskList(); //继承自Node
tasklist.setContentByRemoteJSON(object);
- mGTaskListHashMap.put(gid, tasklist);
- mGTaskHashMap.put(gid, tasklist);
-
+ mGTaskListHashMap.put(gid, tasklist);
+ mGTaskHashMap.put(gid, tasklist); //为什么加两遍???
+
// load tasks
JSONArray jsTasks = client.getTaskList(gid);
for (int j = 0; j < jsTasks.length(); j++) {
@@ -246,19 +258,24 @@ public class GTaskManager {
throw new ActionFailureException("initGTaskList: handing JSONObject failed");
}
}
-
- private void syncContent() throws NetworkFailureException {
+
+ /**
+ * 功能:本地内容同步操作
+ * @throws NetworkFailureException
+ * @return 无返回值
+ */
+ private void syncContent() throws NetworkFailureException { //本地内容同步操作
int syncType;
- Cursor c = null;
- String gid;
- Node node;
-
- mLocalDeleteIdMap.clear();
-
+ Cursor c = null; //数据库指针
+ String gid; //GoogleID??
+ Node node; //Node包含Sync_Action的不同类型
+
+ mLocalDeleteIdMap.clear(); //HashSet类型
+
if (mCancelled) {
return;
}
-
+
// for local deleted note
try {
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
@@ -273,7 +290,7 @@ public class GTaskManager {
mGTaskHashMap.remove(gid);
doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c);
}
-
+
mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
}
} else {
@@ -285,10 +302,10 @@ public class GTaskManager {
c = null;
}
}
-
+
// sync folder first
syncFolder();
-
+
// for note existing in database
try {
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
@@ -301,8 +318,8 @@ public class GTaskManager {
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);
+ mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系
+ mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系
syncType = node.getSyncAction(c);
} else {
if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
@@ -318,23 +335,23 @@ public class GTaskManager {
} 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();
+ Iterator> iter = mGTaskHashMap.entrySet().iterator(); //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
+
+ // mCancelled can be set by another thread, so we neet to check one by //thread----线程
// one
// clear local delete table
if (!mCancelled) {
@@ -342,25 +359,30 @@ public class GTaskManager {
throw new ActionFailureException("failed to batch-delete local deleted notes");
}
}
-
+
// refresh local sync id
if (!mCancelled) {
GTaskClient.getInstance().commitUpdate();
refreshLocalSyncId();
}
-
+
}
-
+
+ /**
+ * 功能:
+ * @author TTS
+ * @throws NetworkFailureException
+ */
private void syncFolder() throws NetworkFailureException {
Cursor c = null;
String gid;
Node node;
int syncType;
-
+
if (mCancelled) {
return;
}
-
+
// for root folder
try {
c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
@@ -389,7 +411,7 @@ public class GTaskManager {
c = null;
}
}
-
+
// for call-note folder
try {
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)",
@@ -423,7 +445,7 @@ public class GTaskManager {
c = null;
}
}
-
+
// for local existing folders
try {
c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
@@ -459,7 +481,7 @@ public class GTaskManager {
c = null;
}
}
-
+
// for remote add folders
Iterator> iter = mGTaskListHashMap.entrySet().iterator();
while (iter.hasNext()) {
@@ -471,16 +493,24 @@ public class GTaskManager {
doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
}
}
-
+
if (!mCancelled)
GTaskClient.getInstance().commitUpdate();
}
-
+
+ /**
+ * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode
+ * @author TTS
+ * @param syncType
+ * @param node
+ * @param c
+ * @throws NetworkFailureException
+ */
private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
}
-
+
MetaData meta;
switch (syncType) {
case Node.SYNC_ACTION_ADD_LOCAL:
@@ -521,12 +551,18 @@ public class GTaskManager {
throw new ActionFailureException("unkown sync action type");
}
}
-
+
+ /**
+ * 功能:本地增加Node
+ * @author TTS
+ * @param node
+ * @throws NetworkFailureException
+ */
private void addLocalNode(Node node) throws NetworkFailureException {
if (mCancelled) {
return;
}
-
+
SqlNote sqlNote;
if (node instanceof TaskList) {
if (node.getName().equals(
@@ -554,7 +590,7 @@ public class GTaskManager {
}
}
}
-
+
if (js.has(GTaskStringUtils.META_HEAD_DATA)) {
JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
for (int i = 0; i < dataArray.length(); i++) {
@@ -568,14 +604,14 @@ public class GTaskManager {
}
}
}
-
+
}
} 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");
@@ -583,29 +619,38 @@ public class GTaskManager {
}
sqlNote.setParentId(parentId.longValue());
}
-
+
// create the local node
sqlNote.setGtaskId(node.getGid());
sqlNote.commit(false);
-
+
// update gid-nid mapping
mGidToNid.put(node.getGid(), sqlNote.getId());
mNidToGid.put(sqlNote.getId(), node.getGid());
-
+
// update meta
updateRemoteMeta(node.getGid(), sqlNote);
}
-
+
+ /**
+ * 功能:update本地node
+ * @author TTS
+ * @param node
+ * ----同步操作的基础数据类型
+ * @param c
+ * ----Cursor
+ * @throws NetworkFailureException
+ */
private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
}
-
+
SqlNote sqlNote;
// update the note locally
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) {
@@ -614,39 +659,50 @@ public class GTaskManager {
}
sqlNote.setParentId(parentId.longValue());
sqlNote.commit(true);
-
+
// update meta info
updateRemoteMeta(node.getGid(), sqlNote);
}
-
+
+ /**
+ * 功能:远程增加Node
+ * 需要updateRemoteMeta
+ * @author TTS
+ * @param node
+ * ----同步操作的基础数据类型
+ * @param c
+ * --Cursor
+ * @throws NetworkFailureException
+ */
private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
}
-
- SqlNote sqlNote = new SqlNote(mContext, c);
+
+ SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容
Node n;
-
+
// update remotely
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");
+ 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);
+ mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点
+
+ //登录远程服务器,创建Task
+ GTaskClient.getInstance().createTask(task);
n = (Node) task;
-
+
// add meta
updateRemoteMeta(task.getGid(), sqlNote);
} else {
TaskList tasklist = null;
-
+
// we need to skip folder if it has already existed
String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;
if (sqlNote.getId() == Notes.ID_ROOT_FOLDER)
@@ -655,13 +711,14 @@ public class GTaskManager {
folderName += GTaskStringUtils.FOLDER_CALL_NOTE;
else
folderName += sqlNote.getSnippet();
-
- Iterator> iter = mGTaskListHashMap.entrySet().iterator();
+
+ //iterator迭代器,通过统一的接口迭代所有的map元素
+ 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)) {
@@ -670,7 +727,7 @@ public class GTaskManager {
break;
}
}
-
+
// no match we can add now
if (tasklist == null) {
tasklist = new TaskList();
@@ -680,56 +737,79 @@ public class GTaskManager {
}
n = (Node) tasklist;
}
-
+
// update local note
sqlNote.setGtaskId(n.getGid());
sqlNote.commit(false);
sqlNote.resetLocalModified();
sqlNote.commit(true);
-
- // gid-id mapping
+
+ // gid-id mapping //创建id间的映射
mGidToNid.put(n.getGid(), sqlNote.getId());
mNidToGid.put(sqlNote.getId(), n.getGid());
}
-
+
+ /**
+ * 功能:更新远端的Node,包含meta更新(updateRemoteMeta)
+ * @author TTS
+ * @param node
+ * ----同步操作的基础数据类型
+ * @param c
+ * --Cursor
+ * @throws NetworkFailureException
+ */
private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
if (mCancelled) {
return;
}
-
+
SqlNote sqlNote = new SqlNote(mContext, c);
-
+
// update remotely
node.setContentByLocalJSON(sqlNote.getContent());
- GTaskClient.getInstance().addUpdateNode(node);
-
+ GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器
+
// update meta
updateRemoteMeta(node.getGid(), sqlNote);
-
+
// move task if necessary
if (sqlNote.isNoteType()) {
Task task = (Task) node;
- TaskList preParentList = task.getParent();
-
+ TaskList preParentList = task.getParent();
+ //preParentList为通过node获取的父节点列表
+
String curParentGid = mNidToGid.get(sqlNote.getParentId());
+ //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid
+
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) {
+ //通过HashMap找到对应Gid的TaskList
+
+ if (preParentList != curParentList) { //?????????????
preParentList.removeChildTask(task);
curParentList.addChildTask(task);
GTaskClient.getInstance().moveTask(task, preParentList, curParentList);
}
}
-
+
// clear local modified flag
sqlNote.resetLocalModified();
- sqlNote.commit(true);
+ //commit到本地数据库
+ sqlNote.commit(true);
}
-
+
+ /**
+ * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。
+ * @author TTS
+ * @param gid
+ * ---GoogleID为String类型
+ * @param sqlNote
+ * ---同步前的数据库操作,故使用类SqlNote
+ * @throws NetworkFailureException
+ */
private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
if (sqlNote != null && sqlNote.isNoteType()) {
MetaData metaData = mMetaHashMap.get(gid);
@@ -745,33 +825,39 @@ public class GTaskManager {
}
}
}
-
+
+ /**
+ * 功能:刷新本地,给sync的ID对应上最后更改过的对象
+ * @author TTS
+ * @return void
+ * @throws NetworkFailureException
+ */
private void refreshLocalSyncId() throws NetworkFailureException {
if (mCancelled) {
return;
}
-
- // get the latest gtask list
+
+ // get the latest gtask list //获取最近的(最晚的)gtask list
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");
+ }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri
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();
+ ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据
values.put(NoteColumns.SYNC_ID, node.getLastModified());
- mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
+ mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。
c.getLong(SqlNote.ID_COLUMN)), values, null, null);
} else {
Log.e(TAG, "something is missed");
@@ -789,12 +875,21 @@ public class GTaskManager {
}
}
}
-
+
+ /**
+ * 功能:获取同步账号,mAccount.name
+ * @author TTS
+ * @return String
+ */
public String getSyncAccount() {
return GTaskClient.getInstance().getSyncAccount().name;
}
-
+
+ /**
+ * 功能:取消同步,置mCancelled为true
+ * @author TTS
+ */
public void cancelSync() {
mCancelled = true;
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskSyncService.java b/src/gtask/remote/GTaskSyncService.java
similarity index 67%
rename from 小米便签源码/src/net/micode/notes/gtask/remote/GTaskSyncService.java
rename to src/gtask/remote/GTaskSyncService.java
index cca36f7..2662101 100644
--- a/小米便签源码/src/net/micode/notes/gtask/remote/GTaskSyncService.java
+++ b/src/gtask/remote/GTaskSyncService.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-package net.micode.notes.gtask.remote;
import android.app.Activity;
import android.app.Service;
@@ -23,55 +22,76 @@ import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
+package net.micode.notes.gtask.remote;
+
+/*
+ * 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() 获取当前进度的信息
+ */
+
public class GTaskSyncService extends Service {
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_BROADCAST_PROGRESS_MSG = "progressMsg";
-
+
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();
+ stopSelf();
}
});
sendBroadcast("");
- mSyncTask.execute();
+ mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行
}
}
-
+
+
private void cancelSync() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
-
+
@Override
- public void onCreate() {
+ public void onCreate() { //初始化一个service
mSyncTask = null;
}
-
+
@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;
@@ -81,48 +101,48 @@ public class GTaskSyncService extends Service {
default:
break;
}
- return START_STICKY;
+ return START_STICKY; //等待新的intent来是这个service继续运行
}
return super.onStartCommand(intent, flags, startId);
}
-
+
@Override
public void onLowMemory() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
-
- public IBinder onBind(Intent intent) {
+
+ 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 intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent
+ intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值
intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
- sendBroadcast(intent);
+ sendBroadcast(intent); //发送这个通知
}
-
- public static void startSync(Activity activity) {
+
+ public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步
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) {
+
+ public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步
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;
}
-}
+}
\ No newline at end of file
diff --git a/小米便签源码/src/net/micode/notes/model/Note.java b/src/model/Note.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/model/Note.java
rename to src/model/Note.java
diff --git a/小米便签源码/src/net/micode/notes/model/WorkingNote.java b/src/model/WorkingNote.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/model/WorkingNote.java
rename to src/model/WorkingNote.java
diff --git a/小米便签源码/src/net/micode/notes/tool/BackupUtils.java b/src/tool/BackupUtils.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/tool/BackupUtils.java
rename to src/tool/BackupUtils.java
diff --git a/小米便签源码/src/net/micode/notes/tool/DataUtils.java b/src/tool/DataUtils.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/tool/DataUtils.java
rename to src/tool/DataUtils.java
diff --git a/小米便签源码/src/net/micode/notes/tool/GTaskStringUtils.java b/src/tool/GTaskStringUtils.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/tool/GTaskStringUtils.java
rename to src/tool/GTaskStringUtils.java
diff --git a/小米便签源码/src/net/micode/notes/tool/ResourceParser.java b/src/tool/ResourceParser.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/tool/ResourceParser.java
rename to src/tool/ResourceParser.java
diff --git a/小米便签源码/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/ui/AlarmAlertActivity.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/AlarmAlertActivity.java
rename to src/ui/AlarmAlertActivity.java
diff --git a/小米便签源码/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/ui/AlarmInitReceiver.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/AlarmInitReceiver.java
rename to src/ui/AlarmInitReceiver.java
diff --git a/小米便签源码/src/net/micode/notes/ui/AlarmReceiver.java b/src/ui/AlarmReceiver.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/AlarmReceiver.java
rename to src/ui/AlarmReceiver.java
diff --git a/小米便签源码/src/net/micode/notes/ui/DateTimePicker.java b/src/ui/DateTimePicker.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/DateTimePicker.java
rename to src/ui/DateTimePicker.java
diff --git a/小米便签源码/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/ui/DateTimePickerDialog.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/DateTimePickerDialog.java
rename to src/ui/DateTimePickerDialog.java
diff --git a/小米便签源码/src/net/micode/notes/ui/DropdownMenu.java b/src/ui/DropdownMenu.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/DropdownMenu.java
rename to src/ui/DropdownMenu.java
diff --git a/小米便签源码/src/net/micode/notes/ui/FoldersListAdapter.java b/src/ui/FoldersListAdapter.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/FoldersListAdapter.java
rename to src/ui/FoldersListAdapter.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NoteEditActivity.java b/src/ui/NoteEditActivity.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NoteEditActivity.java
rename to src/ui/NoteEditActivity.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NoteEditText.java b/src/ui/NoteEditText.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NoteEditText.java
rename to src/ui/NoteEditText.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NoteItemData.java b/src/ui/NoteItemData.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NoteItemData.java
rename to src/ui/NoteItemData.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NotesListActivity.java b/src/ui/NotesListActivity.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NotesListActivity.java
rename to src/ui/NotesListActivity.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NotesListAdapter.java b/src/ui/NotesListAdapter.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NotesListAdapter.java
rename to src/ui/NotesListAdapter.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NotesListItem.java b/src/ui/NotesListItem.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NotesListItem.java
rename to src/ui/NotesListItem.java
diff --git a/小米便签源码/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/ui/NotesPreferenceActivity.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/ui/NotesPreferenceActivity.java
rename to src/ui/NotesPreferenceActivity.java
diff --git a/小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider.java b/src/widget/NoteWidgetProvider.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider.java
rename to src/widget/NoteWidgetProvider.java
diff --git a/小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/widget/NoteWidgetProvider_2x.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider_2x.java
rename to src/widget/NoteWidgetProvider_2x.java
diff --git a/小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/widget/NoteWidgetProvider_4x.java
similarity index 100%
rename from 小米便签源码/src/net/micode/notes/widget/NoteWidgetProvider_4x.java
rename to src/widget/NoteWidgetProvider_4x.java
diff --git a/小米便签源码/.gitignore b/小米便签源码/.gitignore
deleted file mode 100644
index 7df8dff..0000000
--- a/小米便签源码/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-# generated files
-bin/
-gen/
-
-# Local configuration file (sdk path, etc)
-project.properties
-.settings/
-.classpath
-.project
diff --git a/小米便签源码/AndroidManifest.xml b/小米便签源码/AndroidManifest.xml
deleted file mode 100644
index e5c7d47..0000000
--- a/小米便签源码/AndroidManifest.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/NOTICE b/小米便签源码/NOTICE
deleted file mode 100644
index 9a54521..0000000
--- a/小米便签源码/NOTICE
+++ /dev/null
@@ -1,190 +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.
-
- 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.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/小米便签源码/README b/小米便签源码/README
deleted file mode 100644
index fc0d824..0000000
--- a/小米便签源码/README
+++ /dev/null
@@ -1,23 +0,0 @@
-[中文]
-
-1. MiCode便签是小米便签的社区开源版,由MIUI团队(www.miui.com) 发起并贡献第一批代码,遵循NOTICE文件所描述的开源协议,
- 今后为MiCode社区(www.micode.net) 拥有,并由社区发布和维护。
-
-2. Bug反馈和跟踪,请访问Github,
- https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
-
-3. 功能建议和综合讨论,请访问MiCode,
- http://micode.net/forum.php?mod=forumdisplay&fid=38
-
-
-[English]
-
-1. MiCode Notes is open source edition of XM notepad, it's first initiated and sponsored by MIUI team (www.miui.com).
- It's opened under license described by NOTICE file. It's owned by the MiCode community (www.micode.net). In future,
- the MiCode community will release and maintain this project.
-
-2. Regarding issue tracking, please visit Github,
- https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
-
-3. Regarding feature request and general discussion, please visit Micode forum,
- http://micode.net/forum.php?mod=forumdisplay&fid=38
diff --git a/小米便签源码/res/color/primary_text_dark.xml b/小米便签源码/res/color/primary_text_dark.xml
deleted file mode 100644
index 7c85459..0000000
--- a/小米便签源码/res/color/primary_text_dark.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/color/secondary_text_dark.xml b/小米便签源码/res/color/secondary_text_dark.xml
deleted file mode 100644
index c1c2384..0000000
--- a/小米便签源码/res/color/secondary_text_dark.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/drawable-hdpi/bg_btn_set_color.png b/小米便签源码/res/drawable-hdpi/bg_btn_set_color.png
deleted file mode 100644
index 5eb5d44..0000000
Binary files a/小米便签源码/res/drawable-hdpi/bg_btn_set_color.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/bg_color_btn_mask.png b/小米便签源码/res/drawable-hdpi/bg_color_btn_mask.png
deleted file mode 100644
index 100db77..0000000
Binary files a/小米便签源码/res/drawable-hdpi/bg_color_btn_mask.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/call_record.png b/小米便签源码/res/drawable-hdpi/call_record.png
deleted file mode 100644
index fb88ca4..0000000
Binary files a/小米便签源码/res/drawable-hdpi/call_record.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/clock.png b/小米便签源码/res/drawable-hdpi/clock.png
deleted file mode 100644
index 5f2ae9a..0000000
Binary files a/小米便签源码/res/drawable-hdpi/clock.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/delete.png b/小米便签源码/res/drawable-hdpi/delete.png
deleted file mode 100644
index 643de3e..0000000
Binary files a/小米便签源码/res/drawable-hdpi/delete.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/dropdown_icon.9.png b/小米便签源码/res/drawable-hdpi/dropdown_icon.9.png
deleted file mode 100644
index 5525025..0000000
Binary files a/小米便签源码/res/drawable-hdpi/dropdown_icon.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_blue.9.png b/小米便签源码/res/drawable-hdpi/edit_blue.9.png
deleted file mode 100644
index 55a1856..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_blue.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_green.9.png b/小米便签源码/res/drawable-hdpi/edit_green.9.png
deleted file mode 100644
index 2cb2d60..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_green.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_red.9.png b/小米便签源码/res/drawable-hdpi/edit_red.9.png
deleted file mode 100644
index bae944a..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_red.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_title_blue.9.png b/小米便签源码/res/drawable-hdpi/edit_title_blue.9.png
deleted file mode 100644
index 96e6092..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_title_blue.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_title_green.9.png b/小米便签源码/res/drawable-hdpi/edit_title_green.9.png
deleted file mode 100644
index 08d8644..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_title_green.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_title_red.9.png b/小米便签源码/res/drawable-hdpi/edit_title_red.9.png
deleted file mode 100644
index 9c430e5..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_title_red.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_title_white.9.png b/小米便签源码/res/drawable-hdpi/edit_title_white.9.png
deleted file mode 100644
index 19e8d95..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_title_white.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_title_yellow.9.png b/小米便签源码/res/drawable-hdpi/edit_title_yellow.9.png
deleted file mode 100644
index bf8f580..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_title_yellow.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_white.9.png b/小米便签源码/res/drawable-hdpi/edit_white.9.png
deleted file mode 100644
index 918f7a6..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_white.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/edit_yellow.9.png b/小米便签源码/res/drawable-hdpi/edit_yellow.9.png
deleted file mode 100644
index 10cb642..0000000
Binary files a/小米便签源码/res/drawable-hdpi/edit_yellow.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/font_large.png b/小米便签源码/res/drawable-hdpi/font_large.png
deleted file mode 100644
index 78cf2e6..0000000
Binary files a/小米便签源码/res/drawable-hdpi/font_large.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/font_normal.png b/小米便签源码/res/drawable-hdpi/font_normal.png
deleted file mode 100644
index 9de7ced..0000000
Binary files a/小米便签源码/res/drawable-hdpi/font_normal.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/font_size_selector_bg.9.png b/小米便签源码/res/drawable-hdpi/font_size_selector_bg.9.png
deleted file mode 100644
index be8e64c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/font_size_selector_bg.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/font_small.png b/小米便签源码/res/drawable-hdpi/font_small.png
deleted file mode 100644
index d3ff104..0000000
Binary files a/小米便签源码/res/drawable-hdpi/font_small.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/font_super.png b/小米便签源码/res/drawable-hdpi/font_super.png
deleted file mode 100644
index 85b13a1..0000000
Binary files a/小米便签源码/res/drawable-hdpi/font_super.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/icon_app.png b/小米便签源码/res/drawable-hdpi/icon_app.png
deleted file mode 100644
index 418aadc..0000000
Binary files a/小米便签源码/res/drawable-hdpi/icon_app.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_background.png b/小米便签源码/res/drawable-hdpi/list_background.png
deleted file mode 100644
index 087e1f9..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_background.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_blue_down.9.png b/小米便签源码/res/drawable-hdpi/list_blue_down.9.png
deleted file mode 100644
index b88eebf..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_blue_down.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_blue_middle.9.png b/小米便签源码/res/drawable-hdpi/list_blue_middle.9.png
deleted file mode 100644
index 96b1c8b..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_blue_middle.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_blue_single.9.png b/小米便签源码/res/drawable-hdpi/list_blue_single.9.png
deleted file mode 100644
index d7e7206..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_blue_single.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_blue_up.9.png b/小米便签源码/res/drawable-hdpi/list_blue_up.9.png
deleted file mode 100644
index 632e88c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_blue_up.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_folder.9.png b/小米便签源码/res/drawable-hdpi/list_folder.9.png
deleted file mode 100644
index 829f61b..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_folder.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_footer_bg.9.png b/小米便签源码/res/drawable-hdpi/list_footer_bg.9.png
deleted file mode 100644
index 5325c25..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_footer_bg.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_green_down.9.png b/小米便签源码/res/drawable-hdpi/list_green_down.9.png
deleted file mode 100644
index 64a39d9..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_green_down.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_green_middle.9.png b/小米便签源码/res/drawable-hdpi/list_green_middle.9.png
deleted file mode 100644
index 897325a..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_green_middle.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_green_single.9.png b/小米便签源码/res/drawable-hdpi/list_green_single.9.png
deleted file mode 100644
index c83405f..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_green_single.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_green_up.9.png b/小米便签源码/res/drawable-hdpi/list_green_up.9.png
deleted file mode 100644
index 141f9e1..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_green_up.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_red_down.9.png b/小米便签源码/res/drawable-hdpi/list_red_down.9.png
deleted file mode 100644
index 4224309..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_red_down.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_red_middle.9.png b/小米便签源码/res/drawable-hdpi/list_red_middle.9.png
deleted file mode 100644
index 9988f17..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_red_middle.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_red_single.9.png b/小米便签源码/res/drawable-hdpi/list_red_single.9.png
deleted file mode 100644
index 587c348..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_red_single.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_red_up.9.png b/小米便签源码/res/drawable-hdpi/list_red_up.9.png
deleted file mode 100644
index 46b4757..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_red_up.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_white_down.9.png b/小米便签源码/res/drawable-hdpi/list_white_down.9.png
deleted file mode 100644
index 29f9d8c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_white_down.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_white_middle.9.png b/小米便签源码/res/drawable-hdpi/list_white_middle.9.png
deleted file mode 100644
index 77a4ab4..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_white_middle.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_white_single.9.png b/小米便签源码/res/drawable-hdpi/list_white_single.9.png
deleted file mode 100644
index 3e79189..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_white_single.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_white_up.9.png b/小米便签源码/res/drawable-hdpi/list_white_up.9.png
deleted file mode 100644
index e23cd5c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_white_up.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_yellow_down.9.png b/小米便签源码/res/drawable-hdpi/list_yellow_down.9.png
deleted file mode 100644
index 31cfc1e..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_yellow_down.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_yellow_middle.9.png b/小米便签源码/res/drawable-hdpi/list_yellow_middle.9.png
deleted file mode 100644
index b6549b2..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_yellow_middle.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_yellow_single.9.png b/小米便签源码/res/drawable-hdpi/list_yellow_single.9.png
deleted file mode 100644
index 3faf507..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_yellow_single.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/list_yellow_up.9.png b/小米便签源码/res/drawable-hdpi/list_yellow_up.9.png
deleted file mode 100644
index 4ae791c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/list_yellow_up.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/menu_delete.png b/小米便签源码/res/drawable-hdpi/menu_delete.png
deleted file mode 100644
index ccdfc4b..0000000
Binary files a/小米便签源码/res/drawable-hdpi/menu_delete.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/menu_move.png b/小米便签源码/res/drawable-hdpi/menu_move.png
deleted file mode 100644
index 1140b71..0000000
Binary files a/小米便签源码/res/drawable-hdpi/menu_move.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/new_note_normal.png b/小米便签源码/res/drawable-hdpi/new_note_normal.png
deleted file mode 100644
index e24e0d1..0000000
Binary files a/小米便签源码/res/drawable-hdpi/new_note_normal.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/new_note_pressed.png b/小米便签源码/res/drawable-hdpi/new_note_pressed.png
deleted file mode 100644
index c748936..0000000
Binary files a/小米便签源码/res/drawable-hdpi/new_note_pressed.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/note_edit_color_selector_panel.png b/小米便签源码/res/drawable-hdpi/note_edit_color_selector_panel.png
deleted file mode 100644
index fc49552..0000000
Binary files a/小米便签源码/res/drawable-hdpi/note_edit_color_selector_panel.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/notification.png b/小米便签源码/res/drawable-hdpi/notification.png
deleted file mode 100644
index b13ab4a..0000000
Binary files a/小米便签源码/res/drawable-hdpi/notification.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/search_result.png b/小米便签源码/res/drawable-hdpi/search_result.png
deleted file mode 100644
index ff2befd..0000000
Binary files a/小米便签源码/res/drawable-hdpi/search_result.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/selected.png b/小米便签源码/res/drawable-hdpi/selected.png
deleted file mode 100644
index b889bef..0000000
Binary files a/小米便签源码/res/drawable-hdpi/selected.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/title_alert.png b/小米便签源码/res/drawable-hdpi/title_alert.png
deleted file mode 100644
index 544ee9c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/title_alert.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/title_bar_bg.9.png b/小米便签源码/res/drawable-hdpi/title_bar_bg.9.png
deleted file mode 100644
index eb6bff0..0000000
Binary files a/小米便签源码/res/drawable-hdpi/title_bar_bg.9.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_2x_blue.png b/小米便签源码/res/drawable-hdpi/widget_2x_blue.png
deleted file mode 100644
index a1707f4..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_2x_blue.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_2x_green.png b/小米便签源码/res/drawable-hdpi/widget_2x_green.png
deleted file mode 100644
index f86886c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_2x_green.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_2x_red.png b/小米便签源码/res/drawable-hdpi/widget_2x_red.png
deleted file mode 100644
index 0e66c29..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_2x_red.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_2x_white.png b/小米便签源码/res/drawable-hdpi/widget_2x_white.png
deleted file mode 100644
index 5f0619a..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_2x_white.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_2x_yellow.png b/小米便签源码/res/drawable-hdpi/widget_2x_yellow.png
deleted file mode 100644
index 12d1c2b..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_2x_yellow.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_4x_blue.png b/小米便签源码/res/drawable-hdpi/widget_4x_blue.png
deleted file mode 100644
index 9183738..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_4x_blue.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_4x_green.png b/小米便签源码/res/drawable-hdpi/widget_4x_green.png
deleted file mode 100644
index fa8b452..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_4x_green.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_4x_red.png b/小米便签源码/res/drawable-hdpi/widget_4x_red.png
deleted file mode 100644
index 62de074..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_4x_red.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_4x_white.png b/小米便签源码/res/drawable-hdpi/widget_4x_white.png
deleted file mode 100644
index a37d67c..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_4x_white.png and /dev/null differ
diff --git a/小米便签源码/res/drawable-hdpi/widget_4x_yellow.png b/小米便签源码/res/drawable-hdpi/widget_4x_yellow.png
deleted file mode 100644
index d7c5fa4..0000000
Binary files a/小米便签源码/res/drawable-hdpi/widget_4x_yellow.png and /dev/null differ
diff --git a/小米便签源码/res/drawable/new_note.xml b/小米便签源码/res/drawable/new_note.xml
deleted file mode 100644
index 2154ebc..0000000
--- a/小米便签源码/res/drawable/new_note.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/account_dialog_title.xml b/小米便签源码/res/layout/account_dialog_title.xml
deleted file mode 100644
index 7717112..0000000
--- a/小米便签源码/res/layout/account_dialog_title.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/add_account_text.xml b/小米便签源码/res/layout/add_account_text.xml
deleted file mode 100644
index c799178..0000000
--- a/小米便签源码/res/layout/add_account_text.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/datetime_picker.xml b/小米便签源码/res/layout/datetime_picker.xml
deleted file mode 100644
index f10d592..0000000
--- a/小米便签源码/res/layout/datetime_picker.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/dialog_edit_text.xml b/小米便签源码/res/layout/dialog_edit_text.xml
deleted file mode 100644
index 361b39a..0000000
--- a/小米便签源码/res/layout/dialog_edit_text.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/folder_list_item.xml b/小米便签源码/res/layout/folder_list_item.xml
deleted file mode 100644
index 77e8148..0000000
--- a/小米便签源码/res/layout/folder_list_item.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/note_edit.xml b/小米便签源码/res/layout/note_edit.xml
deleted file mode 100644
index 10b2aa7..0000000
--- a/小米便签源码/res/layout/note_edit.xml
+++ /dev/null
@@ -1,400 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/note_edit_list_item.xml b/小米便签源码/res/layout/note_edit_list_item.xml
deleted file mode 100644
index a885f9c..0000000
--- a/小米便签源码/res/layout/note_edit_list_item.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/note_item.xml b/小米便签源码/res/layout/note_item.xml
deleted file mode 100644
index d541f6a..0000000
--- a/小米便签源码/res/layout/note_item.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/note_list.xml b/小米便签源码/res/layout/note_list.xml
deleted file mode 100644
index 6b25d38..0000000
--- a/小米便签源码/res/layout/note_list.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/note_list_dropdown_menu.xml b/小米便签源码/res/layout/note_list_dropdown_menu.xml
deleted file mode 100644
index 3fa271d..0000000
--- a/小米便签源码/res/layout/note_list_dropdown_menu.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/note_list_footer.xml b/小米便签源码/res/layout/note_list_footer.xml
deleted file mode 100644
index 5ca7b22..0000000
--- a/小米便签源码/res/layout/note_list_footer.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/settings_header.xml b/小米便签源码/res/layout/settings_header.xml
deleted file mode 100644
index 5eb8c50..0000000
--- a/小米便签源码/res/layout/settings_header.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/layout/widget_2x.xml b/小米便签源码/res/layout/widget_2x.xml
deleted file mode 100644
index 55970ce..0000000
--- a/小米便签源码/res/layout/widget_2x.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/layout/widget_4x.xml b/小米便签源码/res/layout/widget_4x.xml
deleted file mode 100644
index dc9bb51..0000000
--- a/小米便签源码/res/layout/widget_4x.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/menu/call_note_edit.xml b/小米便签源码/res/menu/call_note_edit.xml
deleted file mode 100644
index 02c0528..0000000
--- a/小米便签源码/res/menu/call_note_edit.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
diff --git a/小米便签源码/res/menu/call_record_folder.xml b/小米便签源码/res/menu/call_record_folder.xml
deleted file mode 100644
index c664346..0000000
--- a/小米便签源码/res/menu/call_record_folder.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
diff --git a/小米便签源码/res/menu/note_edit.xml b/小米便签源码/res/menu/note_edit.xml
deleted file mode 100644
index 35cacd1..0000000
--- a/小米便签源码/res/menu/note_edit.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/menu/note_list.xml b/小米便签源码/res/menu/note_list.xml
deleted file mode 100644
index 42ea736..0000000
--- a/小米便签源码/res/menu/note_list.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
diff --git a/小米便签源码/res/menu/note_list_dropdown.xml b/小米便签源码/res/menu/note_list_dropdown.xml
deleted file mode 100644
index 7cbaadc..0000000
--- a/小米便签源码/res/menu/note_list_dropdown.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/menu/note_list_options.xml b/小米便签源码/res/menu/note_list_options.xml
deleted file mode 100644
index daac008..0000000
--- a/小米便签源码/res/menu/note_list_options.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/menu/sub_folder.xml b/小米便签源码/res/menu/sub_folder.xml
deleted file mode 100644
index b00de26..0000000
--- a/小米便签源码/res/menu/sub_folder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/raw-zh-rCN/introduction b/小米便签源码/res/raw-zh-rCN/introduction
deleted file mode 100644
index 7188359..0000000
--- a/小米便签源码/res/raw-zh-rCN/introduction
+++ /dev/null
@@ -1,7 +0,0 @@
-欢迎使用MIUI便签!
-
- 无论从软件中直接添加,还是从桌面拖出widget,MIUI便签能让你快速建立和保存便签;
-
- 除了调整文字大小、便签背景、文件夹等基础功能外,你会发现MIUI便签也提供了清单模式、便签提醒、软件加密、导出到SD卡、同步google task的高级功能,让你的生活记录更加美好和安全;
-
- 来分享你的使用体验吧:http://www.miui.com/index.php
diff --git a/小米便签源码/res/raw/introduction b/小米便签源码/res/raw/introduction
deleted file mode 100644
index 269cf7b..0000000
--- a/小米便签源码/res/raw/introduction
+++ /dev/null
@@ -1 +0,0 @@
-Welcome to use MIUI notes!
\ No newline at end of file
diff --git a/小米便签源码/res/values-zh-rCN/arrays.xml b/小米便签源码/res/values-zh-rCN/arrays.xml
deleted file mode 100644
index a092386..0000000
--- a/小米便签源码/res/values-zh-rCN/arrays.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
- - 短信
- - 邮件
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/values-zh-rCN/strings.xml b/小米便签源码/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 09f75ed..0000000
--- a/小米便签源码/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
- 便签
- 便签2x2
- 便签4x4
- 没有关联内容,点击新建便签。
- 访客模式下,便签内容不可见
- ...
- 新建便签
- 成功删除提醒
- 创建提醒
- 已过期
- yyyyMMdd
- MM月dd日 kk:mm
- 知道了
- 查看
- 呼叫电话
- 发送邮件
- 浏览网页
- 打开地图
-
- 新建文件夹
- 导出文本
- 同步
- 取消同步
- 设置
- 搜索
- 删除
- 移动到文件夹
- 选中了 %d 项
- 没有选中项,操作无效
- 全选
- 取消全选
- 文字大小
- 小
- 正常
- 大
- 超大
- 进入清单模式
- 退出清单模式
- 查看文件夹
- 刪除文件夹
- 修改文件夹名称
- 文件夹 %1$s 已存在,请重新命名
- 分享
- 发送到桌面
- 提醒我
- 删除提醒
- 选择文件夹
- 上一级文件夹
- 已添加到桌面
- 删除
- 确认要删除所选的 %d 条便签吗?
- 确认要删除该条便签吗?
- 确认删除文件夹及所包含的便签吗?
- 已将所选 %1$d 条便签移到 %2$s 文件夹
-
- SD卡被占用,不能操作
- 导出文本时发生错误,请检查SD卡
- 要查看的便签不存在
- 不能为空便签设置闹钟提醒
- 不能将空便签发送到桌面
- 导出成功
- 导出失败
- 已将文本文件(%1$s)输出至SD卡(%2$s)目录
-
- 同步便签...
- 同步成功
- 同步失败
- 同步已取消
- 与%1$s同步成功
- 同步失败,请检查网络和帐号设置
- 同步失败,发生内部错误
- 同步已取消
- 登录%1$s...
- 正在获取服务器便签列表...
- 正在同步本地便签...
-
- 设置
- 同步账号
- 与google task同步便签记录
- 上次同步于 %1$s
- 添加账号
- 更换账号
- 删除账号
- 取消
- 立即同步
- 取消同步
- 当前帐号 %1$s
- 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复
- 同步便签
- 请选择google帐号,便签将与该帐号的google task内容同步。
- 正在同步中,不能修改同步帐号
- 同步帐号已设置为%1$s
- 新建便签背景颜色随机
- 删除
- 通话便签
- 请输入名称
- 正在搜索便签
- 搜索便签
- 便签中的文字
- 便签
- 设置
- 取消
-
- - %1$s 条符合“%2$s”的搜索结果
-
-
-
diff --git a/小米便签源码/res/values-zh-rTW/arrays.xml b/小米便签源码/res/values-zh-rTW/arrays.xml
deleted file mode 100644
index 5297209..0000000
--- a/小米便签源码/res/values-zh-rTW/arrays.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
- - 短信
- - 郵件
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/values-zh-rTW/strings.xml b/小米便签源码/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 3c41894..0000000
--- a/小米便签源码/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
- 便簽
- 便簽2x2
- 便簽4x4
- 沒有關聯內容,點擊新建便簽。
- 訪客模式下,便籤內容不可見
- ...
- 新建便簽
- 成功刪除提醒
- 創建提醒
- 已過期
- yyyyMMdd
- MM月dd日 kk:mm
- 知道了
- 查看
- 呼叫電話
- 發送郵件
- 浏覽網頁
- 打開地圖
- 已將所選 %1$d 便籤移到 %2$s 文件夾
-
- 新建文件夾
- 導出文本
- 同步
- 取消同步
- 設置
- 搜尋
- 刪除
- 移動到文件夾
- 選中了 %d 項
- 沒有選中項,操作無效
- 全選
- 取消全選
- 文字大小
- 小
- 正常
- 大
- 超大
- 進入清單模式
- 退出清單模式
- 查看文件夾
- 刪除文件夾
- 修改文件夾名稱
- 文件夾 %1$s 已存在,請重新命名
- 分享
- 發送到桌面
- 提醒我
- 刪除提醒
- 選擇文件夾
- 上一級文件夾
- 已添加到桌面
- 刪除
- 确认要刪除所選的 %d 條便籤嗎?
- 确认要删除該條便籤嗎?
- 確認刪除檔夾及所包含的便簽嗎?
- SD卡被佔用,不能操作
- 導出TXT時發生錯誤,請檢查SD卡
- 要查看的便籤不存在
- 不能爲空便籤設置鬧鐘提醒
- 不能將空便籤發送到桌面
- 導出成功
- 導出失敗
- 已將文本文件(%1$s)導出至SD(%2$s)目錄
-
- 同步便簽...
- 同步成功
- 同步失敗
- 同步已取消
- 與%1$s同步成功
- 同步失敗,請檢查網絡和帳號設置
- 同步失敗,發生內部錯誤
- 同步已取消
- 登陸%1$s...
- 正在獲取服務器便籤列表...
- 正在同步本地便籤...
-
- 設置
- 同步賬號
- 与google task同步便簽記錄
- 上次同步于 %1$s
- 添加賬號
- 更換賬號
- 刪除賬號
- 取消
- 立即同步
- 取消同步
- 當前帳號 %1$s
- 如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復
- 同步便簽
- 請選擇google帳號,便簽將與該帳號的google task內容同步。
- 正在同步中,不能修改同步帳號
- 同步帳號已設置為%1$s
- 新建便籤背景顏色隨機
-
- 刪除
- 通話便籤
- 請輸入名稱
-
- 正在搜索便籤
- 搜索便籤
- 便籤中的文字
- 便籤
- 設置
- 取消
-
- - %1$s 條符合”%2$s“的搜尋結果
-
-
-
diff --git a/小米便签源码/res/values/arrays.xml b/小米便签源码/res/values/arrays.xml
deleted file mode 100644
index e00210b..0000000
--- a/小米便签源码/res/values/arrays.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
- - -%s
- - --%s
- - --%s
- - --%s
-
-
-
- - Messaging
- - Email
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/values/colors.xml b/小米便签源码/res/values/colors.xml
deleted file mode 100644
index 123ffbf..0000000
--- a/小米便签源码/res/values/colors.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- #335b5b5b
-
diff --git a/小米便签源码/res/values/dimens.xml b/小米便签源码/res/values/dimens.xml
deleted file mode 100644
index 194e84f..0000000
--- a/小米便签源码/res/values/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
- 33sp
- 26sp
- 20sp
- 17sp
- 14sp
-
\ No newline at end of file
diff --git a/小米便签源码/res/values/strings.xml b/小米便签源码/res/values/strings.xml
deleted file mode 100644
index 55df868..0000000
--- a/小米便签源码/res/values/strings.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
- Notes
- Notes 2x2
- Notes 4x4
- No associated note found, click to create associated note.
- Privacy mode,can not see note content
- ...
- Add note
- Delete reminder successfully
- Set reminder
- Expired
- yyyyMMdd
- MMMd kk:mm
- Got it
- Take a look
- Call
- Send email
- Browse web
- Open map
-
- /MIUI/notes/
- notes_%s.txt
-
- (%d)
- New Folder
- Export text
- Sync
- Cancel syncing
- Settings
- Search
- Delete
- Move to folder
- %d selected
- Nothing selected, the operation is invalid
- Select all
- Deselect all
- Font size
- Small
- Medium
- Large
- Super
- Enter check list
- Leave check list
- View folder
- Delete folder
- Change folder name
- The folder %1$s exist, please rename
- Share
- Send to home
- Remind me
- Delete reminder
- Select folder
- Parent folder
- Note added to home
- Confirm to delete folder and its notes?
- Delete selected notes
- Confirm to delete the selected %d notes?
- Confirm to delete this note?
- Have moved selected %1$d notes to %2$s folder
-
- SD card busy, not available now
- Export failed, please check SD card
- The note is not exist
- Sorry, can not set clock on empty note
- Sorry, can not send and empty note to home
- Export successful
- Export fail
- Export text file (%1$s) to SD (%2$s) directory
-
- Syncing notes...
- Sync is successful
- Sync is failed
- Sync is canceled
- Sync is successful with account %1$s
- Sync failed, please check network and account settings
- Sync failed, internal error occurs
- Sync is canceled
- Logging into %1$s...
- Getting remote note list...
- Synchronize local notes with Google Task...
-
- Settings
- Sync account
- Sync notes with google task
- Last sync time %1$s
- yyyy-MM-dd hh:mm:ss
- Add account
- Change sync account
- Remove sync account
- Cancel
- Sync immediately
- Cancel syncing
- Current account %1$s
- All sync related information will be deleted, which may result in duplicated items sometime
- Sync notes
- Please select a google account. Local notes will be synced with google task.
- Cannot change the account because sync is in progress
- %1$s has been set as the sync account
- New note background color random
-
- Delete
- Call notes
- Input name
-
- Searching Notes
- Search notes
- Text in your notes
- Notes
- set
- cancel
-
- - %1$s result for \"%2$s\"
-
- - %1$s results for \"%2$s\"
-
-
-
diff --git a/小米便签源码/res/values/styles.xml b/小米便签源码/res/values/styles.xml
deleted file mode 100644
index d750e65..0000000
--- a/小米便签源码/res/values/styles.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/小米便签源码/res/xml/preferences.xml b/小米便签源码/res/xml/preferences.xml
deleted file mode 100644
index fe58f8f..0000000
--- a/小米便签源码/res/xml/preferences.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/小米便签源码/res/xml/searchable.xml b/小米便签源码/res/xml/searchable.xml
deleted file mode 100644
index bf74f14..0000000
--- a/小米便签源码/res/xml/searchable.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
diff --git a/小米便签源码/res/xml/widget_2x_info.xml b/小米便签源码/res/xml/widget_2x_info.xml
deleted file mode 100644
index ac8b225..0000000
--- a/小米便签源码/res/xml/widget_2x_info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
diff --git a/小米便签源码/res/xml/widget_4x_info.xml b/小米便签源码/res/xml/widget_4x_info.xml
deleted file mode 100644
index cf79f9c..0000000
--- a/小米便签源码/res/xml/widget_4x_info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-