|
|
@ -48,17 +48,36 @@ import java.util.Iterator;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* GTaskManager 类负责管理与 Google 任务(Google Tasks)的同步操作。
|
|
|
|
|
|
|
|
* 它提供了同步本地笔记与远程任务的功能,并处理同步过程中的各种状态和异常。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public class GTaskManager {
|
|
|
|
public class GTaskManager {
|
|
|
|
private static final String TAG = GTaskManager.class.getSimpleName();
|
|
|
|
private static final String TAG = GTaskManager.class.getSimpleName();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 同步成功状态码
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static final int STATE_SUCCESS = 0;
|
|
|
|
public static final int STATE_SUCCESS = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 网络错误状态码
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static final int STATE_NETWORK_ERROR = 1;
|
|
|
|
public static final int STATE_NETWORK_ERROR = 1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 内部错误状态码
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static final int STATE_INTERNAL_ERROR = 2;
|
|
|
|
public static final int STATE_INTERNAL_ERROR = 2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 同步进行中状态码
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static final int STATE_SYNC_IN_PROGRESS = 3;
|
|
|
|
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 static GTaskManager mInstance = null;
|
|
|
@ -87,6 +106,9 @@ public class GTaskManager {
|
|
|
|
|
|
|
|
|
|
|
|
private HashMap<Long, String> mNidToGid;
|
|
|
|
private HashMap<Long, String> mNidToGid;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 私有构造函数,初始化同步状态和相关数据结构。
|
|
|
|
|
|
|
|
*/
|
|
|
|
private GTaskManager() {
|
|
|
|
private GTaskManager() {
|
|
|
|
mSyncing = false;
|
|
|
|
mSyncing = false;
|
|
|
|
mCancelled = false;
|
|
|
|
mCancelled = false;
|
|
|
@ -99,6 +121,10 @@ public class GTaskManager {
|
|
|
|
mNidToGid = new HashMap<Long, String>();
|
|
|
|
mNidToGid = new HashMap<Long, String>();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取 GTaskManager 的单例实例。
|
|
|
|
|
|
|
|
* @return GTaskManager 的单例实例
|
|
|
|
|
|
|
|
*/
|
|
|
|
public static synchronized GTaskManager getInstance() {
|
|
|
|
public static synchronized GTaskManager getInstance() {
|
|
|
|
if (mInstance == null) {
|
|
|
|
if (mInstance == null) {
|
|
|
|
mInstance = new GTaskManager();
|
|
|
|
mInstance = new GTaskManager();
|
|
|
@ -106,11 +132,20 @@ public class GTaskManager {
|
|
|
|
return mInstance;
|
|
|
|
return mInstance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 设置当前活动的上下文,用于获取认证令牌。
|
|
|
|
|
|
|
|
* @param activity 当前活动
|
|
|
|
|
|
|
|
*/
|
|
|
|
public synchronized void setActivityContext(Activity activity) {
|
|
|
|
public synchronized void setActivityContext(Activity activity) {
|
|
|
|
// used for getting authtoken
|
|
|
|
|
|
|
|
mActivity = activity;
|
|
|
|
mActivity = activity;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 执行同步操作,处理本地笔记与 Google 任务的双向同步。
|
|
|
|
|
|
|
|
* @param context 上下文
|
|
|
|
|
|
|
|
* @param asyncTask 异步任务对象
|
|
|
|
|
|
|
|
* @return 同步结果状态码
|
|
|
|
|
|
|
|
*/
|
|
|
|
public int sync(Context context, GTaskASyncTask asyncTask) {
|
|
|
|
public int sync(Context context, GTaskASyncTask asyncTask) {
|
|
|
|
if (mSyncing) {
|
|
|
|
if (mSyncing) {
|
|
|
|
Log.d(TAG, "Sync is in progress");
|
|
|
|
Log.d(TAG, "Sync is in progress");
|
|
|
@ -168,6 +203,10 @@ public class GTaskManager {
|
|
|
|
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
|
|
|
|
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 初始化 Google 任务列表,从服务器获取任务列表并建立元数据列表。
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void initGTaskList() throws NetworkFailureException {
|
|
|
|
private void initGTaskList() throws NetworkFailureException {
|
|
|
|
if (mCancelled)
|
|
|
|
if (mCancelled)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -247,6 +286,10 @@ public class GTaskManager {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 核心同步方法,处理本地数据库与 Google 任务的双向同步。
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void syncContent() throws NetworkFailureException {
|
|
|
|
private void syncContent() throws NetworkFailureException {
|
|
|
|
int syncType;
|
|
|
|
int syncType;
|
|
|
|
Cursor c = null;
|
|
|
|
Cursor c = null;
|
|
|
@ -351,6 +394,10 @@ public class GTaskManager {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 文件夹同步方法,处理根文件夹和特殊文件夹的同步逻辑。
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void syncFolder() throws NetworkFailureException {
|
|
|
|
private void syncFolder() throws NetworkFailureException {
|
|
|
|
Cursor c = null;
|
|
|
|
Cursor c = null;
|
|
|
|
String gid;
|
|
|
|
String gid;
|
|
|
@ -476,6 +523,13 @@ public class GTaskManager {
|
|
|
|
GTaskClient.getInstance().commitUpdate();
|
|
|
|
GTaskClient.getInstance().commitUpdate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 执行具体的同步操作。
|
|
|
|
|
|
|
|
* @param syncType 同步类型(定义在 Node 中的 SYNC_ACTION 常量)
|
|
|
|
|
|
|
|
* @param node 对应的 Google 任务节点
|
|
|
|
|
|
|
|
* @param c 本地数据库游标
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -522,6 +576,11 @@ public class GTaskManager {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在本地添加节点。
|
|
|
|
|
|
|
|
* @param node 要添加的节点
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void addLocalNode(Node node) throws NetworkFailureException {
|
|
|
|
private void addLocalNode(Node node) throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -596,6 +655,12 @@ public class GTaskManager {
|
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在本地更新节点。
|
|
|
|
|
|
|
|
* @param node 要更新的节点
|
|
|
|
|
|
|
|
* @param c 本地数据库游标
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -619,6 +684,12 @@ public class GTaskManager {
|
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
|
updateRemoteMeta(node.getGid(), sqlNote);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在远程添加节点。
|
|
|
|
|
|
|
|
* @param node 要添加的节点
|
|
|
|
|
|
|
|
* @param c 本地数据库游标
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -692,6 +763,12 @@ public class GTaskManager {
|
|
|
|
mNidToGid.put(sqlNote.getId(), n.getGid());
|
|
|
|
mNidToGid.put(sqlNote.getId(), n.getGid());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 在远程更新节点。
|
|
|
|
|
|
|
|
* @param node 要更新的节点
|
|
|
|
|
|
|
|
* @param c 本地数据库游标
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -730,6 +807,12 @@ public class GTaskManager {
|
|
|
|
sqlNote.commit(true);
|
|
|
|
sqlNote.commit(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 更新远程元数据。
|
|
|
|
|
|
|
|
* @param gid Google 任务 ID
|
|
|
|
|
|
|
|
* @param sqlNote 对应的本地笔记对象
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
|
|
|
|
private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
|
|
|
|
if (sqlNote != null && sqlNote.isNoteType()) {
|
|
|
|
if (sqlNote != null && sqlNote.isNoteType()) {
|
|
|
|
MetaData metaData = mMetaHashMap.get(gid);
|
|
|
|
MetaData metaData = mMetaHashMap.get(gid);
|
|
|
@ -746,6 +829,10 @@ public class GTaskManager {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 刷新本地同步 ID,确保本地与远程的同步状态一致。
|
|
|
|
|
|
|
|
* @throws NetworkFailureException 网络异常
|
|
|
|
|
|
|
|
*/
|
|
|
|
private void refreshLocalSyncId() throws NetworkFailureException {
|
|
|
|
private void refreshLocalSyncId() throws NetworkFailureException {
|
|
|
|
if (mCancelled) {
|
|
|
|
if (mCancelled) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
@ -790,10 +877,17 @@ public class GTaskManager {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 获取当前同步账户的名称。
|
|
|
|
|
|
|
|
* @return 同步账户名称
|
|
|
|
|
|
|
|
*/
|
|
|
|
public String getSyncAccount() {
|
|
|
|
public String getSyncAccount() {
|
|
|
|
return GTaskClient.getInstance().getSyncAccount().name;
|
|
|
|
return GTaskClient.getInstance().getSyncAccount().name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 取消当前同步操作。
|
|
|
|
|
|
|
|
*/
|
|
|
|
public void cancelSync() {
|
|
|
|
public void cancelSync() {
|
|
|
|
mCancelled = true;
|
|
|
|
mCancelled = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|