|  |  |  | @ -0,0 +1,430 @@ | 
			
		
	
		
			
				
					|  |  |  |  | /* | 
			
		
	
		
			
				
					|  |  |  |  |  * 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.appwidget.AppWidgetManager; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.ContentUris; | 
			
		
	
		
			
				
					|  |  |  |  | import android.content.Context; | 
			
		
	
		
			
				
					|  |  |  |  | import android.database.Cursor; | 
			
		
	
		
			
				
					|  |  |  |  | import android.text.TextUtils; | 
			
		
	
		
			
				
					|  |  |  |  | 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.DataConstants; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.NoteColumns; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.data.Notes.TextNote; | 
			
		
	
		
			
				
					|  |  |  |  | import net.micode.notes.tool.ResourceParser.NoteBgResources; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * 工作笔记管理类:处理笔记的创建、加载、保存及状态管理 | 
			
		
	
		
			
				
					|  |  |  |  |  * 封装笔记的编辑状态和业务逻辑,关联Widget和提醒功能 | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | public class WorkingNote { | 
			
		
	
		
			
				
					|  |  |  |  |     // 关联的基础笔记模型
 | 
			
		
	
		
			
				
					|  |  |  |  |     private Note mNote; | 
			
		
	
		
			
				
					|  |  |  |  |     // 笔记ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     private long mNoteId; | 
			
		
	
		
			
				
					|  |  |  |  |     // 笔记内容
 | 
			
		
	
		
			
				
					|  |  |  |  |     private String mContent; | 
			
		
	
		
			
				
					|  |  |  |  |     // 笔记模式(普通/待办清单)
 | 
			
		
	
		
			
				
					|  |  |  |  |     private int mMode; | 
			
		
	
		
			
				
					|  |  |  |  |     // 提醒时间
 | 
			
		
	
		
			
				
					|  |  |  |  |     private long mAlertDate; | 
			
		
	
		
			
				
					|  |  |  |  |     // 最后修改时间
 | 
			
		
	
		
			
				
					|  |  |  |  |     private long mModifiedDate; | 
			
		
	
		
			
				
					|  |  |  |  |     // 背景颜色ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     private int mBgColorId; | 
			
		
	
		
			
				
					|  |  |  |  |     // Widget ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     private int mWidgetId; | 
			
		
	
		
			
				
					|  |  |  |  |     // Widget类型
 | 
			
		
	
		
			
				
					|  |  |  |  |     private int mWidgetType; | 
			
		
	
		
			
				
					|  |  |  |  |     // 所属文件夹ID
 | 
			
		
	
		
			
				
					|  |  |  |  |     private long mFolderId; | 
			
		
	
		
			
				
					|  |  |  |  |     // 应用上下文
 | 
			
		
	
		
			
				
					|  |  |  |  |     private Context mContext; | 
			
		
	
		
			
				
					|  |  |  |  |     // 日志标签
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static final String TAG = "WorkingNote"; | 
			
		
	
		
			
				
					|  |  |  |  |     // 标记是否已删除
 | 
			
		
	
		
			
				
					|  |  |  |  |     private boolean mIsDeleted; | 
			
		
	
		
			
				
					|  |  |  |  |     // 笔记设置变更监听器
 | 
			
		
	
		
			
				
					|  |  |  |  |     private NoteSettingChangedListener mNoteSettingStatusListener; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 数据查询投影(指定查询的列)
 | 
			
		
	
		
			
				
					|  |  |  |  |     public static final String[] DATA_PROJECTION = new String[] { | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.ID, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.CONTENT, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.MIME_TYPE, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.DATA1, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.DATA2, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.DATA3, | 
			
		
	
		
			
				
					|  |  |  |  |             DataColumns.DATA4, | 
			
		
	
		
			
				
					|  |  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 笔记查询投影
 | 
			
		
	
		
			
				
					|  |  |  |  |     public static final String[] NOTE_PROJECTION = new String[] { | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.PARENT_ID,    // 所属文件夹ID
 | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.ALERTED_DATE, // 提醒时间
 | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.BG_COLOR_ID,  // 背景颜色ID
 | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.WIDGET_ID,    // Widget ID
 | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.WIDGET_TYPE,  // Widget类型
 | 
			
		
	
		
			
				
					|  |  |  |  |             NoteColumns.MODIFIED_DATE // 最后修改时间
 | 
			
		
	
		
			
				
					|  |  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 列索引常量(提高代码可读性)
 | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int DATA_ID_COLUMN = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int DATA_CONTENT_COLUMN = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int DATA_MIME_TYPE_COLUMN = 2; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int DATA_MODE_COLUMN = 3; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_PARENT_ID_COLUMN = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_ALERTED_DATE_COLUMN = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_BG_COLOR_ID_COLUMN = 2; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_WIDGET_ID_COLUMN = 3; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_WIDGET_TYPE_COLUMN = 4; | 
			
		
	
		
			
				
					|  |  |  |  |     private static final int NOTE_MODIFIED_DATE_COLUMN = 5; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 新建笔记构造函数 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param folderId 所属文件夹ID | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private WorkingNote(Context context, long folderId) { | 
			
		
	
		
			
				
					|  |  |  |  |         mContext = context; | 
			
		
	
		
			
				
					|  |  |  |  |         mAlertDate = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         mModifiedDate = System.currentTimeMillis(); | 
			
		
	
		
			
				
					|  |  |  |  |         mFolderId = folderId; | 
			
		
	
		
			
				
					|  |  |  |  |         mNote = new Note(); | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteId = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         mIsDeleted = false; | 
			
		
	
		
			
				
					|  |  |  |  |         mMode = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         mWidgetType = Notes.TYPE_WIDGET_INVALIDE; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 加载现有笔记构造函数 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param noteId 笔记ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @param folderId 所属文件夹ID | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private WorkingNote(Context context, long noteId, long folderId) { | 
			
		
	
		
			
				
					|  |  |  |  |         mContext = context; | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteId = noteId; | 
			
		
	
		
			
				
					|  |  |  |  |         mFolderId = folderId; | 
			
		
	
		
			
				
					|  |  |  |  |         mIsDeleted = false; | 
			
		
	
		
			
				
					|  |  |  |  |         mNote = new Note(); | 
			
		
	
		
			
				
					|  |  |  |  |         loadNote(); // 加载笔记基础信息
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 从数据库加载笔记基础信息 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private void loadNote() { | 
			
		
	
		
			
				
					|  |  |  |  |         // 查询笔记基础信息
 | 
			
		
	
		
			
				
					|  |  |  |  |         Cursor cursor = mContext.getContentResolver().query( | 
			
		
	
		
			
				
					|  |  |  |  |                 ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, | 
			
		
	
		
			
				
					|  |  |  |  |                 null, null); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (cursor != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (cursor.moveToFirst()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 // 解析查询结果并赋值给成员变量
 | 
			
		
	
		
			
				
					|  |  |  |  |                 mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                 mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                 mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                 mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                 mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                 mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             cursor.close(); | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |             Log.e(TAG, "No note with id:" + mNoteId); | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalArgumentException("Unable to find note with id " + mNoteId); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         loadNoteData(); // 加载笔记详细数据
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 加载笔记详细数据(内容、类型等) | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private void loadNoteData() { | 
			
		
	
		
			
				
					|  |  |  |  |         // 查询笔记关联的数据
 | 
			
		
	
		
			
				
					|  |  |  |  |         Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, | 
			
		
	
		
			
				
					|  |  |  |  |                 DataColumns.NOTE_ID + "=?", new String[] { | 
			
		
	
		
			
				
					|  |  |  |  |                         String.valueOf(mNoteId) | 
			
		
	
		
			
				
					|  |  |  |  |                 }, null); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (cursor != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (cursor.moveToFirst()) { | 
			
		
	
		
			
				
					|  |  |  |  |                 do { | 
			
		
	
		
			
				
					|  |  |  |  |                     String type = cursor.getString(DATA_MIME_TYPE_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                     if (DataConstants.NOTE.equals(type)) { | 
			
		
	
		
			
				
					|  |  |  |  |                         // 普通文本笔记
 | 
			
		
	
		
			
				
					|  |  |  |  |                         mContent = cursor.getString(DATA_CONTENT_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                         mMode = cursor.getInt(DATA_MODE_COLUMN); | 
			
		
	
		
			
				
					|  |  |  |  |                         mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); | 
			
		
	
		
			
				
					|  |  |  |  |                     } else if (DataConstants.CALL_NOTE.equals(type)) { | 
			
		
	
		
			
				
					|  |  |  |  |                         // 通话笔记
 | 
			
		
	
		
			
				
					|  |  |  |  |                         mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); | 
			
		
	
		
			
				
					|  |  |  |  |                     } else { | 
			
		
	
		
			
				
					|  |  |  |  |                         Log.d(TAG, "Wrong note type with type:" + type); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } while (cursor.moveToNext()); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             cursor.close(); | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |             Log.e(TAG, "No data with id:" + mNoteId); | 
			
		
	
		
			
				
					|  |  |  |  |             throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 创建空笔记的工厂方法 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param folderId 所属文件夹ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @param widgetId Widget ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @param widgetType Widget类型 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param defaultBgColorId 默认背景颜色ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @return 新创建的WorkingNote实例 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, | 
			
		
	
		
			
				
					|  |  |  |  |                                               int widgetType, int defaultBgColorId) { | 
			
		
	
		
			
				
					|  |  |  |  |         WorkingNote note = new WorkingNote(context, folderId); | 
			
		
	
		
			
				
					|  |  |  |  |         note.setBgColorId(defaultBgColorId); | 
			
		
	
		
			
				
					|  |  |  |  |         note.setWidgetId(widgetId); | 
			
		
	
		
			
				
					|  |  |  |  |         note.setWidgetType(widgetType); | 
			
		
	
		
			
				
					|  |  |  |  |         return note; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 加载现有笔记的工厂方法 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param context 应用上下文 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param id 笔记ID | 
			
		
	
		
			
				
					|  |  |  |  |      * @return 加载的WorkingNote实例 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public static WorkingNote load(Context context, long id) { | 
			
		
	
		
			
				
					|  |  |  |  |         return new WorkingNote(context, id, 0); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 保存笔记到数据库 | 
			
		
	
		
			
				
					|  |  |  |  |      * @return 保存结果 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public synchronized boolean saveNote() { | 
			
		
	
		
			
				
					|  |  |  |  |         if (isWorthSaving()) { // 判断是否需要保存
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (!existInDatabase()) { // 新建笔记场景
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                     Log.e(TAG, "Create new note fail with id:" + mNoteId); | 
			
		
	
		
			
				
					|  |  |  |  |                     return false; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.syncNote(mContext, mNoteId); // 同步笔记数据
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             /** | 
			
		
	
		
			
				
					|  |  |  |  |              * 如果存在关联的Widget,则通知更新 | 
			
		
	
		
			
				
					|  |  |  |  |              */ | 
			
		
	
		
			
				
					|  |  |  |  |             if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID | 
			
		
	
		
			
				
					|  |  |  |  |                     && mWidgetType != Notes.TYPE_WIDGET_INVALIDE | 
			
		
	
		
			
				
					|  |  |  |  |                     && mNoteSettingStatusListener != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mNoteSettingStatusListener.onWidgetChanged(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 判断笔记是否已存在于数据库 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean existInDatabase() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteId > 0; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 判断是否值得保存(避免无效保存) | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     private boolean isWorthSaving() { | 
			
		
	
		
			
				
					|  |  |  |  |         if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) | 
			
		
	
		
			
				
					|  |  |  |  |                 || (existInDatabase() && !mNote.isLocalModified())) { | 
			
		
	
		
			
				
					|  |  |  |  |             return false; | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |             return true; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 设置笔记设置变更监听器 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNoteSettingStatusListener = l; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 设置提醒时间 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param date 提醒时间戳 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param set 是否设置提醒 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public void setAlertDate(long date, boolean set) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (date != mAlertDate) { | 
			
		
	
		
			
				
					|  |  |  |  |             mAlertDate = date; | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         // 通知监听器提醒时间已变更
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (mNoteSettingStatusListener != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteSettingStatusListener.onClockAlertChanged(date, set); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 以下为各种属性的设置方法(带变更检测和通知)
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void markDeleted(boolean mark) { | 
			
		
	
		
			
				
					|  |  |  |  |         mIsDeleted = mark; | 
			
		
	
		
			
				
					|  |  |  |  |         if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID | 
			
		
	
		
			
				
					|  |  |  |  |                 && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { | 
			
		
	
		
			
				
					|  |  |  |  |             mNoteSettingStatusListener.onWidgetChanged(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setBgColorId(int id) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (id != mBgColorId) { | 
			
		
	
		
			
				
					|  |  |  |  |             mBgColorId = id; | 
			
		
	
		
			
				
					|  |  |  |  |             if (mNoteSettingStatusListener != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mNoteSettingStatusListener.onBackgroundColorChanged(); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setCheckListMode(int mode) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (mMode != mode) { | 
			
		
	
		
			
				
					|  |  |  |  |             if (mNoteSettingStatusListener != null) { | 
			
		
	
		
			
				
					|  |  |  |  |                 mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             mMode = mode; | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setWidgetType(int type) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (type != mWidgetType) { | 
			
		
	
		
			
				
					|  |  |  |  |             mWidgetType = type; | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setWidgetId(int id) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (id != mWidgetId) { | 
			
		
	
		
			
				
					|  |  |  |  |             mWidgetId = id; | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public void setWorkingText(String text) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (!TextUtils.equals(mContent, text)) { | 
			
		
	
		
			
				
					|  |  |  |  |             mContent = text; | 
			
		
	
		
			
				
					|  |  |  |  |             mNote.setTextData(DataColumns.CONTENT, mContent); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 将文本笔记转换为通话笔记 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param phoneNumber 电话号码 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param callDate 通话时间 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public void convertToCallNote(String phoneNumber, long callDate) { | 
			
		
	
		
			
				
					|  |  |  |  |         mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); | 
			
		
	
		
			
				
					|  |  |  |  |         mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); | 
			
		
	
		
			
				
					|  |  |  |  |         // 更改所属文件夹为通话记录文件夹
 | 
			
		
	
		
			
				
					|  |  |  |  |         mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // 以下为各种属性的获取方法
 | 
			
		
	
		
			
				
					|  |  |  |  |     public boolean hasClockAlert() { | 
			
		
	
		
			
				
					|  |  |  |  |         return (mAlertDate > 0 ? true : false); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public String getContent() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mContent; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getAlertDate() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mAlertDate; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getModifiedDate() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mModifiedDate; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getBgColorResId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return NoteBgResources.getNoteBgResource(mBgColorId); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getBgColorId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mBgColorId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getTitleBgResId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return NoteBgResources.getNoteTitleBgResource(mBgColorId); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getCheckListMode() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mMode; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getNoteId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mNoteId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public long getFolderId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mFolderId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getWidgetId() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mWidgetId; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     public int getWidgetType() { | 
			
		
	
		
			
				
					|  |  |  |  |         return mWidgetType; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 笔记设置变更监听器接口 | 
			
		
	
		
			
				
					|  |  |  |  |      * 定义笔记属性变更时的回调方法 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     public interface NoteSettingChangedListener { | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 背景颜色变更时回调 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         void onBackgroundColorChanged(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 提醒时间变更时回调 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         void onClockAlertChanged(long date, boolean set); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * Widget状态变更时回调 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         void onWidgetChanged(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * 待办清单模式变更时回调 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         void onCheckListModeChanged(int oldMode, int newMode); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } |