Search in sources :

Example 1 with TaskList

use of net.micode.notes.gtask.data.TaskList in project Notes by MiCode.

the class GTaskManager method initGTaskList.

private void initGTaskList() throws NetworkFailureException {
    if (mCancelled)
        return;
    GTaskClient client = GTaskClient.getInstance();
    try {
        JSONArray jsTaskLists = client.getTaskLists();
        // init meta list first
        mMetaList = null;
        for (int i = 0; i < jsTaskLists.length(); i++) {
            JSONObject object = jsTaskLists.getJSONObject(i);
            String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
            String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
            if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
                mMetaList = new TaskList();
                mMetaList.setContentByRemoteJSON(object);
                // load meta data
                JSONArray jsMetas = client.getTaskList(gid);
                for (int j = 0; j < jsMetas.length(); j++) {
                    object = (JSONObject) jsMetas.getJSONObject(j);
                    MetaData metaData = new MetaData();
                    metaData.setContentByRemoteJSON(object);
                    if (metaData.isWorthSaving()) {
                        mMetaList.addChildTask(metaData);
                        if (metaData.getGid() != null) {
                            mMetaHashMap.put(metaData.getRelatedGid(), metaData);
                        }
                    }
                }
            }
        }
        // create meta list if not existed
        if (mMetaList == null) {
            mMetaList = new TaskList();
            mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META);
            GTaskClient.getInstance().createTaskList(mMetaList);
        }
        // init task list
        for (int i = 0; i < jsTaskLists.length(); i++) {
            JSONObject object = jsTaskLists.getJSONObject(i);
            String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
            String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
            if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
                TaskList tasklist = new TaskList();
                tasklist.setContentByRemoteJSON(object);
                mGTaskListHashMap.put(gid, tasklist);
                mGTaskHashMap.put(gid, tasklist);
                // load tasks
                JSONArray jsTasks = client.getTaskList(gid);
                for (int j = 0; j < jsTasks.length(); j++) {
                    object = (JSONObject) jsTasks.getJSONObject(j);
                    gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
                    Task task = new Task();
                    task.setContentByRemoteJSON(object);
                    if (task.isWorthSaving()) {
                        task.setMetaInfo(mMetaHashMap.get(gid));
                        tasklist.addChildTask(task);
                        mGTaskHashMap.put(gid, task);
                    }
                }
            }
        }
    } catch (JSONException e) {
        Log.e(TAG, e.toString());
        e.printStackTrace();
        throw new ActionFailureException("initGTaskList: handing JSONObject failed");
    }
}
Also used : Task(net.micode.notes.gtask.data.Task) ActionFailureException(net.micode.notes.gtask.exception.ActionFailureException) JSONObject(org.json.JSONObject) MetaData(net.micode.notes.gtask.data.MetaData) TaskList(net.micode.notes.gtask.data.TaskList) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException)

Example 2 with TaskList

use of net.micode.notes.gtask.data.TaskList in project Notes by MiCode.

the class GTaskManager method addRemoteNode.

private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
    if (mCancelled) {
        return;
    }
    SqlNote sqlNote = new SqlNote(mContext, c);
    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");
            throw new ActionFailureException("cannot add remote task");
        }
        mGTaskListHashMap.get(parentGid).addChildTask(task);
        GTaskClient.getInstance().createTask(task);
        n = (Node) task;
        // add meta
        updateRemoteMeta(task.getGid(), sqlNote);
    } else {
        TaskList tasklist = null;
        // we need to skip folder if it has already existed
        String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;
        if (sqlNote.getId() == Notes.ID_ROOT_FOLDER)
            folderName += GTaskStringUtils.FOLDER_DEFAULT;
        else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER)
            folderName += GTaskStringUtils.FOLDER_CALL_NOTE;
        else
            folderName += sqlNote.getSnippet();
        Iterator<Map.Entry<String, TaskList>> iter = mGTaskListHashMap.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<String, TaskList> entry = iter.next();
            String gid = entry.getKey();
            TaskList list = entry.getValue();
            if (list.getName().equals(folderName)) {
                tasklist = list;
                if (mGTaskHashMap.containsKey(gid)) {
                    mGTaskHashMap.remove(gid);
                }
                break;
            }
        }
        // no match we can add now
        if (tasklist == null) {
            tasklist = new TaskList();
            tasklist.setContentByLocalJSON(sqlNote.getContent());
            GTaskClient.getInstance().createTaskList(tasklist);
            mGTaskListHashMap.put(tasklist.getGid(), tasklist);
        }
        n = (Node) tasklist;
    }
    // update local note
    sqlNote.setGtaskId(n.getGid());
    sqlNote.commit(false);
    sqlNote.resetLocalModified();
    sqlNote.commit(true);
    // gid-id mapping
    mGidToNid.put(n.getGid(), sqlNote.getId());
    mNidToGid.put(sqlNote.getId(), n.getGid());
}
Also used : Task(net.micode.notes.gtask.data.Task) ActionFailureException(net.micode.notes.gtask.exception.ActionFailureException) Node(net.micode.notes.gtask.data.Node) TaskList(net.micode.notes.gtask.data.TaskList) HashMap(java.util.HashMap) Map(java.util.Map) SqlNote(net.micode.notes.gtask.data.SqlNote)

