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.

345 lines
11 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;
/**
* 便签项数据模型类
* 用于存储和管理便签列表项的所有数据
* 从数据库查询便签数据并封装为对象
* 提供便签属性的访问方法和位置信息判断
*/
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, // 小部件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; // 是否是文件夹后的多个便签之一
/**
* 构造函数
* 从数据库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表示是文件夹后的单个便签
*/
public boolean isOneFollowingFolder() {
return mIsOneNoteFollowingFolder;
}
/**
* 判断是否是文件夹后的多个便签之一
* @return true表示是文件夹后的多个便签之一
*/
public boolean isMultiFollowingFolder() {
return mIsMultiNotesFollowingFolder;
}
/**
* 判断是否是列表最后一项
* @return true表示是列表最后一项
*/
public boolean isLast() {
return mIsLastItem;
}
/**
* 获取通话记录的联系人名称
* @return 联系人名称或电话号码
*/
public String getCallName() {
return mName;
}
/**
* 判断是否是列表第一项
* @return true表示是列表第一项
*/
public boolean isFirst() {
return mIsFirstItem;
}
/**
* 判断是否是列表中唯一一项
* @return true表示是列表中唯一一项
*/
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表示有附件
*/
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相同
* @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表示设置了提醒
*/
public boolean hasAlert() {
return (mAlertDate > 0);
}
/**
* 判断是否是通话记录便签
* @return true表示是通话记录便签
*/
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);
}
}