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 @@ - - - - - - - - - - - - - -