You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
text123/WorkingNote.java

451 lines
17 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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;
// WorkingNote类用于管理工作笔记的相关信息和操作
public class WorkingNote {
// 表示工作笔记的Note对象
private Note mNote;
// 笔记的ID
private long mNoteId;
// 笔记的内容
private String mContent;
// 笔记的模式
private int mMode;
// 提醒日期
private long mAlertDate;
// 最后修改日期
private long mModifiedDate;
// 背景颜色ID
private int mBgColorId;
// 小部件ID
private int mWidgetId;
// 小部件类型
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, // 数据ID
DataColumns.CONTENT, // 数据内容
DataColumns.MIME_TYPE, // 数据的MIME类型
DataColumns.DATA1, // 自定义数据1
DataColumns.DATA2, // 自定义数据2
DataColumns.DATA3, // 自定义数据3
DataColumns.DATA4 // 自定义数据4
};
// 定义用于查询笔记的列投影
public static final String[] NOTE_PROJECTION = new String[] {
NoteColumns.PARENT_ID, // 父文件夹ID
NoteColumns.ALERTED_DATE, // 提醒日期
NoteColumns.BG_COLOR_ID, // 背景颜色ID
NoteColumns.WIDGET_ID, // 小部件ID
NoteColumns.WIDGET_TYPE, // 小部件类型
NoteColumns.MODIFIED_DATE // 修改日期
};
// 定义DATA_PROJECTION中数据ID列的索引
private static final int DATA_ID_COLUMN = 0;
// 定义DATA_PROJECTION中数据内容列的索引
private static final int DATA_CONTENT_COLUMN = 1;
// 定义DATA_PROJECTION中数据MIME类型列的索引
private static final int DATA_MIME_TYPE_COLUMN = 2;
// 定义DATA_PROJECTION中数据模式列假设DATA1表示模式的索引
private static final int DATA_MODE_COLUMN = 3;
// 定义NOTE_PROJECTION中父文件夹ID列的索引
private static final int NOTE_PARENT_ID_COLUMN = 0;
// 定义NOTE_PROJECTION中提醒日期列的索引
private static final int NOTE_ALERTED_DATE_COLUMN = 1;
// 定义NOTE_PROJECTION中背景颜色ID列的索引
private static final int NOTE_BG_COLOR_ID_COLUMN = 2;
// 定义NOTE_PROJECTION中小部件ID列的索引
private static final int NOTE_WIDGET_ID_COLUMN = 3;
// 定义NOTE_PROJECTION中小部件类型列的索引
private static final int NOTE_WIDGET_TYPE_COLUMN = 4;
// 定义NOTE_PROJECTION中修改日期列的索引
private static final int NOTE_MODIFIED_DATE_COLUMN = 5;
// 新建笔记的构造函数
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;
}
// 加载已有笔记的构造函数
private WorkingNote(Context context, long noteId, long folderId) {
mContext = context;
mNoteId = noteId;
mFolderId = folderId;
mIsDeleted = false;
mNote = new Note();
loadNote(); // 调用加载笔记的方法
}
// 加载笔记的详细信息,包括所属文件夹、背景颜色、小部件等相关属性
private void loadNote() {
// 通过内容解析器查询指定笔记ID的笔记信息
Cursor cursor = mContext.getContentResolver().query(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), // 查询的URI根据笔记ID构建
NOTE_PROJECTION, // 要查询的列投影
null, // 选择条件这里为null表示查询所有记录
null, // 选择参数这里为null
null); // 排序顺序这里为null
if (cursor!= null) { // 如果查询到结果
if (cursor.moveToFirst()) { // 将游标移动到结果集的第一条记录
// 从游标中获取并设置相应的属性值
mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); // 获取父文件夹ID
mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); // 获取背景颜色ID
mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); // 获取小部件ID
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() {
// 通过内容解析器查询与指定笔记ID相关的数据
Cursor cursor = mContext.getContentResolver().query(
Notes.CONTENT_DATA_URI, // 查询的URI
DATA_PROJECTION, // 要查询的列投影
DataColumns.NOTE_ID + "=?", // 选择条件查询指定笔记ID的数据
new String[] { String.valueOf(mNoteId) }, // 选择参数即要查询的笔记ID
null); // 排序顺序这里为null
if (cursor!= null) { // 如果查询到结果
if (cursor.moveToFirst()) { // 将游标移动到结果集的第一条记录
do {
String type = cursor.getString(DATA_MIME_TYPE_COLUMN); // 获取数据的MIME类型
if (DataConstants.NOTE.equals(type)) { // 如果是普通笔记类型
mContent = cursor.getString(DATA_CONTENT_COLUMN); // 获取笔记内容
mMode = cursor.getInt(DATA_MODE_COLUMN); // 获取笔记模式
mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); // 设置笔记的文本数据ID
} else if (DataConstants.CALL_NOTE.equals(type)) { // 如果是通话笔记类型
mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); // 设置笔记的通话数据ID
} 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); // 抛出异常
}
}
// 创建一个空的工作笔记
public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId,
int widgetType, int defaultBgColorId) {
WorkingNote note = new WorkingNote(context, folderId); // 创建一个新的工作笔记对象
note.setBgColorId(defaultBgColorId); // 设置默认背景颜色ID
note.setWidgetId(widgetId); // 设置小部件ID
note.setWidgetType(widgetType); // 设置小部件类型
return note; // 返回创建好的空笔记对象
}
// 加载指定ID的工作笔记
public static WorkingNote load(Context context, long id) {
return new WorkingNote(context, id, 0); // 创建并返回一个加载指定ID笔记的工作笔记对象
}
// 保存笔记的方法,该方法是线程安全的
public synchronized boolean saveNote() {
if (isWorthSaving()) { // 如果笔记值得保存isWorthSaving方法需自行实现判断逻辑
if (!existInDatabase()) { // 如果笔记不存在于数据库中
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { // 创建新的笔记ID
Log.e(TAG, "Create new note fail with id:" + mNoteId); // 记录错误日志
return false; // 创建失败返回false
}
}
mNote.syncNote(mContext, mNoteId); // 同步笔记到数据库
/**
* 如果存在与该笔记相关的小部件,更新小部件内容
*/
if (mWidgetId!= AppWidgetManager.INVALID_APPWIDGET_ID // 小部件ID有效
&& mWidgetType!= Notes.TYPE_WIDGET_INVALIDE // 小部件类型有效
&& mNoteSettingStatusListener!= null) { // 监听器不为空
mNoteSettingStatusListener.onWidgetChanged(); // 通知监听器小部件已改变
}
return true; // 保存成功返回true
} else {
return false; // 不值得保存返回false
}
}
// 判断当前笔记是否存在于数据库中
public boolean existInDatabase() {
// 通过判断笔记ID是否大于0来确定笔记是否存在于数据库
// 这里假设大于0的笔记ID表示该笔记已在数据库中存在
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
mNoteSettingStatusListener = l;
}
// 设置提醒日期
public void setAlertDate(long date, boolean set) {
// 如果传入的日期与当前的提醒日期不同
if (date!= mAlertDate) {
// 更新提醒日期
mAlertDate = date;
// 通过Note对象设置提醒日期的值
mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate));
}
// 如果设置了笔记设置状态改变监听器
if (mNoteSettingStatusListener!= null) {
// 通知监听器提醒日期已改变
mNoteSettingStatusListener.onClockAlertChanged(date, set);
}
}
// 标记笔记为已删除或取消删除标记
public void markDeleted(boolean mark) {
// 更新删除标记
mIsDeleted = mark;
// 如果小部件ID有效小部件类型有效且设置了笔记设置状态改变监听器
if (mWidgetId!= AppWidgetManager.INVALID_APPWIDGET_ID
&& mWidgetType!= Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener!= null) {
// 通知监听器小部件状态已改变
mNoteSettingStatusListener.onWidgetChanged();
}
}
// 设置笔记的背景颜色ID
public void setBgColorId(int id) {
// 如果传入的背景颜色ID与当前的背景颜色ID不同
if (id!= mBgColorId) {
// 更新背景颜色ID
mBgColorId = id;
// 如果设置了笔记设置状态改变监听器
if (mNoteSettingStatusListener!= null) {
// 通知监听器背景颜色已改变
mNoteSettingStatusListener.onBackgroundColorChanged();
}
// 通过Note对象设置背景颜色ID的值
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;
// 通过Note对象设置文本数据中的清单模式
mNote.setTextData(TextNote.MODE, String.valueOf(mMode));
}
}
// 设置小部件类型
public void setWidgetType(int type) {
// 如果当前小部件类型与传入的类型不同
if (type!= mWidgetType) {
// 更新小部件类型
mWidgetType = type;
// 通过Note对象设置笔记的小部件类型值
mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType));
}
}
// 设置小部件ID
public void setWidgetId(int id) {
// 如果当前小部件ID与传入的ID不同
if (id!= mWidgetId) {
// 更新小部件ID
mWidgetId = id;
// 通过Note对象设置笔记的小部件ID值
mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId));
}
}
// 设置工作笔记的文本内容
public void setWorkingText(String text) {
// 如果当前内容与传入的文本不相等
if (!TextUtils.equals(mContent, text)) {
// 更新笔记内容
mContent = text;
// 通过Note对象设置文本数据中的内容
mNote.setTextData(DataColumns.CONTENT, mContent);
}
}
// 将笔记转换为通话笔记
public void convertToCallNote(String phoneNumber, long callDate) {
// 通过Note对象设置通话笔记的通话日期
mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));
// 通过Note对象设置通话笔记的电话号码
mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);
// 通过Note对象设置笔记的父文件夹ID为通话记录文件夹的ID
mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER));
}
// 判断笔记是否有闹钟提醒
public boolean hasClockAlert() {
// 如果提醒日期大于0则表示有闹钟提醒返回true否则返回false
return (mAlertDate > 0? true : false);
}
// 获取笔记的内容
public String getContent() {
return mContent;
}
// 获取笔记的提醒日期
public long getAlertDate() {
return mAlertDate;
}
// 获取笔记的最后修改日期
public long getModifiedDate() {
return mModifiedDate;
}
// 获取对应背景颜色ID的资源ID
public int getBgColorResId() {
// 通过NoteBgResources工具类获取背景颜色资源ID
return NoteBgResources.getNoteBgResource(mBgColorId);
}
// 获取背景颜色ID
public int getBgColorId() {
return mBgColorId;
}
// 获取对应背景颜色ID的标题背景资源ID
public int getTitleBgResId() {
// 通过NoteBgResources工具类获取标题背景颜色资源ID
return NoteBgResources.getNoteTitleBgResource(mBgColorId);
}
// 获取清单模式
public int getCheckListMode() {
return mMode;
}
// 获取笔记ID
public long getNoteId() {
return mNoteId;
}
// 获取所属文件夹ID
public long getFolderId() {
return mFolderId;
}
// 获取小部件ID
public int getWidgetId() {
return mWidgetId;
}
// 获取小部件类型
public int getWidgetType() {
return mWidgetType;
}
// 定义一个接口,用于监听笔记设置的变化
public interface NoteSettingChangedListener {
/**
* 当当前笔记的背景颜色刚刚改变时调用此方法。
* 此方法由实现该接口的类来具体实现,用于处理背景颜色改变的相关逻辑。
*/
void onBackgroundColorChanged();
/**
* 当用户设置闹钟时调用此方法。
*
* @param date 设置的闹钟日期(或时间戳)
* @param set 表示是否设置了闹钟true 表示设置false 表示取消设置
*/
void onClockAlertChanged(long date, boolean set);
/**
* 当用户通过小部件创建笔记时调用此方法。
* 用于通知实现该接口的类执行与通过小部件创建笔记相关的操作。
*/
void onWidgetChanged();
/**
* 当用户在清单模式和普通模式之间切换时调用此方法。
*
* @param oldMode 切换前的旧模式
* @param newMode 切换后的新模式
*/
void onCheckListModeChanged(int oldMode, int newMode);
}