diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index 8d70bd2..e668f4a 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -72,44 +72,23 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -/** - * NoteEditActivity - 便签编辑界面活动类 - * 作为便签应用的核心编辑界面,负责便签的创建、编辑、查看和删除等功能。 - * 支持普通文本模式和待办事项列表模式,提供背景颜色和字体大小的自定义设置, - * 以及提醒功能的管理。 - * - * 主要功能: - * - 便签内容编辑(支持普通文本和待办事项列表两种模式) - * - 背景颜色选择 - * - 字体大小调整 - * - 提醒时间设置 - * - 搜索结果高亮显示 - * - 便签快捷方式创建 - * - 便签 widget 支持 - * - * 核心组件: - * - {@link #mWorkingNote} - 处理便签数据的工作类 - * - {@link #mNoteEditor} - 便签内容编辑器 - * - {@link #mNoteBgColorSelector} - 背景颜色选择器 - * - {@link #mFontSizeSelector} - 字体大小选择器 - */ -public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener { - /** - * HeadViewHolder - 便签头部视图的持有者类 - * 用于缓存便签头部的各个UI组件,提高视图访问效率。 - */ +public class NoteEditActivity extends Activity + //public class NoteEditActivity表示声明一个新的公开的类,extends Activity表示继承Android的Activity类(意思就是这个类实现的其实是一个用户交互界面) + //implement为一个类所需实现功能的承诺,NoteEditActivity将实现三个接口中所定义的所有功能 + implements OnClickListener, //OnClickListener——处理点击事件 + NoteSettingChangedListener, //NoteSettingChangedListener——监听便签设置变化 + OnTextViewChangeListener { //OnTextViewChangeListener——监听文本修改变化 + private class HeadViewHolder { - public TextView tvModified; // 修改日期文本视图 - public ImageView ivAlertIcon; // 提醒图标 - public TextView tvAlertDate; // 提醒日期文本视图 - public ImageView ibSetBgColor; // 设置背景颜色按钮 + public TextView tvModified; + + public ImageView ivAlertIcon; + + public TextView tvAlertDate; + + public ImageView ibSetBgColor; } - /** - * 背景选择按钮ID与背景颜色资源ID的映射关系 - * 用于快速查找用户点击的背景选择按钮对应的背景颜色资源。 - */ private static final Map sBgSelectorBtnsMap = new HashMap(); static { sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); @@ -119,10 +98,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); } - /** - * 背景颜色资源ID与背景选择指示器ID的映射关系 - * 用于根据当前选择的背景颜色显示对应的选择指示器。 - */ private static final Map sBgSelectorSelectionMap = new HashMap(); static { sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); @@ -132,10 +107,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); } - /** - * 字体大小按钮ID与字体大小资源ID的映射关系 - * 用于快速查找用户点击的字体大小按钮对应的字体大小资源。 - */ private static final Map sFontSizeBtnsMap = new HashMap(); static { sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); @@ -144,10 +115,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); } - /** - * 字体大小资源ID与字体选择指示器ID的映射关系 - * 用于根据当前选择的字体大小显示对应的选择指示器。 - */ private static final Map sFontSelectorSelectionMap = new HashMap(); static { sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); @@ -156,30 +123,41 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); } - private static final String TAG = "NoteEditActivity"; // 日志标签 + private static final String TAG = "NoteEditActivity"; + + private HeadViewHolder mNoteHeaderHolder; + + private View mHeadViewPanel; + + private View mNoteBgColorSelector; + + private View mFontSizeSelector; + + private EditText mNoteEditor; + + private View mNoteEditorPanel; - private HeadViewHolder mNoteHeaderHolder; // 便签头部视图持有者 - private View mHeadViewPanel; // 便签头部面板 - private View mNoteBgColorSelector; // 背景颜色选择器视图 - private View mFontSizeSelector; // 字体大小选择器视图 - private EditText mNoteEditor; // 便签内容编辑器 - private View mNoteEditorPanel; // 便签编辑器面板 - private WorkingNote mWorkingNote; // 工作便签实例 - private SharedPreferences mSharedPrefs; // 共享偏好设置 - private int mFontSizeId; // 当前字体大小ID + private WorkingNote mWorkingNote; - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; // 字体大小偏好键 + private SharedPreferences mSharedPrefs; + private int mFontSizeId; - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; // 快捷方式图标标题最大长度 + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; - public static final String TAG_CHECKED = String.valueOf('\u221A'); // 待办事项已完成标记 - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); // 待办事项未完成标记 + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; - private LinearLayout mEditTextList; // 便签编辑列表容器 + public static final String TAG_CHECKED = String.valueOf('\u221A'); + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); - private String mUserQuery; // 用户搜索查询词 - private Pattern mPattern; // 搜索查询词的正则表达式模式 + private LinearLayout mEditTextList; + private String mUserQuery; + private Pattern mPattern; + + /** + * 初始化Activity界面与资源 + * @param savedInstanceState + */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -210,12 +188,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 初始化活动状态 - * 根据传入的Intent处理不同的操作类型,包括查看便签、创建新便签和处理来电记录便签。 - * @param intent 传入的Intent对象 - * @return 是否成功初始化活动状态 - */ private boolean initActivityState(Intent intent) { /** * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, @@ -305,11 +277,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, initNoteScreen(); } - /** - * 初始化便签界面 - * 设置便签的字体大小、内容、背景颜色和提醒信息等界面元素。 - * 根据便签模式(普通文本或待办事项列表)显示不同的界面布局。 - */ private void initNoteScreen() { mNoteEditor.setTextAppearance(this, TextAppearanceResources .getTexAppearanceResource(mFontSizeId)); @@ -391,13 +358,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return super.dispatchTouchEvent(ev); } - /** - * 检查触摸事件是否在指定视图范围内 - * 用于判断用户的触摸操作是否发生在某个特定视图上。 - * @param view 要检查的视图 - * @param ev 触摸事件 - * @return 触摸事件是否在视图范围内 - */ private boolean inRangeOfView(View view, MotionEvent ev) { int []location = new int[2]; view.getLocationOnScreen(location); @@ -412,10 +372,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } - /** - * 初始化界面资源 - * 初始化并绑定所有界面元素,设置监听器,加载偏好设置等。 - */ private void initResources() { mHeadViewPanel = findViewById(R.id.note_title); mNoteHeaderHolder = new HeadViewHolder(); @@ -478,12 +434,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, setResult(RESULT_OK, intent); } - /** - * 处理视图点击事件 - * 响应背景颜色选择按钮、字体大小选择按钮等UI元素的点击事件, - * 执行相应的背景颜色和字体大小设置操作。 - * @param v 被点击的视图 - */ public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_set_bg_color) { @@ -511,11 +461,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 处理返回按钮点击事件 - * 先检查是否需要清除当前的设置状态(如背景选择器或字体选择器是否可见), - * 如果不需要则保存便签并返回上一个界面。 - */ @Override public void onBackPressed() { if(clearSettingState()) { @@ -526,11 +471,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, super.onBackPressed(); } - /** - * 清除设置状态 - * 隐藏背景颜色选择器和字体大小选择器等设置界面元素。 - * @return 是否有设置界面元素被隐藏 - */ private boolean clearSettingState() { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { mNoteBgColorSelector.setVisibility(View.GONE); @@ -542,10 +482,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return false; } - /** - * 背景颜色变化回调方法 - * 当便签的背景颜色发生变化时调用,更新界面上的背景颜色显示。 - */ public void onBackgroundColorChanged() { findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.VISIBLE); @@ -626,18 +562,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } - /** - * 设置便签提醒 - * 显示日期时间选择对话框,让用户选择提醒时间,并设置到当前便签上。 - */ - private void setReminder() { - DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); + private void setReminder() { //设置提醒 + DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); //创建日期时间选择对话框 d.setOnDateTimeSetListener(new OnDateTimeSetListener() { public void OnDateTimeSet(AlertDialog dialog, long date) { - mWorkingNote.setAlertDate(date , true); + mWorkingNote.setAlertDate(date , true); //设置提醒时间 } }); - d.show(); + d.show(); //显示时间选择器 } /** @@ -651,10 +583,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, context.startActivity(intent); } - /** - * 创建新便签 - * 保存当前正在编辑的便签,然后启动一个新的NoteEditActivity来创建新便签。 - */ private void createNewNote() { // Firstly, save current editing notes saveNote(); @@ -667,10 +595,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, startActivity(intent); } - /** - * 删除当前便签 - * 根据是否处于同步模式,将当前便签直接删除或移到回收站文件夹。 - */ private void deleteCurrentNote() { if (mWorkingNote.existInDatabase()) { HashSet ids = new HashSet(); @@ -693,21 +617,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, mWorkingNote.markDeleted(true); } - /** - * 检查是否处于同步模式 - * 根据是否设置了Google同步账户来判断是否处于同步模式。 - * @return 是否处于同步模式 - */ private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } - /** - * 提醒时间变化回调方法 - * 当便签的提醒时间发生变化时调用,更新界面上的提醒信息显示。 - * @param date 提醒时间戳 - * @param set 是否设置了提醒 - */ public void onClockAlertChanged(long date, boolean set) { /** * User could set clock to an unsaved note, so before setting the @@ -738,20 +651,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 小部件变更回调方法 - * 当便签的小部件相关属性发生变化时调用,更新小部件显示。 - */ public void onWidgetChanged() { updateWidget(); } - /** - * 编辑框删除回调方法 - * 当待办事项列表模式下删除某个编辑框时调用,处理列表项的重新排序和内容合并。 - * @param index 删除的编辑框索引 - * @param text 被删除编辑框中的文本内容 - */ public void onEditTextDelete(int index, String text) { int childCount = mEditTextList.getChildCount(); if (childCount == 1) { @@ -778,12 +681,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.setSelection(length); } - /** - * 编辑框回车回调方法 - * 当待办事项列表模式下编辑框中按下回车键时调用,创建新的列表项。 - * @param index 当前编辑框的索引 - * @param text 编辑框中剩余的文本内容 - */ public void onEditTextEnter(int index, String text) { /** * Should not happen, check for debug @@ -803,11 +700,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 切换到列表模式 - * 将便签从普通文本模式切换到待办事项列表模式,根据现有文本内容创建待办事项列表项。 - * @param text 便签的当前文本内容 - */ private void switchToListMode(String text) { mEditTextList.removeAllViews(); String[] items = text.split("\n"); @@ -825,13 +717,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, mEditTextList.setVisibility(View.VISIBLE); } - /** - * 获取带查询结果高亮的文本 - * 在便签内容中查找并高亮显示与用户搜索查询词匹配的文本。 - * @param fullText 便签的完整文本内容 - * @param userQuery 用户的搜索查询词 - * @return 带有高亮显示的搜索结果的Spannable文本 - */ private Spannable getHighlightQueryResult(String fullText, String userQuery) { SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); if (!TextUtils.isEmpty(userQuery)) { @@ -849,13 +734,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return spannable; } - /** - * 获取列表项视图 - * 为待办事项列表模式创建并配置一个列表项视图,包含复选框和编辑框。 - * @param item 列表项的文本内容 - * @param index 列表项的索引位置 - * @return 创建好的列表项视图 - */ private View getListItem(String item, int index) { View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); @@ -887,13 +765,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, return view; } - /** - * 文本变化回调方法 - * 当待办事项列表模式下编辑框中的文本内容发生变化时调用, - * 根据文本是否为空显示或隐藏对应的复选框。 - * @param index 编辑框的索引位置 - * @param hasText 编辑框中是否有文本内容 - */ public void onTextChange(int index, boolean hasText) { if (index >= mEditTextList.getChildCount()) { Log.e(TAG, "Wrong index, should not happen"); @@ -906,13 +777,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 待办事项模式变化回调方法 - * 当便签的模式从普通文本模式切换到待办事项列表模式或反之亦然时调用, - * 执行相应的界面布局切换和数据处理。 - * @param oldMode 之前的模式 - * @param newMode 新的模式 - */ public void onCheckListModeChanged(int oldMode, int newMode) { if (newMode == TextNote.MODE_CHECK_LIST) { switchToListMode(mNoteEditor.getText().toString()); @@ -927,13 +791,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } - /** - * 获取当前工作文本 - * 根据当前便签模式(普通文本或待办事项列表)获取编辑框中的文本内容, - * 并更新到WorkingNote对象中。对于待办事项列表模式,会为每个列表项添加 - * 相应的完成或未完成标记。 - * @return 是否有待办事项已完成 - */ private boolean getWorkingText() { boolean hasChecked = false; if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { @@ -957,32 +814,31 @@ public class NoteEditActivity extends Activity implements OnClickListener, return hasChecked; } - /** - * 保存便签 - * 获取当前编辑的文本内容并保存到数据库中。根据保存结果设置返回结果码, - * 用于区分是打开现有便签还是创建新便签的情况。 - * 从列表视图到编辑视图有两种模式:打开现有便签和创建/编辑便签。 - * 打开便签时,返回时需要回到列表中的原始位置; - * 创建新便签时,返回时需要回到列表顶部。 - * 这里使用{@link #RESULT_OK}来标识创建/编辑状态。 - * @return 是否成功保存便签 - */ private boolean saveNote() { getWorkingText(); boolean saved = mWorkingNote.saveNote(); + if (TextUtils.isEmpty(mWorkingNote.getContent())) { + deleteCurrentNote();//删除当前便签 + saved = false; // 标记为未保存 if (saved) { + /** + * There are two modes from List view to edit view, open one note, + * create/edit a node. Opening node requires to the original + * position in the list when back from edit view, while creating a + * new node requires to the top of the list. This code + * {@link #RESULT_OK} is used to identify the create/edit state + */ setResult(RESULT_OK); } return saved; } - /** - * 发送便签到桌面 - * 在桌面上创建当前便签的快捷方式,方便用户快速访问。 - * 发送前会确保当前编辑的便签已保存到数据库中。 - */ private void sendToDesktop() { - // 发送到桌面之前,确保当前编辑的便签已存在于数据库中 + /** + * Before send message to home, we should make sure that current + * editing note is exists in databases. So, for new note, firstly + * save it + */ if (!mWorkingNote.existInDatabase()) { saveNote(); } @@ -1002,19 +858,16 @@ public class NoteEditActivity extends Activity implements OnClickListener, showToast(R.string.info_note_enter_desktop); sendBroadcast(sender); } else { - // 用户未输入任何内容(便签不值得保存),没有便签ID + /** + * There is the condition that user has input nothing (the note is + * not worthy saving), we have no note id, remind the user that he + * should input something + */ Log.e(TAG, "Send to desktop error"); showToast(R.string.error_note_empty_for_send_to_desktop); } } - /** - * 生成快捷方式图标标题 - * 从便签内容中提取快捷方式图标的标题,移除待办事项的标记字符, - * 并确保标题长度不超过最大限制。 - * @param content 便签的完整内容 - * @return 生成的快捷方式图标标题 - */ private String makeShortcutIconTitle(String content) { content = content.replace(TAG_CHECKED, ""); content = content.replace(TAG_UNCHECKED, "");