Example 3 with TaskList

use of net.micode.notes.gtask.data.TaskList in project Notes by MiCode.

the class GTaskManager method addLocalNode.

private void addLocalNode(Node node) throws NetworkFailureException {
    if (mCancelled) {
        return;
    }
    SqlNote sqlNote;
    if (node instanceof TaskList) {
        if (node.getName().equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) {
            sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER);
        } else if (node.getName().equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) {
            sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER);
        } else {
            sqlNote = new SqlNote(mContext);
            sqlNote.setContent(node.getLocalJSONFromContent());
            sqlNote.setParentId(Notes.ID_ROOT_FOLDER);
        }
    } else {
        sqlNote = new SqlNote(mContext);
        JSONObject js = node.getLocalJSONFromContent();
        try {
            if (js.has(GTaskStringUtils.META_HEAD_NOTE)) {
                JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
                if (note.has(NoteColumns.ID)) {
                    long id = note.getLong(NoteColumns.ID);
                    if (DataUtils.existInNoteDatabase(mContentResolver, id)) {
                        // the id is not available, have to create a new one
                        note.remove(NoteColumns.ID);
                    }
                }
            }
            if (js.has(GTaskStringUtils.META_HEAD_DATA)) {
                JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
                for (int i = 0; i < dataArray.length(); i++) {
                    JSONObject data = dataArray.getJSONObject(i);
                    if (data.has(DataColumns.ID)) {
                        long dataId = data.getLong(DataColumns.ID);
                        if (DataUtils.existInDataDatabase(mContentResolver, dataId)) {
                            // the data id is not available, have to create
                            // a new one
                            data.remove(DataColumns.ID);
                        }
                    }
                }
            }
        } catch (JSONException e) {
            Log.w(TAG, e.toString());
            e.printStackTrace();
        }
        sqlNote.setContent(js);
        Long parentId = mGidToNid.get(((Task) node).getParent().getGid());
        if (parentId == null) {
            Log.e(TAG, "cannot find task's parent id locally");
            throw new ActionFailureException("cannot add local node");
        }
        sqlNote.setParentId(parentId.longValue());
    }
    // 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);
}
Also used : Task(net.micode.notes.gtask.data.Task) ActionFailureException(net.micode.notes.gtask.exception.ActionFailureException) JSONObject(org.json.JSONObject) TaskList(net.micode.notes.gtask.data.TaskList) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) SqlNote(net.micode.notes.gtask.data.SqlNote)

Example 4 with TaskList

use of net.micode.notes.gtask.data.TaskList in project Notes by MiCode.

