Merge branch 'master' of https://bdgit.educoder.net/mbhvfy6mx/gitProject
	
		
	
				
					
				
			# Conflicts: # src/.idea/deploymentTargetDropDown.xml # src/app/src/main/java/net/micode/notes/gtask/data/SqlData.javapull/16/head
						commit
						026e1f0cba
					
				| @ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * 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 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.exception; | ||||
| 
 | ||||
| public class NetworkFailureException extends Exception { | ||||
|     private static final long serialVersionUID = 2107610287180234136L; | ||||
| 
 | ||||
|     public NetworkFailureException() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     public NetworkFailureException(String paramString) { | ||||
|         super(paramString); | ||||
|     } | ||||
| 
 | ||||
|     public NetworkFailureException(String paramString, Throwable paramThrowable) { | ||||
|         super(paramString, paramThrowable); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,505 @@ | ||||
| /* | ||||
|  * 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 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.appwidget.AppWidgetManager; | ||||
| import android.content.ContentResolver; | ||||
| import android.content.ContentValues; | ||||
| import android.content.Context; | ||||
| import android.database.Cursor; | ||||
| import android.net.Uri; | ||||
| import android.util.Log; | ||||
| 
 | ||||
| import net.micode.notes.data.Notes; | ||||
| import net.micode.notes.data.Notes.DataColumns; | ||||
| import net.micode.notes.data.Notes.NoteColumns; | ||||
| import net.micode.notes.gtask.exception.ActionFailureException; | ||||
| import net.micode.notes.tool.GTaskStringUtils; | ||||
| import net.micode.notes.tool.ResourceParser; | ||||
| 
 | ||||
| import org.json.JSONArray; | ||||
| import org.json.JSONException; | ||||
| import org.json.JSONObject; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| 
 | ||||
| 
 | ||||
| public class SqlNote { | ||||
|     private static final String TAG = SqlNote.class.getSimpleName(); | ||||
| 
 | ||||
|     private static final int INVALID_ID = -99999; | ||||
| 
 | ||||
|     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, | ||||
|             NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, | ||||
|             NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, | ||||
|             NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, | ||||
|             NoteColumns.VERSION | ||||
|     }; | ||||
| 
 | ||||
|     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; | ||||
| 
 | ||||
|     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<SqlData> mDataList; | ||||
| 
 | ||||
|     public SqlNote(Context context) { | ||||
|         mContext = context; | ||||
|         mContentResolver = context.getContentResolver(); | ||||
|         mIsCreate = true; | ||||
|         mId = INVALID_ID; | ||||
|         mAlertDate = 0; | ||||
|         mBgColorId = ResourceParser.getDefaultBgId(context); | ||||
|         mCreatedDate = System.currentTimeMillis(); | ||||
|         mHasAttachment = 0; | ||||
|         mModifiedDate = System.currentTimeMillis(); | ||||
|         mParentId = 0; | ||||
|         mSnippet = ""; | ||||
|         mType = Notes.TYPE_NOTE; | ||||
|         mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; | ||||
|         mWidgetType = Notes.TYPE_WIDGET_INVALIDE; | ||||
|         mOriginParent = 0; | ||||
|         mVersion = 0; | ||||
|         mDiffNoteValues = new ContentValues(); | ||||
|         mDataList = new ArrayList<SqlData>(); | ||||
|     } | ||||
| 
 | ||||
|     public SqlNote(Context context, Cursor c) { | ||||
|         mContext = context; | ||||
|         mContentResolver = context.getContentResolver(); | ||||
|         mIsCreate = false; | ||||
|         loadFromCursor(c); | ||||
|         mDataList = new ArrayList<SqlData>(); | ||||
|         if (mType == Notes.TYPE_NOTE) | ||||
|             loadDataContent(); | ||||
|         mDiffNoteValues = new ContentValues(); | ||||
|     } | ||||
| 
 | ||||
|     public SqlNote(Context context, long id) { | ||||
|         mContext = context; | ||||
|         mContentResolver = context.getContentResolver(); | ||||
|         mIsCreate = false; | ||||
|         loadFromCursor(id); | ||||
|         mDataList = new ArrayList<SqlData>(); | ||||
|         if (mType == Notes.TYPE_NOTE) | ||||
|             loadDataContent(); | ||||
|         mDiffNoteValues = new ContentValues(); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     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); | ||||
|             if (c != null) { | ||||
|                 c.moveToNext(); | ||||
|                 loadFromCursor(c); | ||||
|             } else { | ||||
|                 Log.w(TAG, "loadFromCursor: cursor = null"); | ||||
|             } | ||||
|         } finally { | ||||
|             if (c != null) | ||||
|                 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); | ||||
|         mCreatedDate = c.getLong(CREATED_DATE_COLUMN); | ||||
|         mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); | ||||
|         mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); | ||||
|         mParentId = c.getLong(PARENT_ID_COLUMN); | ||||
|         mSnippet = c.getString(SNIPPET_COLUMN); | ||||
|         mType = c.getInt(TYPE_COLUMN); | ||||
|         mWidgetId = c.getInt(WIDGET_ID_COLUMN); | ||||
|         mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); | ||||
|         mVersion = c.getLong(VERSION_COLUMN); | ||||
|     } | ||||
| 
 | ||||
|     private void loadDataContent() { | ||||
|         Cursor c = null; | ||||
|         mDataList.clear(); | ||||
|         try { | ||||
|             c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, | ||||
|                     "(note_id=?)", new String[] { | ||||
|                         String.valueOf(mId) | ||||
|                     }, null); | ||||
|             if (c != null) { | ||||
|                 if (c.getCount() == 0) { | ||||
|                     Log.w(TAG, "it seems that the note has not data"); | ||||
|                     return; | ||||
|                 } | ||||
|                 while (c.moveToNext()) { | ||||
|                     SqlData data = new SqlData(mContext, c); | ||||
|                     mDataList.add(data); | ||||
|                 } | ||||
|             } else { | ||||
|                 Log.w(TAG, "loadDataContent: cursor = null"); | ||||
|             } | ||||
|         } finally { | ||||
|             if (c != null) | ||||
|                 c.close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public boolean setContent(JSONObject js) { | ||||
|         try { | ||||
|             JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); | ||||
|             if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { | ||||
|                 Log.w(TAG, "cannot set system folder"); | ||||
|             } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { | ||||
|                 // for folder we can only update the snnipet and type
 | ||||
|                 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; | ||||
|             } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { | ||||
|                 JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); | ||||
|                 long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; | ||||
|                 if (mIsCreate || mId != id) { | ||||
|                     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; | ||||
|                     if (data.has(DataColumns.ID)) { | ||||
|                         long dataId = data.getLong(DataColumns.ID); | ||||
|                         for (SqlData temp : mDataList) { | ||||
|                             if (dataId == temp.getId()) { | ||||
|                                 sqlData = temp; | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (sqlData == null) { | ||||
|                         sqlData = new SqlData(mContext); | ||||
|                         mDataList.add(sqlData); | ||||
|                     } | ||||
| 
 | ||||
|                     sqlData.setContent(data); | ||||
|                 } | ||||
|             } | ||||
|         } catch (JSONException e) { | ||||
|             Log.e(TAG, e.toString()); | ||||
|             e.printStackTrace(); | ||||
|             return false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     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) { | ||||
|                 note.put(NoteColumns.ID, mId); | ||||
|                 note.put(NoteColumns.ALERTED_DATE, mAlertDate); | ||||
|                 note.put(NoteColumns.BG_COLOR_ID, mBgColorId); | ||||
|                 note.put(NoteColumns.CREATED_DATE, mCreatedDate); | ||||
|                 note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); | ||||
|                 note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); | ||||
|                 note.put(NoteColumns.PARENT_ID, mParentId); | ||||
|                 note.put(NoteColumns.SNIPPET, mSnippet); | ||||
|                 note.put(NoteColumns.TYPE, mType); | ||||
|                 note.put(NoteColumns.WIDGET_ID, mWidgetId); | ||||
|                 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(); | ||||
|                     if (data != null) { | ||||
|                         dataArray.put(data); | ||||
|                     } | ||||
|                 } | ||||
|                 js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); | ||||
|             } 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()); | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public void setParentId(long id) { | ||||
|         mParentId = id; | ||||
|         mDiffNoteValues.put(NoteColumns.PARENT_ID, id); | ||||
|     } | ||||
| 
 | ||||
|     public void setGtaskId(String gid) { | ||||
|         mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); | ||||
|     } | ||||
| 
 | ||||
|     public void setSyncId(long syncId) { | ||||
|         mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); | ||||
|     } | ||||
| 
 | ||||
|     public void resetLocalModified() { | ||||
|         mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); | ||||
|     } | ||||
| 
 | ||||
|     public long getId() { | ||||
|         return mId; | ||||
|     } | ||||
| 
 | ||||
|     public long getParentId() { | ||||
|         return mParentId; | ||||
|     } | ||||
| 
 | ||||
|     public String getSnippet() { | ||||
|         return mSnippet; | ||||
|     } | ||||
| 
 | ||||
|     public boolean isNoteType() { | ||||
|         return mType == Notes.TYPE_NOTE; | ||||
|     } | ||||
| 
 | ||||
|     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)); | ||||
|             } catch (NumberFormatException e) { | ||||
|                 Log.e(TAG, "Get note id error :" + e.toString()); | ||||
|                 throw new ActionFailureException("create note failed"); | ||||
|             } | ||||
|             if (mId == 0) { | ||||
|                 throw new IllegalStateException("Create thread id failed"); | ||||
|             } | ||||
| 
 | ||||
|             if (mType == Notes.TYPE_NOTE) { | ||||
|                 for (SqlData sqlData : mDataList) { | ||||
|                     sqlData.commit(mId, false, -1); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { | ||||
|                 Log.e(TAG, "No such note"); | ||||
|                 throw new IllegalStateException("Try to update note with invalid id"); | ||||
|             } | ||||
|             if (mDiffNoteValues.size() > 0) { | ||||
|                 mVersion ++; | ||||
|                 int result = 0; | ||||
|                 if (!validateVersion) { | ||||
|                     result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" | ||||
|                             + NoteColumns.ID + "=?)", new String[] { | ||||
|                         String.valueOf(mId) | ||||
|                     }); | ||||
|                 } else { | ||||
|                     result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" | ||||
|                             + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", | ||||
|                             new String[] { | ||||
|                                     String.valueOf(mId), String.valueOf(mVersion) | ||||
|                             }); | ||||
|                 } | ||||
|                 if (result == 0) { | ||||
|                     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; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,351 @@ | ||||
| /* | ||||
|  * 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 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.text.TextUtils; | ||||
| import android.util.Log; | ||||
| 
 | ||||
| import net.micode.notes.data.Notes; | ||||
| import net.micode.notes.data.Notes.DataColumns; | ||||
| import net.micode.notes.data.Notes.DataConstants; | ||||
| import net.micode.notes.data.Notes.NoteColumns; | ||||
| import net.micode.notes.gtask.exception.ActionFailureException; | ||||
| import net.micode.notes.tool.GTaskStringUtils; | ||||
| 
 | ||||
| import org.json.JSONArray; | ||||
| 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 String mNotes; | ||||
| 
 | ||||
|     private JSONObject mMetaInfo; | ||||
| 
 | ||||
|     private Task mPriorSibling; | ||||
| 
 | ||||
|     private TaskList mParent; | ||||
| 
 | ||||
|     public Task() { | ||||
|         super(); | ||||
|         mCompleted = false; | ||||
|         mNotes = null; | ||||
|         mPriorSibling = null; | ||||
|         mParent = null; | ||||
|         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()); | ||||
|             entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); | ||||
|             entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, | ||||
|                     GTaskStringUtils.GTASK_JSON_TYPE_TASK); | ||||
|             if (getNotes() != null) { | ||||
|                 entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); | ||||
|             } | ||||
|             js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); | ||||
| 
 | ||||
|             // parent_id
 | ||||
|             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
 | ||||
|             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()); | ||||
|             if (getNotes() != null) { | ||||
|                 entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); | ||||
|             } | ||||
|             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 { | ||||
|                 // id
 | ||||
|                 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)); | ||||
|                 } | ||||
|             } catch (JSONException e) { | ||||
|                 Log.e(TAG, e.toString()); | ||||
|                 e.printStackTrace(); | ||||
|                 throw new ActionFailureException("fail to get task content from jsonobject"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void setContentByLocalJSON(JSONObject js) { | ||||
|         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"); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             for (int i = 0; i < dataArray.length(); i++) { | ||||
|                 JSONObject data = dataArray.getJSONObject(i); | ||||
|                 if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { | ||||
|                     setName(data.getString(DataColumns.CONTENT)); | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } catch (JSONException e) { | ||||
|             Log.e(TAG, e.toString()); | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public JSONObject getLocalJSONFromContent() { | ||||
|         String name = getName(); | ||||
|         try { | ||||
|             if (mMetaInfo == null) { | ||||
|                 // new task created from web
 | ||||
|                 if (name == null) { | ||||
|                     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(); | ||||
|                 JSONObject data = new JSONObject(); | ||||
|                 data.put(DataColumns.CONTENT, name); | ||||
|                 dataArray.put(data); | ||||
|                 js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); | ||||
|                 note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); | ||||
|                 js.put(GTaskStringUtils.META_HEAD_NOTE, note); | ||||
|                 return js; | ||||
|             } else { | ||||
|                 // 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)) { | ||||
|                         data.put(DataColumns.CONTENT, getName()); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); | ||||
|                 return mMetaInfo; | ||||
|             } | ||||
|         } catch (JSONException e) { | ||||
|             Log.e(TAG, e.toString()); | ||||
|             e.printStackTrace(); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public void setMetaInfo(MetaData metaData) { | ||||
|         if (metaData != null && metaData.getNotes() != null) { | ||||
|             try { | ||||
|                 mMetaInfo = new JSONObject(metaData.getNotes()); | ||||
|             } catch (JSONException e) { | ||||
|                 Log.w(TAG, e.toString()); | ||||
|                 mMetaInfo = null; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     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()) { | ||||
|                     // no update both side
 | ||||
|                     return SYNC_ACTION_NONE; | ||||
|                 } else { | ||||
|                     // apply remote to local
 | ||||
|                     return SYNC_ACTION_UPDATE_LOCAL; | ||||
|                 } | ||||
|             } else { | ||||
|                 // validate gtask id
 | ||||
|                 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()) { | ||||
|                     // local modification only
 | ||||
|                     return SYNC_ACTION_UPDATE_REMOTE; | ||||
|                 } else { | ||||
|                     return SYNC_ACTION_UPDATE_CONFLICT; | ||||
|                 } | ||||
|             } | ||||
|         } catch (Exception e) { | ||||
|             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; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,343 @@ | ||||
| /* | ||||
|  * 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 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; | ||||
| 
 | ||||
| 
 | ||||
| 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; | ||||
|     } | ||||
| 
 | ||||
|     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(); | ||||
|             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; | ||||
|     } | ||||
| 
 | ||||
|     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 { | ||||
|                 // id
 | ||||
|                 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(); | ||||
|                 throw new ActionFailureException("fail to get tasklist content from jsonobject"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     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(NoteColumns.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(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     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) { | ||||
|                 // there is no local update
 | ||||
|                 if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { | ||||
|                     // no update both side
 | ||||
|                     return SYNC_ACTION_NONE; | ||||
|                 } else { | ||||
|                     // apply remote to local
 | ||||
|                     return SYNC_ACTION_UPDATE_LOCAL; | ||||
|                 } | ||||
|             } else { | ||||
|                 // validate gtask id
 | ||||
|                 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()) { | ||||
|                     // local modification only
 | ||||
|                     return SYNC_ACTION_UPDATE_REMOTE; | ||||
|                 } else { | ||||
|                     // for folder conflicts, 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) { | ||||
|                 // need to set prior sibling and parent
 | ||||
|                 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); | ||||
| 
 | ||||
|             // update the task list
 | ||||
|             Task preTask = null; | ||||
|             Task afterTask = null; | ||||
|             if (index != 0) | ||||
|                 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; | ||||
|     } | ||||
| 
 | ||||
|     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( | ||||
|                             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)); | ||||
|     } | ||||
| 
 | ||||
|     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); | ||||
|     } | ||||
| 
 | ||||
|     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() { | ||||
|         return this.mIndex; | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue