From ca8c67da9436e5f03df34bf1f12c331e44a28f19 Mon Sep 17 00:00:00 2001 From: zhaoyue233 <1361435070@qq.com> Date: Tue, 20 May 2025 22:41:24 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9Cv1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/李自强技术博客.docx | Bin 0 -> 15024 bytes doc/质量分析报告lzq.docx | Bin 0 -> 18702 bytes doc/质量检测报告.docx | Bin 18332 -> 0 bytes doc/赵皓阳 技术博客.docx | Bin 19065 -> 0 bytes src/Note.java | 347 ++++++++++++++++++++++ src/NoteWidgetProvider.java | 187 ------------ src/NoteWidgetProvider_2x.java | 73 ----- src/NoteWidgetProvider_4x.java | 77 ----- src/WorkingNote.java | 512 ++++++++++++++++++++++++++++++++ 9 files changed, 859 insertions(+), 337 deletions(-) create mode 100644 doc/李自强技术博客.docx create mode 100644 doc/质量分析报告lzq.docx delete mode 100644 doc/质量检测报告.docx delete mode 100644 doc/赵皓阳 技术博客.docx create mode 100644 src/Note.java delete mode 100644 src/NoteWidgetProvider.java delete mode 100644 src/NoteWidgetProvider_2x.java delete mode 100644 src/NoteWidgetProvider_4x.java create mode 100644 src/WorkingNote.java diff --git a/doc/李自强技术博客.docx b/doc/李自强技术博客.docx new file mode 100644 index 0000000000000000000000000000000000000000..f7a6b1b539c033a8495ca9437ab5c369ff24c720 GIT binary patch literal 15024 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
_q_1SlPc?jjFPGKCbOOd+BXk+6u6nxE#AGuM0y` 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 literal 0 HcmV?d00001 diff --git a/doc/质量检测报告.docx b/doc/质量检测报告.docx deleted file mode 100644 index 83ff6e47498871595f4377309b72391de3aaa4ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18332 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 0 || mNoteData.isLocalModified(); + } + + /** + * 将笔记同步到内容提供者 + * @param context 应用上下文 + * @param noteId 笔记ID + * @return 同步成功返回true,失败返回false + */ + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("错误的笔记ID: " + noteId); + } + + if (!isLocalModified()) { + return true; // 没有修改,无需同步 + } + + /** + * 理论上,一旦数据发生变化,笔记应在{@link NoteColumns#LOCAL_MODIFIED}和 + * {@link NoteColumns#MODIFIED_DATE}上更新。为了数据安全,即使更新笔记失败, + * 我们也会更新笔记数据信息 + */ + if (context.getContentResolver().update( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, + null) == 0) { + Log.e(TAG, "更新笔记错误,这种情况不应该发生"); + // 不返回,继续执行 + } + mNoteDiffValues.clear(); // 清除已同步的变更值 + + // 同步笔记数据,如果有修改且同步失败则返回false + if (mNoteData.isLocalModified() + && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + return false; + } + + return true; + } + + /** + * 内部类,用于管理笔记关联的数据(文本内容、通话记录等) + */ + private class NoteData { + private long mTextDataId; // 文本数据ID + private ContentValues mTextDataValues; // 文本数据变更值 + private long mCallDataId; // 通话数据ID + private ContentValues mCallDataValues; // 通话数据变更值 + private static final String TAG = "NoteData"; + + /** + * 构造函数,初始化笔记数据对象 + */ + public NoteData() { + mTextDataValues = new ContentValues(); // 初始化文本数据容器 + mCallDataValues = new ContentValues(); // 初始化通话数据容器 + mTextDataId = 0; // 初始文本数据ID为0 + mCallDataId = 0; // 初始通话数据ID为0 + } + + /** + * 检查笔记数据是否有本地修改 + * @return 如果有修改返回true,否则返回false + */ + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + /** + * 设置文本数据ID + * @param id 文本数据ID + */ + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("文本数据ID应大于0"); + } + mTextDataId = id; + } + + /** + * 设置通话数据ID + * @param id 通话数据ID + */ + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("通话数据ID应大于0"); + } + mCallDataId = id; + } + + /** + * 设置通话数据的值 + * @param key 键名 + * @param value 值 + */ + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + // 标记笔记已修改,并更新修改时间 + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + /** + * 设置文本数据的值 + * @param key 键名 + * @param value 值 + */ + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + // 标记笔记已修改,并更新修改时间 + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + /** + * 将笔记数据推送到内容提供者 + * @param context 应用上下文 + * @param noteId 笔记ID + * @return 成功返回笔记URI,失败返回null + */ + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * 安全检查 + */ + if (noteId <= 0) { + throw new IllegalArgumentException("错误的笔记ID: " + noteId); + } + + // 创建批量操作列表 + ArrayList operationList = new ArrayList(); + ContentProviderOperation.Builder builder = null; + + // 处理文本数据变更 + if(mTextDataValues.size() > 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId); // 设置关联的笔记ID + if (mTextDataId == 0) { + // 新增文本数据 + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + // 从返回的URI中获取并设置新的文本数据ID + setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "插入新文本数据失败,笔记ID: " + noteId); + mTextDataValues.clear(); + return null; + } + } else { + // 更新现有文本数据 + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); // 清除已处理的变更值 + } + + // 处理通话数据变更 + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); // 设置关联的笔记ID + if (mCallDataId == 0) { + // 新增通话数据 + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + // 从返回的URI中获取并设置新的通话数据ID + setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "插入新通话数据失败,笔记ID: " + noteId); + mCallDataValues.clear(); + return null; + } + } else { + // 更新现有通话数据 + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); // 清除已处理的变更值 + } + + // 执行批量操作 + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/src/NoteWidgetProvider.java b/src/NoteWidgetProvider.java deleted file mode 100644 index 9ed21f1..0000000 --- a/src/NoteWidgetProvider.java +++ /dev/null @@ -1,187 +0,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.widget; // 指定此类属于 net.micode.notes.widget 包中的一个子类。 - -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.util.Log; -import android.widget.RemoteViews; -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NoteEditActivity; -import net.micode.notes.ui.NotesListActivity; // 导入必要的Android组件和业务逻辑接口,包括处理意图、远程视图、AppWidget管理等 - -/* - 抽象类,用于实现笔记小部件的功能。 - 提供了小部件的更新、删除等基础功能,具体的小部件布局和背景资源由子类实现。 - */ -public abstract class NoteWidgetProvider extends AppWidgetProvider { - /* - 数据库查询时需要投影的字段数组。 - 包括笔记的ID、背景颜色ID和片段。 - */ - public static final String[] PROJECTION = new String[]{ - NoteColumns.ID, // 笔记的ID - NoteColumns.BG_COLOR_ID, // 笔记的背景颜色ID - NoteColumns.SNIPPET // 笔记的片段 - }; - - /* - 定义字段在查询结果中的索引位置。 - */ - public static final int COLUMN_ID = 0; // ID字段的索引 - public static final int COLUMN_BG_COLOR_ID = 1; // 背景颜色ID字段的索引 - public static final int COLUMN_SNIPPET = 2; // 片段字段的索引 - - private static final String TAG = "NoteWidgetProvider"; // 日志标签 - - /* - 当小部件被删除时调用。 - 将与小部件关联的笔记的WIDGET_ID字段更新为无效值。 - @param context 上下文 - @param appWidgetIds 要删除的小部件ID数组 - */ - @Override - public void onDeleted(Context context, int[] appWidgetIds) { - ContentValues values = new ContentValues(); // 创建ContentValues对象用于更新数据 - values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); // 设置WIDGET_ID为无效值 - for (int i = 0; i < appWidgetIds.length; i++) { - context.getContentResolver().update(Notes.CONTENT_NOTE_URI, // 更新笔记数据 - values, - NoteColumns.WIDGET_ID + "=?", // 更新条件:WIDGET_ID等于当前小部件ID - new String[]{String.valueOf(appWidgetIds[i])}); - } - } - - /* - 查询与指定小部件ID关联的笔记信息 - @param context 上下文 - @param widgetId 小部件ID - @return 查询结果的Cursor - */ - private Cursor getNoteWidgetInfo(Context context, int widgetId) { - return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, // 查询笔记数据 - PROJECTION, // 查询的字段 - NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", // 查询条件:WIDGET_ID等于widgetId且PARENT_ID不等于ID_TRASH_FOLDER - new String[]{String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER)}, // 查询条件的参数 - null); // 不指定排序 - } - - /* - 更新小部件。 - 如果未指定隐私模式,则直接调用update方法。 - @param context 上下文 - @param appWidgetManager 小部件管理器 - @param appWidgetIds 要更新的小部件ID数组 - */ - protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); // 默认不启用隐私模式 - } - - /* - 更新小部件的核心逻辑。 - 根据小部件ID查询关联的笔记信息,并更新小部件的显示内容。 - @param context 上下文 - @param appWidgetManager 小部件管理器 - @param appWidgetIds 要更新的小部件ID数组 - @param privacyMode 是否启用隐私模式 - */ - private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, - boolean privacyMode) { - for (int i = 0; i < appWidgetIds.length; i++) { - if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { // 确保小部件ID有效 - int bgId = ResourceParser.getDefaultBgId(context); // 获取默认背景颜色ID - String snippet = ""; // 初始化笔记片段为空字符串 - Intent intent = new Intent(context, NoteEditActivity.class); // 创建编辑笔记的Intent - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 设置Intent标志 - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); // 添加小部件ID到Intent - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); // 添加小部件类型到Intent - - Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); // 查询与小部件关联的笔记信息 - if (c != null && c.moveToFirst()) { - if (c.getCount() > 1) { // 如果查询到多条记录,记录错误并返回 - Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); - c.close(); - return; - } - snippet = c.getString(COLUMN_SNIPPET); // 获取笔记片段 - bgId = c.getInt(COLUMN_BG_COLOR_ID); // 获取笔记背景颜色ID - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); // 添加笔记ID到Intent - intent.setAction(Intent.ACTION_VIEW); // 设置Intent动作 - } else { - snippet = context.getResources().getString(R.string.widget_havenot_content); // 如果未查询到笔记信息,显示默认内容 - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 设置Intent动作 - } - - if (c != null) { - c.close(); // 关闭Cursor - } - - RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); // 创建RemoteViews对象 - rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); // 设置小部件背景图片 - intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); // 添加背景颜色ID到Intent - - /* - 生成点击小部件时启动的PendingIntent。 - */ - PendingIntent pendingIntent = null; - if (privacyMode) { // 如果启用隐私模式 - rv.setTextViewText(R.id.widget_text, // 设置小部件文本为隐私模式提示 - context.getString(R.string.widget_under_visit_mode)); - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( - context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); // 创建跳转到笔记列表的PendingIntent - } else { - rv.setTextViewText(R.id.widget_text, snippet); // 设置小部件文本为笔记片段 - pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, // 创建跳转到笔记编辑的PendingIntent - PendingIntent.FLAG_UPDATE_CURRENT); - } - - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); // 设置小部件点击事件 - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); // 更新小部件 - } - } - } - - /* - 获取背景资源ID的抽象方法。 - 具体实现由子类提供。 - @param bgId 背景颜色ID - @return 背景资源ID - */ - protected abstract int getBgResourceId(int bgId); - - /* - 获取小部件布局ID的抽象方法。 - 具体实现由子类提供。 - @return 小部件布局ID - */ - protected abstract int getLayoutId(); - - /* - 获取小部件类型的抽象方法。 - 具体实现由子类提供。 - @return 小部件类型 - */ - protected abstract int getWidgetType(); -} \ No newline at end of file diff --git a/src/NoteWidgetProvider_2x.java b/src/NoteWidgetProvider_2x.java deleted file mode 100644 index 1047d7e..0000000 --- a/src/NoteWidgetProvider_2x.java +++ /dev/null @@ -1,73 +0,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.widget; // 包路径,表示该类属于 net.micode.notes.widget 包 - -import android.appwidget.AppWidgetManager; // 导入 AppWidgetManager,用于管理小部件 -import android.content.Context; // 导入 Context,用于获取应用上下文 - -import net.micode.notes.R; // 导入资源文件 -import net.micode.notes.data.Notes; // 导入笔记数据相关的类 -import net.micode.notes.tool.ResourceParser; // 导入资源解析工具类 - -/* - NoteWidgetProvider_2x 类,用于实现 2x 大小的笔记小部件。 - 继承自 NoteWidgetProvider 抽象类,实现了具体的布局、背景资源和小部件类型。 - */ -public class NoteWidgetProvider_2x extends NoteWidgetProvider { - /* - 当小部件需要更新时调用的方法。 - 调用父类的 update 方法来更新小部件。 - @param context 上下文 - *param appWidgetManager 小部件管理器 - @param appWidgetIds 需要更新的小部件 ID 数组 - */ - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); // 调用父类的 update 方法 - } - - /* - 获取小部件的布局 ID。 - 返回 2x 大小的小部件布局资源 ID。 - @return 小部件布局资源 ID - */ - @Override - protected int getLayoutId() { - return R.layout.widget_2x; // 返回 2x 大小的小部件布局资源 ID - } - - /* - 获取小部件的背景资源 ID。 - 根据背景颜色 ID,返回对应的 2x 大小的小部件背景资源 ID。 - @param bgId 背景颜色 ID - @return 背景资源 ID - */ - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); // 调用工具类获取背景资源 ID - } - - /* - 获取小部件的类型。 - 返回 2x 大小的小部件类型。 - @return 小部件类型 - */ - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_2X; // 返回 2x 大小的小部件类型 - } -} \ No newline at end of file diff --git a/src/NoteWidgetProvider_4x.java b/src/NoteWidgetProvider_4x.java deleted file mode 100644 index 7642d1f..0000000 --- a/src/NoteWidgetProvider_4x.java +++ /dev/null @@ -1,77 +0,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.widget; // 包路径,表示该类属于 net.micode.notes.widget 包 - -import android.appwidget.AppWidgetManager; // 导入 AppWidgetManager,用于管理小部件 -import android.content.Context; // 导入 Context,用于获取应用上下文 - -import net.micode.notes.R; // 导入资源文件 -import net.micode.notes.data.Notes; // 导入笔记数据相关的类 -import net.micode.notes.tool.ResourceParser; // 导入资源解析工具类 - -/* - NoteWidgetProvider_4x 类,用于实现 4x 大小的笔记小部件。 - 继承自 NoteWidgetProvider 抽象类,实现了具体的布局、背景资源和小部件类型。 - */ -public class NoteWidgetProvider_4x extends NoteWidgetProvider { - /* - 当小部件需要更新时调用的方法。 - 调用父类的 update 方法来更新小部件。 - - @param context 上下文 - @param appWidgetManager 小部件管理器 - @param appWidgetIds 需要更新的小部件 ID 数组 - */ - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); // 调用父类的 update 方法 - } - - /* - 获取小部件的布局 ID。 - 返回 4x 大小的小部件布局资源 ID。 - - @return 小部件布局资源 ID - */ - @Override - protected int getLayoutId() { - return R.layout.widget_4x; // 返回 4x 大小的小部件布局资源 ID - } - - /* - 获取小部件的背景资源 ID。 - 根据背景颜色 ID,返回对应的 4x 大小的小部件背景资源 ID。 - - @param bgId 背景颜色 ID - @return 背景资源 ID - */ - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); // 调用工具类获取背景资源 ID - } - - /* - 获取小部件的类型。 - 返回 4x 大小的小部件类型。 - - @return 小部件类型 - */ - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; // 返回 4x 大小的小部件类型 - } -} \ No newline at end of file diff --git a/src/WorkingNote.java b/src/WorkingNote.java new file mode 100644 index 0000000..dc9855b --- /dev/null +++ b/src/WorkingNote.java @@ -0,0 +1,512 @@ +/* + * 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.model; + +import android.appwidget.AppWidgetManager; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.text.TextUtils; +import android.util.Log; + +import net.micode.notes.data.Notes; +import net.micode.notes.data.Notes.CallNote; +import net.micode.notes.data.Notes.DataColumns; +import net.micode.notes.data.Notes.DataConstants; +import net.micode.notes.data.Notes.NoteColumns; +import net.micode.notes.data.Notes.TextNote; +import net.micode.notes.tool.ResourceParser.NoteBgResources; + +/** + * WorkingNote 类用于管理笔记的创建、加载、保存和修改操作 + * 提供了笔记的各种属性设置和获取方法,并支持与界面的交互回调 + */ +public class WorkingNote { + // 笔记核心操作类 + private Note mNote; + // 笔记ID + private long mNoteId; + // 笔记内容 + private String mContent; + // 笔记模式(普通文本或待办列表) + private int mMode; + // 提醒日期 + private long mAlertDate; + // 修改日期 + private long mModifiedDate; + // 背景颜色ID + private int mBgColorId; + // 桌面小部件ID + private int mWidgetId; + // 桌面小部件类型 + private int mWidgetType; + // 文件夹ID + private long mFolderId; + // 应用上下文 + private Context mContext; + // 日志标签 + private static final String TAG = "WorkingNote"; + // 标记是否已删除 + private boolean mIsDeleted; + // 笔记设置变更监听器 + private NoteSettingChangedListener mNoteSettingStatusListener; + + // 数据查询投影(用于查询笔记相关数据) + public static final String[] DATA_PROJECTION = new String[] { + DataColumns.ID, // 数据ID + DataColumns.CONTENT, // 内容 + DataColumns.MIME_TYPE, // 内容类型 + DataColumns.DATA1, // 数据1(通常用于存储模式) + DataColumns.DATA2, // 数据2 + DataColumns.DATA3, // 数据3 + DataColumns.DATA4, // 数据4 + }; + + // 笔记查询投影(用于查询笔记基本信息) + public static final String[] NOTE_PROJECTION = new String[] { + NoteColumns.PARENT_ID, // 父文件夹ID + NoteColumns.ALERTED_DATE, // 提醒日期 + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.WIDGET_ID, // 桌面小部件ID + NoteColumns.WIDGET_TYPE, // 桌面小部件类型 + NoteColumns.MODIFIED_DATE // 修改日期 + }; + + // 数据查询列索引 + private static final int DATA_ID_COLUMN = 0; + private static final int DATA_CONTENT_COLUMN = 1; + private static final int DATA_MIME_TYPE_COLUMN = 2; + private static final int DATA_MODE_COLUMN = 3; + + // 笔记查询列索引 + private static final int NOTE_PARENT_ID_COLUMN = 0; + private static final int NOTE_ALERTED_DATE_COLUMN = 1; + private static final int NOTE_BG_COLOR_ID_COLUMN = 2; + private static final int NOTE_WIDGET_ID_COLUMN = 3; + private static final int NOTE_WIDGET_TYPE_COLUMN = 4; + private static final int NOTE_MODIFIED_DATE_COLUMN = 5; + + /** + * 私有构造函数,用于创建新笔记 + * @param context 应用上下文 + * @param folderId 父文件夹ID + */ + private WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; // 默认无提醒 + mModifiedDate = System.currentTimeMillis(); // 设置当前时间为修改时间 + mFolderId = folderId; // 设置父文件夹ID + mNote = new Note(); // 初始化笔记操作类 + mNoteId = 0; // 新笔记ID为0,表示尚未保存到数据库 + mIsDeleted = false; // 默认未删除 + mMode = 0; // 默认普通文本模式 + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; // 默认无效小部件类型 + } + + /** + * 私有构造函数,用于加载已存在的笔记 + * @param context 应用上下文 + * @param noteId 笔记ID + * @param folderId 父文件夹ID + */ + private WorkingNote(Context context, long noteId, long folderId) { + mContext = context; + mNoteId = noteId; // 设置笔记ID + mFolderId = folderId; // 设置父文件夹ID + mIsDeleted = false; // 默认未删除 + mNote = new Note(); // 初始化笔记操作类 + loadNote(); // 从数据库加载笔记信息 + } + + /** + * 从数据库加载笔记基本信息 + */ + private void loadNote() { + // 查询笔记基本信息 + Cursor cursor = mContext.getContentResolver().query( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, + null, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + // 从游标中获取并设置笔记各属性 + mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); + mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); + mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); + mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); + mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); + mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); + } + cursor.close(); + } else { + Log.e(TAG, "No note with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note with id " + mNoteId); + } + loadNoteData(); // 加载笔记关联的数据 + } + + /** + * 从数据库加载笔记关联的数据(如文本内容、通话记录等) + */ + private void loadNoteData() { + // 查询笔记关联的数据 + Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, + DataColumns.NOTE_ID + "=?", new String[] { + String.valueOf(mNoteId) + }, null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + // 根据数据类型处理不同的数据 + String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + if (DataConstants.NOTE.equals(type)) { + // 文本笔记数据 + mContent = cursor.getString(DATA_CONTENT_COLUMN); + mMode = cursor.getInt(DATA_MODE_COLUMN); + mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); + } else if (DataConstants.CALL_NOTE.equals(type)) { + // 通话记录数据 + mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); + } else { + Log.d(TAG, "Wrong note type with type:" + type); + } + } while (cursor.moveToNext()); + } + cursor.close(); + } else { + Log.e(TAG, "No data with id:" + mNoteId); + throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); + } + } + + /** + * 创建新的空笔记 + * @param context 应用上下文 + * @param folderId 父文件夹ID + * @param widgetId 桌面小部件ID + * @param widgetType 桌面小部件类型 + * @param defaultBgColorId 默认背景颜色ID + * @return 新创建的WorkingNote对象 + */ + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + note.setBgColorId(defaultBgColorId); // 设置默认背景颜色 + note.setWidgetId(widgetId); // 设置小部件ID + note.setWidgetType(widgetType); // 设置小部件类型 + return note; + } + + /** + * 从数据库加载现有笔记 + * @param context 应用上下文 + * @param id 笔记ID + * @return 加载的WorkingNote对象 + */ + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + /** + * 同步保存笔记到数据库 + * @return 保存成功返回true,失败返回false + */ + public synchronized boolean saveNote() { + if (isWorthSaving()) { // 检查是否值得保存 + if (!existInDatabase()) { // 如果笔记还不存在于数据库中 + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + // 同步笔记到数据库 + mNote.syncNote(mContext, mNoteId); + + /** + * 如果笔记有相关联的桌面小部件,更新小部件内容 + */ + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE + && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + /** + * 检查笔记是否已存在于数据库中 + * @return 存在返回true,否则返回false + */ + public boolean existInDatabase() { + return mNoteId > 0; + } + + /** + * 判断笔记是否值得保存 + * @return 值得保存返回true,否则返回false + */ + private boolean isWorthSaving() { + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; // 已删除、新笔记无内容或无修改的笔记不值得保存 + } else { + return true; + } + } + + /** + * 设置笔记设置变更监听器 + * @param l 监听器对象 + */ + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + /** + * 设置提醒日期 + * @param date 提醒日期时间戳 + * @param set 是否设置提醒 + */ + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + // 通知监听器提醒设置已变更 + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + /** + * 标记笔记为已删除或未删除 + * @param mark true表示已删除,false表示未删除 + */ + public void markDeleted(boolean mark) { + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + // 通知监听器小部件已变更 + mNoteSettingStatusListener.onWidgetChanged(); + } + } + + /** + * 设置笔记背景颜色 + * @param id 背景颜色ID + */ + public void setBgColorId(int id) { + if (id != mBgColorId) { + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + // 通知监听器背景颜色已变更 + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + /** + * 设置笔记模式(普通文本或待办列表) + * @param mode 模式值 + */ + public void setCheckListMode(int mode) { + if (mMode != mode) { + if (mNoteSettingStatusListener != null) { + // 通知监听器模式已变更 + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + /** + * 设置桌面小部件类型 + * @param type 小部件类型 + */ + public void setWidgetType(int type) { + if (type != mWidgetType) { + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + } + } + + /** + * 设置桌面小部件ID + * @param id 小部件ID + */ + public void setWidgetId(int id) { + if (id != mWidgetId) { + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + } + } + + /** + * 设置笔记文本内容 + * @param text 文本内容 + */ + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) { + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + /** + * 将笔记转换为通话记录笔记 + * @param phoneNumber 电话号码 + * @param callDate 通话日期 + */ + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + /** + * 检查笔记是否设置了提醒 + * @return 设置了提醒返回true,否则返回false + */ + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + /** + * 获取笔记内容 + * @return 笔记内容字符串 + */ + public String getContent() { + return mContent; + } + + /** + * 获取提醒日期 + * @return 提醒日期时间戳 + */ + public long getAlertDate() { + return mAlertDate; + } + + /** + * 获取修改日期 + * @return 修改日期时间戳 + */ + public long getModifiedDate() { + return mModifiedDate; + } + + /** + * 获取背景颜色资源ID + * @return 背景颜色资源ID + */ + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + /** + * 获取背景颜色ID + * @return 背景颜色ID + */ + public int getBgColorId() { + return mBgColorId; + } + + /** + * 获取标题背景资源ID + * @return 标题背景资源ID + */ + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + /** + * 获取笔记模式 + * @return 笔记模式值 + */ + public int getCheckListMode() { + return mMode; + } + + /** + * 获取笔记ID + * @return 笔记ID + */ + public long getNoteId() { + return mNoteId; + } + + /** + * 获取父文件夹ID + * @return 父文件夹ID + */ + public long getFolderId() { + return mFolderId; + } + + /** + * 获取桌面小部件ID + * @return 桌面小部件ID + */ + public int getWidgetId() { + return mWidgetId; + } + + /** + * 获取桌面小部件类型 + * @return 桌面小部件类型 + */ + public int getWidgetType() { + return mWidgetType; + } + + /** + * 笔记设置变更监听器接口 + */ + public interface NoteSettingChangedListener { + /** + * 当笔记背景颜色变更时调用 + */ + void onBackgroundColorChanged(); + + /** + * 当用户设置/取消提醒时调用 + * @param date 提醒日期 + * @param set 是否设置提醒 + */ + void onClockAlertChanged(long date, boolean set); + + /** + * 当从桌面小部件创建笔记时调用 + */ + void onWidgetChanged(); + + /** + * 当在待办列表模式和普通文本模式之间切换时调用 + * @param oldMode 变更前的模式 + * @param newMode 变更后的模式 + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} +