From b7ef3c36ff6713ed31e51ef77b8aa46e0df040a8 Mon Sep 17 00:00:00 2001 From: Dong Jiayi <2179258363@qq.com> Date: Thu, 15 May 2025 23:30:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/widget/NoteWidgetProvider.java | 179 +++++++++++++++++------------ 1 file changed, 108 insertions(+), 71 deletions(-) diff --git a/src/widget/NoteWidgetProvider.java b/src/widget/NoteWidgetProvider.java index ec6f819..8c026d1 100644 --- a/src/widget/NoteWidgetProvider.java +++ b/src/widget/NoteWidgetProvider.java @@ -14,119 +14,156 @@ * limitations under the License. */ -package 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; - +package net.micode.notes.widget; // 定义包名,表示这个类所在的包 + +import android.app.PendingIntent; // 导入PendingIntent类,用于创建延迟的Intent +import android.appwidget.AppWidgetManager; // 导入AppWidgetManager类,用于管理小部件 +import android.appwidget.AppWidgetProvider; // 导入AppWidgetProvider类,用于定义小部件的行为 +import android.content.ContentValues; // 导入ContentValues类,用于存储要插入或更新的值 +import android.content.Context; // 导入Context类,用于访问应用程序环境 +import android.content.Intent; // 导入Intent类,用于在不同组件之间进行通信 +import android.database.Cursor; // 导入Cursor类,用于查询返回的数据集 +import android.util.Log; // 导入Log类,用于日志输出 +import android.widget.RemoteViews; // 导入RemoteViews类,用于定义小部件的布局和行为 + +import net.micode.notes.R; // 导入R类,用于访问应用程序的资源文件 +import net.micode.notes.data.Notes; // 导入Notes类,包含便签相关的数据操作 +import net.micode.notes.data.Notes.NoteColumns; // 导入NoteColumns类,包含便签数据表的列名 +import net.micode.notes.tool.ResourceParser; // 导入ResourceParser类,用于解析资源 +import net.micode.notes.ui.NoteEditActivity; // 导入NoteEditActivity类,用于编辑便签 +import net.micode.notes.ui.NotesListActivity; // 导入NotesListActivity类,用于显示便签列表 + +// 定义一个抽象的NoteWidgetProvider类,继承自AppWidgetProvider +// 这个类负责处理便签桌面小部件的通用逻辑 public abstract class NoteWidgetProvider extends AppWidgetProvider { + + // 定义查询便签时使用的列投影 public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_ID, - NoteColumns.SNIPPET + NoteColumns.ID, // 便签ID + NoteColumns.BG_COLOR_ID, // 便签背景颜色ID + NoteColumns.SNIPPET // 便签内容摘要 }; - public static final int COLUMN_ID = 0; - public static final int COLUMN_BG_COLOR_ID = 1; - public static final int COLUMN_SNIPPET = 2; + // 定义列索引常量,便于通过索引访问查询结果中的数据 + 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"; + // 定义日志标签 + private static final String TAG = "NoteWidgetProvider"; // 日志标签,便于在日志中识别来自这个类的日志信息 + // 当小部件被删除时调用的方法 + // @param context 应用上下文 + // @param appWidgetIds 被删除的小部件ID数组 @Override public void onDeleted(Context context, int[] appWidgetIds) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - for (int i = 0; i < appWidgetIds.length; i++) { - context.getContentResolver().update(Notes.CONTENT_NOTE_URI, - values, - NoteColumns.WIDGET_ID + "=?", - new String[] { String.valueOf(appWidgetIds[i])}); + ContentValues values = new ContentValues(); // 创建一个ContentValues对象,用于存储要更新的值 + values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); // 设置便签的WIDGET_ID为无效ID,表示该便签不再关联任何小部件 + for (int i = 0; i < appWidgetIds.length; i++) { // 遍历被删除的小部件ID数组 + // 更新数据库中便签的WIDGET_ID为无效ID + context.getContentResolver().update(Notes.CONTENT_NOTE_URI, // 数据表的URI + values, // 要更新的值 + NoteColumns.WIDGET_ID + "=?", // 查询条件,WIDGET_ID等于特定值 + new String[] { String.valueOf(appWidgetIds[i]) }); // 查询条件的值,即当前小部件ID } } + // 获取指定小部件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 + "<>?", - new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, - null); + // 查询数据库中WIDGET_ID等于特定值且PARENT_ID不等于废纸篓ID的便签信息 + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, // 数据表的URI + PROJECTION, // 查询的列 + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "!=?", // 查询条件 + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, // 查询条件的值 + null); // 排序方式,这里为null表示不排序 } + // 更新小部件的方法,调用另一个带有privacyMode参数的update方法 + // @param context 应用上下文 + // @param appWidgetManager 小部件管理器 + // @param appWidgetIds 需要更新的小部件ID数组 protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); + update(context, appWidgetManager, appWidgetIds, false); // 调用另一个update方法,privacyMode默认为false } + // 更新小部件的方法,处理小部件的更新逻辑 + // @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) { - int bgId = ResourceParser.getDefaultBgId(context); - String snippet = ""; - Intent intent = new Intent(context, NoteEditActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); - intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); - + for (int i = 0; i < appWidgetIds.length; i++) { // 遍历需要更新的小部件ID数组 + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { // 检查当前小部件ID是否有效 + int bgId = ResourceParser.getDefaultBgId(context); // 获取默认背景ID + String snippet = ""; // 初始化便签内容摘要为空字符串 + Intent intent = new Intent(context, NoteEditActivity.class); // 创建一个Intent对象,指向NoteEditActivity + intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // 设置Intent标志,表示如果目标Activity已经在任务栈顶,则不新建实例 + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); // 将小部件ID添加到Intent中 + intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); // 将小部件类型添加到Intent中 + + // 查询指定小部件ID的便签信息 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; + if (c != null && c.moveToFirst()) { // 检查查询结果是否有效并且有数据 + if (c.getCount() > 1) { // 检查查询结果的数量是否大于1 + Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); // 记录错误日志,表示有多个便签关联了同一个小部件ID + c.close(); // 关闭Cursor + return; // 返回,不继续执行 } - snippet = c.getString(COLUMN_SNIPPET); - bgId = c.getInt(COLUMN_BG_COLOR_ID); - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); - intent.setAction(Intent.ACTION_VIEW); + 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); + snippet = context.getResources().getString(R.string.widget_havenot_content); // 设置便签内容摘要为“没有内容” + intent.setAction(Intent.ACTION_INSERT_OR_EDIT); // 设置Intent动作,表示插入或编辑便签 } - if (c != null) { - c.close(); + if (c != null) { // 检查Cursor是否有效 + c.close(); // 关闭Cursor } - RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); - rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); - intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + // 创建一个RemoteViews对象,用于定义小部件的布局和行为 + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); // 获取小部件的布局资源ID + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); // 设置小部件背景图像资源ID + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); // 将背景ID添加到Intent中 + /** - * Generate the pending intent to start host for the widget + * 生成用于启动宿主Activity的PendingIntent */ - PendingIntent pendingIntent = null; - if (privacyMode) { - rv.setTextViewText(R.id.widget_text, - context.getString(R.string.widget_under_visit_mode)); + PendingIntent pendingIntent = null; // 初始化PendingIntent为null + if (privacyMode) { // 如果处于隐私模式 + rv.setTextViewText(R.id.widget_text, // 设置小部件文本视图的内容 + context.getString(R.string.widget_under_visit_mode)); // 设置内容为“正在访问模式” + // 创建一个PendingIntent,指向NotesListActivity pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); } else { - rv.setTextViewText(R.id.widget_text, snippet); + rv.setTextViewText(R.id.widget_text, snippet); // 设置小部件文本视图的内容为便签摘要 + // 创建一个PendingIntent,指向NoteEditActivity pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, PendingIntent.FLAG_UPDATE_CURRENT); } - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); // 设置小部件文本视图的点击事件为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 小部件类型ID protected abstract int getWidgetType(); } From 5e9d261adfaf44b862c8b5240a5f58032995b0a3 Mon Sep 17 00:00:00 2001 From: Dong Jiayi <2179258363@qq.com> Date: Thu, 15 May 2025 23:49:52 +0800 Subject: [PATCH 2/3] ffff --- src/widget/NoteWidgetProvider_4x.java | 40 +++++++++++++++++++-------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/widget/NoteWidgetProvider_4x.java b/src/widget/NoteWidgetProvider_4x.java index c12a02e..2a9d810 100644 --- a/src/widget/NoteWidgetProvider_4x.java +++ b/src/widget/NoteWidgetProvider_4x.java @@ -14,33 +14,51 @@ * limitations under the License. */ -package net.micode.notes.widget; +package net.micode.notes.widget; // 定义包名,表示这个类所在的包 -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; +import android.appwidget.AppWidgetManager; // 导入AppWidgetManager类,用于管理小部件 +import android.content.Context; // 导入Context类,用于访问应用程序环境 +import net.micode.notes.R; // 导入R类,用于访问应用程序的资源文件 +import net.micode.notes.data.Notes; // 导入Notes类,包含便签相关的数据操作 +import net.micode.notes.tool.ResourceParser; // 导入ResourceParser类,用于解析资源 +// 4×4尺寸便签桌面小部件的提供者类 +// 继承自NoteWidgetProvider基类,负责处理4×4尺寸便签小部件的更新和显示逻辑 public class NoteWidgetProvider_4x extends NoteWidgetProvider { + + // 小部件更新时调用的方法 + // @param context 应用上下文 + // @param appWidgetManager 小部件管理器 + // @param appWidgetIds 需要更新的小部件ID数组 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); + // 调用父类的更新方法处理通用更新逻辑 + super.update(context, appWidgetManager, appWidgetIds); // 调用父类的update方法,传入当前上下文、小部件管理器和小部件ID数组 } + // 获取小部件布局资源ID + // @return 4×4小部件对应的布局资源ID + @Override protected int getLayoutId() { - return R.layout.widget_4x; + // 返回4×4尺寸小部件使用的布局文件资源ID + return R.layout.widget_4x; // 返回布局资源ID,该ID指向一个名为widget_4x的XML布局文件 } + // 根据背景ID获取对应的背景资源ID + // @param bgId 背景样式ID + // @return 对应的背景资源ID @Override protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); + // 通过ResourceParser工具类获取4×4小部件背景资源ID + return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); // 使用ResourceParser类中的静态方法获取背景资源ID } + // 获取小部件类型 + // @return 小部件类型ID @Override protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; + // 返回4×4小部件的类型ID,该ID在Notes类中定义 + return Notes.TYPE_WIDGET_4X; // 返回小部件类型ID,表示这是一个4×4尺寸的小部件 } } From 8ad918c348ff33047723a262f250cc1dfb03cec7 Mon Sep 17 00:00:00 2001 From: Dong Jiayi <2179258363@qq.com> Date: Thu, 15 May 2025 23:53:07 +0800 Subject: [PATCH 3/3] zhushi --- src/widget/NoteWidgetProvider_2x.java | 39 +++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/widget/NoteWidgetProvider_2x.java b/src/widget/NoteWidgetProvider_2x.java index 64808e6..825ad18 100644 --- a/src/widget/NoteWidgetProvider_2x.java +++ b/src/widget/NoteWidgetProvider_2x.java @@ -14,34 +14,33 @@ * limitations under the License. */ -package net.micode.notes.widget;//hushvusgvs +package net.micode.notes.widget; // 定义包名,表示这个类属于net.micode.notes.widget这个包 -import android.appwidget.AppWidgetManager;//ivhsiuyvsivy -import android.content.Context; +import android.appwidget.AppWidgetManager; // 导入Android的AppWidgetManager类,用于管理App Widget的更新和事件 +import android.content.Context; // 导入Android的Context类,表示应用程序的环境信息 -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; +import net.micode.notes.R; // 导入R类,用于访问应用程序的资源,如布局文件,字符串等 +import net.micode.notes.data.Notes; // 导入Notes类,可能用于存储和操作笔记数据 +import net.micode.notes.tool.ResourceParser; // 导入ResourceParser类,可能用于解析应用程序的资源 - -public class NoteWidgetProvider_2x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); +public class NoteWidgetProvider_2x extends NoteWidgetProvider { // 定义一个名为NoteWidgetProvider_2x的类,它继承自NoteWidgetProvider + @Override // 表示下面的方法重写了父类的方法 + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // 定义onUpdate方法,当App Widget需要更新时会被调用 + super.update(context, appWidgetManager, appWidgetIds); // 调用父类的update方法,传入上下文、AppWidgetManager和AppWidget的ID数组,以更新App Widget } - @Override - protected int getLayoutId() { - return R.layout.widget_2x; + @Override // 表示下面的方法重写了父类的方法 + protected int getLayoutId() { // 定义getLayoutId方法,用于获取App Widget的布局资源ID + return R.layout.widget_2x; // 返回布局资源ID,R.layout.widget_2x表示具体的布局文件 } - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); + @Override // 表示下面的方法重写了父类的方法 + protected int getBgResourceId(int bgId) { // 定义getBgResourceId方法,用于获取背景资源ID,传入背景ID作为参数 + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); // 调用ResourceParser类中的方法,获取2x大小App Widget的背景资源ID } - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_2X; + @Override // 表示下面的方法重写了父类的方法 + protected int getWidgetType() { // 定义getWidgetType方法,用于获取App Widget的类型 + return Notes.TYPE_WIDGET_2X; // 返回2x大小App Widget的类型,TYPE_WIDGET_2X是一个常量,定义在Notes类中 } }