From dd3315cf722050ebe5cdc90adc7f101d0d29bdd3 Mon Sep 17 00:00:00 2001 From: LQS <253192890@qq.com> Date: Fri, 19 Jan 2024 12:46:50 +0800 Subject: [PATCH] final --- doc/阅读维护开源软件的汇报.pptx | Bin 1915648 -> 1918721 bytes .../micode/notes/ui/AlarmAlertActivity.java | 154 ++++++- .../micode/notes/ui/AlarmInitReceiver.java | 43 +- .../net/micode/notes/ui/AlarmReceiver .java | 57 +++ .../net/micode/notes/ui/AlarmReceiver.java | 27 ++ .../net/micode/notes/ui/DateTimePicker.java | 103 ++++- .../micode/notes/ui/DateTimePickerDialog.java | 36 +- .../src/net/micode/notes/ui/DropdownMenu.java | 32 +- .../micode/notes/ui/FoldersListAdapter.java | 37 +- .../net/micode/notes/ui/NoteEditActivity.java | 401 ++++++++++++++---- .../src/net/micode/notes/ui/NoteEditText.java | 107 +++-- .../src/net/micode/notes/ui/NoteItemData.java | 32 +- .../micode/notes/ui/NotesListActivity.java | 335 ++++++++++++++- .../net/micode/notes/ui/NotesListAdapter.java | 112 ++++- .../net/micode/notes/ui/NotesListItem.java | 27 +- .../notes/ui/NotesPreferenceActivity.java | 205 +++++++-- 16 files changed, 1497 insertions(+), 211 deletions(-) create mode 100644 src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver .java diff --git a/doc/阅读维护开源软件的汇报.pptx b/doc/阅读维护开源软件的汇报.pptx index e8906c4f2c88f61c41b05ef4bde989c00bbdabe5..263ec809f1fdb174f8da9d4c78716e8145f05333 100644 GIT binary patch delta 106203 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

