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.
java/ui/NoteItemData.java

326 lines
9.0 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.

package net.micode.notes.ui;
import android.content.Context;
import android.database.Cursor;
import android.text.TextUtils;
import net.micode.notes.data.Contact;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.tool.DataUtils;
/**
* 用于处理笔记数据的一个数据类。
*/
public class NoteItemData {
// 定义要投影的字段
static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE,
NoteColumns.BG_COLOR_ID,
NoteColumns.CREATED_DATE,
NoteColumns.HAS_ATTACHMENT,
NoteColumns.MODIFIED_DATE,
NoteColumns.NOTES_COUNT,
NoteColumns.PARENT_ID,
NoteColumns.SNIPPET,
NoteColumns.TYPE,
NoteColumns.WIDGET_ID,
NoteColumns.WIDGET_TYPE,
};
// 定义每个字段在Cursor中的索引
private static final int ID_COLUMN = 0;
private static final int ALERTED_DATE_COLUMN = 1;
private static final int BG_COLOR_ID_COLUMN = 2;
private static final int CREATED_DATE_COLUMN = 3;
private static final int HAS_ATTACHMENT_COLUMN = 4;
private static final int MODIFIED_DATE_COLUMN = 5;
private static final int NOTES_COUNT_COLUMN = 6;
private static final int PARENT_ID_COLUMN = 7;
private static final int SNIPPET_COLUMN = 8;
private static final int TYPE_COLUMN = 9;
private static final int WIDGET_ID_COLUMN = 10;
private static final int WIDGET_TYPE_COLUMN = 11;
// 成员变量,对应数据库中的字段
private long mId; // 笔记的ID
private long mAlertDate; // 提醒日期
private int mBgColorId; // 背景颜色ID
private long mCreatedDate; // 创建日期
private boolean mHasAttachment; // 是否有附件
private long mModifiedDate; // 修改日期
private int mNotesCount; // 笔记数量
private long mParentId; // 父ID
private String mSnippet; // 笔记摘要
private int mType; // 笔记类型
private int mWidgetId; // 小部件ID
private int mWidgetType; // 小部件类型
private String mName; // 联系人名称
private String mPhoneNumber; // 联系电话号码
// 用于表示某些特定的位置信息
private boolean mIsLastItem; // 是否是最后一项
private boolean mIsFirstItem; // 是否是第一项
private boolean mIsOnlyOneItem; // 是否只有一项
private boolean mIsOneNoteFollowingFolder; // 是否是一篇笔记跟随一个文件夹
private boolean mIsMultiNotesFollowingFolder; // 是否有多篇笔记跟随一个文件夹
/**
* 使用给定的Context和Cursor来构造NoteItemData对象。
* @param context 应用的Context对象
* @param cursor 数据库Cursor对象
*/
public NoteItemData(Context context, Cursor cursor) {
// 从Cursor中获取数据
mId = cursor.getLong(ID_COLUMN);
mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN);
mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);
mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN);
mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false;
mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN);
mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);
mParentId = cursor.getLong(PARENT_ID_COLUMN);
mSnippet = cursor.getString(SNIPPET_COLUMN);
// 清理摘要中的标签
mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace(
NoteEditActivity.TAG_UNCHECKED, "");
mType = cursor.getInt(TYPE_COLUMN);
mWidgetId = cursor.getInt(WIDGET_ID_COLUMN);
mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN);
// 初始化联系人和电话号码
mPhoneNumber = "";
if (mParentId == Notes.ID_CALL_RECORD_FOLDER) {
// 获取联系人的电话号码
mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId);
// 如果电话号码不为空,尝试获取联系人的名称
if (!TextUtils.isEmpty(mPhoneNumber)) {
mName = Contact.getContact(context, mPhoneNumber);
// 如果获取名称失败,使用电话号码作为名称
if (mName == null) {
mName = mPhoneNumber;
}
}
}
// 如果名称不为空,则使用它,否则使用空字符串
if (mName == null) {
mName = "";
}
// 检查位置信息
checkPostion(cursor);
}
/**
* 检查Cursor的位置信息例如是否是最后一项是否是第一项等。
* @param cursor 数据库Cursor对象
*/
private void checkPostion(Cursor cursor) {
mIsLastItem = cursor.isLast() ? true : false;
mIsFirstItem = cursor.isFirst() ? true : false;
mIsOnlyOneItem = (cursor.getCount() == 1);
mIsMultiNotesFollowingFolder = false;
mIsOneNoteFollowingFolder = false;
// 如果是笔记类型,并且不是第一项,则检查前一项的类型
if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {
int position = cursor.getPosition();
// 如果可以移动到前一项,则检查前一项的类型
if (cursor.moveToPrevious()) {
// 如果前一项是文件夹或者系统类型,则根据情况设置标志位
if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER
|| cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {
// 如果文件夹或者系统类型的项后还有其他项,则设置为多笔记跟随文件夹
if (cursor.getCount() > (position + 1)) {
mIsMultiNotesFollowingFolder = true;
} else {
// 否则设置为单笔记跟随文件夹
mIsOneNoteFollowingFolder = true;
}
}
// 如果不能移动回原来的位置,则抛出异常
if (!cursor.moveToNext()) {
throw new IllegalStateException("cursor move to previous but can't move back");
}
}
}
}
}
/**
* 获取是否只有一篇笔记跟随一个文件夹的标志位。
* @return 如果是单笔记跟随文件夹返回true否则返回false。
*/
public boolean isOneFollowingFolder() {
return mIsOneNoteFollowingFolder;
}
/**
* 获取是否有多篇笔记跟随一个文件夹的标志位。
* @return 如果是多笔记跟随文件夹返回true否则返回false。
*/
public boolean isMultiFollowingFolder() {
return mIsMultiNotesFollowingFolder;
}
/**
* 获取是否是最后一项的标志位。
* @return 如果是最后一项返回true否则返回false。
*/
public boolean isLast() {
return mIsLastItem;
}
/**
* 获取与该笔记关联的联系人名称。
* @return 联系人名称,如果未关联联系人,返回空字符串。
*/
public String getCallName() {
return mName;
}
/**
* 获取是否是第一项的标志位。
* @return 如果是第一项返回true否则返回false。
*/
public boolean isFirst() {
return mIsFirstItem;
}
/**
* 获取是否只有一项的标志位。
* @return 如果是唯一一项返回true否则返回false。
*/
public boolean isSingle() {
return mIsOnlyOneItem;
}
/**
* 获取笔记的ID。
* @return 笔记ID。
*/
public long getId() {
return mId;
}
/**
* 获取笔记的提醒日期。
* @return 提醒日期。
*/
public long getAlertDate() {
return mAlertDate;
}
/**
* 获取笔记的创建日期。
* @return 创建日期。
*/
public long getCreatedDate() {
return mCreatedDate;
}
/**
* 检查笔记是否包含附件。
* @return 包含附件返回true否则返回false。
*/
public boolean hasAttachment() {
return mHasAttachment;
}
/**
* 获取笔记的修改日期。
* @return 修改日期。
*/
public long getModifiedDate() {
return mModifiedDate;
}
/**
* 获取笔记的背景颜色ID。
* @return 背景颜色ID。
*/
public int getBgColorId() {
return mBgColorId;
}
/**
* 获取笔记的父ID即其所属文件夹的ID。
* @return 父ID。
*/
public long getParentId() {
return mParentId;
}
/**
* 获取笔记的数量。
* @return 笔记数量。
*/
public int getNotesCount() {
return mNotesCount;
}
/**
* 获取笔记的父ID即其所属文件夹的ID与getParentId相同。
* @return 父ID。
*/
public long getFolderId() {
return mParentId;
}
/**
* 获取笔记的类型。
* @return 笔记类型。
*/
public int getType() {
return mType;
}
/**
* 获取小部件的类型。
* @return 小部件类型。
*/
public int getWidgetType() {
return mWidgetType;
}
/**
* 获取小部件的ID。
* @return 小部件ID。
*/
public int getWidgetId() {
return mWidgetId;
}
/**
* 获取笔记的摘要。
* @return 笔记摘要。
*/
public String getSnippet() {
return mSnippet;
}
/**
* 检查笔记是否有提醒设置。
* @return 如果有提醒设置返回true否则返回false。
*/
public boolean hasAlert() {
return (mAlertDate > 0);
}
/**
* 检查笔记是否是通话记录。
* @return 如果笔记是通话记录返回true否则返回false。
*/
public boolean isCallRecord() {
return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber));
}
/**
* 从Cursor中获取笔记的类型。
* @param cursor 包含笔记信息的Cursor对象。
* @return 笔记类型。
*/
public static int getNoteType(Cursor cursor) {
return cursor.getInt(TYPE_COLUMN);
}