diff --git a/doc/report.docx b/doc/report.docx index 16fb34e..dedc5fa 100644 Binary files a/doc/report.docx and b/doc/report.docx differ diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java index 0ea27b7..b5a9e75 100644 --- a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java +++ b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -29,10 +29,21 @@ import net.micode.notes.ui.NotesListActivity; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * @method: GTaskASyncTask + * @description:GTaskASyncTask 类继承 AsyncTask 类而来,负责同步任务读取的账户准备, + * 完成消息报文的读取,取消任务同步,以及显示任务的进度信息,完成信息的任务。 + * 总计定义了4个私有的变量 + * mcontext 用于访问特定资源和类的context对象 + * mOnCompleteListener 回调接口,将传递结果给调用者 + * mNotifiManager 通过调用 mTaskManager 控制和调度异步任务 + * @date: 9:01 + * @author: Xia Yanbo +*/ public class GTaskASyncTask extends AsyncTask { - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;//序列化,用于验证版本 +//声明定义一个接口OnCompleteListener,实现放在后面 public interface OnCompleteListener { void onComplete(); } @@ -44,7 +55,16 @@ public class GTaskASyncTask extends AsyncTask { private GTaskManager mTaskManager; private OnCompleteListener mOnCompleteListener; - +/** + * @method: GTaskASyncTask + * @description:GTaskASyncTask类的构造函数,完成构造 + * @date: 16:11 + * @author: Xia Yanbo + * @param: mcontext 用于访问特定资源和类的context对象 + * @param: mOnCompleteListener 回调接口,将传递结果给调用者 + * @param: mNotifiManager 通过调用 + * @param: mTaskManager 控制和调度异步任务 +*/ public GTaskASyncTask(Context context, OnCompleteListener listener) { mContext = context; mOnCompleteListener = listener; @@ -52,22 +72,42 @@ public class GTaskASyncTask extends AsyncTask { .getSystemService(Context.NOTIFICATION_SERVICE); mTaskManager = GTaskManager.getInstance(); } - + /** + * @method: GTaskASyncTask + * @description:取消异步任务 + * @date: 8:32 + * @author: Xia Yanbo + */ public void cancelSync() { mTaskManager.cancelSync(); } + /** + * @method: GTaskASyncTask + * @description:更新异步任务的进度 + * @date: 8:33 + * @author: Xia Yanbo + * @param: message 进度的报文 + */ public void publishProgess(String message) { publishProgress(new String[] { message }); } - + /** + * @method: GTaskASyncTask + * @description:显示系统通知 + * @date: 8:35 + * @author: Xia Yanbo + * @param:tickerId通知的文本资源的ID + * @param:content通知的具体文本内容 + * @return:NULL + */ private void showNotification(int tickerId, String content) { Notification notification = new Notification(R.drawable.notification, mContext .getString(tickerId), System.currentTimeMillis()); notification.defaults = Notification.DEFAULT_LIGHTS; - notification.flags = Notification.FLAG_AUTO_CANCEL; + notification.flags = Notification.FLAG_AUTO_CANCEL;//打上标识,用于判断发送报错信息和通知操作等 PendingIntent pendingIntent; if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, @@ -79,24 +119,43 @@ public class GTaskASyncTask extends AsyncTask { } // notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, // pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//直接调用父类的方法 } - + /** + * @method: GTaskASyncTask + * @description:运行在后台,执行同步操作前准备 + * @date: 8:46 + * @author: Xia Yanbo + * @return: 状态码,用于检验同步是否完成 + */ @Override protected Integer doInBackground(Void... unused) { publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); + .getSyncAccountName(mContext)));//获取用户的状态信息 return mTaskManager.sync(mContext, this); } - + /** + * @method: GTaskASyncTask + * @description:同步过程中发送传输同步信息的报文 + * @date: 8:50 + * @author: Xia Yanbo + * @param:Progress 正在进行的任务的进度信息 + */ @Override protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { + showNotification(R.string.ticker_syncing, progress[0]);//显示正在进行同步操作的通知 + if (mContext instanceof GTaskSyncService) {//检查是否是GTaskSyncService的实例。 ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + // 如果是,就调用该服务的sendBroadcast方法发送广播,通知其他组件同步的进度。 } } - + /** + * @method: GTaskASyncTask + * @description:将执行完毕的任务的完成信息,错误信息以及取消信息显示出来 + * @date: 8:57 + * @author: Xia Yanbo + * @param:result 进程运行的结果信息 + */ @Override protected void onPostExecute(Integer result) { if (result == GTaskManager.STATE_SUCCESS) { @@ -111,7 +170,7 @@ public class GTaskASyncTask extends AsyncTask { showNotification(R.string.ticker_cancel, mContext .getString(R.string.error_sync_cancelled)); } - if (mOnCompleteListener != null) { + if (mOnCompleteListener != null) {//如果监听到了报文,创建一个新的线程来通知任务完成(减少主进程时间浪费) new Thread(new Runnable() { public void run() { diff --git a/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/main/java/net/micode/notes/ui/NoteEditText.java index 2afe2a8..39592b5 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -36,16 +36,26 @@ import net.micode.notes.R; import java.util.HashMap; import java.util.Map; - +/** + * @classname: NoteEditText + * @methodname + * @description: + * @date: 2023/12/24 9:22 + * @author: Xia Yanbo + * @param: + * @param: + * @param: + * @return: +*/ public class NoteEditText extends EditText { - private static final String TAG = "NoteEditText"; - private int mIndex; + private static final String TAG = "NoteEditText";//标签,分类接收特定信息 + private int mIndex;//声明文本的索引 private int mSelectionStartBeforeDelete; - + //声明字符串常量,标志电话、网址、邮件 private static final String SCHEME_TEL = "tel:" ; private static final String SCHEME_HTTP = "http:" ; private static final String SCHEME_EMAIL = "mailto:" ; - + //设置映射,将文本内容拼接成完整的网址 private static final Map sSchemaActionResMap = new HashMap(); static { sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); @@ -55,53 +65,65 @@ 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 + * 当按下delete时删除编辑的文字 */ void onEditTextDelete(int index, String text); /** * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} * happen + * 当按下enter时添加编辑的文本到文本中 */ void onEditTextEnter(int index, String text); /** * Hide or show item option when text change + * 当文字发生变化时显示或者隐藏起设置 */ void onTextChange(int index, boolean hasText); } - + //声明文本视图变化的监听器 private OnTextViewChangeListener mOnTextViewChangeListener; - + //实例化NoteEditText对象, public NoteEditText(Context context) { super(context, null); mIndex = 0; } - + //为本本编辑设置一个索引 public void setIndex(int index) { mIndex = index; } - + //直接调用父类,定义好文本视图变化的监听器 public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } - + //NoteEditText的构造函数,通过文本编辑风格的参数集实例化 public NoteEditText(Context context, AttributeSet attrs) { super(context, attrs, android.R.attr.editTextStyle); } - + //NoteEditText的构造函数,通过文本编辑风格的参数集实例化,支持用户自定义风格 public NoteEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); + super(context, attrs, defStyle);//允许自定义风格 // TODO Auto-generated constructor stub } - + /** + * @classname: NoteEditText + * @methodname onTouchEvent + * @description:根据得到的用户采取的动作(事件)类型进行相应的光标的设置 + * @date: 2023/12/24 10:05 + * @author: Xia Yanbo + * @param:event 具体的动作动作事件 + * @return:boolean 表示是否成功 + */ @Override public boolean onTouchEvent(MotionEvent event) { - switch (event.getAction()) { + switch (event.getAction()) {//对动作事件进行分类的判别 case MotionEvent.ACTION_DOWN: int x = (int) event.getX(); @@ -112,15 +134,24 @@ public class NoteEditText extends EditText { y += getScrollY(); Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); + int line = layout.getLineForVertical(y);//直接获取行数 + int off = layout.getOffsetForHorizontal(line, x);//从边界起数获得偏移 Selection.setSelection(getText(), off); break; } - return super.onTouchEvent(event); + return super.onTouchEvent(event);//再调用父类的方法进行后续的处理 } - + /** + * @classname: NoteEditText + * @methodname onKeyDown + * @description:监听键盘按键按下 + * @date: 2023/12/24 10:15 + * @author: Xia Yanbo + * @param:keyCode 按键的编码值 + * @param:event 按键的具体事件 + * @return:boolean 表示判断执行的过程是否顺利 + */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { @@ -137,7 +168,16 @@ public class NoteEditText extends EditText { } return super.onKeyDown(keyCode, event); } - + /** + * @classname: NoteEditText + * @methodname onKeyUp + * @description:监听键盘按键抬起 + * @date: 2023/12/24 10:15 + * @author: Xia Yanbo + * @param:keyCode 按键的编码值 + * @param:event 按键的具体事件 + * @return:boolean 表示判断执行的过程是否顺利 + */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch(keyCode) { @@ -166,11 +206,20 @@ public class NoteEditText extends EditText { } return super.onKeyUp(keyCode, event); } - + /** + * @classname: NoteEditText + * @methodname onFocusChanged + * @description:对应当前视图的焦点改变 + * @date: 2023/12/24 10:25 + * @author: Xia Yanbo + * @param:focused 焦点改变或者还未改变 + * @param:direction 改变方向? + * @param:reviouslyFocusedRect 上一个焦点所关注的视图 + */ @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { + if (!focused && TextUtils.isEmpty(getText())) {//当没有输入,关注的视图也发生改变,设置隐藏 mOnTextViewChangeListener.onTextChange(mIndex, false); } else { mOnTextViewChangeListener.onTextChange(mIndex, true); @@ -178,19 +227,27 @@ public class NoteEditText extends EditText { } super.onFocusChanged(focused, direction, previouslyFocusedRect); } - + /** + * @classname: NoteEditText + * @methodname onCreateContextMenu + * @description:创建文本的上下文菜单 + * @date: 2023/12/24 10:34 + * @author: Xia Yanbo + * @param:contextMenu 现有的上下文菜单 + */ @Override protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - + if (getText() instanceof Spanned) {//检查文本的类型 Spanned是一个接口 + int selStart = getSelectionStart();//所选择文本的开始位置 + int selEnd = getSelectionEnd();//所选择文本的结束位置 + //确定选择开始的较小值和较大值,方便直接做差 int min = Math.min(selStart, selEnd); int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + //获取选择的文本范围内获取所有的 URLSpan 对象。URLSpan 是用于表示文本中的链接的。 + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);//获取范围 if (urls.length == 1) { int defaultResId = 0; + //根据URL获取资源 for(String schema: sSchemaActionResMap.keySet()) { if(urls[0].getURL().indexOf(schema) >= 0) { defaultResId = sSchemaActionResMap.get(schema); @@ -201,9 +258,10 @@ public class NoteEditText extends EditText { if (defaultResId == 0) { defaultResId = R.string.note_link_other; } - + //添加菜单项 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() { + //设置监听器,放菜单项被点击,触发链接 public boolean onMenuItemClick(MenuItem item) { // goto a new intent urls[0].onClick(NoteEditText.this); @@ -212,6 +270,6 @@ public class NoteEditText extends EditText { }); } } - super.onCreateContextMenu(menu); + super.onCreateContextMenu(menu);//调用父类方法 } }