the class GTaskManager method updateRemoteNode.

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);
    // update meta
    updateRemoteMeta(node.getGid(), sqlNote);
    // move task if necessary
    if (sqlNote.isNoteType()) {
        Task task = (Task) node;
        TaskList preParentList = task.getParent();
        String curParentGid = mNidToGid.get(sqlNote.getParentId());
        if (curParentGid == null) {
            Log.e(TAG, "cannot find task's parent tasklist");
            throw new ActionFailureException("cannot update remote task");
        }
        TaskList curParentList = mGTaskListHashMap.get(curParentGid);
        if (preParentList != curParentList) {
            preParentList.removeChildTask(task);
            curParentList.addChildTask(task);
            GTaskClient.getInstance().moveTask(task, preParentList, curParentList);
        }
    }
    // clear local modified flag
    sqlNote.resetLocalModified();
    sqlNote.commit(true);
}
Also used : Task(net.micode.notes.gtask.data.Task) ActionFailureException(net.micode.notes.gtask.exception.ActionFailureException) TaskList(net.micode.notes.gtask.data.TaskList) SqlNote(net.micode.notes.gtask.data.SqlNote)

Example 5 with TaskList

use of net.micode.notes.gtask.data.TaskList in project Notes by MiCode.

the class GTaskManager method syncFolder.

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, Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null);
        if (c != null) {
            c.moveToNext();
            gid = c.getString(SqlNote.GTASK_ID_COLUMN);
            node = mGTaskHashMap.get(gid);
            if (node != null) {
                mGTaskHashMap.remove(gid);
                mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER);
                mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid);
                // for system folder, only update remote name if necessary
                if (!node.getName().equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT))
                    doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
            } else {
                doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
            }
        } else {
            Log.w(TAG, "failed to query root folder");
        }
    } finally {
        if (c != null) {
            c.close();
            c = null;
        }
    }
    // for call-note folder
    try {
        c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", new String[] { String.valueOf(Notes.ID_CALL_RECORD_FOLDER) }, null);
        if (c != null) {
            if (c.moveToNext()) {
                gid = c.getString(SqlNote.GTASK_ID_COLUMN);
                node = mGTaskHashMap.get(gid);
                if (node != null) {
                    mGTaskHashMap.remove(gid);
                    mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER);
                    mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid);
                    // necessary
                    if (!node.getName().equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE))
                        doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
                } else {
                    doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
                }
            }
        } else {
            Log.w(TAG, "failed to query call note folder");
        }
    } finally {
        if (c != null) {
            c.close();
            c = null;
        }
    }
    // for local existing folders
    try {
        c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(type=? AND parent_id<>?)", new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) }, NoteColumns.TYPE + " DESC");
        if (c != null) {
            while (c.moveToNext()) {
                gid = c.getString(SqlNote.GTASK_ID_COLUMN);
                node = mGTaskHashMap.get(gid);
                if (node != null) {
                    mGTaskHashMap.remove(gid);
                    mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));
                    mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);
                    syncType = node.getSyncAction(c);
                } else {
                    if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
                        // local add
                        syncType = Node.SYNC_ACTION_ADD_REMOTE;
                    } else {
                        // remote delete
                        syncType = Node.SYNC_ACTION_DEL_LOCAL;
                    }
                }
                doContentSync(syncType, node, c);
            }
        } else {
            Log.w(TAG, "failed to query existing folder");
        }
    } finally {
        if (c != null) {
            c.close();
            c = null;
        }
    }
    // for remote add folders
    Iterator<Map.Entry<String, TaskList>> iter = mGTaskListHashMap.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry<String, TaskList> entry = iter.next();
        gid = entry.getKey();
        node = entry.getValue();
        if (mGTaskHashMap.containsKey(gid)) {
            mGTaskHashMap.remove(gid);
            doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
        }
    }
    if (!mCancelled)
        GTaskClient.getInstance().commitUpdate();
}
Also used : Node(net.micode.notes.gtask.data.Node) TaskList(net.micode.notes.gtask.data.TaskList) Cursor(android.database.Cursor) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

TaskList (net.micode.notes.gtask.data.TaskList)5 Task (net.micode.notes.gtask.data.Task)4 ActionFailureException (net.micode.notes.gtask.exception.ActionFailureException)4 SqlNote (net.micode.notes.gtask.data.SqlNote)3 HashMap (java.util.HashMap)2 Map (java.util.Map)2 Node (net.micode.notes.gtask.data.Node)2 JSONArray (org.json.JSONArray)2 JSONException (org.json.JSONException)2 JSONObject (org.json.JSONObject)2 Cursor (android.database.Cursor)1 MetaData (net.micode.notes.gtask.data.MetaData)1