You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TEST1231/NoteWidgetProvider.java

157 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* 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;
import android.app.PendingIntent; // 用于处理延迟执行的Intent
import android.appwidget.AppWidgetManager; // 管理应用小部件的类
import android.appwidget.AppWidgetProvider; // 小部件的基类
import android.content.ContentValues; // 用于向ContentProvider提供新值
import android.content.Context; // 提供应用环境信息的类
import android.content.Intent; // 用于不同组件间通信的类
import android.database.Cursor; // 用于遍历查询结果的类
import android.util.Log; // 用于打印日志信息
import android.widget.RemoteViews; // 用于在远程视图中更新小部件的UI
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; // 编辑笔记的Activity
import net.micode.notes.ui.NotesListActivity; // 笔记列表的Activity
// 定义一个抽象类,用于实现自定义笔记小部件
public abstract class NoteWidgetProvider extends AppWidgetProvider {
// 定义查询笔记时需要的列
public static final String [] PROJECTION = new String [] {
NoteColumns.ID, // 笔记ID
NoteColumns.BG_COLOR_ID, // 笔记背景颜色ID
NoteColumns.SNIPPET // 笔记摘要
};
// 定义列的索引用于从Cursor中获取数据
public static final int COLUMN_ID = 0;
public static final int COLUMN_BG_COLOR_ID = 1;
public static final int COLUMN_SNIPPET = 2;
// 定义日志标签
private static final String TAG = "NoteWidgetProvider";
// 当小部件被删除时调用
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
// 更新被删除小部件对应的笔记中的WIDGET_ID为无效值
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])});
}
}
// 根据小部件ID获取笔记信息
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);
}
// 更新小部件的UI公开方法
protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
update(context, appWidgetManager, appWidgetIds, false);
}
// 更新小部件的UI私有方法支持隐私模式
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);
String snippet = "";
// 创建跳转到编辑笔记Activity的Intent
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());
// 查询小部件对应的笔记信息
Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]);
if (c != null && c.moveToFirst()) {
if (c.getCount() > 1) {
// 如果有多条记录打印错误日志并关闭Cursor
Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]);
c.close();
return;
}
// 从Cursor中获取摘要和背景ID并设置Intent的额外数据
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);
} else {
// 如果没有找到笔记设置默认摘要文本和Intent动作
snippet = context.getResources().getString(R.string.widget_havenot_content);
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
}
// 关闭Cursor
if (c != null) {
c.close();
}
// 创建RemoteViews对象并设置背景和资源
RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId());
rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId));
intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId);
// 根据隐私模式设置不同的PendingIntent
PendingIntent pendingIntent = null;
if (privacyMode) {
// 隐私模式下设置文本为提示信息并创建跳转到笔记列表的PendingIntent
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 {
// 非隐私模式下设置文本为摘要并创建跳转到编辑笔记的PendingIntent
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
protected abstract int getBgResourceId(int bgId);
// 抽象方法用于获取小部件的布局ID
protected abstract int getLayoutId();
// 抽象方法,用于获取小部件的类型
protected abstract int getWidgetType();
}