/* * 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. */ // 包声明,表明该类所在的包名为net.micode.notes.ui 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 { // 定义查询数据库时使用的投影(即要查询的列),用于获取笔记相关的多个属性信息,这些列对应了笔记表中的各个字段, // 通过指定这些列,可以从数据库中获取需要的数据来构建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)中准确获取对应列的数据,每个常量对应着PROJECTION数组中列的顺序位置, // 通过这些索引可以清晰地从游标中提取出笔记的各个属性值,如ID、提醒日期、背景颜色ID等信息。 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; // 笔记的唯一标识符,从数据库游标中获取,用于区分不同的笔记记录,在后续对笔记进行各种操作(如查找、更新、删除等)时,可通过该ID来定位具体的笔记。 private long mId; // 笔记的提醒日期(以时间戳形式表示),从游标中获取,用于判断笔记是否设置了提醒以及何时提醒,方便在相关业务逻辑中根据提醒日期进行相应的提醒功能实现。 private long mAlertDate; // 笔记的背景颜色ID,从游标中获取,对应着笔记在展示时所使用的背景颜色资源标识,通过该ID可以设置笔记在界面上的背景颜色样式。 private int mBgColorId; // 笔记的创建日期(以时间戳形式表示),从游标中获取,可用于展示笔记的创建时间信息,例如在列表中显示笔记创建的先后顺序等情况。 private long mCreatedDate; // 用于标记笔记是否有附件,从游标中获取对应的数据并转换为布尔值,方便判断笔记是否关联了其他附件资源,如图片、文件等,以决定是否展示附件相关的提示或操作入口。 private boolean mHasAttachment; // 笔记的最后修改日期(以时间戳形式表示),从游标中获取,常用于展示笔记的更新情况,例如提示用户笔记最近一次修改的时间等,便于用户了解笔记的变动历史。 private long mModifiedDate; // 与笔记相关的数量信息(具体含义可能根据业务场景而定,也许是关联的子笔记数量等情况),从游标中获取,可用于一些统计或展示相关的逻辑处理,例如显示某个文件夹下笔记的总数等。 private int mNotesCount; // 笔记所属的父级ID(如所属文件夹的ID等),从游标中获取,用于构建笔记的层级关系,方便进行分类管理和展示,例如在文件夹视图中确定笔记归属的文件夹。 private long mParentId; // 笔记的摘要信息(通常是笔记内容的简短描述,可能是开头部分内容等),从游标中获取,并进行一些预处理(去除特定标记字符串)后存储, // 可用于在列表中简要展示笔记内容,让用户快速了解笔记大致情况。 private String mSnippet; // 笔记的类型标识,从游标中获取,用于区分不同类型的笔记(如普通笔记、系统笔记、文件夹等不同类型),根据类型可以进行不同的业务逻辑处理和展示方式。 private int mType; // 笔记关联的小部件ID(如果有的话),从游标中获取,用于处理笔记与桌面小部件之间的关联关系,例如更新小部件显示内容时根据该ID找到对应的笔记数据。 private int mWidgetId; // 笔记关联的小部件类型标识,从游标中获取,用于区分不同类型的小部件(可能对应不同的布局、功能等),以便在与小部件交互时进行相应的适配操作。 private int mWidgetType; // 通话记录相关笔记对应的联系人姓名,若笔记属于通话记录类型(根据父级ID判断),则通过相关工具方法尝试获取对应的联系人姓名,若获取不到则使用电话号码代替, // 用于在展示通话记录笔记时显示更友好的联系人信息,方便用户识别。 private String mName; // 通话记录相关笔记对应的电话号码,若笔记属于通话记录类型(根据父级ID判断),则通过相关工具方法尝试获取对应的电话号码,用于展示通话记录相关的关键信息以及后续可能的拨打电话等操作。 private String mPhoneNumber; // 用于标记该笔记数据对应的笔记是否是列表中的最后一项,通过游标判断是否处于最后位置来设置该标记,方便在列表展示等场景下进行边界判断和相关样式处理。 private boolean mIsLastItem; // 用于标记该笔记数据对应的笔记是否是列表中的第一项,通过游标判断是否处于第一位置来设置该标记,同样便于在列表展示等场景下进行边界判断和相关样式处理。 private boolean mIsFirstItem; // 用于标记该笔记数据对应的笔记是否是列表中唯一的一项,通过判断游标中的记录总数是否为1来设置该标记,可用于一些特殊的展示逻辑,例如只有一个笔记时的全屏展示等情况。 private boolean mIsOnlyOneItem; // 用于标记该笔记是否是某个文件夹下仅跟随的一个笔记,通过检查笔记类型以及前后位置关系等来判断,在列表展示和操作逻辑中可用于区分不同的排列情况。 private boolean mIsOneNoteFollowingFolder; // 用于标记该笔记是否是某个文件夹下跟随的多个笔记之一,通过检查笔记类型以及前后位置关系等来判断,同样有助于在列表展示和操作逻辑中对笔记的排列情况进行准确判断和处理。 private boolean mIsMultiNotesFollowingFolder; // 构造函数,用于创建NoteItemData实例,接收上下文(Context)和数据库游标(Cursor)作为参数, // 从游标中按照定义的列索引提取各项笔记数据,并进行一些必要的预处理和位置相关情况的判断,以初始化该实例的各个属性。 public NoteItemData(Context context, Cursor cursor) { // 从游标中获取笔记的ID,并赋值给对应的成员变量,作为该笔记的唯一标识。 mId = cursor.getLong(ID_COLUMN); // 从游标中获取笔记的提醒日期,并赋值给对应的成员变量,用于后续提醒相关的逻辑判断。 mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); // 从游标中获取笔记的背景颜色ID,并赋值给对应的成员变量,以便后续设置笔记的背景颜色样式。 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); // 从游标中获取笔记所属的父级ID,并赋值给对应的成员变量,用于构建笔记的层级关系。 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); // 从游标中获取笔记关联的小部件ID,并赋值给对应的成员变量,用于处理笔记与小部件之间的关联关系。 mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); // 从游标中获取笔记关联的小部件类型标识,并赋值给对应的成员变量,用于区分不同类型的小部件进行相应的适配操作。 mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); // 初始化电话号码为空字符串,后续根据笔记是否属于通话记录类型来尝试获取对应的电话号码信息。 mPhoneNumber = ""; // 判断如果笔记所属的父级ID是通话记录文件夹的ID(Notes.ID_CALL_RECORD_FOLDER),则尝试通过DataUtils工具类方法, // 根据笔记ID从内容解析器(getContentResolver)获取对应的电话号码信息,并赋值给mPhoneNumber成员变量。 if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); // 如果获取到的电话号码不为空(即成功获取到了电话号码),则通过Contact类的方法尝试获取对应的联系人姓名, // 如果获取到的联系人姓名为null(可能不存在对应的联系人记录等情况),则使用电话号码作为显示名称赋值给mName成员变量。 if (!TextUtils.isEmpty(mPhoneNumber)) { mName = Contact.getContact(context, mPhoneNumber); if (mName == null) { mName = mPhoneNumber; } } } // 如果最终获取到的联系人姓名仍为null(例如前面获取过程出现问题或者本身就没有对应联系人),则将姓名设置为空字符串,确保成员变量有合理的默认值。 if (mName == null) { mName = ""; } // 调用方法检查该笔记在列表中的位置相关情况,设置对应的位置标记成员变量,以便后续在列表展示等场景下进行相关判断和处理。 checkPostion(cursor); } // 私有方法,用于检查当前笔记在游标所代表的列表中的位置相关情况,通过游标提供的方法判断是否是第一、最后一项,以及是否是某个文件夹下的唯一笔记、 // 仅跟随一个笔记或者跟随多个笔记等情况,并设置相应的成员变量标记,方便在其他方法中对外提供这些位置判断信息。 private void checkPostion(Cursor cursor) { // 通过游标判断是否处于最后位置,将结果赋值给mIsLastItem成员变量,标记该笔记是否是列表中的最后一项。 mIsLastItem = cursor.isLast()? true : false; // 通过游标判断是否处于第一位置,将结果赋值给mIsFirstItem成员变量,标记该笔记是否是列表中的第一项。 mIsFirstItem = cursor.isFirst()? true : false; // 通过判断游标中的记录总数是否为1,将结果赋值给mIsOnlyOneItem成员变量,标记该笔记是否是列表中唯一的一项。 mIsOnlyOneItem = (cursor.getCount() == 1); // 初始化为false,表示默认该笔记不是某个文件夹下跟随多个笔记的情况,后续根据具体判断逻辑进行更新。 mIsMultiNotesFollowingFolder = false; // 初始化为false,表示默认该笔记不是某个文件夹下仅跟随一个笔记的情况,后续根据具体判断逻辑进行更新。 mIsOneNoteFollowingFolder = false; // 如果当前笔记的类型是普通笔记类型(Notes.TYPE_NOTE)且不是列表中的第一项(因为要判断前面的记录情况),则进行以下位置相关的判断逻辑。 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) { // 判断游标中的记录总数是否大于当前位置索引加1(即当前位置后面还有记录),如果是,则表示当前笔记是某个文件夹下跟随的多个笔记之一, // 设置mIsMultiNotesFollowingFolder成员变量为true,标记该情况。 if (cursor.getCount() > (position + 1)) { mIsMultiNotesFollowingFolder = true; } else { // 如果后面没有其他记录了,则表示当前笔记是某个文件夹下仅跟随的一个笔记,设置mIsOneNoteFollowingFolder成员变量为true,标记该情况。 mIsOneNoteFollowingFolder = true; } } // 将游标再移回原来的位置(即当前笔记所在的位置),确保游标位置的正确性,不影响后续其他操作对游标的使用。 if (!cursor.moveToNext()) { throw new IllegalStateException("cursor move to previous but can't move back"); } } } } // 用于判断该笔记是否是某个文件夹下仅跟随的一个笔记,返回对应的成员变量标记值,外部可通过调用该方法来获取此位置判断信息, // 用于在列表展示等场景下进行不同的样式或操作逻辑处理,例如针对仅跟随一个笔记的情况显示特殊的提示等。 public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; } // 用于判断该笔记是否是某个文件夹下跟随的多个笔记之一,返回对应的成员变量标记值,方便外部获取此位置判断信息, // 在列表展示和操作逻辑中可根据该情况进行相应的处理,比如分组展示等操作。 public boolean isMultiFollowingFolder() { return mIsMultiNotesFollowingFolder; } // 用于判断该笔记是否是列表中的最后一项,返回对应的成员变量标记值,外部可通过调用该方法来获取此位置判断信息, // 常用于列表滚动、分页等相关逻辑中,例如判断是否加载下一页数据等情况。 public boolean isLast() { return mIsLastItem; } // 用于获取通话记录笔记对应的联系人姓名(如果是通话记录类型笔记),返回存储的联系人姓名成员变量值,方便在展示通话记录笔记时显示相应的联系人信息, // 提高信息展示的友好性,便于用户识别通话记录相关的笔记内容。 public String getCallName() { return mName; } // 用于判断该笔记是否是列表中的第一项,返回对应的成员变量标记值,外部可通过调用该方法来获取此位置判断信息, // 在列表展示等