diff --git a/src/widget/NoteWidgetProvider.java b/src/widget/NoteWidgetProvider.java index ec6f819..cfb37ac 100644 --- a/src/widget/NoteWidgetProvider.java +++ b/src/widget/NoteWidgetProvider.java @@ -15,41 +15,88 @@ */ package net.micode.notes.widget; +// 导入 Android 中用于创建延迟执行意图的类 import android.app.PendingIntent; +// 导入 Android 中用于管理桌面小部件的类 import android.appwidget.AppWidgetManager; +// 导入 Android 中桌面小部件提供者的基类 import android.appwidget.AppWidgetProvider; +// 导入 Android 中用于存储键值对的类,常用于 ContentResolver 操作 import android.content.ContentValues; +// 导入 Android 中表示应用程序环境的上下文类 import android.content.Context; +// 导入 Android 中用于在不同组件间传递消息的意图类 import android.content.Intent; +// 导入 Android 中用于处理数据库查询结果的游标类 import android.database.Cursor; +// 导入 Android 中用于日志记录的类 import android.util.Log; +// 导入 Android 中用于远程操作视图的类 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; +/** + * NoteWidgetProvider 是一个抽象类,继承自 AppWidgetProvider,用于处理桌面小部件的相关操作。 + * 该类提供了小部件删除、更新等操作的实现,同时定义了一些抽象方法,需要子类进行具体实现。 + */ public abstract class NoteWidgetProvider extends AppWidgetProvider { + /** + * 定义查询笔记小部件信息时需要查询的列。 + */ public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_ID, - NoteColumns.SNIPPET + // 笔记的 ID 列 + NoteColumns.ID, + // 笔记的背景颜色 ID 列 + NoteColumns.BG_COLOR_ID, + // 笔记的摘要列 + NoteColumns.SNIPPET }; + /** + * PROJECTION 数组中笔记 ID 列的索引。 + */ public static final int COLUMN_ID = 0; + /** + * PROJECTION 数组中笔记背景颜色 ID 列的索引。 + */ public static final int COLUMN_BG_COLOR_ID = 1; + /** + * PROJECTION 数组中笔记摘要列的索引。 + */ public static final int COLUMN_SNIPPET = 2; + /** + * 日志标签,用于在日志记录中标识该类的日志信息。 + */ private static final String TAG = "NoteWidgetProvider"; + /** + * 当一个或多个小部件被删除时调用此方法。 + * 该方法会将被删除小部件关联的笔记的小部件 ID 设置为无效值。 + * + * @param context 应用程序上下文 + * @param appWidgetIds 被删除的小部件 ID 数组 + */ @Override public void onDeleted(Context context, int[] appWidgetIds) { + // 创建一个 ContentValues 对象,用于存储要更新的数据 ContentValues values = new ContentValues(); + // 将笔记的小部件 ID 设置为无效值 values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + // 遍历被删除的小部件 ID 数组 for (int i = 0; i < appWidgetIds.length; i++) { + // 更新与该小部件关联的笔记的小部件 ID context.getContentResolver().update(Notes.CONTENT_NOTE_URI, values, NoteColumns.WIDGET_ID + "=?", @@ -57,7 +104,15 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { } } + /** + * 根据小部件 ID 获取关联笔记的信息。 + * + * @param context 应用程序上下文 + * @param widgetId 小部件 ID + * @return 包含笔记信息的 Cursor 对象 + */ private Cursor getNoteWidgetInfo(Context context, int widgetId) { + // 查询与指定小部件 ID 关联的笔记信息 return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", @@ -65,68 +120,134 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { null); } + /** + * 更新小部件的内容,默认隐私模式为关闭状态。 + * + * @param context 应用程序上下文 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 需要更新的小部件 ID 数组 + */ protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // 调用带隐私模式参数的更新方法,隐私模式为 false update(context, appWidgetManager, appWidgetIds, false); } + /** + * 根据隐私模式更新小部件的内容。 + * + * @param context 应用程序上下文 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 需要更新的小部件 ID 数组 + * @param privacyMode 是否开启隐私模式 + */ private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, - boolean privacyMode) { + boolean privacyMode) { + // 遍历需要更新的小部件 ID 数组 for (int i = 0; i < appWidgetIds.length; i++) { + // 检查小部件 ID 是否有效 if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + // 获取默认的背景颜色 ID int bgId = ResourceParser.getDefaultBgId(context); + // 初始化笔记摘要字符串 String snippet = ""; + // 创建一个意图,用于启动笔记编辑活动 Intent intent = new Intent(context, NoteEditActivity.class); + // 设置意图标志,确保活动以单顶部模式启动 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + // 将小部件 ID 作为额外数据添加到意图中 intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); + // 将小部件类型作为额外数据添加到意图中 intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); + // 获取与该小部件关联的笔记信息 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); + // 获取笔记的背景颜色 ID bgId = c.getInt(COLUMN_BG_COLOR_ID); + // 将笔记的 ID 作为额外数据添加到意图中 intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); + // 设置意图的操作类型为查看 intent.setAction(Intent.ACTION_VIEW); } else { + // 如果没有关联的笔记,设置默认的摘要信息 snippet = context.getResources().getString(R.string.widget_havenot_content); + // 设置意图的操作类型为插入或编辑 intent.setAction(Intent.ACTION_INSERT_OR_EDIT); } + // 检查游标是否不为空,若不为空则关闭游标 if (c != null) { c.close(); } + // 创建一个 RemoteViews 对象,用于更新小部件的视图 RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); + // 设置小部件的背景图片资源 rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); + // 将背景颜色 ID 作为额外数据添加到意图中 intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); /** - * Generate the pending intent to start host for the widget + * 生成用于启动小部件宿主的延迟意图 */ + // 初始化延迟意图对象 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); } else { + // 设置小部件文本为笔记的摘要信息 rv.setTextViewText(R.id.widget_text, snippet); + // 创建一个延迟意图,用于启动笔记编辑活动 pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, PendingIntent.FLAG_UPDATE_CURRENT); } + // 设置小部件文本区域的点击事件为延迟意图 rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); + // 更新指定小部件的内容 appWidgetManager.updateAppWidget(appWidgetIds[i], rv); } } } + /** + * 根据背景颜色 ID 获取对应的背景资源 ID。 + * 该方法为抽象方法,需要子类进行具体实现。 + * + * @param bgId 背景颜色 ID + * @return 背景资源 ID + */ protected abstract int getBgResourceId(int bgId); + /** + * 获取小部件的布局 ID。 + * 该方法为抽象方法,需要子类进行具体实现。 + * + * @return 小部件的布局 ID + */ protected abstract int getLayoutId(); + /** + * 获取小部件的类型。 + * 该方法为抽象方法,需要子类进行具体实现。 + * + * @return 小部件的类型 + */ protected abstract int getWidgetType(); } diff --git a/src/widget/NoteWidgetProvider_2x.java b/src/widget/NoteWidgetProvider_2x.java index adcb2f7..a8bf912 100644 --- a/src/widget/NoteWidgetProvider_2x.java +++ b/src/widget/NoteWidgetProvider_2x.java @@ -14,34 +14,77 @@ * limitations under the License. */ +/** + * 该包包含与笔记应用桌面小部件相关的类。 + */ package net.micode.notes.widget; +// 导入 Android 系统中用于管理桌面小部件的类 + import android.appwidget.AppWidgetManager; +// 导入 Android 系统中表示应用程序环境的上下文类 import android.content.Context; +// 导入应用资源类 import net.micode.notes.R; +// 导入应用笔记数据相关类 import net.micode.notes.data.Notes; +// 导入应用资源解析工具类 import net.micode.notes.tool.ResourceParser; - +/** + * NoteWidgetProvider_2x 类继承自 NoteWidgetProvider,用于处理 2x 尺寸桌面小部件的相关操作。 + * 该类重写了父类的一些抽象方法,以实现 2x 小部件特有的布局、背景资源和类型。 + */ public class NoteWidgetProvider_2x extends NoteWidgetProvider { + /** + * 当小部件需要更新时,系统会调用此方法。 + * 该方法会调用父类的 update 方法来完成小部件的更新操作。 + * + * @param context 应用程序上下文,提供对应用资源和系统服务的访问。 + * @param appWidgetManager 桌面小部件管理器,用于管理小部件的生命周期和更新操作。 + * @param appWidgetIds 需要更新的小部件 ID 数组。 + */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // 调用父类的 update 方法更新小部件 super.update(context, appWidgetManager, appWidgetIds); } + /** + * 获取 2x 小部件的布局 ID。 + * 该方法重写了父类的抽象方法,返回 2x 小部件对应的布局资源 ID。 + * + * @return 2x 小部件的布局资源 ID。 + */ @Override protected int getLayoutId() { + // 返回 2x 小部件的布局资源 ID return R.layout.widget_2x; } + /** + * 根据背景颜色 ID 获取 2x 小部件的背景资源 ID。 + * 该方法重写了父类的抽象方法,使用 ResourceParser 工具类获取对应的背景资源 ID。 + * + * @param bgId 背景颜色 ID。 + * @return 2x 小部件对应的背景资源 ID。 + */ @Override protected int getBgResourceId(int bgId) { + // 使用 ResourceParser 工具类获取 2x 小部件的背景资源 ID return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); } + /** + * 获取 2x 小部件的类型。 + * 该方法重写了父类的抽象方法,返回 2x 小部件对应的类型常量。 + * + * @return 2x 小部件的类型常量。 + */ @Override protected int getWidgetType() { + // 返回 2x 小部件的类型常量 return Notes.TYPE_WIDGET_2X; } } diff --git a/src/widget/NoteWidgetProvider_4x.java b/src/widget/NoteWidgetProvider_4x.java index c12a02e..94b58ab 100644 --- a/src/widget/NoteWidgetProvider_4x.java +++ b/src/widget/NoteWidgetProvider_4x.java @@ -2,45 +2,86 @@ * 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; +// 导入 Android 系统中用于管理桌面小部件的类 import android.appwidget.AppWidgetManager; +// 导入 Android 系统中表示应用程序环境的上下文类 import android.content.Context; +// 导入应用资源类 import net.micode.notes.R; +// 导入应用笔记数据相关类 import net.micode.notes.data.Notes; +// 导入应用资源解析工具类 import net.micode.notes.tool.ResourceParser; - +/** + * NoteWidgetProvider_4x 类继承自 NoteWidgetProvider,用于处理 4x 尺寸桌面小部件的相关操作。 + * 该类重写了父类的一些抽象方法,以实现 4x 小部件特有的布局、背景资源和类型。 + */ public class NoteWidgetProvider_4x extends NoteWidgetProvider { + /** + * 当小部件需要更新时,系统会调用此方法。 + * 该方法会调用父类的 update 方法来完成小部件的更新操作。 + * + * @param context 应用程序上下文,提供对应用资源和系统服务的访问。 + * @param appWidgetManager 桌面小部件管理器,用于管理小部件的生命周期和更新操作。 + * @param appWidgetIds 需要更新的小部件 ID 数组。 + */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + // 调用父类的 update 方法更新小部件 super.update(context, appWidgetManager, appWidgetIds); } + /** + * 获取 4x 小部件的布局 ID。 + * 该方法重写了父类的抽象方法,返回 4x 小部件对应的布局资源 ID。 + * + * @return 4x 小部件的布局资源 ID。 + */ + @Override protected int getLayoutId() { + // 返回 4x 小部件的布局资源 ID return R.layout.widget_4x; } + /** + * 根据背景颜色 ID 获取 4x 小部件的背景资源 ID。 + * 该方法重写了父类的抽象方法,使用 ResourceParser 工具类获取对应的背景资源 ID。 + * + * @param bgId 背景颜色 ID。 + * @return 4x 小部件对应的背景资源 ID。 + */ @Override protected int getBgResourceId(int bgId) { + // 使用 ResourceParser 工具类获取 4x 小部件的背景资源 ID return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); } + /** + * 获取 4x 小部件的类型。 + * 该方法重写了父类的抽象方法,返回 4x 小部件对应的类型常量。 + * + * @return 4x 小部件的类型常量。 + */ @Override protected int getWidgetType() { + // 返回 4x 小部件的类型常量 return Notes.TYPE_WIDGET_4X; } }