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

360 lines
12 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.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;
/**
* NoteItemData 类用于封装从数据库查询得到的笔记项数据。
* 该类提供了从 Cursor 中提取笔记数据的功能,并提供了一系列方法来获取这些数据。
*/
public class NoteItemData {
// 定义从数据库查询笔记数据时使用的列名数组
static final String [] PROJECTION = new String [] {
NoteColumns.ID, // 笔记的唯一标识符
NoteColumns.ALERTED_DATE, // 提醒日期
NoteColumns.BG_COLOR_ID, // 背景颜色 ID
NoteColumns.CREATED_DATE, // 创建日期
NoteColumns.HAS_ATTACHMENT, // 是否有附件
NoteColumns.MODIFIED_DATE, // 修改日期
NoteColumns.NOTES_COUNT, // 笔记数量
NoteColumns.PARENT_ID, // 父文件夹 ID
NoteColumns.SNIPPET, // 笔记摘要
NoteColumns.TYPE, // 笔记类型
NoteColumns.WIDGET_ID, // 小部件 ID
NoteColumns.WIDGET_TYPE, // 小部件类型
};
// 定义每个列在 PROJECTION 数组中的索引,方便从 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; // 笔记的唯一标识符
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; // 是否是文件夹后面的多条笔记
/**
* 构造函数,从 Cursor 中提取笔记数据并初始化对象的属性。
*
* @param 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);
}
/**
* 检查笔记在列表中的位置,并设置相应的标志。
*
* @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;
}
}
// 将 Cursor 移动回原来的位置
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;
}
/**
* 获取笔记的唯一标识符。
*
* @return 笔记的唯一标识符
*/
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。
*
* @return 父文件夹 ID
*/
public long getParentId() {
return mParentId;
}
/**
* 获取笔记的数量。
*
* @return 笔记数量
*/
public int getNotesCount() {
return mNotesCount;
}
/**
* 获取笔记所在文件夹的 ID。
*
* @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);
}
}