From c48d439bb40ce538da8cc4373acdb1849b00bd6d Mon Sep 17 00:00:00 2001 From: Dong Jiayi <2179258363@qq.com> Date: Thu, 15 May 2025 23:23:41 +0800 Subject: [PATCH 1/6] second --- 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 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 2/6] =?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 3/6] 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 4/6] 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类中 } } From e061c610239717a3d96930c8abb24f8a38d5584d Mon Sep 17 00:00:00 2001 From: Dong Jiayi <2179258363@qq.com> Date: Fri, 16 May 2025 01:07:17 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=96=87=E6=A1=A3v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/~$便签开源代码的泛读报告.docx | Bin 0 -> 162 bytes ...米便签开源代码的泛读报告.docx | Bin 17284 -> 17399 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/~$便签开源代码的泛读报告.docx diff --git a/doc/~$便签开源代码的泛读报告.docx b/doc/~$便签开源代码的泛读报告.docx new file mode 100644 index 0000000000000000000000000000000000000000..e2e9988a5b82f047df97316a628f781a62355ee4 GIT binary patch literal 162 ccmZQIGBmd|VjvN)G8i!!GMF=10%=+U01x;A6#xJL literal 0 HcmV?d00001 diff --git a/doc/小米便签开源代码的泛读报告.docx b/doc/小米便签开源代码的泛读报告.docx index 743021a2862767f943e6d3dc90249c740462e541..be42dcaa9d36c66cf74748de8996cb1bedb04b68 100644 GIT binary patch delta 8605 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 M1p&cA`k$x&2QzDOa{vGU From b55528808ad04c7e1ee130057bc573cc711dfbf8 Mon Sep 17 00:00:00 2001 From: ptaif8hk6 <198586914@qq.com> Date: Sun, 18 May 2025 23:16:50 +0800 Subject: [PATCH 6/6] =?UTF-8?q?Delete=20'doc/~$=E4=BE=BF=E7=AD=BE=E5=BC=80?= =?UTF-8?q?=E6=BA=90=E4=BB=A3=E7=A0=81=E7=9A=84=E6=B3=9B=E8=AF=BB=E6=8A=A5?= =?UTF-8?q?=E5=91=8A.docx'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/~$便签开源代码的泛读报告.docx | Bin 162 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/~$便签开源代码的泛读报告.docx diff --git a/doc/~$便签开源代码的泛读报告.docx b/doc/~$便签开源代码的泛读报告.docx deleted file mode 100644 index e2e9988a5b82f047df97316a628f781a62355ee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 ccmZQIGBmd|VjvN)G8i!!GMF=10%=+U01x;A6#xJL