wm&47%QH%s|6@MFW-pM187 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 S&lBKTSr9FvH4zBf!v6&<(Ip80 diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..6609d84 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -39,36 +39,80 @@ import net.micode.notes.tool.DataUtils; import java.io.IOException; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: AlarmAlertActivity + * @Description: AlarmAlertActivity类的作用是作为一个提醒警报的活动界面。 + * 当便签的提醒功能触发时,系统会启动AlarmAlertActivity,显示提醒的详细内容和相关操作选项, + * 让用户可以对提醒进行处理,比如查看提醒内容、延迟提醒或者标记为已完成等操作。 + * 这个类主要负责提醒相关的界面展示和用户交互逻辑。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 10:33 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 10:33 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; + private long mNoteId;//文本在数据库存储中的ID号 + private String mSnippet;//闹钟提示时出现的文本片段 private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; + + /** + * @method onCreate + * @description : + * 初始化提醒界面的布局和逻辑。 + * 设置窗口特性,请求不显示标题栏,并在锁屏状态下显示提醒界面。 + * 获取传入该活动的Intent对象,并尝试从中获取便签的ID。 + * 使用获取到的便签ID获取便签的摘要信息,并进行相应的处理。 + * 创建一个MediaPlayer对象,用于播放提醒的声音。 + * 检查该便签是否在便签数据库中可见。 + * 如果便签可见,则显示操作对话框,并播放提醒音效。 + * 如果便签不可见,则关闭该界面。 + * @date: 2023-12-24 10:41 + * @author: xumingyang + * @param + * @return + */ + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 + //onsaveInstanceState方法是用来保存Activity的状态的 + //能从onCreate的参数savedInsanceState中获得状态数 requestWindowFeature(Window.FEATURE_NO_TITLE); - + //界面显示——无标题 final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); if (!isScreenOn()) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + //保持窗体点亮 | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + //将窗体点亮 | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + //允许窗体点亮时锁屏 | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } + }//在手机锁屏后如果到了闹钟提示时间,点亮屏幕 Intent intent = getIntent(); try { mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + //根据ID从数据库中获取标签的内容; + //getContentResolver()是实现数据共享,实例存储 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; + //判断标签片段是否达到符合长度 } catch (IllegalArgumentException e) { e.printStackTrace(); return; @@ -77,20 +121,44 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); + //弹出对话框 playAlarmSound(); + //闹钟提示音激发 } else { finish(); + //完成闹钟动作 } } + + /** + * @method isScreenOn + * @description 判断屏幕是否锁屏,调用系统函数判断 + * @date: 2023-12-24 10:45 + * @author: xumingyang + * @param + * @return bool 类型 + */ private boolean isScreenOn() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } + + + /** + * @method playAlarmSound + * @description: + * 该段代码的作用是根据用户的设置,播放系统默认的闹钟铃声。 + * 并且可以支持在静音模式下播放闹钟铃声 + * @date: 2023-12-24 10:47 + * @author: xumingyang + * @param + * @return + */ private void playAlarmSound() { Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - + //调用系统的铃声管理URI,得到闹钟提示音 int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); @@ -101,12 +169,20 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); + //方法:setDataSource(Context context, Uri uri) + //解释:无返回值,设置多媒体数据来源【根据 Uri】 mPlayer.prepare(); + //准备同步 mPlayer.setLooping(true); + //设置是否循环播放 mPlayer.start(); + //开始播放 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); + //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 + //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 + } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -119,39 +195,105 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } } + + /** + * @method showActionDialog + * @description + * 创建一个AlertDialog.Builder对象,并设置对话框的标题为应用的名称(R.string.app_name)。 + * 将对话框的消息内容设置为mSnippet变量所存储的文本信息。 + * 设置对话框的积极按钮(Positive Button)的文本为“确定”(R.string.notealert_ok),并将当前类作为按钮的点击监听器。 + * 如果屏幕处于开启状态(通过isScreenOn()方法判断),则设置对话框的消极按钮(Negative Button)的文本为“进入”(R.string.notealert_enter),并将当前类作为按钮的点击监听器。 + * 调用dialog.show().setOnDismissListener(this)方法显示对话框,并设置当前类作为对话框消失时的监听器。 + * @date: 2023-12-24 10:51 + * @author: xumingyang + * @param + * @return + */ + private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); + /* + * AlertDialog的构造方法全部是Protected的 + * 所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 + * 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 + * 如这里的dialog就是新建了一个AlertDialog + */ dialog.setTitle(R.string.app_name); + //为对话框设置标题 dialog.setMessage(mSnippet); + //为对话框设置内容 dialog.setPositiveButton(R.string.notealert_ok, this); + //给对话框添加"Yes"按钮 if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); - } + }//对话框添加"No"按钮 dialog.show().setOnDismissListener(this); } + + + /** + * @method onClick + * @description : + * 根据点击的按钮类型执行相应的操作, + * 如果点击的是对话框中的消极按钮,则打开一个新的便签编辑界面,并将当前笔记的id传递给该Activity。 + * @date: 2023-12-24 10:55 + * @author: xumingyang + * @param + * @return + */ public void onClick(DialogInterface dialog, int which) { switch (which) { + //用which来选择click后下一步的操作 case DialogInterface.BUTTON_NEGATIVE: + //这是取消操作 Intent intent = new Intent(this, NoteEditActivity.class); + //实现两个类间的数据传输 intent.setAction(Intent.ACTION_VIEW); + //设置动作属性 intent.putExtra(Intent.EXTRA_UID, mNoteId); + //实现key-value对 + //EXTRA_UID为key;mNoteId为键 startActivity(intent); + //开始动作 break; default: + //这是确定操作' break; } } + + /** + * @method onDismiss + * @description 在闹钟提醒对话框消失时,停止闹钟铃声并结束当前Activity的生命周期。 + * @date: 2023-12-24 10:57 + * @author: xumingyang + * @param + * @return + */ public void onDismiss(DialogInterface dialog) { stopAlarmSound(); + //停止闹钟声音 finish(); + //完成该动作 } + + /** + * @method stopAlarmSound + * @description 停止正在播放的闹钟声音,并释放相关的资源。 + * @date: 2023-12-24 10:58 + * @author: xumingyang + * @param + * @return + */ private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); + //停止播放 mPlayer.release(); + //释放MediaPlayer对象 mPlayer = null; } } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java index f221202..bdd8067 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java @@ -28,25 +28,59 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: AlarmInitReceiver + * @Description: AlarmInitReceiver类是小米便签应用中的一个广播接收器(BroadcastReceiver) + * 其作用是在设备启动时接收系统发送的广播,并执行一些初始化操作 + * @Author: xumingyang + * @CreateDate: 2023-12-24 11:11 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 11:11 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + + public class AlarmInitReceiver extends BroadcastReceiver { private static final String [] PROJECTION = new String [] { NoteColumns.ID, NoteColumns.ALERTED_DATE }; - + //对数据库的操作,调用标签ID和闹钟时间 private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; + + /** + * @method onReceive + * @description 是在设备启动后,通过查询数据库找到需要提醒的标签,并设置对应的闹钟。 + * 这样,在设备启动完成后,小米便签应用可以重新加载标签的提醒功能,确保按时提醒用户。 + * @date: 2023-12-24 11:26 + * @author: xumingyang + * @param *Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 + * 从游标中获取提醒日期(alertDate) + * 创建一个新的Intent对象(sender),并指定目标广播接收器(AlarmReceiver) + * 创建PendingIntent:使用getBroadcast()方法创建一个用于启动广播的PendingIntent对象(pendingIntent) + * @return 查询结果将以Cursor对象(c)返回 + */ + @Override public void onReceive(Context context, Intent intent) { long currentDate = System.currentTimeMillis(); + //System.currentTimeMillis()产生一个当前的毫秒 + //这个毫秒其实就是自1970年1月1日0时起的毫秒数 + Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, + //将long变量currentDate转化为字符串 null); - + //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 if (c != null) { if (c.moveToFirst()) { do { @@ -62,4 +96,9 @@ public class AlarmInitReceiver extends BroadcastReceiver { c.close(); } } +/* + * 然而通过网上查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤 + * 如新建Intent、PendingIntent以及AlarmManager等 + * 这里就是根据数据库里的闹钟时间创建一个闹钟机制 + */ } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver .java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver .java new file mode 100644 index 0000000..b29d722 --- /dev/null +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver .java @@ -0,0 +1,57 @@ +/* + * 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.ui; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: AlarmReceiver + * @Description: 通过AlarmReceiver类,可以实现小米便签的提醒功能, + * 让用户按时收到提醒并进行相应的操作。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 12:46 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 12:46 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + + + /** + * @method + * @description 段代码是用于在接收到广播时启动AlarmAlertActivity活动,并在新的任务栈中展示该活动 + * @param *Context context和Intent intent,其中context表示上下文环境,intent表示接收到的广播意图。 + * @return + */ + +public class AlarmReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + //重写了onReceive()方法,该方法在接收到广播时会被调用 + intent.setClass(context, AlarmAlertActivity.class); + //启动AlarmAlertActivity + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 + //所以要新起一个栈装入启动的activity + context.startActivity(intent); + } +} diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java index 54e503b..b29d722 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java @@ -20,11 +20,38 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: AlarmReceiver + * @Description: 通过AlarmReceiver类,可以实现小米便签的提醒功能, + * 让用户按时收到提醒并进行相应的操作。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 12:46 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 12:46 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + + + /** + * @method + * @description 段代码是用于在接收到广播时启动AlarmAlertActivity活动,并在新的任务栈中展示该活动 + * @param *Context context和Intent intent,其中context表示上下文环境,intent表示接收到的广播意图。 + * @return + */ + public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + //重写了onReceive()方法,该方法在接收到广播时会被调用 intent.setClass(context, AlarmAlertActivity.class); + //启动AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 + //所以要新起一个栈装入启动的activity context.startActivity(intent); } } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePicker.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePicker.java index 496b0cd..e81e920 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePicker.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePicker.java @@ -28,8 +28,25 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; -public class DateTimePicker extends FrameLayout { +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: DateTimePicker + * @Description: 用于选择日期和时间的自定义视图,包括年、月、日、时、分等选择器。 + * 它使用了NumberPicker控件来实现日期和时间的选择功能,并提供了一些回调接口以便在日期和时间改变时进行通知。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 12:58 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 12:58 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + +public class DateTimePicker extends FrameLayout { + //FrameLayout是布局模板之一 + //所有的子元素全部在屏幕的右上方 private static final boolean DEFAULT_ENABLE_STATE = true; private static final int HOURS_IN_HALF_DAY = 12; @@ -45,12 +62,17 @@ public class DateTimePicker extends FrameLayout { private static final int MINUT_SPINNER_MAX_VAL = 59; private static final int AMPM_SPINNER_MIN_VAL = 0; private static final int AMPM_SPINNER_MAX_VAL = 1; + //初始化控件 private final NumberPicker mDateSpinner; private final NumberPicker mHourSpinner; private final NumberPicker mMinuteSpinner; private final NumberPicker mAmPmSpinner; + //NumberPicker是数字选择器 + //这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午) + private Calendar mDate; + //定义了Calendar类型的变量mDate,用于操作时间 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; @@ -72,8 +94,23 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; + //OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 + //将现在日期的值传递给mDate;updateDateControl是同步操作 private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + //这里是对 小时(Hour) 的监听 + + /** + * @method onValueChange + * @description 这段代码是一个回调函数,用于监听NumberPicker的数值改变事件。 + * 当用户改变了时间选择器中的小时数时,就会触发这个回调函数。 + * 在函数中,首先判断当前选择器是否为24小时制,如果不是则需要处理上下午的切换和跨天的情况。 + * @date: 2023-12-24 13:03 + * @author: xumingyang + * @param *声明一个Calendar的变量cal,便于后续的操作 + * @return isdateChanged bool类型 判断是否需要对时间进行调整 + */ + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; @@ -83,29 +120,33 @@ public class DateTimePicker extends FrameLayout { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //这里是对于12小时制时,晚上11点和12点交替时对日期的更改 } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; - } + }//这里是对于12小时制时,晚上11点和12点交替时对日期的更改 if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { mIsAm = !mIsAm; updateAmPmControl(); - } + }//这里是对于12小时制时,中午11点和12点交替时对AM和PM的更改 } else { if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //这里是对于24小时制时,晚上11点和12点交替时对日期的更改 } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - } + }//这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + //通过数字选择器对newHour的赋值 mDate.set(Calendar.HOUR_OF_DAY, newHour); + //通过set函数将新的Hour值传给mDate onDateTimeChanged(); if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); @@ -116,16 +157,27 @@ public class DateTimePicker extends FrameLayout { }; private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { + /** + * @method onValueChange + * @description 用于监控 NumberPicker(数字选择器)的数值变化事件。 + * 具体来说,这个监听器是用于监听分钟选择器的数值变化。 + * @param *三个参数:picker(当前的 NumberPicker 对象)、oldVal(旧值)和 newVal(新值) + */ + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + //设置offset,作为小时改变的一个记录数据 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } + //如果原值为59,新值为0,则offset加1 + //如果原值为0,新值为59,则offset减1 + if (offset != 0) { mDate.add(Calendar.HOUR_OF_DAY, offset); mHourSpinner.setValue(getCurrentHour()); @@ -145,9 +197,16 @@ public class DateTimePicker extends FrameLayout { }; private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { + /** + * @method onValueChange + * @description 实现了一个监听器,用于监测用户对NumberPicker控件数值的改变, + * 并根据改变的数值来更新界面上的上午/下午控件 + */ + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mIsAm = !mIsAm; + //对AM和PM的监听 if (mIsAm) { mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); } else { @@ -165,19 +224,24 @@ public class DateTimePicker extends FrameLayout { public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); - } + }//通过对数据库的访问,获取当前的系统时间 public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); - } + }//上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); + //获取系统时间 mDate = Calendar.getInstance(); mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - + /* + * 如果当前Activity里用到别的layout,比如对话框layout + * 还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 + * 然后再用findViewById()找到它上面的其它组件 + */ mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); @@ -214,17 +278,30 @@ public class DateTimePicker extends FrameLayout { mInitialising = false; } + + /** + * @method setEnabled + * @description 这个函数用于统一设置控件及其相关子控件的可用状态,并且会根据传入的参数值进行相应的操作 + * @param *布尔值 enabled,用于指定控件是否可用。 + * @return 将 mIsEnabled 的值更新为传入的 enabled,以保持状态同步 + */ + @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { return; } + /* + * 如果传入的参数 enabled 与当前的控件可用状态 mIsEnabled 相同,则无需进行任何操作,直接返回。 + * 这样可以避免重复设置控件的可用状态。 + */ super.setEnabled(enabled); mDateSpinner.setEnabled(enabled); mMinuteSpinner.setEnabled(enabled); mHourSpinner.setEnabled(enabled); mAmPmSpinner.setEnabled(enabled); mIsEnabled = enabled; + //将 mIsEnabled 的值更新为传入的 enabled,以保持状态同步 } @Override @@ -251,7 +328,7 @@ public class DateTimePicker extends FrameLayout { cal.setTimeInMillis(date); setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } + }//实现函数功能——设置当前的时间,参数是date /** * Set the current date @@ -269,13 +346,15 @@ public class DateTimePicker extends FrameLayout { setCurrentDay(dayOfMonth); setCurrentHour(hourOfDay); setCurrentMinute(minute); - } + }//实现函数功能——设置当前的时间,参数是各详细的变量 /** * Get current year * * @return The current year */ + + //下面是得到year、month、day等值 public int getCurrentYear() { return mDate.get(Calendar.YEAR); } @@ -446,7 +525,7 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.setDisplayedValues(mDateDisplayValues); mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); mDateSpinner.invalidate(); - } + }// 对于星期几的算法 private void updateAmPmControl() { if (mIs24HourView) { @@ -456,7 +535,7 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setValue(index); mAmPmSpinner.setVisibility(View.VISIBLE); } - } + }// 对于上下午操作的算法 private void updateHourControl() { if (mIs24HourView) { @@ -466,7 +545,7 @@ public class DateTimePicker extends FrameLayout { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); } - } + }// 对与小时的算法 /** * Set the callback that indicates the 'Set' button has been pressed. diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..ee1f339 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java @@ -29,21 +29,43 @@ import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; +/** + * + * @ProjectName: DateTimePickerDialog + * @Package: net.micode.notes.ui + * @ClassName: DateTimePickerDialog + * @Description: DateTimePickerDialog 的作用是提供一个日期和时间选择器的对话框,用于让用户选择日期和时间。 + * 该对话框通常用于设置便签的提醒时间或截止时间等功能,用户可以通过滚动选择器来选择特定的日期和时间。 + * DateTimePickerDialog 提供了直观且方便的界面,使用户能够方便地选择所需的日期和时间。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 13:52 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 13:52 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ public class DateTimePickerDialog extends AlertDialog implements OnClickListener { private Calendar mDate = Calendar.getInstance(); + //创建一个Calendar类型的变量 mDate,方便时间的操作 private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; + //声明一个时间日期滚动选择控件 mOnDateTimeSetListener private DateTimePicker mDateTimePicker; + //DateTimePicker控件,控件一般用于让用户可以从日期列表中选择单个值。 + //运行时,单击控件边上的下拉箭头,会显示为两个部分:一个下拉列表,一个用于选择日期的 public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } public DateTimePickerDialog(Context context, long date) { + //对该界面对话框的实例化 super(context); + //对数据库的操作 mDateTimePicker = new DateTimePicker(context); setView(mDateTimePicker); + //添加一个子视图 mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { public void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute) { @@ -52,15 +74,21 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); mDate.set(Calendar.MINUTE, minute); + //将视图中的各选项设置为系统当前时间 updateTitle(mDate.getTimeInMillis()); } }); mDate.setTimeInMillis(date); + //得到系统时间 mDate.set(Calendar.SECOND, 0); + //将秒数设置为0 对日期时间进行标准化处理 mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); + //将日期时间选择器设置为当前设置的日期时间 setButton(context.getString(R.string.datetime_dialog_ok), this); setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + //设置按钮 set24HourView(DateFormat.is24HourFormat(this.getContext())); + //时间标准化打印 updateTitle(mDate.getTimeInMillis()); } @@ -70,7 +98,7 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; - } + }//将时间日期滚动选择控件实例化 private void updateTitle(long date) { int flag = @@ -79,12 +107,12 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener DateUtils.FORMAT_SHOW_TIME; flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } + }//android开发中常见日期管理工具类(API)——DateUtils:按照上下午显示时间 public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } - } - + }//第一个参数arg0是接收到点击事件的对话框 + //第二个参数arg1是该对话框上的按钮 } \ No newline at end of file diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DropdownMenu.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DropdownMenu.java index 613dc74..f4a3b4d 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/DropdownMenu.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/DropdownMenu.java @@ -27,17 +27,43 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: DropdownMenu + * @Description: DropdownMenu是一个下拉菜单,它的作用是提供一种选择多个选项的方式。 + * 当用户点击DropdownMenu时,会弹出一个下拉列表,列出了多个选项供用户选择。 + * 1.笔记分类:用户可以使用DropdownMenu来选择笔记的分类,比如工作、生活、学习等,从而方便地将笔记进行分类管理。 + * 2.笔记排序:用户可以使用DropdownMenu来选择笔记的排序方式,比如按时间、按标题等进行排序,以满足不同排序需求。 + * 3.标签管理:用户可以使用DropdownMenu来选择或添加标签,以对笔记进行更细粒度的分类和标记。 + * @Author: xumingyang + * @CreateDate: 2023-12-24 13:57 + * @UpdateUser: 更新者: + * @UpdateDate: 2023-12-24 13:57 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ + + public class DropdownMenu { private Button mButton; private PopupMenu mPopupMenu; + //声明一个下拉菜单 + private Menu mMenu; + public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); + //设置这个view的背景 mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + //MenuInflater是用来实例化Menu目录下的Menu布局文件 + //根据ID来确认menu的内容选项 + mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); @@ -49,13 +75,13 @@ public class DropdownMenu { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); } - } + }//设置菜单的监听 public MenuItem findItem(int id) { return mMenu.findItem(id); - } + }//对于菜单选项的初始化,根据索引搜索菜单需要的选项 public void setTitle(CharSequence title) { mButton.setText(title); } -} +}//布局文件,设置标题 diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java index 96b77da..c7a9ed4 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java @@ -29,25 +29,53 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: FoldersListAdapter + * @Description: FoldersListAdapter 的作用是作为文件夹列表的适配器,用于管理和显示文件夹列表的数据和视图。 + * CursorAdapter是Cursor和ListView的接口 + * FoldersListAdapter继承了CursorAdapter的类 + * 主要作用是便签数据库和用户的交互 + * 这里就是用folder(文件夹)的形式展现给用户 + * @Author: xumingyang + * @CreateDate: 2023-12-24 14:05 + * @UpdateDate: 2023-12-24 14:05 + * @Version: 1.0 + */ public class FoldersListAdapter extends CursorAdapter { + public static final String [] PROJECTION = { NoteColumns.ID, NoteColumns.SNIPPET - }; + };//调用数据库中便签的ID和片段 public static final int ID_COLUMN = 0; public static final int NAME_COLUMN = 1; + /** + * @method FoldersListAdapter + * @description 用于初始化FoldersListAdapter类的实例。这个类可能是用于管理文件夹列表显示的适配器,其中包含了数据库操作相关的功能 + * @param context 参数通常是指当前的上下文 + * c 参数可能是一个用于查询数据库的Cursor对象。 + */ public FoldersListAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub - } + }//数据库操作 + /** + * @method newView + * @description 用于创建新的视图用于显示文件夹列表项。 + * @return 将该视图返回给适配器使用 + */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new FolderListItem(context); } + //将各个布局文件绑定起来 @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof FolderListItem) { @@ -57,6 +85,7 @@ public class FoldersListAdapter extends CursorAdapter { } } + //根据数据库中标签的ID得到标签的各项内容 public String getFolderName(Context context, int position) { Cursor cursor = (Cursor) getItem(position); return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context @@ -67,8 +96,8 @@ public class FoldersListAdapter extends CursorAdapter { private TextView mName; public FolderListItem(Context context) { - super(context); - inflate(context, R.layout.folder_list_item, this); + super(context);//操作数据库 + inflate(context, R.layout.folder_list_item, this);//根据布局文件的名字等信息将其找出来 mName = (TextView) findViewById(R.id.tv_folder_name); } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index b7579c9..4f6220d 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -16,6 +16,7 @@ package net.micode.notes.ui; + import android.app.Activity; import android.app.AlarmManager; import android.app.AlertDialog; @@ -102,9 +103,40 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NoteEditActivity + * @Description: 编辑小米便签应用中的便签内容。它向用户提供了一个界面,允许用户输入、编辑和保存文本信息。 + * 具体来说,用户可以在该界面中添加或编辑标题、标签、内容、图片等信息,并将这些信息保存到小米便签数据库中。 + * 还提供了一些常用的编辑功能,如加粗、倾斜、下划线、字体调整、颜色设置、插入图片等,使得用户可以更加方便地对便签内容进行编辑和美化。 + * @Author: xumingyang + * @CreateDate: 2024-01-03 8:44 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-03 8:44 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ import android.speech.tts.TextToSpeech.OnInitListener; + +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NoteEditActivity + * @Description: 编辑小米便签应用中的便签内容。它向用户提供了一个界面,允许用户输入、编辑和保存文本信息。 + * 具体来说,用户可以在该界面中添加或编辑标题、标签、内容、图片等信息,并将这些信息保存到小米便签数据库中。 + * 还提供了一些常用的编辑功能,如加粗、倾斜、下划线、字体调整、颜色设置、插入图片等,使得用户可以更加方便地对便签内容进行编辑和美化。 + * @Author: xumingyang + * @CreateDate: 2024-01-03 8:44 + * @UpdateDate: 2024-01-03 8:44 + * @Version: 1.0 + */ public class NoteEditActivity extends Activity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { + //该类主要是针对标签的编辑 + //继承了系统内部许多和监听有关的类 public static void setmChanged(Stack mChanged) { NoteEditActivity.mChanged = mChanged; } @@ -112,6 +144,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, private class HeadViewHolder { public TextView tvModified; + public EditText editText1;//新增 + public TextView textView;//新增 public ImageView ivAlertIcon; public TextView tvAlertDate; @@ -119,6 +153,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public ImageView ibSetBgColor; } + //使用Map实现数据存储 private static final Map sBgSelectorBtnsMap = new HashMap(); static { sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); @@ -126,6 +161,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); + //put函数是将指定值和指定键相连 } private static final Map sBgSelectorSelectionMap = new HashMap(); @@ -135,6 +171,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); + //put函数是将指定值和指定键相连 } private static final Map sFontSizeBtnsMap = new HashMap(); @@ -157,22 +194,24 @@ public class NoteEditActivity extends Activity implements OnClickListener, private HeadViewHolder mNoteHeaderHolder; - private View mHeadViewPanel; + private View mHeadViewPanel;//私有化一个界面操作mHeadViewPanel,对表头的操作 - private View mNoteBgColorSelector; + private View mNoteBgColorSelector;//私有化一个界面操作mNoteBgColorSelector,对背景颜色的操作 - private View mFontSizeSelector; + private View mFontSizeSelector;//私有化一个界面操作mFontSizeSelector,对标签字体的操作 - private EditText mNoteEditor; + private EditText mNoteEditor;//声明编辑控件,对文本操作 private EditText editText; private TextView textView; - private View mNoteEditorPanel; + private View mNoteEditorPanel;//私有化一个界面操作mNoteEditorPanel,文本编辑的控制板 - private WorkingNote mWorkingNote; + private WorkingNote mWorkingNote;//对模板WorkingNote的初始化 private SharedPreferences mSharedPrefs; - private int mFontSizeId; + //私有化SharedPreferences的数据存储方式 + //它的本质是基于XML文件存储key-value键值对数据 + private int mFontSizeId;//用于操作字体的大小 private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; @@ -181,7 +220,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public static final String TAG_CHECKED = String.valueOf('\u221A'); public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); - private LinearLayout mEditTextList; + private LinearLayout mEditTextList;//线性布局 private String mUserQuery; private Pattern mPattern; @@ -359,9 +398,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, Editable editable = noteEditText.getText(); String noteText = editable.toString(); int length = editable.length(); + //对于每个字符,从当前位置开始,向后遍历文本,直到找到与图片标记匹配的子字符串。 for (int i = 0; i < length; i++) { for (int j = i; j < length; j++) { String img_fragment = noteText.substring(i, j + 1); + //检查其长度是否大于15,且以"[local]"开头,以"[/local]"结尾 if (img_fragment.length() > 15 && img_fragment.endsWith("[/local]") && img_fragment.startsWith("[local]")) { int limit = 7; int len = img_fragment.length() - 15; @@ -369,17 +410,23 @@ public class NoteEditActivity extends Activity implements OnClickListener, Bitmap bitmap = null; Log.d(TAG, "图片的路径是:" + path); try { + //BitmapFactory.decodeFile(path)是Android中用于从指定路径加载图片文件并返回一个Bitmap对象的方法 bitmap = BitmapFactory.decodeFile(path); } catch (Exception e) { e.printStackTrace(); } + //如果解码成功(即bitmap不为null),则创建一个新的ImageSpan对象,并将其插入到原始文本中,替换原来的图片标记 if (bitmap != null) { Log.d(TAG, "图片不为null"); + //创建一个SpannableString对象,将字符串ss作为参数传递给构造函数。 + //SpannableString是一个可编辑的字符串,可以设置文本样式(如颜色、大小等)。 ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap); String ss = "[local]" + path + "[/local]"; SpannableString spannableString = new SpannableString(ss); + //将ImageSpan对象应用于spannableString,从索引0开始,到字符串长度结束。这样可以将图片显示在指定的文本范围内 spannableString.setSpan(imageSpan, 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Log.d(TAG, "Create spannable string success!"); + //获取noteEditText的可编辑文本内容,并将其赋值给变量edit_text Editable edit_text = noteEditText.getEditableText(); edit_text.delete(i, i + len + 15); edit_text.insert(i, spannableString); @@ -390,6 +437,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } //处理返回的数据,并将图片的路径也写入到数据库 + //当用户在相机应用中选择了一张图片后,该图片的URI会被传递给NoteEditActivity,然后通过这个方法进行处理。 @RequiresApi(api = Build.VERSION_CODES.KITKAT) protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); @@ -399,12 +447,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, Uri originalUri = intent.getData(); Bitmap bitmap = null; try { - bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));//2.解码图片 + bitmap = BitmapFactory.decodeStream(resolver.openInputStream(originalUri));//解码图片 } catch (FileNotFoundException e) { Log.d(TAG, "onActivityResult: get file_exception"); e.printStackTrace(); } - if (bitmap != null) { Log.d(TAG, "onActivityResult: bitmap is not null"); ImageSpan imageSpan = new ImageSpan(NoteEditActivity.this, bitmap); @@ -467,12 +514,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, } return null; } + //用于从给定的URI中获取数据列 + //Android的ContentResolver类来执行查询操作,通过url来定位和获取上下文数据 public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { + //调用context.getContentResolver().query()方法,传入URI、投影、选择条件、选择参数和排序方式,执行查询操作并将结果存储在cursor中 cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); @@ -491,17 +541,27 @@ public class NoteEditActivity extends Activity implements OnClickListener, return "com.android.providers.media.documents".equals(uri.getAuthority()); } + /** + * @method onCreate + * @description 描述一下方法的作用方法的主要作用是初始化Activity的状态、资源和界面,并对便签内容进行处理和计数。 + */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - this.setContentView(R.layout.note_edit); + this.setContentView(R.layout.note_edit); //调用setContentView方法设置当前Activity显示的布局为note_edit.xml文件。 setmChanged(new Stack<>() ); + + /* + * 判断savedInstanceState是否为空,并调用initActivityState方法初始化Activity的状态。 + * initActivityState方法会根据传入的Intent信息,判断当前是新建一个便签还是编辑一个已有的便签。 + */ if (savedInstanceState == null && !initActivityState(getIntent())) { finish(); return; } - initResources(); - count(); + + initResources();//调用initResources方法初始化Activity中的资源,如绑定控件等。 + count();//新增文档计数功能 final ImageButton add_img_btn = (ImageButton) findViewById(R.id.add_img_btn); add_img_btn.setOnClickListener(new View.OnClickListener() { @@ -523,21 +583,37 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ //用于在Activity被系统销毁后恢复其状态 @Override + /** + * @method onRestoreInstanceState + * @description 该方法的主要作用是在Activity恢复状态时,根据保存的数据重新初始化Activity的状态, + * 以保证在Activity被销毁后重新创建时能够正确恢复之前的状态。 + */ protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); + //将保存在savedInstanceState中的Intent.EXTRA_UID的值作为Long类型的额外数据传递给新的Intent对象。 if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); + + /* + * 调用initActivityState方法,将新的Intent传递进去进行初始化Activity的状态。 + * 如果initActivityState返回false,说明初始化失败,直接销毁Activity并返回。 + */ if (!initActivityState(intent)) { finish(); return; } Log.d(TAG, "Restoring from killed activity"); - } + }//为防止内存不足时程序的终止,在这里有一个保存现场的函数 } - //该方法主要用于初始化Activity的状态,根据传入的Intent的不同动作(action)执行不同的操作。 - private boolean initActivityState(Intent intent) { + /** + * @method initActivityState + * @description 作用是初始化NoteEditActivity的状态。 + * @param + * @return true表示初始化成功 false表示初始化失败 + */ + private boolean initActivityState(Intent intent) {//用于实时更新字符数的文本视图 /** * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, * then jump to the NotesListActivity @@ -547,31 +623,34 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); mUserQuery = ""; - + //如果用户实例化标签时,系统并未给出标签ID /** * Starting from the searched result */ + //根据键值查找ID if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); } //DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE) 是一个方法调用 // 用于检查给定的 noteId 是否存在于笔记数据库中 + //如果ID在数据库中未找到 if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { Intent jump = new Intent(this, NotesListActivity.class); - startActivity(jump); + startActivity(jump);//程序将跳转到上面声明的intent——jump showToast(R.string.error_note_not_exist); finish(); return false; - } else { + } else {//ID在数据库中找到 //如果指定的笔记 ID 存在于笔记数据库中,则调用 WorkingNote.load() 方法,根据指定的笔记 ID 加载笔记对象,并将结果赋值给 mWorkingNote mWorkingNote = WorkingNote.load(this, noteId); if (mWorkingNote == null) { - Log.e(TAG, "load note failed with note id" + noteId); + Log.e(TAG, "load note failed with note id" + noteId); //打印出红色的错误信息 finish(); return false; } } + //setSoftInputMode——软键盘输入模式 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); @@ -579,6 +658,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, //需要创建或编辑一个笔记 // New note //从 Intent 中获取一些额外的信息,如文件夹 ID、小部件 ID、小部件类型和背景资源 ID。这些信息用于确定新笔记的位置和外观。 + /* + * intent.getAction() + * 大多用于broadcast发送广播时给机制(intent)设置一个action,就是一个字符串 + * 用户可以通过receive(接受)intent,通过 getAction得到的字符串,来决定做什么 + */ long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); @@ -625,20 +709,37 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } + /** + * @method onResume + * @description 在Activity恢复时重新初始化便签的显示 + */ @Override protected void onResume() { super.onResume(); - initNoteScreen(); + initNoteScreen();//然后调用initNoteScreen方法,该方法会根据mWorkingNote的内容初始化便签的各个UI控件,例如标题栏、编辑区域、图片等。 } //用于初始化笔记屏幕 + /** + * @method initNoteScreen + * @description 根据mWorkingNote的内容重新初始化便签的UI,包括文本样式、编辑区域、背景、修改时间等 + */ private void initNoteScreen() { mNoteEditor.setTextAppearance(this, TextAppearanceResources .getTexAppearanceResource(mFontSizeId)); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + /* + * 如果当前便签是“清单”模式,则调用switchToListMode方法将编辑区域切换到“清单”模式, + * 并将mWorkingNote中的内容填充到编辑区域。 + */ + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {//首先根据mFontSizeId设置mNoteEditor的文本样式。 switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + } + /* + * 如果当前便签不是“清单”模式,则将mWorkingNote中的内容填充到编辑区域 + * 并调用getHighlightQueryResult方法将搜索关键字高亮显示。 + */ + else { + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));//将所有背景选择器控件隐藏,然后根据mWorkingNote的标题背景和便签背景设置标题栏和编辑区域的背景。 mNoteEditor.setSelection(mNoteEditor.getText().length()); } for (Integer id : sBgSelectorSelectionMap.keySet()) { @@ -660,12 +761,17 @@ public class NoteEditActivity extends Activity implements OnClickListener, convertToImage(); } + /** + * @method showAlertHeader + * @description 根据mWorkingNote的提醒设置来显示提醒相关的UI,包括提醒日期文本和提醒图标。 + * 如果有设置提醒,则根据当前时间判断是否已过期,并显示相应的文本。如果没有设置提醒,则隐藏相关UI。 + */ private void showAlertHeader() { - if (mWorkingNote.hasClockAlert()) { + if (mWorkingNote.hasClockAlert()) {//首先判断mWorkingNote是否有设置提醒(hasClockAlert)。如果有设置提醒,则执行以下步骤 long time = System.currentTimeMillis(); if (time > mWorkingNote.getAlertDate()) { - mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); - } else { + mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);//判断当前时间是否超过了提醒时间(mWorkingNote.getAlertDate)。如果超过了提醒时间,则将提醒日期文本(tvAlertDate) + } else {//如果没有超过提醒时间,则将提醒日期文本设置为相对时间,即距离提醒时间还有多久(使用DateUtils.getRelativeTimeSpanString方法)。 mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); } @@ -678,11 +784,18 @@ public class NoteEditActivity extends Activity implements OnClickListener, } @Override + //在Activity已经存在于任务栈中时,再次启动该Activity时的回调方法,可以在其中处理相关的逻辑操作 protected void onNewIntent(Intent intent) { super.onNewIntent(intent); initActivityState(intent); } + /** + * @method onSaveInstanceState + * @description 在Activity即将被销毁时的回调方法,用于保存当前Activity的状态, + * 以便在Activity被恢复时能够正确地加载之前的状态。 + * @return void + */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -692,28 +805,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, * is no id which is equivalent to create new note */ if (!mWorkingNote.existInDatabase()) { - saveNote(); + saveNote();//在创建一个新的标签时,先在数据库中匹配 + //如果不存在,那么先在数据库中存储 } outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); } @Override + //MotionEvent是对屏幕触控的传递机制 public boolean dispatchTouchEvent(MotionEvent ev) { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE && !inRangeOfView(mNoteBgColorSelector, ev)) { mNoteBgColorSelector.setVisibility(View.GONE); return true; - } + }//颜色选择器在屏幕上可见 + + if (mFontSizeSelector.getVisibility() == View.VISIBLE && !inRangeOfView(mFontSizeSelector, ev)) { mFontSizeSelector.setVisibility(View.GONE); return true; - } + }//字体大小选择器在屏幕上可见 return super.dispatchTouchEvent(ev); } + //对屏幕触控的坐标进行操作 private boolean inRangeOfView(View view, MotionEvent ev) { int []location = new int[2]; view.getLocationOnScreen(location); @@ -723,7 +841,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, || ev.getX() > (x + view.getWidth()) || ev.getY() < y || ev.getY() > (y + view.getHeight())) { - return false; + return false;//如果触控的位置超出了给定的范围,返回false } return true; } @@ -751,12 +869,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, for (int id : sBgSelectorBtnsMap.keySet()) { ImageView iv = (ImageView) findViewById(id); iv.setOnClickListener(this); - } + }//对标签各项属性内容的初始化 mFontSizeSelector = findViewById(R.id.font_size_selector); for (int id : sFontSizeBtnsMap.keySet()) { View view = findViewById(id); view.setOnClickListener(this); - }; + };//对字体大小的选择 mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); /** @@ -910,15 +1028,17 @@ public class NoteEditActivity extends Activity implements OnClickListener, alertDialog2.show(); } + //在Activity即将失去焦点并进入后台时的回调方法,用于执行一些与保存数据、清除状态等相关的操作。 @Override protected void onPause() { super.onPause(); if(saveNote()) { Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); } - clearSettingState(); + clearSettingState();//调用clearSettingState()方法来清除一些设置状态。具体的逻辑需要根据实际需求来实现,可能包括清除临时数据、重置一些标志位等。 } + //和桌面小工具的同步 private void updateWidget() { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { @@ -934,6 +1054,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, mWorkingNote.getWidgetId() }); + //将当前Note笔记的Widget ID放入Intent的Extra参数中。注意,这里只更新当前Note笔记所绑定的Widget,因此只需要传入一个Widget ID。 sendBroadcast(intent); setResult(RESULT_OK, intent); } @@ -965,10 +1086,19 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { mNoteEditor.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); } + /* + * 如果点击的ID在sFontSizeBtnsMap中存在(即点击的是字体大小选择项的按钮),则将当前字体大小的选择项设置为不可见, + * 将字体大小ID更新为对应的值,并将新的字体大小选择项设置为可见。 + * 同时,根据Note笔记的模式(是否为检查列表模式)进行相应的处理: + * 如果是检查列表模式,则切换到列表模式并获取最新的Note内容; + * 否则,仅更新文本编辑器的字体样式。 + */ mFontSizeSelector.setVisibility(View.GONE); } } + //这段代码重写了Activity的返回按钮操作, + // 在返回操作中处理了设置状态的清除和Note笔记的保存。 @Override public void onBackPressed() { if(clearSettingState()) { @@ -979,7 +1109,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, super.onBackPressed(); } + /** + * @method clearSettingState + * @description 这个方法的作用是在用户按下返回按钮时,检查当前是否处于设置状态(例如正在选择背景颜色或字体大小), + * 如果是,则清除设置状态并返回true,否则返回false。 + * @return true表示成功清除了设置状态 返回false表示当前没有处于设置状态。 + */ private boolean clearSettingState() { + //首先检查背景颜色选择器(mNoteBgColorSelector)和字体大小选择器(mFontSizeSelector)的可见性 if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { mNoteBgColorSelector.setVisibility(View.GONE); return true; @@ -990,24 +1127,34 @@ public class NoteEditActivity extends Activity implements OnClickListener, return false; } + /** + * @method onBackgroundColorChanged + * @description 在背景颜色发生变化时,根据新的背景颜色ID更新选中状态的选择项的可见性, + * 并将新的背景颜色资源应用到相关的视图上,以实现界面的背景颜色变更 + */ public void onBackgroundColorChanged() { findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.VISIBLE); mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + //获取当前Note笔记的背景颜色资源ID,并将该资源作为背景设置给mNoteEditorPanel和mHeadViewPanel,实现对编辑区域和标题区域的背景颜色的更新。 } - + /** + * @method onPrepareOptionsMenu + * @description 根据当前Note笔记的状态和属性,动态加载选项菜单的内容,并更新其中的部分选项的名称和可见性。 + */ //该方法的主要作用是根据当前的工作笔记(mWorkingNote)的属性来准备和更新菜单项。 @Override public boolean onPrepareOptionsMenu(Menu menu) { if (isFinishing()) { return true; - } + }//判断当前Activity是否正在关闭,如果是,则直接返回true,不做任何处理。 clearSettingState(); - menu.clear(); + menu.clear(); //调用clearSettingState()方法清除当前的设置状态,并使用menu.clear()方法清空选项菜单中的所有选项。 + //工作笔记的文件夹ID if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_note_edit, menu); + getMenuInflater().inflate(R.menu.call_note_edit, menu);// MenuInflater是用来实例化Menu目录下的Menu布局文件的 } else { getMenuInflater().inflate(R.menu.note_edit, menu); } @@ -1016,6 +1163,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); } + //如果当前Note笔记已经有闹钟提醒,则隐藏“添加提醒”选项,否则隐藏“删除提醒”选项。 if (mWorkingNote.hasClockAlert()) { menu.findItem(R.id.menu_alert).setVisible(false); } else { @@ -1024,12 +1172,22 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } + /** + * @method onOptionsItemSelected + * @description 用于处理选项菜单中的各个选项被点击时的事件响应。 + * @return boolean 返回true表示已经处理了该选项的点击事件。 + */ @Override public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.menu_new_note) { + int itemId = item.getItemId();//在这个方法中,首先获取被点击的选项的ID,然后根据ID的不同执行相应的操作。 + if (itemId == R.id.menu_new_note) {//如果被点击的选项是“新建笔记”,则调用createNewNote()方法创建一个新的笔记。 createNewNote(); - } else if (itemId == R.id.menu_delete) { + } + /* + * 如果被点击的选项是“删除”,则弹出一个警告对话框,询问用户是否确认删除当前笔记。 + * 如果用户确认删除,则调用deleteCurrentNote()方法删除当前笔记,并关闭当前Activity。 + */ + else if (itemId == R.id.menu_delete) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.alert_title_delete)); builder.setIcon(android.R.drawable.ic_dialog_alert); @@ -1043,20 +1201,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, }); builder.setNegativeButton(android.R.string.cancel, null); builder.show(); - } else if (itemId == R.id.menu_font_size) { + } + //如果被点击的选项是“修改字体大小”,则显示字体大小选择器,以供用户选择字体大小。 + else if (itemId == R.id.menu_font_size) { mFontSizeSelector.setVisibility (View.VISIBLE); findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - } else if (itemId == R.id.menu_list_mode) { + + } + //如果被点击的选项是“切换列表模式”,则切换当前笔记的检查列表模式状态。 + else if (itemId == R.id.menu_list_mode) { mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0); - } else if (itemId == R.id.menu_share) { + } + //如果被点击的选项是“分享”,则获取当前笔记的内容并将其发送到其他应用程序。 + else if (itemId == R.id.menu_share) { getWorkingText(); sendTo(this, mWorkingNote.getContent()); - } else if (itemId == R.id.menu_send_to_desktop) { + } + //如果被点击的选项是“发送到桌面”,则将当前笔记发送到桌面。 + else if (itemId == R.id.menu_send_to_desktop) { sendToDesktop(); - } else if (itemId == R.id.menu_alert) { + } + //如果被点击的选项是“添加提醒”,则设置当前笔记的提醒时间 + else if (itemId == R.id.menu_alert) { setReminder(); - } else if (itemId == R.id.menu_delete_remind) { + } + //如果被点击的选项是“删除提醒”,则清除当前笔记的提醒时间 + else if (itemId == R.id.menu_delete_remind) { mWorkingNote.setAlertDate(0, false); }else if(itemId == R.id.menu_revoke) { doRevoke(); @@ -1075,42 +1246,51 @@ public class NoteEditActivity extends Activity implements OnClickListener, private void setReminder() { DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); d.setOnDateTimeSetListener(new OnDateTimeSetListener() { + //首先创建一个DateTimePickerDialog对象,并将当前系统时间作为初始时间传入。 + // 然后,为该对话框设置一个日期时间选择器监听器。 public void OnDateTimeSet(AlertDialog dialog, long date) { mWorkingNote.setAlertDate(date , true); } }); - d.show(); + d.show();//最后,显示日期时间选择器对话框。 } /** * Share note to apps that support {@link Intent#ACTION_SEND} action * and {@text/plain} type */ + /** + * @method sendTo + * @description 用于在给定的Context上下文环境中,利用系统默认的分享功能将特定的文本信息发送给其他应用程序。 + */ private void sendTo(Context context, String info) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, info); - intent.setType("text/plain"); - context.startActivity(intent); + Intent intent = new Intent(Intent.ACTION_SEND);//在方法内部,首先创建一个新的Intent对象,并将其动作设置为Intent.ACTION_SEND,表示发送内容。 + + intent.putExtra(Intent.EXTRA_TEXT, info);//接着,通过putExtra方法将要分享的文本信息info放入Intent中,使用Intent.EXTRA_TEXT作为键。 + + intent.setType("text/plain"); //然后,使用setType方法将要分享的内容的MIME类型设置为"text/plain",表示纯文本类型。 + + context.startActivity(intent);//最后,通过context.startActivity(intent)启动该Intent,将文本信息发送给其他应用程序进行处理。 } - private void count(){ + private void count(){//用于实时更新字符数的文本视图 mNoteEditor.addTextChangedListener(new TextWatcher() { int currentlength = 0; @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { textView.setText("字符数:"+currentlength); - } + }//在beforeTextChanged()方法中,通过获取当前文本的长度并更新textView的文本来显示当前字符数。 @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { currentlength = editText.getText().length(); - } + }//在onTextChanged()方法中,通过获取编辑框的文本长度并将其赋值给currentLength变量,以便在afterTextChanged()方法中使用。 @Override public void afterTextChanged(Editable editable) { textView.setText("字符数:" + currentlength); - } + }//在afterTextChanged()方法中,再次更新textView的文本以显示最新的字符数 }); } private void createNewNote() { @@ -1130,6 +1310,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, startActivity(intent); } + //删除便签 private void deleteCurrentNote() { //假如当前运行的便签内存有数据 if (mWorkingNote.existInDatabase()) { @@ -1159,6 +1340,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, mWorkingNote.markDeleted(true); } + /** + * @method isSyncMode + * @description 用于判断是否处于同步模式。 + * @return 如果此名称的长度大于0,则说明处于同步模式,返回true;否则返回false。 + */ private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } @@ -1168,10 +1354,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, * User could set clock to an unsaved note, so before setting the * alert clock, we should save the note first */ - if (!mWorkingNote.existInDatabase()) { + if (!mWorkingNote.existInDatabase()) {//首先检查当前工作的便签是否存在于数据库中,如果不存在,则调用saveNote()方法保存便签。 saveNote(); } - if (mWorkingNote.getNoteId() > 0) { + if (mWorkingNote.getNoteId() > 0) {//若当前便签的ID大于0,则创建一个用于触发闹钟的Intent,并设置相应的PendingIntent。 + // 然后根据参数set来决定是取消闹钟还是设置新的闹钟时间。 Intent intent = new Intent(this, AlarmReceiver.class); intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); @@ -1193,10 +1380,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } + //更新小部件的显示内容。具体的更新逻辑可能包括重新加载数据、刷新UI等操作,以确保小部件展示的内容和状态是最新的。 public void onWidgetChanged() { updateWidget(); } + /** + * @method onEditTextDelete + * @description 用于处理删除文本编辑框的操作。 + */ public void onEditTextDelete(int index, String text) { int childCount = mEditTextList.getChildCount(); if (childCount == 1) { @@ -1223,17 +1415,21 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.setSelection(length); } + /** + * @method onEditTextEnter + * @description 用于处理插入文本编辑框的操作。 + */ public void onEditTextEnter(int index, String text) { /** * Should not happen, check for debug */ if(index > mEditTextList.getChildCount()) { - Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); + Log.e(TAG, "Index out of mEditTextList boundrary, should not happen");//在方法中,首先检查传入的索引位置是否超出了mEditTextList的子视图数量。如果超出了范围,会记录错误日志。 } - View view = getListItem(text, index); - mEditTextList.addView(view, index); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + View view = getListItem(text, index);//根据传入的文本和索引位置创建一个新的视图view。 + mEditTextList.addView(view, index);//将创建的视图插入到mEditTextList中的指定索引位置。 + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);//获取新插入的文本编辑框,并将其请求获取焦点。同时,将光标定位在文本编辑框的开头位置。 edit.requestFocus(); edit.setSelection(0); for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { @@ -1242,6 +1438,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } + //用于切换到列表模式 private void switchToListMode(String text) { mEditTextList.removeAllViews(); String[] items = text.split("\n"); @@ -1259,6 +1456,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, mEditTextList.setVisibility(View.VISIBLE); } + //用于将匹配到的查询结果进行高亮处理。 private Spannable getHighlightQueryResult(String fullText, String userQuery) { SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); if (!TextUtils.isEmpty(userQuery)) { @@ -1276,11 +1474,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, return spannable; } + /** + * @method getListItem + * @description 用于根据给定的文本项item和索引index创建一个列表项的视图。 + */ private View getListItem(String item, int index) { - View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); + View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);//首先使用LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null)从布局文件note_edit_list_item中获取一个视图view。 final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); + edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));//从view中获取一个NoteEditText编辑框对象edit,并设置其文本外观为当前字体大小mFontSizeId对应的样式。 + CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); //从view中获取一个CheckBox对象cb,并设置其选中状态改变的监听器,以便在状态改变时修改编辑框的文本外观。 cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { @@ -1291,6 +1493,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, } }); + /* + 根据文本项的前缀标记判断当前列表项是否被选中。如果是,则将复选框设置为选中状态,并将编辑框的文本外观设置为带有删除线的样式; + 否则,将复选框设置为未选中状态,并将编辑框的文本外观设置为普通样式。 + 同时,去除前缀标记并去除两端的空格。 + */ if (item.startsWith(TAG_CHECKED)) { cb.setChecked(true); edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); @@ -1303,38 +1510,61 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.setOnTextViewChangeListener(this); edit.setIndex(index); - edit.setText(getHighlightQueryResult(item, mUserQuery)); - return view; + edit.setText(getHighlightQueryResult(item, mUserQuery));//设置编辑框的值为经过高亮处理的文本项item,并设置编辑框的索引值为传入的索引index, + return view;// 最后将edit对象添加到视图view中并返回该视图。 } + /** + * @method onCheckListModeChanged + * @description 用于监听编辑框中文本的改变,并根据是否有文本来控制复选框的可见性。 + */ public void onTextChange(int index, boolean hasText) { if (index >= mEditTextList.getChildCount()) { Log.e(TAG, "Wrong index, should not happen"); return; + //判断传入的索引值index是否超出了编辑框列表中子视图的数量范围。 + //如果超出,则打印错误日志并退出方法。 } if(hasText) { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); } else { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); } + //根据传入的hasText参数判断当前编辑框是否有文本。如果有文本,则将该编辑框所在的列表项的复选框设置为可见状态; + // 否则,将复选框设置为不可见状态。 } + /** + * @method onCheckListModeChanged + * @description 用于监听检查列表模式的改变,并根据新的模式来更新界面显示。 + */ public void onCheckListModeChanged(int oldMode, int newMode) { + //判断新的模式是否为检查列表模式。如果是,则调用switchToListMode()方法, + // 并传入当前编辑器中的文本内容,以切换到列表模式。 if (newMode == TextNote.MODE_CHECK_LIST) { switchToListMode(mNoteEditor.getText().toString()); } else { + //调用getWorkingText()方法来获取当前的工作文本。如果获取失败(即没有工作文本),则将工作文本设置为去除了未选中标记的内容。 if (!getWorkingText()) { mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", "")); } - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mEditTextList.setVisibility(View.GONE); - mNoteEditor.setVisibility(View.VISIBLE); + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));//将编辑器的文本设置为经过高亮处理的工作文本内容 + mEditTextList.setVisibility(View.GONE);//将编辑框列表设置为不可见状态。 + mNoteEditor.setVisibility(View.VISIBLE);//将编辑器设置为可见状态。 } } + /** + * @method getWorkingText + * @description 用于获取工作笔记的文本内容,并根据是否为待办事项模式进行相应处理。 + * @return 该方法返回一个布尔值,表示在待办事项模式下是否有选中的项目。 + */ private boolean getWorkingText() { boolean hasChecked = false; + //检查当前工作笔记mWorkingNote是否为待办事项模式。如果是,就遍历所有子视图view,其中包含每个待办事项的复选框和文本编辑框。 + // 对于每个非空的文本编辑框,如果其相应的复选框被选中,则将文本内容作为已选中的待办事项添加到字符串缓冲区sb中,并将标记hasChecked设置为true; + // 否则,将文本内容作为未选中的待办事项添加到字符串缓冲区sb中。 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < mEditTextList.getChildCount(); i++) { @@ -1345,6 +1575,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); hasChecked = true; } else { + //如果不是待办事项模式,则将文本编辑器mNoteEditor中的文本内容设置为工作笔记的文本内容。 sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); } } @@ -1353,12 +1584,16 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); } - return hasChecked; + return hasChecked;//该方法返回一个布尔值hasChecked,表示在待办事项模式下是否有选中的项目。 } + //用于保存当前正在编辑的笔记。 private boolean saveNote() { + //在方法内部,首先调用getWorkingText方法获取当前正在编辑的笔记的文本内容,并将其保存到mWorkingNote对象中。 getWorkingText(); boolean saved = mWorkingNote.saveNote(); + //如果保存成功,则调用setResult(RESULT_OK)方法,设置当前Activity的返回状态为RESULT_OK。 + //这个状态用于标识从编辑状态返回到列表视图时,是创建新笔记还是编辑已有笔记。 if (saved) { /** * There are two modes from List view to edit view, open one note, @@ -1372,30 +1607,34 @@ public class NoteEditActivity extends Activity implements OnClickListener, 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 */ + //检查当前正在编辑的笔记是否存在于数据库中。如果笔记不存在于数据库中,则调用saveNote()方法保存笔记。 if (!mWorkingNote.existInDatabase()) { saveNote(); } if (mWorkingNote.getNoteId() > 0) { - Intent sender = new Intent(); + Intent sender = new Intent();//创建一个Intent对象sender用于发送广播。 Intent shortcutIntent = new Intent(this, NoteEditActivity.class); - shortcutIntent.setAction(Intent.ACTION_VIEW); - shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); + shortcutIntent.setAction(Intent.ACTION_VIEW);//创建一个Intent对象shortcutIntent,指定其目标为NoteEditActivity类,并设置动作为Intent.ACTION_VIEW + shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId());//将正在编辑的笔记ID作为附加数据放入shortcutIntent中。 + //将笔记内容生成适合作为快捷方式图标标题的字符串,并放入sender中作为附加数据。 sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, makeShortcutIconTitle(mWorkingNote.getContent())); sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); + //将应用程序的图标资源作为快捷方式图标放入sender中。 sender.putExtra("duplicate", true); - sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); - showToast(R.string.info_note_enter_desktop); - sendBroadcast(sender); + sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT");//设置sender的动作为com.android.launcher.action.INSTALL_SHORTCUT,表示要安装快捷方式。 + showToast(R.string.info_note_enter_desktop);//弹出一个简短的提示消息,提示用户笔记已经进入桌面。 + sendBroadcast(sender);//发送广播,安装快捷方式。 } else { /** * There is the condition that user has input nothing (the note is @@ -1404,20 +1643,26 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ Log.e(TAG, "Send to desktop error"); showToast(R.string.error_note_empty_for_send_to_desktop); + //如果当前正在编辑的笔记没有有效的笔记ID,则执行以下操作: + //输出一个错误日志,表示发送到桌面出错 + //弹出一个提示消息,提醒用户必须输入一些内容才能发送到桌面。 } } + //用于生成快捷图标的标题 private String makeShortcutIconTitle(String content) { - content = content.replace(TAG_CHECKED, ""); + content = content.replace(TAG_CHECKED, "");//使用replace()方法将文本中的所有TAG_CHECKED和TAG_UNCHECKED替换为空字符串,即去除已选中和未选中标记。 content = content.replace(TAG_UNCHECKED, ""); return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, SHORTCUT_ICON_TITLE_MAX_LEN) : content; } + //用于显示一个短时间的 Toast 提示消息 private void showToast(int resId) { showToast(resId, Toast.LENGTH_SHORT); } + //用于显示一个指定时长的 Toast 提示消息 private void showToast(int resId, int duration) { Toast.makeText(this, resId, duration).show(); } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditText.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditText.java index 2afe2a8..ec4c87b 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditText.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteEditText.java @@ -37,7 +37,25 @@ import net.micode.notes.R; import java.util.HashMap; import java.util.Map; -public class NoteEditText extends EditText { +/** + * + * @ProjectName: 小米便签代码标注 + * @Package: net.micode.notes.ui + * @ClassName: NoteEditText + * @Description: + * 处理屏幕被按下的事件,并根据坐标更新光标位置。 + * 处理用户按下一个键盘按键时会触发的删除事件,并记录光标位置。 + * 处理用户松开一个键盘按键时会触发的删除和添加新文本事件,并利用OnTextViewChangeListener对文本修改进行监听。 + * 处理焦点变化的事件,并利用OnTextViewChangeListener对文本修改进行监听。 + * 生成上下文菜单,根据文本中的URLSpan创建菜单项并跳转到相应链接。 + * @Author: 作者名 xumingyang + * @CreateDate: 2024-01-06 8:13 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-06 8:13 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ +public class NoteEditText extends EditText {//继承edittext,设置便签设置文本框 private static final String TAG = "NoteEditText"; private int mIndex; private int mSelectionStartBeforeDelete; @@ -46,6 +64,7 @@ public class NoteEditText extends EditText { private static final String SCHEME_HTTP = "http:" ; private static final String SCHEME_EMAIL = "mailto:" ; + //建立一个字符和整数的hash表,用于链接电话,网站,还有邮箱 private static final Map sSchemaActionResMap = new HashMap(); static { sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); @@ -56,18 +75,19 @@ public class NoteEditText extends EditText { /** * Call by the {@link NoteEditActivity} to delete or add edit text */ + //在NoteEditActivity中删除或添加文本的操作,可以看做是一个文本是否被变的标记,英文注释已说明的很清楚 public interface OnTextViewChangeListener { /** * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens * and the text is null */ - void onEditTextDelete(int index, String text); + void onEditTextDelete(int index, String text);//处理删除按键时的操作 /** * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} * happen */ - void onEditTextEnter(int index, String text); + void onEditTextEnter(int index, String text);//处理进入按键时的操作 /** * Hide or show item option when text change @@ -77,72 +97,96 @@ public class NoteEditText extends EditText { private OnTextViewChangeListener mOnTextViewChangeListener; + //根据context设置文本 public NoteEditText(Context context) { - super(context, null); + super(context, null);//用super引用父类变量 mIndex = 0; } - + //设置当前光标 public void setIndex(int index) { mIndex = index; } + //初始化文本修改标记 public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } + //AttributeSet 百度了一下是自定义空控件属性,用于维护便签动态变化的属性 + //初始化便签 public NoteEditText(Context context, AttributeSet attrs) { super(context, attrs, android.R.attr.editTextStyle); } + // 根据defstyle自动初始化 public NoteEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } + /** + * @method onTouchEvent + * @description 在用户触摸屏幕时被调用,实现了根据用户点击的位置更新光标的位置,让用户更加方便地编辑文本。 + * @param *参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息, + * 例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。 + * @return 返回super.onTouchEvent(event)来处理其他的触摸事件 + */ @Override public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { + switch (event.getAction()) {//重写了需要处理屏幕被按下的事件 case MotionEvent.ACTION_DOWN: - + //更新当前坐标值 int x = (int) event.getX(); int y = (int) event.getY(); x -= getTotalPaddingLeft(); y -= getTotalPaddingTop(); x += getScrollX(); y += getScrollY(); - + //用布局控件layout根据x,y的新值设置新的位置 Layout layout = getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); Selection.setSelection(getText(), off); break; } - + //更新光标新的位置 return super.onTouchEvent(event); } + /** + * @method onKeyDown + * @description 处理用户按下一个键盘按键时会触发 的事件 + * @param + * @return 返回super.onKeyDown(keyCode, event)来处理其他的按键事件 + */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { + switch (keyCode) {//根据按键的 Unicode 编码值来处理 + case KeyEvent.KEYCODE_ENTER://“进入”按键 + if (mOnTextViewChangeListener != null) {//如果设置了则返回false,否则交给父类处理。 return false; } break; - case KeyEvent.KEYCODE_DEL: - mSelectionStartBeforeDelete = getSelectionStart(); + case KeyEvent.KEYCODE_DEL://“删除”按键 + mSelectionStartBeforeDelete = getSelectionStart();//通过getSelectionStart()方法获取当前光标的位置,并记录下来 break; default: break; } - return super.onKeyDown(keyCode, event); + return super.onKeyDown(keyCode, event);//继续执行父类的其他点击事件 } + /** + * @method onKeyUp + * @description 在用户释放一个键盘按键时被调用。它实现了处理删除和回车事件的功能,并触发相应的回调。 + * @param keyCode 按键码 keyevent 按键对象 + * @return 需要返回super.onKeyUp(keyCode, event)来处理其他的按键事件。 + */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { - switch(keyCode) { + switch(keyCode) {//根据按键的 Unicode 编码值来处理,有删除和进入2种操作 case KeyEvent.KEYCODE_DEL: - if (mOnTextViewChangeListener != null) { + if (mOnTextViewChangeListener != null) {//若是被修改过 if (0 == mSelectionStartBeforeDelete && mIndex != 0) { mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); return true; @@ -151,7 +195,7 @@ public class NoteEditText extends EditText { Log.d(TAG, "OnTextViewChangeListener was not seted"); } break; - case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_ENTER://同上也是分为监听器是否建立2种情况 if (mOnTextViewChangeListener != null) { int selectionStart = getSelectionStart(); String text = getText().subSequence(selectionStart, length()).toString(); @@ -168,18 +212,29 @@ public class NoteEditText extends EditText { } @Override + /** + * @method onFocusChanged + * @description 在TextView获取或失去焦点时被调用。它实现了当TextView失去焦点且内容为空时,触发onTextChange()回调。 + * @param * focused表示触发该事件的View是否获得了焦点,当该控件获得焦点时,Focused等于true,否则等于false。 + * direction表示焦点移动的方向,用数值表示 + * @return 表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域,即表示焦点是从哪里来的。如果不可用则为null + */ protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { - mOnTextViewChangeListener.onTextChange(mIndex, false); + if (mOnTextViewChangeListener != null) {//若监听器已经建立 + if (!focused && TextUtils.isEmpty(getText())) {//获取到焦点并且文本不为空 + mOnTextViewChangeListener.onTextChange(mIndex, false);//mOnTextViewChangeListener子函数,置false隐藏事件选项 } else { - mOnTextViewChangeListener.onTextChange(mIndex, true); + mOnTextViewChangeListener.onTextChange(mIndex, true);//mOnTextViewChangeListener子函数,置true显示事件选项 } } - super.onFocusChanged(focused, direction, previouslyFocusedRect); + super.onFocusChanged(focused, direction, previouslyFocusedRect); //继续执行父类的其他焦点变化的事件 } @Override + /** + * @method onCreateContextMenu + * @description 创建上下文菜单(Context Menu)。它实现了在文本中存在URL链接时,在上下文菜单中添加相应的选项,并在点击选项时执行相应的操作。 + */ protected void onCreateContextMenu(ContextMenu menu) { if (getText() instanceof Spanned) { int selStart = getSelectionStart(); @@ -192,13 +247,13 @@ public class NoteEditText extends EditText { if (urls.length == 1) { int defaultResId = 0; for(String schema: sSchemaActionResMap.keySet()) { - if(urls[0].getURL().indexOf(schema) >= 0) { + if(urls[0].getURL().indexOf(schema) >= 0) {//若url可以添加则在添加后将defaultResId置为key所映射的值 defaultResId = sSchemaActionResMap.get(schema); break; } } - if (defaultResId == 0) { + if (defaultResId == 0) {//defaultResId == 0则说明url并没有添加任何东西,所以置为连接其他SchemaActionResMap的值 defaultResId = R.string.note_link_other; } @@ -212,6 +267,6 @@ public class NoteEditText extends EditText { }); } } - super.onCreateContextMenu(menu); + super.onCreateContextMenu(menu);//继续执行父类的其他菜单创建的事件 } } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteItemData.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteItemData.java index 0f5a878..15669c7 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteItemData.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NoteItemData.java @@ -26,6 +26,20 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.DataUtils; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NoteItemData + * @Description: 这是一个便签应用中的一个数据类,用于存储和管理便签的相关信息。它包含了便签的各种属性和方法, + * 例如便签的ID、提醒日期、背景颜色、创建日期、是否有附件等等。 + * @Author: xumingyang + * @CreateDate: 2024-01-06 8:46 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-06 8:46 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ public class NoteItemData { static final String [] PROJECTION = new String [] { NoteColumns.ID, @@ -42,6 +56,7 @@ public class NoteItemData { NoteColumns.WIDGET_TYPE, }; + //常量标记和数据就不一一标记了,意义翻译基本就知道 private static final int ID_COLUMN = 0; private static final int ALERTED_DATE_COLUMN = 1; private static final int BG_COLOR_ID_COLUMN = 2; @@ -76,7 +91,9 @@ public class NoteItemData { private boolean mIsOneNoteFollowingFolder; private boolean mIsMultiNotesFollowingFolder; + //初始化NoteItemData,主要利用光标cursor获取的东西 public NoteItemData(Context context, Cursor cursor) { + //getxxx为转换格式 mId = cursor.getLong(ID_COLUMN); mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); @@ -109,31 +126,35 @@ public class NoteItemData { checkPostion(cursor); } + //根据鼠标的位置设置标记,和位置 private void checkPostion(Cursor cursor) { + //初始化几个标记 mIsLastItem = cursor.isLast() ? true : false; mIsFirstItem = cursor.isFirst() ? true : false; mIsOnlyOneItem = (cursor.getCount() == 1); + //初始化“多重子文件”“单一子文件”2个标记 mIsMultiNotesFollowingFolder = false; mIsOneNoteFollowingFolder = false; - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {//若是note格式并且不是第一个元素 int position = cursor.getPosition(); - if (cursor.moveToPrevious()) { + if (cursor.moveToPrevious()) {//获取光标位置后看上一行 if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { + || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {//若光标满足系统或note格式 if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true; + mIsMultiNotesFollowingFolder = true;//若是数据行数大于但前位置+1则设置成正确 } else { mIsOneNoteFollowingFolder = true; } } - if (!cursor.moveToNext()) { + if (!cursor.moveToNext()) {//若不能再往下走则报错 throw new IllegalStateException("cursor move to previous but can't move back"); } } } } + //以下都是获取标记 public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; } @@ -214,6 +235,7 @@ public class NoteItemData { return (mAlertDate > 0); } + //若数据父id为保存至文件夹模式的id且满足电话号码单元不为空,则isCallRecord为true public boolean isCallRecord() { return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListActivity.java index 3cecceb..f86b4a9 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListActivity.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListActivity.java @@ -78,6 +78,19 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashSet; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NotesListActivity + * @Description: 显示和管理便签列表的主要界面。 + * @Author: xumingyang + * @CreateDate: 2024-01-09 11:02 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-09 11:02 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { /* 用于首页背景切换的控制变量 @@ -141,11 +154,26 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private final static int REQUEST_CODE_OPEN_NODE = 102; private final static int REQUEST_CODE_NEW_NODE = 103; + /** + * @method onCreate + * @description 用于初始化资源 + */ @Override protected void onCreate(Bundle savedInstanceState) { + /* + 需要是final类型 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 + final类不能被继承,没有子类,final类中的方法默认是final的。 + final方法不能被子类的方法覆盖,但可以被继承。 + final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 + final不能用于修饰构造方法。 + */ super.onCreate(savedInstanceState); + // 调用父类的onCreate函数 setContentView(R.layout.note_list); + //绑定视图 initResources(); + //调用初始化函数进行初始化 包括数据和视图的关联 + getWindow().setBackgroundDrawableResource(R.drawable.picture1); /** * Insert an introduction when user firstly use this application @@ -153,27 +181,41 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt setAppInfoFromRawRes(); } + + /** + * @method onActivityResult + * @description 返回一些子模块完成的数据交给主Activity处理 + */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // 结果值 和 要求值 符合要求 if (resultCode == RESULT_OK && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { mNotesListAdapter.changeCursor(null); } else { super.onActivityResult(requestCode, resultCode, data); + // 调用 Activity 的onActivityResult() } } + /** + * @method setAppInfoFromRawRes + * @description 用于从应用的原始资源文件中读取介绍内容,并将其保存为一个便签。 + */ private void setAppInfoFromRawRes() { + // Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。 SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { StringBuilder sb = new StringBuilder(); InputStream in = null; try { + // 把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后, + // 以openRawResource方法(不带后缀的资源文件名)打开这个文件。 in = getResources().openRawResource(R.raw.introduction); if (in != null) { InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; + char [] buf = new char[1024];// 自行定义的数值,使用者不知道有什么意义 int len = 0; while ((len = br.read(buf)) > 0) { sb.append(buf, 0, len); @@ -195,12 +237,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } } - + // 创建空的WorkingNote WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, ResourceParser.RED); note.setWorkingText(sb.toString()); if (note.saveNote()) { + // 更新保存note的信息 sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); } else { Log.e(TAG, "Save introduction note error"); @@ -209,17 +252,30 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } + /** + * @method onStart + * @description 启动时执行异步查询操作,以获取数据并在 UI 中显示结果。 + */ @Override protected void onStart() { super.onStart(); + //调用父类的 onStart() 方法 startAsyncNotesListQuery(); } + /** + * @method initResources + * @description 进行资源的初始化 + */ private void initResources() { mContentResolver = this.getContentResolver(); + // 获取应用程序的数据,得到类似数据表的东西 mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); mCurrentFolderId = Notes.ID_ROOT_FOLDER; + + // findViewById 是安卓编程的定位函数,主要是引用.R文件里的引用名 mNotesListView = (ListView) findViewById(R.id.notes_list); + // 绑定XML中的ListView,作为Item的容器 mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), null, false); mNotesListView.setOnItemClickListener(new OnListItemClickListener()); @@ -227,6 +283,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt mNotesListAdapter = new NotesListAdapter(this); mNotesListView.setAdapter(mNotesListAdapter); mAddNewNote = (Button) findViewById(R.id.btn_new_note); + // 在activity中要获取该按钮 mAddNewNote.setOnClickListener(this); mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); mDispatch = false; @@ -237,6 +294,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt mModeCallBack = new ModeCallback(); } + // 继承自ListView.MultiChoiceModeListener 和 OnMenuItemClickListener private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { private DropdownMenu mDropDownMenu; private ActionMode mActionMode; @@ -274,15 +332,24 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }); return true; } + + /** + * @method updateMenu + * @description 新下拉菜单的内容。 + * 根据已选择的项目数量和选择状态更新下拉菜单的标题和菜单项。它用于在用户选择项目时动态更新菜单的显示内容。 + */ private void updateMenu() { int selectedCount = mNotesListAdapter.getSelectedCount(); + //取已选择的项目数量。 // Update dropdown menu String format = getResources().getString(R.string.menu_select_title, selectedCount); - mDropDownMenu.setTitle(format); + //获取一个格式化的字符串,其中包含已选择的项目数量。然后,将该字符串设置为下拉菜单的标题 + mDropDownMenu.setTitle(format);// 更改标题 MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); if (item != null) { if (mNotesListAdapter.isAllSelected()) { + //检查是否所有项目都被选择。 item.setChecked(true); item.setTitle(R.string.menu_deselect_all); } else { @@ -292,39 +359,76 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } + /** + * @method onPrepareActionMode + * @description 进入操作模式时对菜单进行特定的修改或更新 + * @return 方法直接返回 false,表示不需要进行任何额外的操作或更新。 + */ public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub return false; } + + /** + * @method onActionItemClicked + * @description 并用于处理操作模式菜单项的点击事件。 + * @param mode 和 item 其中,mode 表示当前的操作模式对象,而 item 表示被点击的菜单项对象。 + * @return 直接返回 false 表示菜单项的点击事件未被处理。 返回 true 表示已经处理了相应的菜单项点击事件。 + */ public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // TODO Auto-generated method stub return false; } + + /** + * @method onDestroyActionMode + * @description 它实现了 ActionMode.Callback 接口中的方法,并用于销毁操作模式。 + */ public void onDestroyActionMode(ActionMode mode) { mNotesListAdapter.setChoiceMode(false); + //取消列表的选择模式。 mNotesListView.setLongClickable(true); + //重新启用列表项的长按事件。 mAddNewNote.setVisibility(View.VISIBLE); + //将新建笔记按钮设置为可见状态。 } + //用于结束当前的操作模式。 public void finishActionMode() { mActionMode.finish(); + //在调用 finish() 方法之前,需要确保当前存在一个有效的操作模式对象 mActionMode。 + // 如果当前不存在任何操作模式对象,则调用 finish() 方法将抛出异常。 } + + /** + * @method onItemCheckedStateChanged + * @description 它实现了 ActionMode.Callback 接口中的方法,并用于处理列表项的选中状态变化事件。 + * @param mode 表示当前的操作模式对象,position 表示列表项的位置,id 表示列表项的唯一标识符,checked 表示列表项的选中状态。 + */ public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { mNotesListAdapter.setCheckedItem(position, checked); + //将列表项的选中状态传递给列表适配器,在适配器中更新相应的数据。 updateMenu(); + //根据当前选中的列表项的数量,更新操作模式的菜单项。 } + /** + * @method onMenuItemClick + * @description 它实现了 MenuItem.OnMenuItemClickListener 接口中的方法,并用于处理操作模式菜单项的单击事件。 + * @param *方法接收一个参数 item,表示被单击的菜单项。 + */ + public boolean onMenuItemClick(MenuItem item) { if (mNotesListAdapter.getSelectedCount() == 0) { Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), Toast.LENGTH_SHORT).show(); return true; } - + //根据被单击的菜单项 ID,执行不同的操作。 int itemId = item.getItemId(); if (itemId == R.id.delete) { AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); @@ -345,11 +449,18 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt startQueryDestinationFolders(); } else { return false; + //如果被单击的菜单项不是删除或移动菜单项,则返回 false } return true; + //如果成功处理了菜单项,则返回 true。 } } + /** + * @method + * @description 实现了OnTouchListener接口。主要功能是处理触摸。 + */ + private class NewNoteOnTouchListener implements OnTouchListener { public boolean onTouch(View v, MotionEvent event) { @@ -360,6 +471,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt int newNoteViewHeight = mAddNewNote.getHeight(); int start = screenHeight - newNoteViewHeight; int eventY = start + (int) event.getY(); + //首先获取屏幕高度和新笔记视图的高度,并计算出起始位置。如果当前状态是子文件夹状态,则还需减去标题栏的高度。 /** * Minus TitleBar's height */ @@ -377,6 +489,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * also change. This is very bad, just for the UI designer's strong requirement. */ if (event.getY() < (event.getX() * (-0.12) + 94)) { + //通过判断触摸点的坐标是否在"New Note"按钮的透明部分上方,来决定是否将事件转发给位于按钮后面的列表视图。 View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 - mNotesListView.getFooterViewsCount()); if (view != null && view.getBottom() > start @@ -395,6 +508,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt mDispatchY += (int) event.getY() - mOriginY; event.setLocation(event.getX(), mDispatchY); return mNotesListView.dispatchTouchEvent(event); + //当动作为ACTION_MOVE(移动)时,如果之前已经开始转发事件,则更新转发的Y坐标,并将事件重新定位后转发给列表视图。 } break; } @@ -403,6 +517,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt event.setLocation(event.getX(), mDispatchY); mDispatch = false; return mNotesListView.dispatchTouchEvent(event); + //如果没有进行事件转发,则返回false,表示本类未处理该事件。 } break; } @@ -412,6 +527,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }; + /** + * @method startAsyncNotesListQuery + * @description 它通过异步查询数据库,获取指定文件夹下的笔记列表,并将结果显示在UI上。 + * @param + * *FOLDER_NOTE_LIST_QUERY_TOKEN是一个常量值,用于标识该次查询(可以理解为查询ID)。 + * 第二个参数为null,表示不需要传递额外的数据。 + * 第三个参数是查询的URI,即Notes.CONTENT_NOTE_URI,表示查询笔记内容的URI。 + * 第四个参数是查询需要返回的列名数组(NoteItemData.PROJECTION),用于指定查询结果中需要包含哪些列。 + * 第五个参数是selection,表示查询时要使用的筛选条件。 + * 最后一个参数是一个字符串数组,表示用于替换查询语句中占位符的值。 + */ private void startAsyncNotesListQuery() { String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION : NORMAL_SELECTION; @@ -449,18 +575,29 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt public BackgroundQueryHandler(ContentResolver contentResolver) { super(contentResolver); } - + + + /** + * @method onQueryComplete + * @description 用于处理异步查询完成后的回调。 + * @param token 参数来判断当前是哪个查询完成了。根据不同的查询标识(token),执行相应的操作。 + */ @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { switch (token) { case FOLDER_NOTE_LIST_QUERY_TOKEN: + //表示文件夹笔记列表查询完成。 mNotesListAdapter.changeCursor(cursor); + //更新笔记列表的显示内容。 break; case FOLDER_LIST_QUERY_TOKEN: + //表示文件夹列表查询完成。 if (cursor != null && cursor.getCount() > 0) { showFolderListMenu(cursor); + //调用showFolderListMenu(cursor)方法,显示文件夹列表菜单。 } else { Log.e(TAG, "Query folder failed"); + //在日志中记录查询文件夹失败的错误信息。 } break; default: @@ -469,32 +606,51 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } + + /** + * @method showFolderListMenu + * @description 用于显示文件夹列表菜单。 + */ private void showFolderListMenu(Cursor cursor) { AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); builder.setTitle(R.string.menu_title_select_folder); final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + //设置对话框的列表项和点击事件监听器。 + //将适配器设置为对话框的列表项,并在点击列表项时执行相应的操作。 public void onClick(DialogInterface dialog, int which) { DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); Toast.makeText( + //显示一条消息,内容为移动的笔记数量和所选文件夹的名称。 NotesListActivity.this, getString(R.string.format_move_notes_to_folder, mNotesListAdapter.getSelectedCount(), adapter.getFolderName(NotesListActivity.this, which)), Toast.LENGTH_SHORT).show(); mModeCallBack.finishActionMode(); + //结束动作模式(Action Mode),即退出多选模式。 } }); builder.show(); + //显示文件夹列表菜单对话框 } + + /** + * @method createNewNote + * @description 用于创建新的笔记 + * @param * intent 来启动一个名为NoteEditActivity的活动, + * ACTION_INSERT_OR_EDIT表示要执行插入或编辑操作 + * Notes.INTENT_EXTRA_FOLDER_ID则是传递当前文件夹的ID + */ private void createNewNote() { Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_INSERT_OR_EDIT); intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); + //通过startActivityForResult方法启动活动,并传递了一个请求码(REQUEST_CODE_NEW_NOTE),以便在活动返回结果时进行区分。 } private void batchDelete() { @@ -534,16 +690,30 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }.execute(); } + + /** + * @method deleteFolder + * @description 避免意外情况下删除根文件夹 + * @date: 2024-01-09 14:54 + * @author: 作者名 + * @param folderId,表示要删除的文件夹的ID + * @return + */ + private void deleteFolder(long folderId) { if (folderId == Notes.ID_ROOT_FOLDER) { Log.e(TAG, "Wrong folder id, should not happen " + folderId); return; + //在方法内部,首先通过条件判断检查folderId是否等于Notes.ID_ROOT_FOLDER(根文件夹的ID)。 + // 如果是根文件夹的ID,则记录错误日志并返回,不执行删除操作。 } HashSet ids = new HashSet(); ids.add(folderId); + //创建一个HashSet对象,并将folderId添加到该集合中 HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, folderId); + //调用DataUtils.getFolderNoteWidget()方法获取与该文件夹相关联的小部件。将结果保存在widgets变量中。 if (!isSyncMode()) { // if not synced, delete folder directly DataUtils.batchDeleteNotes(mContentResolver, ids); @@ -556,11 +726,17 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { updateWidget(widget.widgetId, widget.widgetType); + //遍历widgets集合中的每个小部件,并根据小部件的ID和类型调用updateWidget()方法进行小部件的更新操作。 } } } } + + /** + * @method openNode + * @description 用于打开笔记。 + */ private void openNode(NoteItemData data) { Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_VIEW); @@ -568,48 +744,75 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); } + /** + * @method openFolder + * @description 打开指定的文件夹 + * @param data,表示要打开的文件夹 + * @return + */ private void openFolder(NoteItemData data) { mCurrentFolderId = data.getId(); + //将当前文件夹的ID设置为参数data的ID,并调用startAsyncNotesListQuery()方法开始异步查询当前文件夹下的笔记列表。 startAsyncNotesListQuery(); + //根据文件夹的ID判断当前状态: if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { mState = ListEditState.CALL_RECORD_FOLDER; mAddNewNote.setVisibility(View.GONE); + //如果文件夹的ID为Notes.ID_CALL_RECORD_FOLDER,则将状态设置为ListEditState.CALL_RECORD_FOLDER,并隐藏添加新笔记按钮; } else { mState = ListEditState.SUB_FOLDER; + //将状态设置为ListEditState.SUB_FOLDER。 } + //根据文件夹的ID设置标题栏的文本: if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { mTitleBar.setText(R.string.call_record_folder_name); + //如果文件夹的ID为Notes.ID_CALL_RECORD_FOLDER,则设置标题栏的文本为字符串资源R.string.call_record_folder_name; } else { mTitleBar.setText(data.getSnippet()); + //否则,设置标题栏的文本为文件夹的名称(通过调用data.getSnippet()方法获取) } mTitleBar.setVisibility(View.VISIBLE); + //将标题栏设置为可见状态。 } + //当按钮控件的 id 为 btn_new_note 的按钮被点击时,该方法会调用 createNewNote() 方法。 public void onClick(View v) { if (v.getId() == R.id.btn_new_note) { createNewNote(); } } + //显示软键盘 private void showSoftInput() { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (inputMethodManager != null) { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } } - + //隐藏软键盘 private void hideSoftInput(View view) { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } + + /** + * @method showCreateOrModifyFolderDialog + * @description 用于创建或者是修改文件夹 + * @param *接收一个参数create,用于指示是创建文件夹还是修改文件夹。 + */ private void showCreateOrModifyFolderDialog(final boolean create) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); + //在方法内部,首先创建一个AlertDialog.Builder对象,并通过LayoutInflater从XML布局文件中实例化一个视图。 final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); showSoftInput(); + //获取EditText对象用于输入文件夹名称,并调用showSoftInput()方法显示软键盘。 + + //根据create参数的值,判断是创建文件夹还是修改文件夹。如果是修改文件夹, if (!create) { if (mFocusNoteDataItem != null) { etName.setText(mFocusNoteDataItem.getSnippet()); + // 从mFocusNoteDataItem中获取文件夹名称,并设置对话框的标题为对应的修改文件夹名称; builder.setTitle(getString(R.string.menu_folder_change_name)); } else { Log.e(TAG, "The long click data item is null"); @@ -618,6 +821,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } else { etName.setText(""); builder.setTitle(this.getString(R.string.menu_create_folder)); + // 如果是创建文件夹,则将EditText的文本设置为空,并设置对话框的标题为创建文件夹。 } builder.setPositiveButton(android.R.string.ok, null); @@ -688,15 +892,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }); } + /** + * @method onBackPressed + * @description 用于处理用户按下返回按钮的操作 + */ + @Override public void onBackPressed() { switch (mState) { + //通过switch语句检查当前的状态(mState) case SUB_FOLDER: mCurrentFolderId = Notes.ID_ROOT_FOLDER; mState = ListEditState.NOTE_LIST; startAsyncNotesListQuery(); mTitleBar.setVisibility(View.GONE); break; + /* + 如果当前状态为SUB_FOLDER(子文件夹), + 则将mCurrentFolderId设置为根文件夹的ID(Notes.ID_ROOT_FOLDER), + 将状态设置为笔记列表状态(ListEditState.NOTE_LIST), + 并调用startAsyncNotesListQuery()方法开始异步查询笔记列表。 + 同时,隐藏标题栏(mTitleBar.setVisibility(View.GONE)) + */ case CALL_RECORD_FOLDER: mCurrentFolderId = Notes.ID_ROOT_FOLDER; mState = ListEditState.NOTE_LIST; @@ -704,27 +921,43 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt mTitleBar.setVisibility(View.GONE); startAsyncNotesListQuery(); break; + /* + 如果当前状态为CALL_RECORD_FOLDER(通话记录文件夹), + 则同样将mCurrentFolderId设置为根文件夹的ID, + 将状态设置为笔记列表状态,显示添加新笔记按钮(mAddNewNote.setVisibility(View.VISIBLE)), + 隐藏标题栏,并调用startAsyncNotesListQuery()方法开始异步查询笔记列表。 + */ case NOTE_LIST: super.onBackPressed(); + //调用父类的onBackPressed()方法,执行默认的返回操作。 break; default: break; } } + + /** + * @method updateWidget + * @description 用于更新小部件(widget) + */ private void updateWidget(int appWidgetId, int appWidgetType) { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + //根据appWidgetType的不同值,设置不同的NoteWidgetProvider类作为接收广播的目标。 if (appWidgetType == Notes.TYPE_WIDGET_2X) { intent.setClass(this, NoteWidgetProvider_2x.class); + //设置NoteWidgetProvider_2x类作为目标; } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { intent.setClass(this, NoteWidgetProvider_4x.class); + //则设置NoteWidgetProvider_4x类作为目标 } else { Log.e(TAG, "Unspported widget type"); + //不匹配任何已知的类型,则记录一个错误日志并返回 return; } intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - appWidgetId + appWidgetId//将appWidgetId作为额外参数放入意图中,并通过sendBroadcast方法发送广播。 }); sendBroadcast(intent); @@ -742,17 +975,31 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } }; + + /** + * @method onContextMenuClosed + * @description 在上下文菜单关闭时调用的方法 + */ @Override public void onContextMenuClosed(Menu menu) { if (mNotesListView != null) { mNotesListView.setOnCreateContextMenuListener(null); + //然后通过调用 setOnCreateContextMenuListener(null) 方法将上下文菜单的创建监听器设置为 null,即移除了上下文菜单的创建监听器。 } super.onContextMenuClosed(menu); + //调用 super.onContextMenuClosed(menu) 方法来执行父类的相应操作。 } + + /** + * @method onContextItemSelected + * @description 用于处理上下文菜单项的选择操作 + * @return 返回true表示操作已经成功处理 如果为空,则记录错误日志并返回false + */ @Override public boolean onContextItemSelected(MenuItem item) { if (mFocusNoteDataItem == null) { + //通过检查mFocusNoteDataItem是否为空来确保当前长按操作的数据项不为空 Log.e(TAG, "The long click data item is null"); return false; } @@ -760,6 +1007,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt case MENU_FOLDER_VIEW: openFolder(mFocusNoteDataItem); break; + //如果用户选择了“查看文件夹”菜单项,则调用openFolder()方法打开该文件夹。 case MENU_FOLDER_DELETE: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.alert_title_delete)); @@ -774,9 +1022,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt builder.setNegativeButton(android.R.string.cancel, null); builder.show(); break; + //如果用户选择了“删除文件夹”菜单项,则弹出一个提示对话框, + // 并在用户确认删除操作后调用deleteFolder()方法执行相应的数据库操作。 case MENU_FOLDER_CHANGE_NAME: showCreateOrModifyFolderDialog(false); break; + //如果用户选择了“重命名文件夹”菜单项,则调用showCreateOrModifyFolderDialog()方法显示创建或修改文件夹的对话框。 default: break; } @@ -784,9 +1035,19 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt return true; } + + /** + * @method onPrepareOptionsMenu + * @description 用于在菜单准备显示时进行处理的。 + * 它会根据当前的状态(mState)来加载不同的菜单布局,并设置相应的标题。 + * @return 方法返回true,表示菜单已经被处理完毕。 + */ @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.clear(); + //通过调用menu.clear()方法清除菜单中的所有项。 + //根据mState的不同值,使用getMenuInflater().inflate()方法加载对应的菜单布局文件。 + if (mState == ListEditState.NOTE_LIST) { getMenuInflater().inflate(R.menu.note_list, menu); // set sync or sync_cancel @@ -834,6 +1095,11 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt startActivity(intent); finish(); } + + /** + * @method onOptionsItemSelected + * @description 每当用户选择菜单项时,Android 系统会调用该方法,并传入被选中的菜单项(MenuItem)。 + */ @Override public boolean onOptionsItemSelected(MenuItem item) { int login_mode=-1; @@ -845,6 +1111,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt else{ login_mode=0; } + //该方法首先获取被选中菜单项的ID,然后根据不同的ID执行相应的操作。 int itemId = item.getItemId(); if (itemId == R.id.menu_new_folder) { showCreateOrModifyFolderDialog(true); @@ -926,8 +1193,24 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt dialog.show(); } return true; + /* + * 如果选中的菜单项是R.id.menu_new_folder,则调用showCreateOrModifyFolderDialog(true)方法,显示创建或修改文件夹的对话框。 + * 如果选中的菜单项是R.id.menu_export_text,则调用exportNoteToText()方法,将笔记导出为文本。 + * 如果选中的菜单项是R.id.menu_sync,则根据当前是否处于同步模式(isSyncMode())分别启动或取消同步服务(GTaskSyncService)或打开设置活动(startPreferenceActivity)。 + * 如果选中的菜单项是R.id.menu_setting,则打开设置活动(startPreferenceActivity)。 + * 如果选中的菜单项是R.id.menu_new_note,则创建新的笔记(createNewNote)。 + * 如果选中的菜单项是R.id.menu_search,则执行搜索请求(onSearchRequested)。 + */ } + /** + * @method onSearchRequested + * @description nSearchRequested方法是一个覆盖方法,用于在用户点击搜索按钮或者执行搜索手势时被调用。 + * @param *搜索关键字(null表示没有指定关键字), + * 是否全局搜索(false表示只搜索当前应用程序), + * 应用程序数据(null表示没有额外的应用程序数据), + * 以及是否由用户触发的搜索(false表示不是由用户触发)。 + */ @Override public boolean onSearchRequested() { startSearch(null, false, null /* appData */, false); @@ -975,14 +1258,23 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }.execute(); } - + //用于检查是否处于同步模式 private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } + + /** + * @method startPreferenceActivity + * @description 用于启动应用程序的“偏好设置”屏幕 + * @param + * @return + */ private void startPreferenceActivity() { Activity from = getParent() != null ? getParent() : this; + //通过检查父活动是否存在来确定从哪个活动中启动偏好设置屏幕。 Intent intent = new Intent(from, NotesPreferenceActivity.class); + //创建一个新的意图(Intent)对象,并将其目标设置为NotesPreferenceActivity类。 from.startActivityIfNeeded(intent, -1); } @@ -1027,6 +1319,18 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } + /** + * @method startQueryDestinationFolders + * @description 用于开始查询目标文件夹列表。 + * @param + * *FOLDER_LIST_QUERY_TOKEN:查询令牌,用于标识此次查询。 + * null:附加到查询令牌的对象,这里为null。 + * Notes.CONTENT_NOTE_URI:要查询的URI,表示笔记内容。 + * FoldersListAdapter.PROJECTION:要返回的数据列数组。 + * selection:查询的条件字符串。 + * new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER), String.valueOf(mCurrentFolderId) }:查询条件中的参数值。 + * NoteColumns.MODIFIED_DATE + " DESC":查询结果按照修改日期降序排列。 + */ private void startQueryDestinationFolders() { String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; selection = (mState == ListEditState.NOTE_LIST) ? selection: @@ -1044,21 +1348,30 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt }, NoteColumns.MODIFIED_DATE + " DESC"); } - + /** + * @method onItemLongClick + * @description 用于处理列表项的长按事件 + * @return 返回false表示事件未被消耗,以便继续处理其他可能的事件。 + */ public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { if (view instanceof NotesListItem) { + //通过检查view是否是NotesListItem的实例来确定长按的列表项类型。 mFocusNoteDataItem = ((NotesListItem) view).getItemData(); if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { if (mNotesListView.startActionMode(mModeCallBack) != null) { mModeCallBack.onItemCheckedStateChanged(null, position, id, true); - mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + //调用mModeCallBack.onItemCheckedStateChanged()方法更新选择状态。 + mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); + //调用mNotesListView.performHapticFeedback()方法进行触觉反馈,表示长按操作已触发。 } else { Log.e(TAG, "startActionMode fails"); } } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); - } + //如果数据项的类型为文件夹类型(Notes.TYPE_FOLDER),则设置列表视图的上下文菜单创建监听器(mFolderOnCreateContextMenuListener)。 + } } return false; + //返回false表示事件未被消耗,以便继续处理其他可能的事件。 } } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java index 51c9cb9..a7c847f 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java @@ -31,56 +31,104 @@ import java.util.HashSet; import java.util.Iterator; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NotesListAdapter + * @Description: 扩展了CursorAdapter类,用于显示笔记列表。 + * 该适配器具有选择模式,允许用户选择多个项目,并处理所选项目的响应。 + * 它还提供了一些实用方法,例如获取所选项目的ID和小部件属性等。 + * @Author: xumingyang + * @CreateDate: 2024-01-07 23:46 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-07 23:46 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ public class NotesListAdapter extends CursorAdapter { private static final String TAG = "NotesListAdapter"; private Context mContext; private HashMap mSelectedIndex; - private int mNotesCount; - private boolean mChoiceMode; + private int mNotesCount;//便签数 + private boolean mChoiceMode;//选择模式标记 + //桌面widget的属性,包括编号和类型 public static class AppWidgetAttribute { public int widgetId; public int widgetType; }; + /** + * @method NotesListAdapter + * @description 初始化便签链接器 + */ public NotesListAdapter(Context context) { - super(context, null); - mSelectedIndex = new HashMap(); + super(context, null);//父类对象置空 + mSelectedIndex = new HashMap();//新建选项下标的hash表 mContext = context; mNotesCount = 0; } + /** + * @method newView + * @description 新建一个视图来存储光标所指向的数据 + * return 返回一个新的项目选项 + */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); } + /** + * @method bindView + * @description 将已经存在的视图和鼠标指向的数据进行捆绑 + */ @Override public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof NotesListItem) { + if (view instanceof NotesListItem) {//若view是NotesListItem的一个实例 + //则新建一个项目选项并且用bind跟将view和鼠标,内容,便签数据捆绑在一起 NoteItemData itemData = new NoteItemData(context, cursor); ((NotesListItem) view).bind(context, itemData, mChoiceMode, isSelectedItem(cursor.getPosition())); } } + /** + * @method setCheckedItem + * @description 设置勾选框 + */ public void setCheckedItem(final int position, final boolean checked) { - mSelectedIndex.put(position, checked); - notifyDataSetChanged(); + mSelectedIndex.put(position, checked);//根据定位和是否勾选设置下标 + notifyDataSetChanged();//在修改后刷新activity } + //判断单选按钮是否勾选 public boolean isInChoiceMode() { return mChoiceMode; } + /** + * @method setChoiceMode + * @description 设置单项选项框 + */ public void setChoiceMode(boolean mode) { - mSelectedIndex.clear(); + mSelectedIndex.clear();//重置下标并且根据参数mode设置选项 mChoiceMode = mode; } + /* + * 函数功能:选择全部选项 + * 函数实现:如下注释 + */ + /** + * @method selectAll + * @description 选择全部选项 + * @param *cursor游标对象 + */ public void selectAll(boolean checked) { - Cursor cursor = getCursor(); - for (int i = 0; i < getCount(); i++) { + Cursor cursor = getCursor();//获取光标位置 + for (int i = 0; i < getCount(); i++) {//遍历所有光标可用的位置在判断为便签类型之后勾选单项框 if (cursor.moveToPosition(i)) { if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { setCheckedItem(i, checked); @@ -89,14 +137,20 @@ public class NotesListAdapter extends CursorAdapter { } } + /** + * @method getSelectedItemIds + * @description 建立选择项的下标列表 + * @param *hashset hash表 + * @return 返回一个itemSet 下标列表 + */ public HashSet getSelectedItemIds() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { + HashSet itemSet = new HashSet();//建立hash表 + for (Integer position : mSelectedIndex.keySet()) {//遍历所有的关键 + if (mSelectedIndex.get(position) == true) {//若光标位置可用 Long id = getItemId(position); - if (id == Notes.ID_ROOT_FOLDER) { + if (id == Notes.ID_ROOT_FOLDER) {//原文件不需要添加 Log.d(TAG, "Wrong item id, should not happen"); - } else { + } else { //则将id该下标假如选项集合中 itemSet.add(id); } } @@ -105,12 +159,18 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + /** + * @method getSelectedWidget + * @description 建立桌面Widget的选项表 + * @param *hashset hash表 + * @return 返回一个itemSet 桌面Widget选项表 + */ public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { if (mSelectedIndex.get(position) == true) { Cursor c = (Cursor) getItem(position); - if (c != null) { + if (c != null) {//光标位置可用的话就建立新的Widget属性并编辑下标和类型,最后添加到选项集中 AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); @@ -128,12 +188,17 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + /** + * @method getSelectedCount + * @description 统计选项的个数 + * @return 返回count 表示选项的个数 + */ public int getSelectedCount() { - Collection values = mSelectedIndex.values(); + Collection values = mSelectedIndex.values();//首先获取选项下标的值 if (null == values) { return 0; } - Iterator iter = values.iterator(); + Iterator iter = values.iterator();//初始化叠加器 int count = 0; while (iter.hasNext()) { if (true == iter.next()) { @@ -143,37 +208,44 @@ public class NotesListAdapter extends CursorAdapter { return count; } + //函数功能:判断是否全部选中 public boolean isAllSelected() { int checkedCount = getSelectedCount(); return (checkedCount != 0 && checkedCount == mNotesCount); + //获取选项数看是否等于便签的个数 } + //函数功能:判断是否为选项表 public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { return false; } return mSelectedIndex.get(position); + //通过传递的下标来确定 } + //函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 @Override protected void onContentChanged() { - super.onContentChanged(); + super.onContentChanged();//执行基类函数 calcNotesCount(); } + //函数功能:在activity光标发生局部变动的时候回调该函数计算便签的数量 @Override public void changeCursor(Cursor cursor) { super.changeCursor(cursor); calcNotesCount(); } + //函数功能:计算便签数量 private void calcNotesCount() { mNotesCount = 0; for (int i = 0; i < getCount(); i++) { Cursor c = (Cursor) getItem(i); if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; + mNotesCount++;//若该位置不为空并且文本类型为便签就+1 } } else { Log.e(TAG, "Invalid cursor"); diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListItem.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListItem.java index 1221e80..77ef8ce 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListItem.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesListItem.java @@ -29,18 +29,21 @@ import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - +//创建便签列表项目选项 public class NotesListItem extends LinearLayout { - private ImageView mAlert; - private TextView mTitle; - private TextView mTime; + private ImageView mAlert;//闹钟图片 + private TextView mTitle;//标题 + private TextView mTime;//时间 private TextView mCallName; - private NoteItemData mItemData; - private CheckBox mCheckBox; + private NoteItemData mItemData;//标签数据 + private CheckBox mCheckBox;//打钩框 + /*初始化基本信息*/ public NotesListItem(Context context) { - super(context); + super(context);//super()它的主要作用是调整调用父类构造函数的顺序 inflate(context, R.layout.note_item, this); + //Inflate可用于将一个xml中定义的布局控件找出来,这里的xml是r。layout + //findViewById用于从contentView中查找指定ID的View,转换出来的形式根据需要而定; mAlert = (ImageView) findViewById(R.id.iv_alert_icon); mTitle = (TextView) findViewById(R.id.tv_title); mTime = (TextView) findViewById(R.id.tv_time); @@ -48,6 +51,7 @@ public class NotesListItem extends LinearLayout { mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); } + //根据data的属性对各个控件的属性的控制,主要是可见性Visibility,内容setText,格式setTextAppearance public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { if (choiceMode && data.getType() == Notes.TYPE_NOTE) { mCheckBox.setVisibility(View.VISIBLE); @@ -57,6 +61,7 @@ public class NotesListItem extends LinearLayout { } mItemData = data; + //设置控件属性,一共三种情况,由data的id和父id是否与保存到文件夹的id一致来决定 if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { mCallName.setVisibility(View.GONE); mAlert.setVisibility(View.VISIBLE); @@ -94,13 +99,15 @@ public class NotesListItem extends LinearLayout { } } } - mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));//设置内容,获取相关时间,从data里编辑的日期中获取 setBackground(data); } + //根据data的文件属性来设置背景 private void setBackground(NoteItemData data) { int id = data.getBgColorId(); + //若是note型文件,则4种情况,对于4种不同情况的背景来源 if (data.getType() == Notes.TYPE_NOTE) { if (data.isSingle() || data.isOneFollowingFolder()) { setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); @@ -111,7 +118,9 @@ public class NotesListItem extends LinearLayout { } else { setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } - } else { + } + //若不是note直接调用文件夹的背景来源 + else { setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } diff --git a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java index 07c5f7e..0d8db59 100644 --- a/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/xiaomi/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java @@ -48,53 +48,78 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; +/** + * + * @ProjectName: + * @Package: net.micode.notes.ui + * @ClassName: NotesPreferenceActivity + * @Description: 它提供了一些选项供用户选择,例如设置字体大小、颜色、排序方式、备份/恢复等。 + * 用户可以通过这个界面来调整应用程序的行为和外观,以更好地适应其需求和喜好。 + * NotesPreferenceActivity,在小米便签中主要实现的是对背景颜色和字体大小的数据储存。 + * 继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity + * @Author: xumingyang + * @CreateDate: 2024-01-08 18:03 + * @UpdateUser: 更新者: + * @UpdateDate: 2024-01-08 18:03 + * @UpdateRemark: 更新说明: + * @Version: 1.0 + */ public class NotesPreferenceActivity extends PreferenceActivity { - public static final String PREFERENCE_NAME = "notes_preferences"; + public static final String PREFERENCE_NAME = "notes_preferences";//优先名 - public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; + public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name";//同步账号 - public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; + public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time";//同步时间 public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; - private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; + private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; //同步密码 - private static final String AUTHORITIES_FILTER_KEY = "authorities"; + private static final String AUTHORITIES_FILTER_KEY = "authorities";//本地密码 - private PreferenceCategory mAccountCategory; + private PreferenceCategory mAccountCategory; //账户分组 - private GTaskReceiver mReceiver; + private GTaskReceiver mReceiver;//同步任务接收器 - private Account[] mOriAccounts; + private Account[] mOriAccounts;//账户 - private boolean mHasAddedAccount; + private boolean mHasAddedAccount;//账户的HASH标记 + /** + * @method onCreate + * @description 创建一个activity,在函数里要完成所有的正常静态设置 + * @param *Bundle icicle:存放了 activity 当前的状态 + */ @Override protected void onCreate(Bundle icicle) { - super.onCreate(icicle); + super.onCreate(icicle);//先执行父类的创建函数 /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setDisplayHomeAsUpEnabled(true);//给左上角图标的左边加上一个返回的图标 - addPreferencesFromResource(R.xml.preferences); - mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); + addPreferencesFromResource(R.xml.preferences);//添加xml来源并显示 xml + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);//根据同步账户关键码来初始化分组 mReceiver = new GTaskReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); + registerReceiver(mReceiver, filter);//初始化同步组件 mOriAccounts = null; - View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - getListView().addHeaderView(header, null, true); + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);//获取listvivew,ListView的作用:用于列出所有选择 + getListView().addHeaderView(header, null, true); //在listview组件上方添加其他组件 } @Override + /** + * @method onResume + * @description activity交互功能的实现,用于接受用户的输入 + */ protected void onResume() { - super.onResume(); + super.onResume();//先执行父类 的交互实现 // need to set sync account automatically if user has added a new // account - if (mHasAddedAccount) { + if (mHasAddedAccount) {//若用户新加了账户则自动设置同步账户 Account[] accounts = getGoogleAccounts(); if (mOriAccounts != null && accounts.length > mOriAccounts.length) { for (Account accountNew : accounts) { @@ -116,6 +141,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { refreshUI(); } + /** + * @method onDestroy + * @description 销毁一个activity + */ @Override protected void onDestroy() { if (mReceiver != null) { @@ -124,48 +153,66 @@ public class NotesPreferenceActivity extends PreferenceActivity { super.onDestroy(); } + /** + * @method loadAccountPreference + * @description 重新设置账户信息 + */ private void loadAccountPreference() { mAccountCategory.removeAll(); - + //销毁所有的分组 Preference accountPref = new Preference(this); + //建立首选项 final String defaultAccount = getSyncAccountName(this); accountPref.setTitle(getString(R.string.preferences_account_title)); accountPref.setSummary(getString(R.string.preferences_account_summary)); + //设置首选项的大标题和小标题 accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { + //建立监听器 if (!GTaskSyncService.isSyncing()) { if (TextUtils.isEmpty(defaultAccount)) { // the first time to set account + //若是第一次建立账户显示选择账户提示对话框 showSelectAccountAlertDialog(); } else { // if the account has already been set, we need to promp // user about the risk + //若是已经建立则显示修改对话框并进行修改操作 showChangeAccountConfirmAlertDialog(); } } else { + //若在没有同步的情况下,则在toast中显示不能修改 Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) + R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) .show(); } return true; } }); + //根据新建首选项编辑新的账户分组 mAccountCategory.addPreference(accountPref); } + /** + * @method loadSyncButton + * @description 设置按键的状态和最后同步的时间 + */ private void loadSyncButton() { Button syncButton = (Button) findViewById(R.id.preference_sync_button); TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - + //获取同步按钮控件和最终同步时间的的窗口 // set button state + //设置按钮的状态 if (GTaskSyncService.isSyncing()) { + //若是在同步状态下 syncButton.setText(getString(R.string.preferences_button_sync_cancel)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { GTaskSyncService.cancelSync(NotesPreferenceActivity.this); } }); + //设置按钮显示的文本为“取消同步”以及监听器 } else { syncButton.setText(getString(R.string.preferences_button_sync_immediately)); syncButton.setOnClickListener(new View.OnClickListener() { @@ -173,50 +220,68 @@ public class NotesPreferenceActivity extends PreferenceActivity { GTaskSyncService.startSync(NotesPreferenceActivity.this); } }); + //若是不同步则设置按钮显示的文本为“立即同步”以及对应监听器 } syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); + //设置按键可用还是不可用 // set last sync time + // 设置最终同步时间 if (GTaskSyncService.isSyncing()) { + //若是在同步的情况下 lastSyncTimeView.setText(GTaskSyncService.getProgressString()); lastSyncTimeView.setVisibility(View.VISIBLE); + // 根据当前同步服务器设置时间显示框的文本以及可见性 } else { + //若是非同步情况 long lastSyncTime = getLastSyncTime(this); if (lastSyncTime != 0) { lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, DateFormat.format(getString(R.string.preferences_last_sync_time_format), lastSyncTime))); lastSyncTimeView.setVisibility(View.VISIBLE); + //则根据最后同步时间的信息来编辑时间显示框的文本内容和可见性 } else { + //若时间为空直接设置为不可见状态 lastSyncTimeView.setVisibility(View.GONE); } } } + /** + * @method refreshUI + * @description 刷新标签界面 + */ private void refreshUI() { loadAccountPreference(); loadSyncButton(); + //调用上文设置账号和设置按键两个函数来实现 } - + /** + * @method showSelectAccountAlertDialog + * @description 函数功能:显示账户选择的对话框并进行账户的设置 + */ private void showSelectAccountAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); + //创建一个新的对话框 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - + //设置标题以及子标题的内容 dialogBuilder.setCustomTitle(titleView); dialogBuilder.setPositiveButton(null, null); - + //设置对话框的自定义标题,建立一个YES的按钮 Account[] accounts = getGoogleAccounts(); String defAccount = getSyncAccountName(this); - + //获取同步账户信息 mOriAccounts = accounts; mHasAddedAccount = false; if (accounts.length > 0) { + //若账户不为空 CharSequence[] items = new CharSequence[accounts.length]; final CharSequence[] itemMapping = items; int checkedItem = -1; @@ -224,83 +289,119 @@ public class NotesPreferenceActivity extends PreferenceActivity { for (Account account : accounts) { if (TextUtils.equals(account.name, defAccount)) { checkedItem = index; + //在账户列表中查询到所需账户 } items[index++] = account.name; } dialogBuilder.setSingleChoiceItems(items, checkedItem, + //在对话框建立一个单选的复选框 new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { setSyncAccount(itemMapping[which].toString()); dialog.dismiss(); + //取消对话框 refreshUI(); } + //设置点击后执行的事件,包括检录新同步账户和刷新标签界面 }); + //建立对话框网络版的监听器 } View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); dialogBuilder.setView(addAccountView); + //给新加账户对话框设置自定义样式 final AlertDialog dialog = dialogBuilder.show(); + //显示对话框 addAccountView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mHasAddedAccount = true; + //将新加账户的hash置true Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); + //建立网络建立组件 intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { - "gmail-ls" + "gmail-ls" }); startActivityForResult(intent, -1); + //跳回上一个选项 dialog.dismiss(); } }); + //建立新加账户对话框的监听器 } + /** + * @method showChangeAccountConfirmAlertDialog + * @description 显示账户选择对话框和相关账户操作 + */ private void showChangeAccountConfirmAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - + //创建一个新的对话框 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, getSyncAccountName(this))); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); + //根据同步修改的账户信息设置标题以及子标题的内容 dialogBuilder.setCustomTitle(titleView); - + //设置对话框的自定义标题 CharSequence[] menuItemArray = new CharSequence[] { getString(R.string.preferences_menu_change_account), getString(R.string.preferences_menu_remove_account), getString(R.string.preferences_menu_cancel) }; + //定义一些标记字符串 dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { + //设置对话框要显示的一个list,用于显示几个命令时,即change,remove,cancel public void onClick(DialogInterface dialog, int which) { + //按键功能,由which来决定 if (which == 0) { + //进入账户选择对话框 showSelectAccountAlertDialog(); } else if (which == 1) { + //删除账户并且跟新便签界面 removeSyncAccount(); refreshUI(); } } }); dialogBuilder.show(); + //显示对话框 } + /** + * @method getGoogleAccounts + * @description 获取谷歌账户 + */ private Account[] getGoogleAccounts() { AccountManager accountManager = AccountManager.get(this); return accountManager.getAccountsByType("com.google"); + //通过账户管理器直接获取 } + /** + * @method setSyncAccount + * @description 设置同步账户 + */ private void setSyncAccount(String account) { if (!getSyncAccountName(this).equals(account)) { + //假如该账号不在同步账号列表中 SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); + //编辑共享的首选项 if (account != null) { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); } else { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } + //将该账号加入到首选项中 + editor.commit(); + //提交修改的数据 - // clean up last sync time setLastSyncTime(this, 0); + //将最后同步时间清零 // clean up local gtask related info new Thread(new Runnable() { @@ -311,23 +412,34 @@ public class NotesPreferenceActivity extends PreferenceActivity { getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); } }).start(); + //重置当地同步任务的信息 Toast.makeText(NotesPreferenceActivity.this, getString(R.string.preferences_toast_success_set_accout, account), Toast.LENGTH_SHORT).show(); + //将toast的文本信息置为“设置账户成功”并显示出来 } } + /** + * @method removeSyncAccount + * @description 删除同步账户 + */ private void removeSyncAccount() { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); + //设置共享首选项 + if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); + //假如当前首选项中有账户就删除 } if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { editor.remove(PREFERENCE_LAST_SYNC_TIME); + //删除当前首选项中有账户时间 } editor.commit(); + //提交更新后的数据 // clean up local gtask related info new Thread(new Runnable() { @@ -338,51 +450,82 @@ public class NotesPreferenceActivity extends PreferenceActivity { getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); } }).start(); + //重置当地同步任务的信息 } + + /** + * @method getSyncAccountName + * @description 获取同步账户名称 + */ public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + //通过共享的首选项里的信息直接获取 return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } + + /** + * @method setLastSyncTime + * @description 设置最终同步的时间 + */ public static void setLastSyncTime(Context context, long time) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); + // 从共享首选项中找到相关账户并获取其编辑器 editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); editor.commit(); + //编辑最终同步时间并提交更新 } + /** + * @method getLastSyncTime + * @description 获取最终同步时间 + */ public static long getLastSyncTime(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + //通过共享的首选项里的信息直接获取 return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); } + /** + * @method + * @description 接受同步信息 + */ private class GTaskReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { refreshUI(); if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { + //获取随广播而来的Intent中的同步服务的数据 TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); syncStatus.setText(intent .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); + //通过获取的数据在设置系统的状态 } } } - + /** + * @method onOptionsItemSelected + * @description 处理菜单的选项 + * @param *MenuItem菜单选项 + */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + //根据选项的id选择,这里只有一个主页 case android.R.id.home: Intent intent = new Intent(this, NotesListActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; + //在主页情况下在创建连接组件intent,发出清空的信号并开始一个相应的activity default: return false; } } -} +} \ No newline at end of file