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.
note/WorkingNote.java

362 lines
14 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; // 导入Android的小部件管理器类
// 定义一个名为WorkingNote的公共类
public class WorkingNote {
// 定义一个Note类型的私有成员变量mNote用于存储笔记信息
private Note mNote;
// 定义一个长整型私有成员变量mNoteId用于存储笔记的ID
private long mNoteId;
// 定义一个字符串类型的私有成员变量mContent用于存储笔记的内容
private String mContent;
// 定义一个整型私有成员变量mMode用于存储笔记的模式
private int mMode;
// 定义一个长整型私有成员变量mAlertDate用于存储笔记的提醒日期
private long mAlertDate;
// 定义一个长整型私有成员变量mModifiedDate用于存储笔记的最后修改日期
private long mModifiedDate;
// 定义一个整型私有成员变量mBgColorId用于存储笔记的背景颜色ID
private int mBgColorId;
// 定义一个整型私有成员变量mWidgetId用于存储笔记关联的小部件ID
private int mWidgetId;
// 定义一个整型私有成员变量mWidgetType用于存储笔记关联的小部件类型
private int mWidgetType;
// 定义一个长整型私有成员变量mFolderId用于存储笔记所属的文件夹ID
private long mFolderId;
// 定义一个Context类型的私有成员变量mContext用于获取应用程序的上下文
private Context mContext;
// 定义一个静态的字符串常量TAG用于日志输出
private static final String TAG = "WorkingNote";
// 定义一个布尔型的私有成员变量mIsDeleted用于标记笔记是否被删除
private boolean mIsDeleted;
// 定义一个NoteSettingChangedListener类型的私有成员变量mNoteSettingStatusListener用于监听笔记设置变化
private NoteSettingChangedListener mNoteSettingStatusListener;
// 定义一个静态的字符串数组DATA_PROJECTION用于指定查询数据库时返回的列
public static final String[] DATA_PROJECTION = new String[] {
DataColumns.ID,
DataColumns.CONTENT,
DataColumns.MIME_TYPE,
DataColumns.DATA1,
DataColumns.DATA2,
DataColumns.DATA3,
DataColumns.DATA4,
};
// 定义一个静态的字符串数组NOTE_PROJECTION用于指定查询笔记数据库时返回的列
public static final String[] NOTE_PROJECTION = new String[] {
NoteColumns.PARENT_ID,
NoteColumns.ALERTED_DATE,
NoteColumns.BG_COLOR_ID,
NoteColumns.WIDGET_ID,
NoteColumns.WIDGET_TYPE,
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;
// 私有构造函数,用于创建新的笔记对象
private WorkingNote(Context context, long folderId) {
mContext = context;
mAlertDate = 0;
mModifiedDate = System.currentTimeMillis(); // 设置当前时间为最后修改时间
mFolderId = folderId;
mNote = new Note(); // 初始化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() {
// 使用ContentResolver查询数据库获取指定ID的笔记信息
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(); // 关闭Cursor
} 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);
// 设置笔记的ID
mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN));
}
// 如果是电话笔记类型
else if (DataConstants.CALL_NOTE.equals(type)) {
// 设置电话笔记的ID
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);
}
}
// 定义一个静态方法,用于创建一个空的笔记对象
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;
}
// 定义一个静态方法用于根据ID加载笔记对象
public static WorkingNote load(Context context, long id) {
return new WorkingNote(context, id, 0);
}
// 定义一个同步方法,用于保存笔记
public synchronized boolean saveNote() {
// 检查笔记是否值得保存
if (isWorthSaving()) {
// 如果笔记在数据库中不存在
if (!existInDatabase()) {
// 获取一个新的笔记ID
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {
// 如果获取ID失败记录错误日志并返回false
Log.e(TAG, "Create new note fail with id:" + mNoteId);
return false;
}
}
// 同步笔记数据到数据库
mNote.syncNote(mContext, mNoteId);
// 如果笔记关联了小部件,并且小部件有效,通知小部件内容已更改
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;
}
// 设置提醒日期
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();
}
}
// 设置笔记背景颜色ID
public void setBgColorId(int id) {
// 如果设置的ID与当前ID不同更新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));
}
}
// 设置小部件ID
public void setWidgetId(int id) {
// 如果设置的小部件ID与当前ID不同更新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);
}
}
// 将笔记转换为电话笔记
public void convertToCallNote(String phoneNumber, long callDate) {
// 设置电话笔记的日期和电话号码
mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));
mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);
// 设置电话笔记所属的文件夹ID为电话记录文件夹
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;
}
// 获取笔记背景颜色的资源ID
public int getBgColorResId() {
return NoteBgResources.getNoteBgResource(mBgColorId);
}
// 获取笔记背景颜色的ID
public int getBgColorId