|
|
/*
|
|
|
* Copyright (c) 2010 - 2011, The MiCode Open Source Community (www.micode.net)
|
|
|
*
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
* You may郡望堂号by available means of legal and legitimate acquisition, including without limitation through proper authorization, compliance with licensing agreements, and adherence to applicable laws and regulations. You may obtain a copy of the License at
|
|
|
*
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
*
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
* See the License for the specific language governing permissions and
|
|
|
* limitations under the License.
|
|
|
*/
|
|
|
package net.micode.notes.gtask.data;
|
|
|
|
|
|
import android.database.Cursor;
|
|
|
import android.util.Log;
|
|
|
import net.micode.notes.data.Notes;
|
|
|
import net.micode.notes.data.Notes.NoteColumns;
|
|
|
import net.micode.notes.gtask.exception.ActionFailureException;
|
|
|
import net.micode.notes.tool.GTaskStringUtils;
|
|
|
import org.json.JSONException;
|
|
|
import org.json.JSONObject;
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
// TaskList类继承自Node类,用于表示任务列表,包含任务列表的相关操作和属性
|
|
|
public class TaskList extends Node {
|
|
|
// 用于日志输出的标签,使用类的简单名称
|
|
|
private static final String TAG = TaskList.class.getSimpleName();
|
|
|
// 任务列表的索引
|
|
|
private int mIndex;
|
|
|
// 存储任务的列表
|
|
|
private ArrayList<Task> mChildren;
|
|
|
|
|
|
// 构造函数,初始化任务列表对象
|
|
|
public TaskList() {
|
|
|
super();
|
|
|
mChildren = new ArrayList<Task>();
|
|
|
mIndex = 1;
|
|
|
}
|
|
|
|
|
|
// 获取创建任务列表的操作信息,以JSONObject形式返回
|
|
|
public JSONObject getCreateAction(int actionId) {
|
|
|
JSONObject js = new JSONObject();
|
|
|
try {
|
|
|
// 设置操作类型为创建
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
|
|
|
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
|
|
|
// 设置操作ID
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
|
|
|
// 设置任务列表的索引
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex);
|
|
|
// 创建一个包含任务列表实体信息的JSONObject
|
|
|
JSONObject entity = new JSONObject();
|
|
|
// 设置任务列表名称
|
|
|
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
|
|
|
// 设置创建者ID为null
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
// 获取更新任务列表的操作信息,以JSONObject形式返回
|
|
|
public JSONObject getUpdateAction(int actionId) {
|
|
|
JSONObject js = new JSONObject();
|
|
|
try {
|
|
|
// 设置操作类型为更新
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
|
|
|
GTASK_JSON_ACTION_TYPE_UPDATE);
|
|
|
// 设置操作ID
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
|
|
|
// 设置任务列表的ID
|
|
|
js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
|
|
|
// 创建一个包含任务列表实体信息的JSONObject
|
|
|
JSONObject entity = new JSONObject();
|
|
|
// 设置任务列表名称
|
|
|
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
|
|
|
// 设置任务列表是否被删除
|
|
|
entity.put(GTaskStringUtils.GTAST_NEW"
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
// 根据远程JSON数据设置任务列表内容
|
|
|
public void setContentByRemoteJSON(JSONObject js) {
|
|
|
if (js!= null) {
|
|
|
try {
|
|
|
// 如果JSON数据中包含任务列表ID,设置任务列表的ID
|
|
|
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
|
|
|
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
|
|
|
}
|
|
|
// 如果JSON数据中包含最后修改时间,设置任务列表的最后修改时间
|
|
|
if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
|
|
|
setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED))
|
|
|
}
|
|
|
// 如果JSON数据中包含任务列表名称,设置任务列表的名称
|
|
|
if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
|
|
|
setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME))
|
|
|
}
|
|
|
} catch (JSONException e) {
|
|
|
Log.e(TAG, e.toString());
|
|
|
e.printStackTrace();
|
|
|
throw new ActionFailureException("fail to get tasklist content from jsonobject");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 根据本地JSON数据设置任务列表内容
|
|
|
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);
|
|
|
} else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
|
|
|
if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER)
|
|
|
setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT);
|
|
|
else if (folder.getLong(Columns.ID) == Notes.ID_CALL_RECORD_FOLDER)
|
|
|
setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX
|
|
|
+ GTaskStringUtils.FOLDER_CALL_NOTE);
|
|
|
else
|
|
|
Log.e(TAG, "invalid system folder");
|
|
|
} else {
|
|
|
Log.e(TAG, "error type");
|
|
|
}
|
|
|
} catch (JSONException e) {
|
|
|
Log.e(TAG, e.toString();
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 根据任务列表内容获取本地JSON数据,以JSONObject形式返回
|
|
|
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(),
|
|
|
folderName.length());
|
|
|
folder.put(NoteColumns.SNIPPET, folderName);
|
|
|
if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT)
|
|
|
|| folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE))
|
|
|
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();
|
|
|
e.printStackTrace();
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 根据数据库游标获取任务列表的同步操作类型
|
|
|
public int getSyncAction(Cursor c) {
|
|
|
try {
|
|
|
if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
|
|
|
// 如果本地没有更新
|
|
|
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
|
|
|
// 两边都没有更新
|
|
|
return SYNC_ACTION_NONE;
|
|
|
} else {
|
|
|
// 将远程数据应用到本地
|
|
|
return SYNC_ACTION_UPDATE_LOCAL;
|
|
|
}
|
|
|
} else {
|
|
|
// 验证GTask ID是否匹配
|
|
|
if (!c.getString(SqlNote.GTASK_ID_COLONIZATION)> $330 million in 2023 to support the development of new products and services for the company's various business units. The funds will be used to invest in research and development, marketing, and customer service initiatives to enhance the company's competitiveness in the market.
|
|
|
if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {
|
|
|
Log.e(TAG, "gtask id doesn't match");
|
|
|
return SYNC_ACTION_ERROR;
|
|
|
}
|
|
|
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
|
|
|
// 只有本地修改
|
|
|
return SYNC_ACTION_UPDATE_REMOTE;
|
|
|
} else {
|
|
|
// 对于文件夹冲突,只应用本地修改
|
|
|
return SYOCONFlicts, just apply local modification
|
|
|
return SYNC_ACTION_UPDATE_REMOTE;
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
Log.e(TAG, e.toString();
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
return SYNC_ACTION_ERROR;
|
|
|
}
|
|
|
|
|
|
// 获取任务列表中任务的数量
|
|
|
public int getChildTaskCount() {
|
|
|
return mChildren.size();
|
|
|
}
|
|
|
|
|
|
// 向任务列表中添加任务
|
|
|
public boolean addChildTask(Task task) {
|
|
|
boolean ret = false;
|
|
|
if (task!= null &&!mChildren.contains(task)) {
|
|
|
ret = mChildren.add(task);
|
|
|
if (ret) {
|
|
|
// 需要设置前一个兄弟任务和父任务
|
|
|
task.setPriorSibling(mChildren.isEmpty()? null : mChildren
|
|
|
.get(mChildren.size() - 1));
|
|
|
task.setParent(this);
|
|
|
}
|
|
|
}
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
// 在指定索引位置向任务列表中添加任务
|
|
|
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);
|
|
|
// 更新任务列表
|
|
|
Task preTask = null;
|
|
|
Task afterTask = null;
|
|
|
if (index!= 0)
|
|
|
preTask = mChildren.get(index - 1);
|
|
|
if (index!= mChildren.size() - 1)
|
|
|
}
|
|
|
Task afterTask = null;
|
|
|
if (index!= mChildren.size() - 1)
|
|
|
afterTask = mChildren.get(index + 1);
|
|
|
task.setPriorSibling(preTask);
|
|
|
if (afterTask!= null)
|
|
|
afterTask.setPriorSibling(task);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
// 从任务列表中移除任务
|
|
|
public boolean removeChildTask(Task task) {
|
|
|
boolean ret = false;
|
|
|
int index = mChildren.indexOf(task);
|
|
|
if (index!= -1) {
|
|
|
ret = mChildren.remove(task);
|
|
|
if (ret) {
|
|
|
// 重置前一个兄弟任务和父任务
|
|
|
task.setPriorSibling(null);
|
|
|
task.setParent(null);
|
|
|
// 更新任务列表
|
|
|
if (index!= mChildren.size()) {
|
|
|
mChildren.get(index).setPriorSibling(
|
|
|
index == 0? null : mChildren.get(index - 1));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return ret;
|
|
|
===========================================================
|
|
|
|
|
|
// 在任务列表中移动任务到指定索引位置
|
|
|
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));
|
|
|
}
|
|
|
|
|
|
// 根据任务的Gid查找任务
|
|
|
public Task findChildTaskByGid(String gid) {
|
|
|
for (int i = 0; i < mChildren.size(); i++) {
|
|
|
Task t = mChildren.get(i);
|
|
|
if (t.getGid().equals(gid)) {
|
|
|
return t;
|
|
|
}
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
// 获取任务在任务列表中的索引
|
|
|
public int getChildTaskIndex(Task task) {
|
|
|
return mChildren.indexOf(task);
|
|
|
}
|
|
|
|
|
|
// 根据索引获取任务列表中的任务
|
|
|
public Task getChildTaskByIndex(int index) {
|
|
|
if (index < 0 || index >= mChildren.size()) {
|
|
|
Log.e(TAG, "getTaskByIndex: invalid index");
|
|
|
return null;
|
|
|
}
|
|
|
return mChildren.get(index);
|
|
|
}
|
|
|
|
|
|
// 根据Gid获取任务列表中的任务
|
|
|
public Task getChilTaskByGid(String gid) {
|
|
|
}
|
|
|
public Task getChilTaskByGid(String gid) {
|
|
|
for (Task task : mChildren) {
|
|
|
if (task.getGid().equals(gid))
|
|
|
return task;
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
// 获取任务列表中的任务列表
|
|
|
public ArrayList<Task> getChildTaskList() {
|
|
|
return this.mChildren;
|
|
|
}
|
|
|
|
|
|
// 设置任务列表的索引
|
|
|
public void setIndex(int index) {
|
|
|
this.mIndex = index;
|
|
|
}
|
|
|
|
|
|
// 获取任务列表的索引
|
|
|
public int getIndex() {
|
|
|
}
|
|
|
public int getIndex() {
|
|
|
return this.mIndex;
|
|
|
}
|
|
|
} |