|  |  |  | @ -0,0 +1,316 @@ | 
			
		
	
		
			
				
					|  |  |  |  | /* | 
			
		
	
		
			
				
					|  |  |  |  |  * 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.model; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.ContentProviderOperation; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.ContentProviderResult; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.ContentValues; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.Context; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.OperationApplicationException; | 
			
		
	
		
			
				
					|  |  |  |  | import android.net.Uri; | 
			
		
	
		
			
				
					|  |  |  |  | import android.os.RemoteException; | 
			
		
	
		
			
				
					|  |  |  |  | import android.util.Log; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.CallNote; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.DataColumns; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.NoteColumns; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.TextNote; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | import java.util.ArrayList; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * 笔记模型类:负责笔记数据的创建、更新和同步到数据库 | 
			
		
	
		
			
				
					|  |  |  |  |  * 管理笔记的基本信息及关联的文本/通话数据 | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | public class Note { | 
			
		
	
		
			
				
					|  |  |  |  |     // 存储笔记属性变更的内容值
 | 
			
		
	
		
			
				
					|  |  |  |  |     private ContentValues mNoteDiffValues; | 
			
		
	
		
			
				
					|  |  |  |  |     // 存储笔记关联的详细数据(文本/通话)
 | 
			
		
	
		
			
				
					|  |  |  |  |     private NoteData mNoteData; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final String TAG = "Note"; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 创建新笔记ID并插入数据库 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param folderId 所属文件夹ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @return 新创建的笔记ID | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public static synchronized long getNewNoteId(Context context, long folderId) { | 
			
		
	
		
			
				
					|  |  |  |  |         // 初始化笔记基础属性
 | 
			
		
	
		
			
				
					|  |  |  |  |         ContentValues values = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |         long createdTime = System.currentTimeMillis(); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.CREATED_DATE, createdTime); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.MODIFIED_DATE, createdTime); | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);  // 普通笔记类型
 | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.LOCAL_MODIFIED, 1);     // 标记为本地修改
 | 
			
		
	
		
			
				
					|  |  |  |  |         values.put(NoteColumns.PARENT_ID, folderId);   // 所属文件夹ID
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // 插入数据库获取URI
 | 
			
		
	
		
			
				
					|  |  |  |  |         Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // 从URI中解析笔记ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         long noteId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         try { | 
			
		
	
		
			
				
					|  |  |  |  |             noteId = Long.valueOf(uri.getPathSegments().get(1)); | 
			
		
	
		
			
				
					|  |  |  |  |         } catch (NumberFormatException e) { | 
			
		
	
		
			
				
					|  |  |  |  |             Log.e(TAG, "Get note id error :" + e.toString()); | 
			
		
	
		
			
				
					|  |  |  |  |             noteId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (noteId == -1) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalStateException("Wrong note id:" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         return noteId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 构造函数:初始化笔记数据容器 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public Note() { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData = new NoteData(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 设置笔记基础属性(如标题、状态等) | 
			
		
	
		
			
				
					|  |  |  |  |      * @param key 属性键 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param value 属性值 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public void setNoteValue(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |         // 标记为本地修改并更新修改时间
 | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 设置文本笔记数据(如笔记内容) | 
			
		
	
		
			
				
					|  |  |  |  |      * @param key 数据键 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param value 数据值 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextData(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 以下为文本/通话数据ID的设置与获取方法
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setTextDataId(id); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getTextDataId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteData.mTextDataId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setCallDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setCallDataId(id); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setCallData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteData.setCallData(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 判断笔记是否有本地修改 | 
			
		
	
		
			
				
					|  |  |  |  |      * @return true表示有未同步的修改 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 同步笔记数据到数据库 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param noteId 笔记ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @return 同步结果 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean syncNote(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (noteId <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalArgumentException("Wrong note id:" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // 无修改时直接返回成功
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (!isLocalModified()) { | 
			
		
	
		
			
				
					|  |  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 核心逻辑:更新笔记基础信息 | 
			
		
	
		
			
				
					|  |  |  |  |          * 即使更新失败也会继续处理关联数据(数据安全策略) | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         if (context.getContentResolver().update( | 
			
		
	
		
			
				
					|  |  |  |  |                 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, | 
			
		
	
		
			
				
					|  |  |  |  |                 null) == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |             Log.e(TAG, "Update note error, should not happen"); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteDiffValues.clear();  // 清空已同步的修改
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // 同步关联的文本/通话数据
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (mNoteData.isLocalModified() | 
			
		
	
		
			
				
					|  |  |  |  |                 && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         return true; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 笔记数据内部类:管理笔记关联的详细数据(文本/通话) | 
			
		
	
		
			
				
					|  |  |  |  |      * 负责数据的插入、更新和批量操作 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private class NoteData { | 
			
		
	
		
			
				
					|  |  |  |  |         private long mTextDataId;         // 文本数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mTextDataValues; // 文本数据值
 | 
			
		
	
		
			
				
					|  |  |  |  |         private long mCallDataId;         // 通话数据ID
 | 
			
		
	
		
			
				
					|  |  |  |  |         private ContentValues mCallDataValues; // 通话数据值
 | 
			
		
	
		
			
				
					|  |  |  |  |         private static final String TAG = "NoteData"; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 构造函数:初始化数据容器 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         public NoteData() { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataValues = new ContentValues(); | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 判断数据是否有本地修改 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         boolean isLocalModified() { | 
			
		
	
		
			
				
					|  |  |  |  |             return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // 以下为数据ID和数据值的设置方法(带参数校验)
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if(id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Text data id should larger than 0"); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallDataId(long id) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (id <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Call data id should larger than 0"); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataId = id; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setCallData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mCallDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             // 同时更新笔记的修改状态和时间
 | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         void setTextData(String key, String value) { | 
			
		
	
		
			
				
					|  |  |  |  |             mTextDataValues.put(key, value); | 
			
		
	
		
			
				
					|  |  |  |  |             // 同时更新笔记的修改状态和时间
 | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 将数据推送到内容解析器(批量操作) | 
			
		
	
		
			
				
					|  |  |  |  |          * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |          * @param noteId 关联的笔记ID | 
			
		
	
		
			
				
					|  |  |  |  |          * @return 操作结果URI | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         Uri pushIntoContentResolver(Context context, long noteId) { | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * 安全校验 | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             if (noteId <= 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 throw new IllegalArgumentException("Wrong note id:" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>(); | 
			
		
	
		
			
				
					|  |  |  |  |             ContentProviderOperation.Builder builder = null; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * 处理文本数据更新 | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             if(mTextDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.put(DataColumns.NOTE_ID, noteId);  // 关联笔记ID
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mTextDataId == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 新增文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); | 
			
		
	
		
			
				
					|  |  |  |  |                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | 
			
		
	
		
			
				
					|  |  |  |  |                             mTextDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     try { | 
			
		
	
		
			
				
					|  |  |  |  |                         setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); | 
			
		
	
		
			
				
					|  |  |  |  |                     } catch (NumberFormatException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                         Log.e(TAG, "Insert new text data fail with noteId" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                         mTextDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |                         return null; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                     // 更新现有文本数据
 | 
			
		
	
		
			
				
					|  |  |  |  |                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.CONTENT_DATA_URI, mTextDataId)); | 
			
		
	
		
			
				
					|  |  |  |  |                     builder.withValues(mTextDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     operationList.add(builder.build()); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 mTextDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * 处理通话数据更新(逻辑与文本数据类似) | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             if(mCallDataValues.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.put(DataColumns.NOTE_ID, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 if (mCallDataId == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                     mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); | 
			
		
	
		
			
				
					|  |  |  |  |                     Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, | 
			
		
	
		
			
				
					|  |  |  |  |                             mCallDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     try { | 
			
		
	
		
			
				
					|  |  |  |  |                         setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); | 
			
		
	
		
			
				
					|  |  |  |  |                     } catch (NumberFormatException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                         Log.e(TAG, "Insert new call data fail with noteId" + noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                         mCallDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |                         return null; | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } else { | 
			
		
	
		
			
				
					|  |  |  |  |                     builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.CONTENT_DATA_URI, mCallDataId)); | 
			
		
	
		
			
				
					|  |  |  |  |                     builder.withValues(mCallDataValues); | 
			
		
	
		
			
				
					|  |  |  |  |                     operationList.add(builder.build()); | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |                 mCallDataValues.clear(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * 执行批量操作 | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             if (operationList.size() > 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 try { | 
			
		
	
		
			
				
					|  |  |  |  |                     ContentProviderResult[] results = context.getContentResolver().applyBatch( | 
			
		
	
		
			
				
					|  |  |  |  |                             Notes.AUTHORITY, operationList); | 
			
		
	
		
			
				
					|  |  |  |  |                     return (results == null || results.length == 0 || results[0] == null) ? null | 
			
		
	
		
			
				
					|  |  |  |  |                             : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); | 
			
		
	
		
			
				
					|  |  |  |  |                 } catch (RemoteException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                     Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); | 
			
		
	
		
			
				
					|  |  |  |  |                     return null; | 
			
		
	
		
			
				
					|  |  |  |  |                 } catch (OperationApplicationException e) { | 
			
		
	
		
			
				
					|  |  |  |  |                     Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); | 
			
		
	
		
			
				
					|  |  |  |  |                     return null; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             return null; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } |