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

346 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.

/**
* 版权声明说明该代码是由MiCode开源社区编写并在Apache License 2.0下授权。
* 该许可证允许用户在遵守条款的前提下使用、复制、分发和修改该文件。
*/
/*
* 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类用于封装从数据库查询到的笔记项数据。
*/
public class NoteItemData {
// 数据库查询时需要的列名数组
static final String [] PROJECTION = new String [] {
NoteColumns.ID, // 笔记项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, // 笔记项关联的Widget ID
NoteColumns.WIDGET_TYPE, // 笔记项关联的Widget类型
};
// 列索引,用于快速访问游标中的数据
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;
// 笔记项的属性与PROJECTION数组中的列对应
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; // 笔记项关联的Widget ID
private int mWidgetType; // 笔记项关联的Widget类型
private String mName; // 与笔记项关联的联系人姓名
private String mPhoneNumber; // 与笔记项关联的电话号码
// 用于标记笔记项在列表中的位置
private boolean mIsLastItem; // 是否是最后一项
private boolean mIsFirstItem; // 是否是第一项
private boolean mIsOnlyOneItem; // 是否仅有一个笔记项
private boolean mIsOneNoteFollowingFolder; // 是否有一个笔记项跟在文件夹后面
private boolean mIsMultiNotesFollowingFolder; // 是否有多个笔记项跟在文件夹后面
/**
* 构造函数从Cursor中获取数据并初始化NoteItemData对象。
* @param context 上下文对象,用于访问应用程序的资源和类
* @param cursor 数据库查询结果的游标,包含笔记项的数据
*/
public NoteItemData(Context context, 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的值
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);
// 如果笔记项的父ID是通话记录文件夹的ID则尝试获取关联的电话号码和联系人姓名
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 数据库查询结果的游标
*/
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");
}
}
}
}
// 下面是一系列getter方法用于获取笔记项的属性值。
/**
* 判断是否有一个笔记项跟在文件夹后面。
* @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通常指向文件夹。
* @return 返回笔记项的父ID。
*/
public long getParentId() {
return mParentId;
}
/**
* 获取笔记项中的笔记数量。
* @return 返回笔记项中的笔记数量。
*/
public int getNotesCount() {
return mNotesCount;
}
/**
* 获取笔记项的文件夹ID。
* 由于笔记项的父ID通常指向文件夹因此这里返回父ID。
* @return 返回笔记项的文件夹ID。
*/
public long getFolderId() {
return mParentId;
}
/**
* 获取笔记项的类型。
* @return 返回笔记项的类型。
*/
public int getType() {
return mType;
}
/**
* 获取笔记项关联的Widget类型。
* @return 返回笔记项关联的Widget类型。
*/
public int getWidgetType() {
return mWidgetType;
}
/**
* 获取笔记项关联的Widget ID。
* @return 返回笔记项关联的Widget 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));
}
/**
* 从游标中获取笔记项的类型。
* @param cursor 数据库查询结果的游标。
* @return 返回游标指向的笔记项的类型。
*/
public static int getNoteType(Cursor cursor) {
return cursor.getInt(TYPE_COLUMN);
}
}