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

331 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对象用于处理笔记更底层的数据操作如保存、修改等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;
// 桌面小部件的类型可能有不同的类型区分具体由Notes类中定义
private int mWidgetType;
// 笔记所属文件夹的ID用于在文件夹结构中定位笔记
private long mFolderId;
// 上下文对象用于获取如ContentResolver等系统资源进行数据库操作等
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,
NoteColumns.ALERTED_DATE,
NoteColumns.BG_COLOR_ID,
NoteColumns.WIDGET_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数组中模式列的索引可能用于获取笔记特定的模式相关数据
private static final int DATA_MODE_COLUMN = 3;
// 对应NOTE_PROJECTION数组中父文件夹ID列的索引用于获取笔记所属文件夹的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列的索引用于获取关联的小部件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;
// 创建一个新的空白笔记的构造函数(用于创建新笔记场景)
// @param context 上下文对象,用于后续的资源获取及数据库操作等
// @param folderId 新笔记所属的文件夹ID确定笔记在文件夹结构中的位置
private WorkingNote(Context context, long folderId) {
mContext = context;
// 初始化提醒日期为0表示未设置提醒时间
mAlertDate = 0;
// 设置修改日期为当前系统时间,即创建时的时间作为初始修改时间
mModifiedDate = System.currentTimeMillis();
mFolderId = folderId;
// 创建一个Note对象用于处理笔记底层的数据操作
mNote = new Note();
// 新笔记初始ID设为0待后续保存成功获取到实际ID
mNoteId = 0;
mIsDeleted = false;
mMode = 0;
// 初始小部件类型设为无效类型可能在Notes类中有对应定义
mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
}
// 通过已有笔记ID加载笔记的构造函数用于打开已存在笔记的场景
// @param context 上下文对象,用于后续的资源获取及数据库操作等
// @param noteId 要加载的笔记的ID
// @param folderId 笔记所属的文件夹ID确定笔记在文件夹结构中的位置此处folderId参数可能在某些情况下有特殊用途当前代码未完全体现
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对应的笔记基本信息使用NOTE_PROJECTION指定要获取的列
Cursor cursor = mContext.getContentResolver().query(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null,
null, null);
if (cursor!= null) {
// 如果查询结果游标有数据移动到第一条记录通常只有一条对应这个笔记ID的记录
if (cursor.moveToFirst()) {
// 从游标中获取笔记所属文件夹ID
mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);
// 获取笔记的背景颜色ID
mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN);
// 获取关联的小部件ID
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 {
// 如果查询结果为空记录错误日志并抛出异常表示找不到对应ID的笔记
Log.e(TAG, "No note with id:" + mNoteId);
throw new IllegalArgumentException("Unable to find note with id " + mNoteId);
}
// 加载笔记的数据内容(如文本内容等)
loadNoteData();
}
// 从数据库加载笔记的数据内容(根据数据类型分别处理文本、通话等不同类型的数据)
private void loadNoteData() {
// 通过ContentResolver查询指定笔记ID对应的笔记数据内容使用DATA_PROJECTION指定要获取的列
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 {
// 获取数据的MIME类型用于判断数据是哪种类型文本、通话等
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 {
// 如果查询结果为空记录错误日志并抛出异常表示找不到对应ID笔记的数据
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 关联的小部件ID如果有的话初始设置小部件相关信息
// @param widgetType 小部件的类型,如果有的话(初始设置小部件相关信息)
// @param defaultBgColorId 默认的背景颜色ID用于设置笔记的初始背景颜色
// @return 返回创建好的空笔记对象
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加载已存在的笔记对象
// @param context 上下文对象,用于后续的资源获取及操作
// @param id 要加载的笔记的ID
// @return 返回加载好的笔记对象
public static WorkingNote load(Context context, long id) {
return new WorkingNote(context, id, 0);
}
// 同步保存笔记到数据库等存储(如果笔记有值得保存的修改内容)
// @return 如果保存成功返回true否则返回false
public synchronized boolean saveNote() {
if (isWorthSaving()) {
if (!existInDatabase()) {
// 如果笔记不存在于数据库中尝试创建新笔记并获取新笔记的ID
if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {
Log.e(TAG, "Create new note fail with id:" + mNoteId);
return false;
}
}
// 调用Note对象的方法同步保存笔记数据到存储可能是数据库等
mNote.syncNote(mContext, mNoteId);
/**
* 如果存在与该笔记关联的小部件,并且小部件相关信息有效,同时设置了笔记设置变更监听器,
* 则触发小部件变更的监听器方法,用于更新小部件显示内容等操作。
*/
if (mWidgetId!= AppWidgetManager.INVALID_APPWIDGET_ID
&& mWidgetType!= Notes.TYPE_WIDGET_INVALIDE
&& mNoteSettingStatusListener!= null) {
mNoteSettingStatusListener.onWidgetChanged();
}
return true;
} else {
return false;
}
}
// 判断笔记是否已存在于数据库中通过笔记ID是否大于0来判断
// @return 如果笔记ID大于0表示存在于数据库中返回true否则返回false
public boolean existInDatabase() {
return mNoteId > 0;
}
// 判断笔记是否有值得保存的修改内容(比如是否被删除、新建笔记时内容是否为空、已存在笔记是否有本地修改等情况)
// @return 如果有值得保存的修改内容返回true否则返回false
private boolean isWorthSaving() {
if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent))
|| (existInDatabase() &&!mNote.isLocalModified())) {
return false;
} else {
return true;
}
}
// 设置笔记设置变更监听器,用于监听笔记相关设置变化情况
// @param l 实现了NoteSettingChangedListener接口的监听器对象
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);
}
}
// 标记笔记是否已删除,并根据删除状态和小部件相关情况触发小部件变更的监听器方法(如果设置了监听器)
// @param mark 布尔值true表示标记为已删除false表示未删除
public void markDeleted(boolean mark) {
mIsDeleted = mark;
if (mWidgetId!= AppWidgetManager.INVALID_APPWIDGET_ID
&& mWidgetType!= Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener!= null) {
mNoteSettingStatusListener.onWidgetChanged();
}
}
// 设置笔记的背景颜色ID并根据颜色ID变化触发相应的监听器方法如果设置了监听器
// @param id 要设置的背景颜色的ID
public void setBgColorId(int id) {
if (id!= mBgColorId) {
mBgColorId = id;
if (mNoteSettingStatusListener!= null) {
mNoteSettingStatusListener.onBackgroundColorChanged();
}
mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id));
}
}
// 设置笔记的检查列表模式(可能对应某种编辑模式),并根据模式变化触发相应的监听器方法(如果设置了监听器)
// @param mode 要设置的检查列表模式值
public void setCheckListMode(int mode) {
if (mMode!= mode) {
if (mNoteSettingStatusListener!= null) {
mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode);
}