diff --git a/README.md b/README.md deleted file mode 100644 index e17a68e..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# xiaomi_mini - diff --git a/doc/master.txt b/doc/master.txt deleted file mode 100644 index e69de29..0000000 diff --git a/doc/实践模板-开源软件的质量分析报告文档.docx b/doc/实践模板-开源软件的质量分析报告文档.docx index 367b563..4d306fe 100644 Binary files a/doc/实践模板-开源软件的质量分析报告文档.docx and b/doc/实践模板-开源软件的质量分析报告文档.docx differ diff --git a/doc/泛读分析和维护报告.docx b/doc/泛读分析和维护报告.docx index cf36ca3..8559734 100644 Binary files a/doc/泛读分析和维护报告.docx and b/doc/泛读分析和维护报告.docx differ diff --git a/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/main/java/net/micode/notes/gtask/data/SqlData.java index 7fdfd17..2bf0273 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlData.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -71,9 +71,9 @@ public class SqlData { private ContentValues mDiffDataValues; - public SqlData(Context context) {//初始化对象,用于存储数据 + public SqlData(Context context) { mContentResolver = context.getContentResolver(); - mIsCreate = true;//一类型的变量为true + mIsCreate = true; mDataId = INVALID_ID; mDataMimeType = DataConstants.NOTE; mDataContent = ""; @@ -82,14 +82,14 @@ public class SqlData { mDiffDataValues = new ContentValues(); } - public SqlData(Context context, Cursor c) {//同样是存储数据,另外定义支持冲cursor读入 + public SqlData(Context context, Cursor c) { mContentResolver = context.getContentResolver(); - mIsCreate = false;//二类型的变量为false + mIsCreate = false; loadFromCursor(c); mDiffDataValues = new ContentValues(); } - private void loadFromCursor(Cursor c) {//上面用到的从cursor读取的函数,从存储的各个列获取数据 + private void loadFromCursor(Cursor c) { mDataId = c.getLong(DATA_ID_COLUMN); mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); mDataContent = c.getString(DATA_CONTENT_COLUMN); @@ -97,9 +97,9 @@ public class SqlData { mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); } - public void setContent(@androidx.annotation.NonNull JSONObject js) throws JSONException {//获取json类型的参数,并且根据它更新自定义的数据单元中的值 - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;//如果有id直接赋值,没有则需要在获取 - if (mIsCreate || mDataId != dataId) {//初始未设置的数据单元通过它设置内容,通过cursor产生的数据元可通过它完成更新 + public void setContent(JSONObject js) throws JSONException { + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; + if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); } mDataId = dataId; @@ -131,7 +131,7 @@ public class SqlData { } public JSONObject getContent() throws JSONException { - if (mIsCreate) {//同样的只有通过cursor产生的数据单元可通过这个函数获取数据 + if (mIsCreate) { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } @@ -144,7 +144,7 @@ public class SqlData { return js; } - public void commit(long noteId, boolean validateVersion, long version) {//提交数据,并且打上类似于标签的版本号以及验证值 + public void commit(long noteId, boolean validateVersion, long version) { if (mIsCreate) { if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { @@ -162,12 +162,12 @@ public class SqlData { } else { if (mDiffDataValues.size() > 0) { int result = 0; - if (!validateVersion) { // 不验证版本的情况下,直接使用ContentResolver更新指定ID的数据 + if (!validateVersion) { result = mContentResolver.update(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { // 需要验证版本的情况下,使用ContentResolver进行条件更新操作 + } else { result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, + Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { String.valueOf(noteId), String.valueOf(version) diff --git a/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/main/java/net/micode/notes/gtask/data/SqlNote.java index 48891a6..79a4095 100644 --- a/src/main/java/net/micode/notes/gtask/data/SqlNote.java +++ b/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -122,7 +122,7 @@ public class SqlNote { private ArrayList mDataList; - public SqlNote(Context context) {//定义数据单元存储数据 + public SqlNote(Context context) { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = true; @@ -135,7 +135,7 @@ public class SqlNote { mParentId = 0; mSnippet = ""; mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;//直接从设置的属性中获取值 + mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; mWidgetType = Notes.TYPE_WIDGET_INVALIDE; mOriginParent = 0; mVersion = 0; @@ -147,14 +147,14 @@ public class SqlNote { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; - loadFromCursor(c);//从cursor中直接获取变量值 + loadFromCursor(c); mDataList = new ArrayList(); if (mType == Notes.TYPE_NOTE) loadDataContent(); mDiffNoteValues = new ContentValues(); } - public SqlNote(Context context, long id) {//根据id初始化数据单元 + public SqlNote(Context context, long id) { mContext = context; mContentResolver = context.getContentResolver(); mIsCreate = false; @@ -175,7 +175,7 @@ public class SqlNote { }, null); if (c != null) { c.moveToNext(); - loadFromCursor(c);//通过调用减少重复代码编写 + loadFromCursor(c); } else { Log.w(TAG, "loadFromCursor: cursor = null"); } @@ -185,7 +185,7 @@ public class SqlNote { } } - private void loadFromCursor(Cursor c) {//直接使用get获得变量值 + private void loadFromCursor(Cursor c) { mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); @@ -200,7 +200,7 @@ public class SqlNote { mVersion = c.getLong(VERSION_COLUMN); } - private void loadDataContent() {//这个函数判别查询的数据是否存在,并且读取到数据列表中存储 + private void loadDataContent() { Cursor c = null; mDataList.clear(); try { @@ -210,12 +210,12 @@ public class SqlNote { }, null); if (c != null) { if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data");//遇到文件为空抛出对应的异常 + Log.w(TAG, "it seems that the note has not data"); return; } while (c.moveToNext()) { SqlData data = new SqlData(mContext, c); - mDataList.add(data);//向Datalist中加入读取到的数据 + mDataList.add(data); } } else { Log.w(TAG, "loadDataContent: cursor = null"); @@ -226,8 +226,7 @@ public class SqlNote { } } - public boolean setContent(JSONObject js) {//设置数据单元中变量的值 - //如果所需的值存在,直接赋值使用,否则再先进行一步读取 + public boolean setContent(JSONObject js) { try { JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { @@ -360,7 +359,7 @@ public class SqlNote { return true; } - public JSONObject getContent() {//直接读取的方式将所需的数据读到对应变量 + public JSONObject getContent() { try { JSONObject js = new JSONObject(); @@ -413,7 +412,6 @@ public class SqlNote { mDiffNoteValues.put(NoteColumns.PARENT_ID, id); } - //定义一些简单的获取取值的方法 public void setGtaskId(String gid) { mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); } @@ -442,7 +440,7 @@ public class SqlNote { return mType == Notes.TYPE_NOTE; } - public void commit(boolean validateVersion) {//将数据做一定修改提交 + public void commit(boolean validateVersion) { if (mIsCreate) { if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { mDiffNoteValues.remove(NoteColumns.ID); diff --git a/src/main/java/net/micode/notes/gtask/data/Task.java b/src/main/java/net/micode/notes/gtask/data/Task.java index 4d68293..6a19454 100644 --- a/src/main/java/net/micode/notes/gtask/data/Task.java +++ b/src/main/java/net/micode/notes/gtask/data/Task.java @@ -32,7 +32,7 @@ import org.json.JSONException; import org.json.JSONObject; -public class Task extends Node {//继承Node类的属性 +public class Task extends Node { private static final String TAG = Task.class.getSimpleName(); private boolean mCompleted; @@ -54,7 +54,7 @@ public class Task extends Node {//继承Node类的属性 mMetaInfo = null; } - public JSONObject getCreateAction(int actionId) {//创建一个初始的任务对象,并对它赋初值 + public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); try { @@ -103,7 +103,7 @@ public class Task extends Node {//继承Node类的属性 return js; } - public JSONObject getUpdateAction(int actionId) {//更新任务 + public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); try { @@ -120,7 +120,7 @@ public class Task extends Node {//继承Node类的属性 // entity_delta JSONObject entity = new JSONObject(); entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) {//如果笔记不为空,更新笔记 + if (getNotes() != null) { entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); } entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); @@ -135,11 +135,11 @@ public class Task extends Node {//继承Node类的属性 return js; } - public void setContentByRemoteJSON(JSONObject js) {//通过远端的json设置内容的值 + public void setContentByRemoteJSON(JSONObject js) { if (js != null) { try { // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {//如果值已经被json对象所具备,则直接进行设置 + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); } @@ -175,7 +175,7 @@ public class Task extends Node {//继承Node类的属性 } } - public void setContentByLocalJSON(JSONObject js) {//通过本地的json文件来设置内容 + public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); @@ -204,7 +204,7 @@ public class Task extends Node {//继承Node类的属性 } } - public JSONObject getLocalJSONFromContent() {//通过本地的内容,生成json文件 + public JSONObject getLocalJSONFromContent() { String name = getName(); try { if (mMetaInfo == null) { @@ -216,7 +216,7 @@ public class Task extends Node {//继承Node类的属性 JSONObject js = new JSONObject(); JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray();//声明所有所要用到的变量 + JSONArray dataArray = new JSONArray(); JSONObject data = new JSONObject(); data.put(DataColumns.CONTENT, name); dataArray.put(data); @@ -227,7 +227,7 @@ public class Task extends Node {//继承Node类的属性 } else { // synced task JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);//提取出所有的信息 + JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); for (int i = 0; i < dataArray.length(); i++) { JSONObject data = dataArray.getJSONObject(i); @@ -258,11 +258,11 @@ public class Task extends Node {//继承Node类的属性 } } - public int getSyncAction(Cursor c) {//同步缓存 + public int getSyncAction(Cursor c) { try { JSONObject noteInfo = null; if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);//更新到最新的笔记信息 + noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); } if (noteInfo == null) { @@ -311,14 +311,14 @@ public class Task extends Node {//继承Node类的属性 return SYNC_ACTION_ERROR; } - public boolean isWorthSaving() {//只要有信息就认为是值得保存的,返回true + public boolean isWorthSaving() { return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) || (getNotes() != null && getNotes().trim().length() > 0); } public void setCompleted(boolean completed) { this.mCompleted = completed; - }//进行前面使用过的调用函数返回值的对应 + } public void setNotes(String notes) { this.mNotes = notes; diff --git a/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/main/java/net/micode/notes/gtask/data/TaskList.java index 95d6bf5..4ea21c5 100644 --- a/src/main/java/net/micode/notes/gtask/data/TaskList.java +++ b/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -30,17 +30,17 @@ import org.json.JSONObject; import java.util.ArrayList; -public class TaskList extends Node {//同Task一样,继承了Node +public class TaskList extends Node { private static final String TAG = TaskList.class.getSimpleName(); private int mIndex; - private ArrayList mChildren;//内部含有一个Task的列,是任务的序列 + private ArrayList mChildren; public TaskList() { super(); mChildren = new ArrayList(); - mIndex = 1;//初始化 + mIndex = 1; } public JSONObject getCreateAction(int actionId) { @@ -74,7 +74,7 @@ public class TaskList extends Node {//同Task一样,继承了Node return js; } - public JSONObject getUpdateAction(int actionId) {//更新行动与Task中定义的基本一样 + public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); try { @@ -104,7 +104,7 @@ public class TaskList extends Node {//同Task一样,继承了Node } public void setContentByRemoteJSON(JSONObject js) { - if (js != null) {//类似的通过远端更新内容 + if (js != null) { try { // id if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { @@ -129,7 +129,7 @@ public class TaskList extends Node {//同Task一样,继承了Node } } - public void setContentByLocalJSON(JSONObject js) {//通过本地文件更新内容 + public void setContentByLocalJSON(JSONObject js) { if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); } @@ -215,26 +215,26 @@ public class TaskList extends Node {//同Task一样,继承了Node return SYNC_ACTION_ERROR; } -//以上都与task定义类似 + public int getChildTaskCount() { return mChildren.size(); } public boolean addChildTask(Task task) { boolean ret = false; - if (task != null && !mChildren.contains(task)) {//任务不为空,并且还不在列表中,则将其加入 + if (task != null && !mChildren.contains(task)) { ret = mChildren.add(task); - if (ret) {//成功加入以后继续设置关系 + if (ret) { // need to set prior sibling and parent task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); - task.setParent(this);//设置任务的父子关系 + task.setParent(this); } } return ret; } - public boolean addChildTask(Task task, int index) {//更进一步的实现在指定索引位置插入任务 + public boolean addChildTask(Task task, int index) { if (index < 0 || index > mChildren.size()) { Log.e(TAG, "add child task: invalid index"); return false; @@ -260,9 +260,9 @@ public class TaskList extends Node {//同Task一样,继承了Node return true; } - public boolean removeChildTask(Task task) {//移除子任务 + public boolean removeChildTask(Task task) { boolean ret = false; - int index = mChildren.indexOf(task);//查找其索引 + int index = mChildren.indexOf(task); if (index != -1) { ret = mChildren.remove(task); @@ -281,7 +281,7 @@ public class TaskList extends Node {//同Task一样,继承了Node return ret; } - public boolean moveChildTask(Task task, int index) {//定向移除对应位置的任务 + public boolean moveChildTask(Task task, int index) { if (index < 0 || index >= mChildren.size()) { Log.e(TAG, "move child task: invalid index"); @@ -299,7 +299,7 @@ public class TaskList extends Node {//同Task一样,继承了Node return (removeChildTask(task) && addChildTask(task, index)); } - public Task findChildTaskByGid(String gid) {//通过Gid查找任务 + public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { Task t = mChildren.get(i); if (t.getGid().equals(gid)) { @@ -309,7 +309,7 @@ public class TaskList extends Node {//同Task一样,继承了Node return null; } - public int getChildTaskIndex(Task task) {//获取任务对应的索引 + public int getChildTaskIndex(Task task) { return mChildren.indexOf(task); } @@ -323,7 +323,7 @@ public class TaskList extends Node {//同Task一样,继承了Node public Task getChilTaskByGid(String gid) { for (Task task : mChildren) { - if (task.getGid().equals(gid))//找到一个gid相符的即为所要的任务 + if (task.getGid().equals(gid)) return task; } return null; diff --git a/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java index 1909174..937be4b 100644 --- a/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java +++ b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java @@ -39,4 +39,3 @@ public class ActionFailureException extends RuntimeException { super(paramString, paramThrowable); } } - diff --git a/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java index 331588d..0e30963 100644 --- a/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java +++ b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -42,3 +42,4 @@ public class NetworkFailureException extends Exception { super(paramString, paramThrowable); } } + diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java index c67dfdf..c78f981 100644 --- a/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java +++ b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java @@ -59,7 +59,12 @@ import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; - + /** + * @classname: GTaskClient + * @description:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表 + * @date: 2024/1/4 11:21 + * @author: wangrunze + */ public class GTaskClient { private static final String TAG = GTaskClient.class.getSimpleName(); @@ -101,17 +106,32 @@ public class GTaskClient { mAccount = null; mUpdateArray = null; } - + /** + * @classname: GTaskClient + * @methodname: getInstance + * @description:获取的实例化对象 + * @date: 2024/1/4 11:22 + * @author: wangrunze + */ public static synchronized GTaskClient getInstance() { if (mInstance == null) { mInstance = new GTaskClient(); } return mInstance; } - + /** + * @classname: GTaskClient + * @methodname: login + * @description:用来实现登录操作的函数 + * @date: 2024/1/4 11:22 + * @author: wangrunze + * @param:Activity activity + * @return:true/false + */ public boolean login(Activity activity) { // we suppose that the cookie would expire after 5 minutes // then we need to re-login + //判断距离最后一次登录操作是否超过5分钟 final long interval = 1000 * 60 * 5; if (mLastLoginTime + interval < System.currentTimeMillis()) { mLoggedin = false; @@ -126,6 +146,7 @@ public class GTaskClient { if (mLoggedin) { Log.d(TAG, "already logged in"); + //如果没超过时间,则不需要重新登录 return true; } @@ -135,7 +156,7 @@ public class GTaskClient { Log.e(TAG, "login google account failed"); return false; } - + //使用用户自己的域名登录 // login with custom domain if necessary if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() .endsWith("googlemail.com"))) { @@ -151,6 +172,7 @@ public class GTaskClient { } } + //如果用户账户无法登录,则使用谷歌官方的URI进行登录 // try to login with google official url if (!mLoggedin) { mGetUrl = GTASK_GET_URL; @@ -163,7 +185,16 @@ public class GTaskClient { mLoggedin = true; return true; } - + /** + * @classname: GTaskClient + * @methodname: loginGoogleAccount + * @description:使用令牌机制登录谷歌账户 + * @date: 2024/1/4 11:24 + * @author: wangrunze + * @param:Activity activity + * @param:boolean invalidateToken + * @return:账号的令牌 + */ private String loginGoogleAccount(Activity activity, boolean invalidateToken) { String authToken; AccountManager accountManager = AccountManager.get(activity); @@ -188,7 +219,7 @@ public class GTaskClient { Log.e(TAG, "unable to get an account with the same name in the settings"); return null; } - + //获取选中账号的令牌 // get the token now AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, "goanna_mobile", null, activity, null, null); @@ -206,7 +237,16 @@ public class GTaskClient { return authToken; } - + /** + * @classname: GTaskClient + * @methodname: tryToLoginGtask + * @description:预先判断令牌是否是有效以及是否能登上GTask + * @date: 2024/1/4 11:25 + * @author: wangrunze + * @param:Activity activity + * @param:String authToken + * @return:true/false + */ private boolean tryToLoginGtask(Activity activity, String authToken) { if (!loginGtask(authToken)) { // maybe the auth token is out of date, now let's invalidate the @@ -224,7 +264,14 @@ public class GTaskClient { } return true; } - + /** + * @classname: GTaskClient + * @methodname: loginGtask + * @description:登录GTask + * @date: 2024/1/4 11:26 + * @author: wangrunze + * @param:String authToken + */ private boolean loginGtask(String authToken) { int timeoutConnection = 10000; int timeoutSocket = 15000; @@ -238,11 +285,11 @@ public class GTaskClient { // login gtask try { - String loginUrl = mGetUrl + "?auth=" + authToken; - HttpGet httpGet = new HttpGet(loginUrl); + String loginUrl = mGetUrl + "?auth=" + authToken;//设置登录的url + HttpGet httpGet = new HttpGet(loginUrl);//通过登录的uri实例化网页上资源的查找 HttpResponse response = null; response = mHttpClient.execute(httpGet); - + //获取CookieStore里存放的cookie // get the cookie now List cookies = mHttpClient.getCookieStore().getCookies(); boolean hasAuthCookie = false; @@ -254,7 +301,7 @@ public class GTaskClient { if (!hasAuthCookie) { Log.w(TAG, "it seems that there is no auth cookie"); } - + //获取client的内容 // get the client version String resString = getResponseContent(response.getEntity()); String jsBegin = "_setup("; @@ -283,14 +330,29 @@ public class GTaskClient { private int getActionId() { return mActionId++; } - + /** + * @classname: GTaskClient + * @methodname: createHttpPost + * @description:创建一个用于向网络传输数据的对象 + * @date: 2024/1/4 11:28 + * @author: wangrunze + * @return:httpPost实例化对象 + */ private HttpPost createHttpPost() { HttpPost httpPost = new HttpPost(mPostUrl); httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); httpPost.setHeader("AT", "1"); return httpPost; } - + /** + * @classname: GTaskClient + * @methodname: getResponseContent + * @description:获取响应后返回的数据 + * @date: 2024/1/4 11:29 + * @author: wangrunze + * @param:HttpEntity entity + * @return:获取到的资源 + */ private String getResponseContent(HttpEntity entity) throws IOException { String contentEncoding = null; if (entity.getContentEncoding() != null) { @@ -322,7 +384,15 @@ public class GTaskClient { input.close(); } } - + /** + * @classname: GTaskClient + * @methodname: postRequest + * @description: 通过JSON发送请求 + * @date: 2024/1/4 11:30 + * @author: wangrunze + * @param:JSONObject js + * @return:JSONObject + */ private JSONObject postRequest(JSONObject js) throws NetworkFailureException { if (!mLoggedin) { Log.e(TAG, "please login first"); @@ -359,7 +429,14 @@ public class GTaskClient { throw new ActionFailureException("error occurs when posting request"); } } - + /** + * @classname: GTaskClient + * @methodname: createTask + * @description:创建单个任务 + * @date: 2024/1/4 11:31 + * @author: wangrunze + * @param:Task task + */ public void createTask(Task task) throws NetworkFailureException { commitUpdate(); try { @@ -385,7 +462,14 @@ public class GTaskClient { throw new ActionFailureException("create task: handing jsonobject failed"); } } - + /** + * @classname: GTaskClient + * @methodname: createTaskList + * @description:创建一个任务列表 + * @date: 2024/1/4 11:31 + * @author: wangrunze + * @param:TaskList tasklist + */ public void createTaskList(TaskList tasklist) throws NetworkFailureException { commitUpdate(); try { @@ -411,7 +495,13 @@ public class GTaskClient { throw new ActionFailureException("create tasklist: handing jsonobject failed"); } } - + /** + * @classname: GTaskClient + * @methodname: commitUpdate + * @description:同步更新 + * @date: 2024/1/4 11:32 + * @author: wangrunze + */ public void commitUpdate() throws NetworkFailureException { if (mUpdateArray != null) { try { @@ -432,7 +522,14 @@ public class GTaskClient { } } } - + /** + * @classname: GTaskClient + * @methodname: addUpdateNode + * @description:添加更新的事项 + * @date: 2024/1/4 11:32 + * @author: wangrunze + * @param:Node node + */ public void addUpdateNode(Node node) throws NetworkFailureException { if (node != null) { // too many update items may result in an error @@ -446,7 +543,16 @@ public class GTaskClient { mUpdateArray.put(node.getUpdateAction(getActionId())); } } - + /** + * @classname: GTaskClient + * @methodname: moveTask + * @description:移动task + * @date: 2024/1/4 11:32 + * @author: wangrunze + * @param:Task task + * @param:TaskList preParent + * @param:TaskList curParent + */ public void moveTask(Task task, TaskList preParent, TaskList curParent) throws NetworkFailureException { commitUpdate(); @@ -485,7 +591,14 @@ public class GTaskClient { throw new ActionFailureException("move task: handing jsonobject failed"); } } - + /** + * @classname: GTaskClient + * @methodname: deleteNode + * @description:删除操作节点 + * @date: 2024/1/4 11:33 + * @author: wangrunze + * @param:Node node + */ public void deleteNode(Node node) throws NetworkFailureException { commitUpdate(); try { @@ -508,7 +621,13 @@ public class GTaskClient { throw new ActionFailureException("delete node: handing jsonobject failed"); } } - + /** + * @classname: GTaskClient + * @methodname: getTaskLists + * @description:获取任务列表 + * @date: 2024/1/4 11:34 + * @author: wangrunze + */ public JSONArray getTaskLists() throws NetworkFailureException { if (!mLoggedin) { Log.e(TAG, "please login first"); @@ -546,7 +665,14 @@ public class GTaskClient { throw new ActionFailureException("get task lists: handing jasonobject failed"); } } - + /** + * @classname: GTaskClient + * @methodname: getTaskList + * @description:从网络上获取相应数据 + * @date: 2024/1/4 11:34 + * @author: wangrunze + * @param:String listGid + */ public JSONArray getTaskList(String listGid) throws NetworkFailureException { commitUpdate(); try { diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java b/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java index d2b4082..96e3202 100644 --- a/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java +++ b/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java @@ -47,7 +47,12 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Map; - +/** + * @classname: GTaskManager + * @description:gtask管理 + * @date: 2024/1/4 11:36 + * @author: wangrunze +*/ public class GTaskManager { private static final String TAG = GTaskManager.class.getSimpleName(); @@ -87,7 +92,7 @@ public class GTaskManager { private HashMap mNidToGid; - private GTaskManager() { + private GTaskManager() {//对象初始化函数 mSyncing = false; mCancelled = false; mGTaskListHashMap = new HashMap(); @@ -98,19 +103,41 @@ public class GTaskManager { mGidToNid = new HashMap(); mNidToGid = new HashMap(); } - + /** + * @classname: GTaskManager + * @methodname: getInstance + * @description:初始化 + * @date: 2024/1/4 11:37 + * @author: wangrunze + */ public static synchronized GTaskManager getInstance() { if (mInstance == null) { mInstance = new GTaskManager(); } return mInstance; } - + /** + * @classname: GTaskManager + * @methodname: setActivityContext + * @description:运行在多线程的环境下 + * @date: 2024/1/4 11:38 + * @author: wangrunze + * @param:Activity activity + + */ public synchronized void setActivityContext(Activity activity) { // used for getting authtoken mActivity = activity; } - + /** + * @classname: GTaskManager + * @methodname: sync + * @description:实现本地同步操作和远端同步操作 + * @date: 2024/1/4 11:38 + * @author: wangrunze + * @param:Context context + * @param:GTaskASyncTask asyncTask + */ public int sync(Context context, GTaskASyncTask asyncTask) { if (mSyncing) { Log.d(TAG, "Sync is in progress"); @@ -128,14 +155,14 @@ public class GTaskManager { mNidToGid.clear(); try { - GTaskClient client = GTaskClient.getInstance(); + GTaskClient client = GTaskClient.getInstance();//getInstance即为创建一个实例 client.resetUpdateArray(); // login google task if (!mCancelled) { if (!client.login(mActivity)) { throw new NetworkFailureException("login google task failed"); - } + }//获取Google上的JSONtasklist转为本地TaskList } // get the task list from google @@ -167,7 +194,13 @@ public class GTaskManager { return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; } - + /** + * @classname: GTaskManager + * @methodname: initGTaskList + * @description:初始化GtaskList + * @date: 2024/1/4 11:41 + * @author: wangrunze + */ private void initGTaskList() throws NetworkFailureException { if (mCancelled) return; @@ -246,7 +279,13 @@ public class GTaskManager { throw new ActionFailureException("initGTaskList: handing JSONObject failed"); } } - + /** + * @classname: GTaskManager + * @methodname: syncContent + * @description:本地内容同步操作 + * @date: 2024/1/4 11:41 + * @author: wangrunze + */ private void syncContent() throws NetworkFailureException { int syncType; Cursor c = null; @@ -350,7 +389,13 @@ public class GTaskManager { } } - + /** + * @classname: GTaskManager + * @methodname: syncFolder + * @description:设置文件夹 + * @date: 2024/1/4 11:42 + * @author: wangrunze + */ private void syncFolder() throws NetworkFailureException { Cursor c = null; String gid; @@ -475,7 +520,16 @@ public class GTaskManager { if (!mCancelled) GTaskClient.getInstance().commitUpdate(); } - + /** + * @classname: GTaskManager + * @methodname: doContentSync + * @description:syncType分类 + * @date: 2024/1/4 11:43 + * @author: wangrunze + * @param:int syncType + * @param:Node node + * @param: Cursor c + */ private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -521,7 +575,14 @@ public class GTaskManager { throw new ActionFailureException("unkown sync action type"); } } - + /** + * @classname: GTaskManager + * @methodname: addLocalNode + * @description:本地增加Node + * @date: 2024/1/4 11:43 + * @author: wangrunze + * @param:Node node + */ private void addLocalNode(Node node) throws NetworkFailureException { if (mCancelled) { return; @@ -595,7 +656,15 @@ public class GTaskManager { // update meta updateRemoteMeta(node.getGid(), sqlNote); } - + /** + * @classname: GTaskManager + * @methodname: updateLocalNode + * @description:更新本地node + * @date: 2024/1/4 11:44 + * @author: wangrunze + * @param:Node node + * @param:Cursor cCursor c + */ private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -618,7 +687,15 @@ public class GTaskManager { // update meta info updateRemoteMeta(node.getGid(), sqlNote); } - + /** + * @classname: GTaskManager + * @methodname: addRemoteNode + * @description:远程增加Node + * @date: 2024/1/4 11:44 + * @author: wangrunze + * @param:Node node + * @param:Cursor c + */ private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -691,7 +768,15 @@ public class GTaskManager { mGidToNid.put(n.getGid(), sqlNote.getId()); mNidToGid.put(sqlNote.getId(), n.getGid()); } - + /** + * @classname: GTaskManager + * @methodname: updateRemoteNode + * @description:更新远端的Node + * @date: 2024/1/4 11:45 + * @author: wangrunze + * @param:Node node + * @param:Cursor c + */ private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { if (mCancelled) { return; @@ -729,7 +814,15 @@ public class GTaskManager { sqlNote.resetLocalModified(); sqlNote.commit(true); } - + /** + * @classname: GTaskManager + * @methodname: updateRemoteMeta + * @description:更新远程meta + * @date: 2024/1/4 11:45 + * @author: wangrunze + * @param:String gid + * @param:SqlNote sqlNote + */ private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { if (sqlNote != null && sqlNote.isNoteType()) { MetaData metaData = mMetaHashMap.get(gid); @@ -745,7 +838,13 @@ public class GTaskManager { } } } - + /** + * @classname: GTaskManager + * @methodname: refreshLocalSyncId + * @description:刷新本地 + * @date: 2024/1/4 11:46 + * @author: wangrunze + */ private void refreshLocalSyncId() throws NetworkFailureException { if (mCancelled) { return; @@ -789,11 +888,23 @@ public class GTaskManager { } } } - + /** + * @classname: GTaskManager + * @methodname: getSyncAccount + * @description:获取同步账号 + * @date: 2024/1/4 11:47 + * @author: wangrunze + */ public String getSyncAccount() { return GTaskClient.getInstance().getSyncAccount().name; } - + /** + * @classname: GTaskManager + * @methodname: cancelSync + * @description:取消同步 + * @date: 2024/1/4 11:48 + * @author: wangrunze + */ public void cancelSync() { mCancelled = true; } diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java b/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java index cca36f7..11e143a 100644 --- a/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java +++ b/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java @@ -22,7 +22,12 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; - +/** + * @classname: GTaskSyncService + * @description:运行后台 + * @date: 2024/1/4 11:50 + * @author: wangrunze +*/ public class GTaskSyncService extends Service { public final static String ACTION_STRING_NAME = "sync_action_type"; @@ -41,7 +46,13 @@ public class GTaskSyncService extends Service { private static GTaskASyncTask mSyncTask = null; private static String mSyncProgress = ""; - + /** + * @classname: GTaskSyncService + * @methodname: startSync + * @description:启动一个同步的工作 + * @date: 2024/1/4 11:52 + * @author: wangrunze + */ private void startSync() { if (mSyncTask == null) { mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { @@ -55,18 +66,36 @@ public class GTaskSyncService extends Service { mSyncTask.execute(); } } - + /** + * @classname: GTaskSyncService + * @methodname: cancelSync + * @description:取消同步 + * @date: 2024/1/4 11:53 + * @author: wangrunze + */ private void cancelSync() { if (mSyncTask != null) { mSyncTask.cancelSync(); } } - + /** + * @classname: GTaskSyncService + * @methodname: onCreate + * @description:创建service + * @date: 2024/1/4 11:53 + * @author: wangrunze + */ @Override public void onCreate() { mSyncTask = null; } - + /** + * @classname: GTaskSyncService + * @methodname: onStartCommand + * @description:对service进行操作 + * @date: 2024/1/4 11:54 + * @author: wangrunze + */ @Override public int onStartCommand(Intent intent, int flags, int startId) { Bundle bundle = intent.getExtras(); @@ -85,7 +114,13 @@ public class GTaskSyncService extends Service { } return super.onStartCommand(intent, flags, startId); } - + /** + * @classname: GTaskSyncService + * @methodname: onLowMemory + * @description:取消同步操作 + * @date: 2024/1/4 11:54 + * @author: wangrunze + */ @Override public void onLowMemory() { if (mSyncTask != null) { @@ -96,7 +131,14 @@ public class GTaskSyncService extends Service { public IBinder onBind(Intent intent) { return null; } - + /** + * @classname: GTaskSyncService + * @methodname: sendBroadcast + * @description:发送广播 + * @date: 2024/1/4 11:55 + * @author: wangrunze + * @param:String msg + */ public void sendBroadcast(String msg) { mSyncProgress = msg; Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); @@ -105,13 +147,28 @@ public class GTaskSyncService extends Service { sendBroadcast(intent); } + /** + * @classname: GTaskSyncService + * @methodname: startSync + * @description:开始执行一个service + * @date: 2024/1/4 11:56 + * @author: wangrunze + * @param:Activity activity + */ public static void startSync(Activity activity) { GTaskManager.getInstance().setActivityContext(activity); Intent intent = new Intent(activity, GTaskSyncService.class); intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); activity.startService(intent); } - + /** + * @classname: GTaskSyncService + * @methodname: cancelSync + * @description:取消执行一个service + * @date: 2024/1/4 11:56 + * @author: wangrunze + * @param:Context context + */ public static void cancelSync(Context context) { Intent intent = new Intent(context, GTaskSyncService.class); intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); diff --git a/src/main/java/net/micode/notes/model/Note.java b/src/main/java/net/micode/notes/model/Note.java index 6706cf6..bf32ddf 100644 --- a/src/main/java/net/micode/notes/model/Note.java +++ b/src/main/java/net/micode/notes/model/Note.java @@ -33,78 +33,102 @@ import net.micode.notes.data.Notes.TextNote; import java.util.ArrayList; - +/** + * @classname: Note + * @description:完成便签的创建以及便签后续的更新操作(设置属性值,完成数据同步) + * 允许批量执行操作,可以将便签放至内存存储器中 + * @date: 2024/1/2 21:31 + * @author: Xia Yanbo +*/ public class Note { private ContentValues mNoteDiffValues; private NoteData mNoteData; private static final String TAG = "Note"; /** * Create a new note id for adding a new note to databases + * @classname: Note + * @description:创建或者修改一个新的便签 + * @date: 2024/1/2 20:36 + * @author: Xia Yanbo + * @param:context上下文 + * @param:folderId 所属包的id + * @return:noteID新笔记记录的id */ - public static synchronized long getNewNoteId(Context context, long folderId) { + public static synchronized long getNewNoteId(Context context, long folderId) {//控制类的所有实例的并发访问 // Create a new note in the database + //初始化变量的信息 ContentValues values = new ContentValues(); long createdTime = System.currentTimeMillis(); - values.put(NoteColumns.CREATED_DATE, createdTime); - values.put(NoteColumns.MODIFIED_DATE, createdTime); - values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - values.put(NoteColumns.PARENT_ID, folderId); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); + values.put(NoteColumns.CREATED_DATE, createdTime);//创建时间 + values.put(NoteColumns.MODIFIED_DATE, createdTime);//修改时间 + values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);//便签类型 + values.put(NoteColumns.LOCAL_MODIFIED, 1);//本地修改位,表示在本地被修改过与否 + values.put(NoteColumns.PARENT_ID, folderId);//所属包的id + Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);//插入新的便签记录(标记) long noteId = 0; try { - noteId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { + noteId = Long.valueOf(uri.getPathSegments().get(1));//获取新笔记纪录的id + } catch (NumberFormatException e) {//获取失败报错 Log.e(TAG, "Get note id error :" + e.toString()); noteId = 0; } + //如果noteid为-1抛出id错误的信息 if (noteId == -1) { throw new IllegalStateException("Wrong note id:" + noteId); } return noteId; } - + //初始化定义两个变量用来存储便签的数据,一个是存储便签属性、一个是存储便签内容 public Note() { - mNoteDiffValues = new ContentValues(); - mNoteData = new NoteData(); + mNoteDiffValues = new ContentValues();//便签属性 + mNoteData = new NoteData();//便签内容 } - + //设置便签的属性 public void setNoteValue(String key, String value) { - mNoteDiffValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + mNoteDiffValues.put(key, value);//键值,id + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);//本地编辑修改位 + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());//修改日期 } - + //设置文本数据(标记) public void setTextData(String key, String value) { mNoteData.setTextData(key, value); } - + //设置文本数据的id public void setTextDataId(long id) { mNoteData.setTextDataId(id); } - + //获取文本数据的id public long getTextDataId() { return mNoteData.mTextDataId; } - + //设置通话数据的id public void setCallDataId(long id) { mNoteData.setCallDataId(id); } - + //设置通话数据 public void setCallData(String key, String value) { mNoteData.setCallData(key, value); } - + //判断本地的文件有没有被修改 public boolean isLocalModified() { return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); } - + /** + * @classname: Note + * @methodname syncNote + * @description:同步便签 + * @date: 2024/1/2 20:54 + * @author: Xia Yanbo + * @param:context + * @param:noteid便签的id号 + * @return:boolean返回更新是否正确完成 + */ public boolean syncNote(Context context, long noteId) { if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); } - + //没有修改过则不需要更新 if (!isLocalModified()) { return true; } @@ -112,7 +136,7 @@ public class Note { /** * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info + * note data info数据发生变化则更新数据(标记) */ if (context.getContentResolver().update( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, @@ -120,8 +144,8 @@ public class Note { Log.e(TAG, "Update note error, should not happen"); // Do not return, fall through } - mNoteDiffValues.clear(); - + mNoteDiffValues.clear();//清除属性 + //如果笔记在本地被修改过,并且推送至ContentResolver失败,则返回false if (mNoteData.isLocalModified() && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { return false; @@ -131,86 +155,97 @@ public class Note { } private class NoteData { - private long mTextDataId; - - private ContentValues mTextDataValues; + private long mTextDataId;//文本数据的id - private long mCallDataId; + private ContentValues mTextDataValues;//存储文本数据的键值对 - private ContentValues mCallDataValues; + private long mCallDataId;//通话数据的id - private static final String TAG = "NoteData"; + private ContentValues mCallDataValues;//存储通话数据 + private static final String TAG = "NoteData";//记录标签,为日志记录打上标签。 + //给新来的见证便签的键值以及id public NoteData() { mTextDataValues = new ContentValues(); mCallDataValues = new ContentValues(); mTextDataId = 0; mCallDataId = 0; } - + //比较文本大小,确定是否被修改过 boolean isLocalModified() { return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; } - + //设置文本数据的id void setTextDataId(long id) { if(id <= 0) { throw new IllegalArgumentException("Text data id should larger than 0"); } mTextDataId = id; } - + //设置通话数据的id void setCallDataId(long id) { if (id <= 0) { throw new IllegalArgumentException("Call data id should larger than 0"); } mCallDataId = id; } - + //设置通话数据的id void setCallData(String key, String value) { mCallDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } - + //设置文本数据 void setTextData(String key, String value) { mTextDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } - + /** + * @classname: NoteData + * @methodname pushIntoContentResolver + * @description:将笔记中的内容放至内容存储器当中,执行所有待执行的动作 + * @date: 2024/1/2 21:10 + * @author: Xia Yanbo + * @param:noteId便签id + * @param:context存了文本的上下文 + * @return:uri更新过数据后的标识符 + */ Uri pushIntoContentResolver(Context context, long noteId) { /** * Check for safety */ + //检查笔记的id是否正确 if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); } - + //创建行动列表 ArrayList operationList = new ArrayList(); ContentProviderOperation.Builder builder = null; - + //如果文本数据不为空,进行更新操作 if(mTextDataValues.size() > 0) { mTextDataValues.put(DataColumns.NOTE_ID, noteId); + // 如果文本数据ID为0,说明是新插入的数据 if (mTextDataId == 0) { mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); + mTextDataValues);//设置对应的关键键值,插入新的文本数据 try { - setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { + setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));//获取数据的id + } catch (NumberFormatException e) {//获取失败打印错误信息 Log.e(TAG, "Insert new text data fail with noteId" + noteId); mTextDataValues.clear(); return null; } - } else { + } else {//创建一个更新操作,并设置更新的数据和条件 builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( Notes.CONTENT_DATA_URI, mTextDataId)); builder.withValues(mTextDataValues); - operationList.add(builder.build()); + operationList.add(builder.build());//将更新操作添加到操作列表中 } mTextDataValues.clear(); } - + //同理如果通信数据不为空,进行更新操作 if(mCallDataValues.size() > 0) { mCallDataValues.put(DataColumns.NOTE_ID, noteId); if (mCallDataId == 0) { @@ -232,19 +267,19 @@ public class Note { } mCallDataValues.clear(); } - + //行动列表非空 if (operationList.size() > 0) { - try { + try { // 使用内容解析器(ContentResolver)的applyBatch方法来批量执行操作列表中的操作 ContentProviderResult[] results = context.getContentResolver().applyBatch( Notes.AUTHORITY, operationList); return (results == null || results.length == 0 || results[0] == null) ? null - : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);//返回操作完成后的结果 } catch (RemoteException e) { Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); return null; } catch (OperationApplicationException e) { Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; + return null;//报错反馈 } } return null; diff --git a/src/main/java/net/micode/notes/model/WorkingNote.java b/src/main/java/net/micode/notes/model/WorkingNote.java index be081e4..460c7d2 100644 --- a/src/main/java/net/micode/notes/model/WorkingNote.java +++ b/src/main/java/net/micode/notes/model/WorkingNote.java @@ -31,37 +31,43 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.Notes.TextNote; import net.micode.notes.tool.ResourceParser.NoteBgResources; - +/** + * @classname: WorkingNote + * @description:活动中的便签类,是对正处于用户编辑等工作状态下的便签,可以对于便签做 + * 更新组件,修改内容,设置提醒,背景颜色修改等在便签内进行文本编辑工作时可以进行的操作 + * @date: 2024/1/4 11:03 + * @author: Xia Yanbo +*/ public class WorkingNote { // Note for the working note - private Note mNote; + private Note mNote;//便签对象 // Note Id - private long mNoteId; + private long mNoteId;//便签的id // Note content - private String mContent; + private String mContent;//内容字符串 // Note mode - private int mMode; - - private long mAlertDate; + private int mMode;//便签所处的模式(任务清单/普通) - private long mModifiedDate; + private long mAlertDate;//提醒时间 - private int mBgColorId; + private long mModifiedDate;//修改日期 - private int mWidgetId; + private int mBgColorId;//背景颜色 - private int mWidgetType; + private int mWidgetId;//小插件的id号 - private long mFolderId; + private int mWidgetType;//小插件的类型 - private Context mContext; + private long mFolderId;//所属便签包的id号 - private static final String TAG = "WorkingNote"; + private Context mContext;//便签的上下文 - private boolean mIsDeleted; + private static final String TAG = "WorkingNote";//用于接收日志的标签 - private NoteSettingChangedListener mNoteSettingStatusListener; + private boolean mIsDeleted;//表示是否已经被删除 + private NoteSettingChangedListener mNoteSettingStatusListener;//设置一个监听器,监听便签设置的改变 + //定义数据的字段 public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, DataColumns.CONTENT, @@ -71,7 +77,7 @@ public class WorkingNote { DataColumns.DATA3, DataColumns.DATA4, }; - + //定义便签的字段 public static final String[] NOTE_PROJECTION = new String[] { NoteColumns.PARENT_ID, NoteColumns.ALERTED_DATE, @@ -80,7 +86,7 @@ public class WorkingNote { NoteColumns.WIDGET_TYPE, NoteColumns.MODIFIED_DATE }; - + //数据相关的参数 private static final int DATA_ID_COLUMN = 0; private static final int DATA_CONTENT_COLUMN = 1; @@ -88,7 +94,7 @@ public class WorkingNote { private static final int DATA_MIME_TYPE_COLUMN = 2; private static final int DATA_MODE_COLUMN = 3; - + //便签相关的参数 private static final int NOTE_PARENT_ID_COLUMN = 0; private static final int NOTE_ALERTED_DATE_COLUMN = 1; @@ -102,19 +108,38 @@ public class WorkingNote { private static final int NOTE_MODIFIED_DATE_COLUMN = 5; // New note construct + /** + * @classname: WorkingNote + * @methodname WorkingNote + * @description:构造函数,构造一个新的便签,完成初始赋值 + * @date: 2024/1/3 19:26 + * @author: Xia Yanbo + * @param:context相关的文本 + * @param:folderId所属包的id + */ private WorkingNote(Context context, long folderId) { mContext = context; mAlertDate = 0; mModifiedDate = System.currentTimeMillis(); mFolderId = folderId; mNote = new Note(); - mNoteId = 0; + mNoteId = 0;//初始化笔记id为0 mIsDeleted = false; mMode = 0; mWidgetType = Notes.TYPE_WIDGET_INVALIDE; } // Existing note construct + /** + * @classname: WorkingNote + * @methodname WorkingNote + * @description:从现有的笔记创建工作中的笔记(被使用) + * @date: 2024/1/3 21:33 + * @author: Xia Yanbo + * @param:context上下文 + * @param:noteId笔记的id号 + * @param:folderId所属文件夹的id + */ private WorkingNote(Context context, long noteId, long folderId) { mContext = context; mNoteId = noteId; @@ -123,14 +148,23 @@ public class WorkingNote { mNote = new Note(); loadNote(); } - + /** + * @classname: WorkingNote + * @methodname loadNote + * @description:加载/读取便签 + * @date: 2024/1/3 21:34 + * @author: Xia Yanbo + */ private void loadNote() { + //查询数据库,获取与给定笔记id关联的笔记 Cursor cursor = mContext.getContentResolver().query( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, null, null); if (cursor != null) { + //如果cursor不为空,移动到结果集的第一行 if (cursor.moveToFirst()) { + //从结果集获取各个属性值 mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); @@ -139,33 +173,43 @@ public class WorkingNote { mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); } cursor.close(); - } else { + } else {//如果找不到关联的笔记抛出异常 Log.e(TAG, "No note with id:" + mNoteId); throw new IllegalArgumentException("Unable to find note with id " + mNoteId); } + // 调用loadNoteData方法,继续加载与笔记相关的其他数据(标记) loadNoteData(); } - + /** + * @classname: WorkingNote + * @methodname loadNoteData + * @description:将便签里的数据加载进去并存储 + * @date: 2024/1/3 21:48 + * @author: Xia Yanbo + */ private void loadNoteData() { + //查询数据库,获取与给定笔记id关联的笔记 Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { String.valueOf(mNoteId) }, null); if (cursor != null) { + //光标移动到查询结果的第一行 if (cursor.moveToFirst()) { do { - String type = cursor.getString(DATA_MIME_TYPE_COLUMN); + String type = cursor.getString(DATA_MIME_TYPE_COLUMN);//获取当前笔记的类型 + //如果笔记是普通的笔记,获取笔记内容、模式、id等参数完成赋值 if (DataConstants.NOTE.equals(type)) { mContent = cursor.getString(DATA_CONTENT_COLUMN); mMode = cursor.getInt(DATA_MODE_COLUMN); mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); - } else if (DataConstants.CALL_NOTE.equals(type)) { + } else if (DataConstants.CALL_NOTE.equals(type)) {//如果数据是通话数据,从数据行中直接获取数据id mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); } else { Log.d(TAG, "Wrong note type with type:" + type); } - } while (cursor.moveToNext()); + } while (cursor.moveToNext());//光标移动到下一行 } cursor.close(); } else { @@ -173,7 +217,7 @@ public class WorkingNote { throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); } } - + //创建一个空的便签,设置属性以及资源的id号等等信息 public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, int widgetType, int defaultBgColorId) { WorkingNote note = new WorkingNote(context, folderId); @@ -182,15 +226,17 @@ public class WorkingNote { note.setWidgetType(widgetType); return note; } - + //读取便签的内容 public static WorkingNote load(Context context, long id) { return new WorkingNote(context, id, 0); } public synchronized boolean saveNote() { + //检查笔记是否有保存的价值 if (isWorthSaving()) { if (!existInDatabase()) { - if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + // 如果不在数据库里,根据包的id和上下文获取一个新的笔记ID,如果获取失败则返回false并记录日志 + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {//获取失败返回的id是0 Log.e(TAG, "Create new note fail with id:" + mNoteId); return false; } @@ -200,6 +246,7 @@ public class WorkingNote { /** * Update widget content if there exist any widget of this note + * 当组件发生变化时,对笔记设置状态的监听器进行更新? */ if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE @@ -211,12 +258,13 @@ public class WorkingNote { return false; } } - + //检查是否位于数据库中 public boolean existInDatabase() { return mNoteId > 0; } - + //检查便签是否具有保存的价值 private boolean isWorthSaving() { + //如果在数据库中已经存在而本地没有修改,或者便签已被删除了,或者便签为空,不值得保存 if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) || (existInDatabase() && !mNote.isLocalModified())) { return false; @@ -224,11 +272,11 @@ public class WorkingNote { return true; } } - + //设置笔记设置状态的监听器为工作状态 public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { mNoteSettingStatusListener = l; } - + //设置提醒的日期 public void setAlertDate(long date, boolean set) { if (date != mAlertDate) { mAlertDate = date; @@ -238,7 +286,7 @@ public class WorkingNote { mNoteSettingStatusListener.onClockAlertChanged(date, set); } } - + //删除标记值 public void markDeleted(boolean mark) { mIsDeleted = mark; if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID @@ -247,6 +295,7 @@ public class WorkingNote { } } + //设置背景的颜色id public void setBgColorId(int id) { if (id != mBgColorId) { mBgColorId = id; @@ -256,9 +305,10 @@ public class WorkingNote { mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); } } - + //设置任务清单模式 public void setCheckListMode(int mode) { if (mMode != mode) { + //进行任务清单模式必要组件的的设置 if (mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); } @@ -266,7 +316,7 @@ public class WorkingNote { mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); } } - + //设定组件相关的类型id等信息 public void setWidgetType(int type) { if (type != mWidgetType) { mWidgetType = type; @@ -280,24 +330,25 @@ public class WorkingNote { mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); } } - + //设置当前工作便签的文本 public void setWorkingText(String text) { if (!TextUtils.equals(mContent, text)) { - mContent = text; + mContent = text;//文本不一样时更新内容 mNote.setTextData(DataColumns.CONTENT, mContent); } } - + //将便签转化为通话便签 public void convertToCallNote(String phoneNumber, long callDate) { mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); } - + //获取是否设置有提醒 public boolean hasClockAlert() { return (mAlertDate > 0 ? true : false); } + //根据需要,返回对应的参数值 public String getContent() { return mContent; } @@ -341,7 +392,13 @@ public class WorkingNote { public int getWidgetType() { return mWidgetType; } - + /** + * @classname: WorkingNote + * @description:接口,进行便签设置状态的监听, + * 并根据状态改变调用相应的背景颜色,任务清单模式,时间提醒,组件更新功能 + * @date: 2024/1/4 9:22 + * @author: Xia Yanbo + */ public interface NoteSettingChangedListener { /** * Called when the background color of current note has just changed @@ -355,6 +412,7 @@ public class WorkingNote { /** * Call when user create note from widget + * 实际完成的是更新控件并通知调用者的工作 */ void onWidgetChanged(); diff --git a/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java index 7370d57..1587955 100644 --- a/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -14,200 +14,199 @@ * limitations under the License. */ - package net.micode.notes.ui; - - import android.app.Activity; - import android.app.AlertDialog; - import android.content.Context; - import android.content.DialogInterface; - import android.content.DialogInterface.OnClickListener; - import android.content.DialogInterface.OnDismissListener; - import android.content.Intent; - import android.media.AudioManager; - import android.media.MediaPlayer; - import android.media.RingtoneManager; - import android.net.Uri; - import android.os.Bundle; - import android.os.PowerManager; - import android.provider.Settings; - import android.view.Window; - import android.view.WindowManager; - - import net.micode.notes.R; - import net.micode.notes.data.Notes; - import net.micode.notes.tool.DataUtils; - - import java.io.IOException; - - /** - * @classname: AlarmAlertActivity - * @description:设置闹钟提示 - * @date: 2023/12/28 11:18 - * @author: wangrunze - */ - public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId;//文本在数据库存储中的ID号 - private String mSnippet;//闹钟提示时出现的文本片段 - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; - //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 - //onsaveInstanceState方法是用来保存Activity的状态的,能从onCreate的参数savedInsanceState中获得状态数据 - - /** - * @classname: AlarmAlertActivity - * @methodname onCreate - * @description:创建界面并进行初始化操作 - * @date: 2023/12/28 11:27 - * @author: wangrunze - * @param: Bundle savedInstanceState - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - 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从数据库中获取标签的内容 - 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; - } - - mPlayer = new MediaPlayer(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - showActionDialog();//弹出对话框 - playAlarmSound();//闹钟提示音激发 - } else { - finish(); - } - } - - /** - * @classname: AlarmAlertActivity - * @methodname isScreenOn - * @description:判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 - * @date: 2023/12/28 11:28 - * @author: wangrunze - * @return: pm.isScreenOn() - */ - private boolean isScreenOn() { - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - /** - * @classname: AlarmAlertActivity - * @methodname playAlarmSound - * @description:闹钟提示音启动激发 - * @date: 2023/12/28 11:29 - * @author: wangrunze - */ - - private void playAlarmSound() { - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - - int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); //调用系统的铃声管理URI,得到闹钟提示音 - - if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { - mPlayer.setAudioStreamType(silentModeStreams); - } else { - mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); - } - try { - mPlayer.setDataSource(this, url);//无返回值,设置多媒体数据来源 - mPlayer.prepare();//准备同步 - mPlayer.setLooping(true);//设置是否循环播放 - mPlayer.start();//开始播放 - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace();//抛出异常, 还将显示出更深的调用信息 - } catch (SecurityException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IllegalStateException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - /** - * @classname: AlarmAlertActivity - * @methodname showActionDialog - * @description:新建对话框 - * @date: 2023/12/28 11:30 - * @author: wangrunze - */ - - private void showActionDialog() { - AlertDialog.Builder dialog = new AlertDialog.Builder(this);//用到AlertDialog.Builder中的create()新建了一个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); - } - - //DialogInterface dialog为对话框,which为选择按钮,功能为选择各种操作 - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_NEGATIVE://这是取消操作 - Intent intent = new Intent(this, NoteEditActivity.class);//实现两个类间的数据传输 - intent.setAction(Intent.ACTION_VIEW);//设置动作属性 - intent.putExtra(Intent.EXTRA_UID, mNoteId); - startActivity(intent); - break; - default: - break; - } - } - - /** - * @classname: AlarmAlertActivity - * @methodname onDismiss - * @description:停止闹钟声音 - * @date: 2023/12/28 11:30 - * @author: wangrunze - * @param:DialogInterface dialog - */ - public void onDismiss(DialogInterface dialog) { - stopAlarmSound(); - finish(); - } - /** - * @classname: AlarmAlertActivity - * @methodname: stopAlarmSound - * @description: - * @date: 2023/12/28 11:31 - * @author: wangrunze - */ - private void stopAlarmSound() { - if (mPlayer != null) { - mPlayer.stop(); - mPlayer.release(); - mPlayer = null; - } - } - } - \ No newline at end of file +package net.micode.notes.ui; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Bundle; +import android.os.PowerManager; +import android.provider.Settings; +import android.view.Window; +import android.view.WindowManager; + +import net.micode.notes.R; +import net.micode.notes.data.Notes; +import net.micode.notes.tool.DataUtils; + +import java.io.IOException; + +/** + * @classname: AlarmAlertActivity + * @description:设置闹钟提示 + * @date: 2023/12/28 11:18 + * @author: wangrunze +*/ +public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { + private long mNoteId;//文本在数据库存储中的ID号 + private String mSnippet;//闹钟提示时出现的文本片段 + private static final int SNIPPET_PREW_MAX_LEN = 60; + MediaPlayer mPlayer; + //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 + //onsaveInstanceState方法是用来保存Activity的状态的,能从onCreate的参数savedInsanceState中获得状态数据 + + /** + * @classname: AlarmAlertActivity + * @methodname onCreate + * @description:创建界面并进行初始化操作 + * @date: 2023/12/28 11:27 + * @author: wangrunze + * @param: Bundle savedInstanceState + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + 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从数据库中获取标签的内容 + 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; + } + + mPlayer = new MediaPlayer(); + if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { + showActionDialog();//弹出对话框 + playAlarmSound();//闹钟提示音激发 + } else { + finish(); + } + } + + /** + * @classname: AlarmAlertActivity + * @methodname isScreenOn + * @description:判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 + * @date: 2023/12/28 11:28 + * @author: wangrunze + * @return: pm.isScreenOn() + */ + private boolean isScreenOn() { + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + return pm.isScreenOn(); + } + + /** + * @classname: AlarmAlertActivity + * @methodname playAlarmSound + * @description:闹钟提示音启动激发 + * @date: 2023/12/28 11:29 + * @author: wangrunze + */ + + private void playAlarmSound() { + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + + int silentModeStreams = Settings.System.getInt(getContentResolver(), + Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); //调用系统的铃声管理URI,得到闹钟提示音 + + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { + mPlayer.setAudioStreamType(silentModeStreams); + } else { + mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); + } + try { + mPlayer.setDataSource(this, url);//无返回值,设置多媒体数据来源 + mPlayer.prepare();//准备同步 + mPlayer.setLooping(true);//设置是否循环播放 + mPlayer.start();//开始播放 + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace();//抛出异常, 还将显示出更深的调用信息 + } catch (SecurityException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalStateException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + /** + * @classname: AlarmAlertActivity + * @methodname showActionDialog + * @description:新建对话框 + * @date: 2023/12/28 11:30 + * @author: wangrunze + */ + + private void showActionDialog() { + AlertDialog.Builder dialog = new AlertDialog.Builder(this);//用到AlertDialog.Builder中的create()新建了一个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); + } + + //DialogInterface dialog为对话框,which为选择按钮,功能为选择各种操作 + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_NEGATIVE://这是取消操作 + Intent intent = new Intent(this, NoteEditActivity.class);//实现两个类间的数据传输 + intent.setAction(Intent.ACTION_VIEW);//设置动作属性 + intent.putExtra(Intent.EXTRA_UID, mNoteId); + startActivity(intent); + break; + default: + break; + } + } + + /** + * @classname: AlarmAlertActivity + * @methodname onDismiss + * @description:启动停止闹钟声音 + * @date: 2023/12/28 11:30 + * @author: wangrunze + * @param:DialogInterface dialog + */ + public void onDismiss(DialogInterface dialog) { + stopAlarmSound(); + finish(); + } + /** + * @classname: AlarmAlertActivity + * @methodname: stopAlarmSound + * @description:停止闹钟声音 + * @date: 2023/12/28 11:31 + * @author: wangrunze + */ + private void stopAlarmSound() { + if (mPlayer != null) { + mPlayer.stop(); + mPlayer.release(); + mPlayer = null; + } + } +} diff --git a/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index f221202..0b59510 100644 --- a/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -27,20 +27,34 @@ import android.database.Cursor; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * @classname: AlarmInitReceiver + * @description:根据数据库里的闹钟时间创建一个闹钟机制 + * @date: 2023/12/29 11:17 + * @author: wangrunze +*/ 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; + /** + * @classname: AlarmInitReceiver + * @methodname: onReceive + * @description:通过查找数据库中的标签内容,找到和当前系统时间相等的标签 + * @date: 2023/12/29 11:23 + * @author: wangrunze + * @param:Context context + * @param:Intent intent + */ @Override public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); + 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, diff --git a/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/main/java/net/micode/notes/ui/AlarmReceiver.java index 54e503b..a2a56bc 100644 --- a/src/main/java/net/micode/notes/ui/AlarmReceiver.java +++ b/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -19,8 +19,23 @@ package net.micode.notes.ui; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +/** + * @classname: AlarmReceiver + * @description:实现alarm闹钟功能 + * @date: 2023/12/29 11:28 + * @author: wangrunze +*/ public class AlarmReceiver extends BroadcastReceiver { + /** + * @classname: AlarmReceiver + * @methodname: onReceive + * @description:启动AlarmAlertActivity + * @date: 2023/12/29 11:29 + * @author: wangrunze + * @param:Context context + * @param:Intent intent + */ @Override public void onReceive(Context context, Intent intent) { intent.setClass(context, AlarmAlertActivity.class); diff --git a/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/main/java/net/micode/notes/ui/DateTimePicker.java index 496b0cd..e2421a9 100644 --- a/src/main/java/net/micode/notes/ui/DateTimePicker.java +++ b/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -28,6 +28,12 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; +/** + * @classname: DateTimePicker + * @description:时间同步 + * @date: 2023/12/29 11:40 + * @author: wangrunze +*/ public class DateTimePicker extends FrameLayout { private static final boolean DEFAULT_ENABLE_STATE = true; @@ -65,6 +71,16 @@ public class DateTimePicker extends FrameLayout { private OnDateTimeChangedListener mOnDateTimeChangedListener; private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { + /** + * @classname: DateTimePicker + * @methodname: onValueChange + * @description:对日期的监听 + * @date: 2023/12/29 11:41 + * @author: wangrunze + * @param:NumberPicker picker + * @param:int oldVal + * @param: int newVal + */ @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); @@ -74,6 +90,16 @@ public class DateTimePicker extends FrameLayout { }; private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + /** + * @classname: DateTimePicker + * @methodname: onValueChange + * @description:对小时(Hour)的监听 + * @date: 2023/12/29 11:42 + * @author: wangrunze + * @param:NumberPicker picker + * @param:int oldVal + * @param:int newVal + */ @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; @@ -116,6 +142,16 @@ public class DateTimePicker extends FrameLayout { }; private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { + /** + * @classname: DateTimePicker + * @methodname: onValueChange + * @description:对分钟的监听 + * @date: 2023/12/29 11:43 + * @author: wangrunze + * @param:NumberPicker picker + * @param:int oldVal + * @param:int newVal + */ @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); @@ -146,6 +182,16 @@ public class DateTimePicker extends FrameLayout { private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { @Override + /** + * @classname: DateTimePicker + * @methodname: onValueChange + * @description: 对AM和PM的监听 + * @date: 2023/12/29 11:43 + * @author: wangrunze + * @param:NumberPicker picker + * @param:int oldVal + * @param: int newVal + */ public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mIsAm = !mIsAm; if (mIsAm) { @@ -157,12 +203,20 @@ public class DateTimePicker extends FrameLayout { onDateTimeChanged(); } }; - + public interface OnDateTimeChangedListener { void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute); } + /** + * @classname: DateTimePicker + * @methodname: DateTimePicker + * @description:获取当前的系统时间 + * @date: 2023/12/29 11:45 + * @author: wangrunze + * @param:Context context + */ public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); } @@ -171,6 +225,16 @@ public class DateTimePicker extends FrameLayout { this(context, date, DateFormat.is24HourFormat(context)); } + /** + * @classname: DateTimePicker + * @methodname: DateTimePicker + * @description:获取系统时间 + * @date: 2023/12/29 11:47 + * @author: wangrunze + * @param:Context context + * @param:long date + * @param:boolean is24HourView + */ public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); mDate = Calendar.getInstance(); @@ -214,6 +278,14 @@ public class DateTimePicker extends FrameLayout { mInitialising = false; } + /** + * @classname: DateTimePicker + * @methodname: setEnabled + * @description:对时间的启动 + * @date: 2023/12/29 11:49 + * @author: wangrunze + * @param:boolean enabled + */ @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { @@ -246,6 +318,14 @@ public class DateTimePicker extends FrameLayout { * * @param date The current date in millis */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentDate + * @description:获取当前时间 + * @date: 2023/12/29 11:51 + * @author: wangrunze + * @param:long date + */ public void setCurrentDate(long date) { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(date); @@ -262,6 +342,14 @@ public class DateTimePicker extends FrameLayout { * @param hourOfDay The current hourOfDay * @param minute The current minute */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentDate + * @description:获取当前时间 + * @date: 2023/12/29 11:51 + * @author: wangrunze + * @param:long date + */ public void setCurrentDate(int year, int month, int dayOfMonth, int hourOfDay, int minute) { setCurrentYear(year); @@ -285,6 +373,14 @@ public class DateTimePicker extends FrameLayout { * * @param year The current year */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentYear + * @description:Set current year + * @date: 2024/1/7 9:53 + * @author: wangrunze + * @param:year + */ public void setCurrentYear(int year) { if (!mInitialising && year == getCurrentYear()) { return; @@ -293,12 +389,19 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - /** * Get current month in the year * * @return The current month in the year */ + /** + * @classname: DateTimePicker + * @methodname: getCurrentMonth + * @description:Get current month in the year + * @date: 2024/1/7 9:54 + * @author: wangrunze + * @return:current month + */ public int getCurrentMonth() { return mDate.get(Calendar.MONTH); } @@ -308,6 +411,14 @@ public class DateTimePicker extends FrameLayout { * * @param month The month in the year */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentMonth + * @description:Set current month in the year + * @date: 2024/1/7 9:56 + * @author: wangrunze + * @param:current month + */ public void setCurrentMonth(int month) { if (!mInitialising && month == getCurrentMonth()) { return; @@ -322,6 +433,14 @@ public class DateTimePicker extends FrameLayout { * * @return The day of the month */ + /** + * @classname: DateTimePicker + * @methodname: getCurrentDay + * @description:Get current day of the month + * @date: 2024/1/7 9:57 + * @author: wangrunze + * @return:current day + */ public int getCurrentDay() { return mDate.get(Calendar.DAY_OF_MONTH); } @@ -331,6 +450,14 @@ public class DateTimePicker extends FrameLayout { * * @param dayOfMonth The day of the month */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentDay + * @description:Set current day of the month + * @date: 2024/1/7 9:57 + * @author: wangrunze + * @param:The day of the month + */ public void setCurrentDay(int dayOfMonth) { if (!mInitialising && dayOfMonth == getCurrentDay()) { return; @@ -344,10 +471,26 @@ public class DateTimePicker extends FrameLayout { * Get current hour in 24 hour mode, in the range (0~23) * @return The current hour in 24 hour mode */ + /** + * @classname: DateTimePicker + * @methodname: getCurrentHourOfDay + * @description:Get current hour in 24 hour mode + * @date: 2024/1/7 9:58 + * @author: wangrunze + * @return:The current hour in 24 hour mode + */ + public int getCurrentHourOfDay() { return mDate.get(Calendar.HOUR_OF_DAY); } - + /** + * @classname: DateTimePicker + * @methodname: getCurrentHour + * @description:Get current hour + * @date: 2024/1/7 9:58 + * @author: wangrunze + * @return:The current hour + */ private int getCurrentHour() { if (mIs24HourView){ return getCurrentHourOfDay(); @@ -366,6 +509,14 @@ public class DateTimePicker extends FrameLayout { * * @param hourOfDay */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentHour + * @description:Set current hour in 24 hour mode + * @date: 2024/1/7 9:59 + * @author: wangrunze + * @param:hourOfDay + */ public void setCurrentHour(int hourOfDay) { if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { return; @@ -394,6 +545,14 @@ public class DateTimePicker extends FrameLayout { * * @return The Current Minute */ + /** + * @classname: DateTimePicker + * @methodname: getCurrentMinute + * @description: Get currentMinute + * @date: 2024/1/7 9:59 + * @author: wangrunze + * @return:The Current Minute + */ public int getCurrentMinute() { return mDate.get(Calendar.MINUTE); } @@ -401,6 +560,14 @@ public class DateTimePicker extends FrameLayout { /** * Set current minute */ + /** + * @classname: DateTimePicker + * @methodname: setCurrentMinute + * @description:Set current minute + * @date: 2024/1/7 9:59 + * @author: wangrunze + * @param:int minute + */ public void setCurrentMinute(int minute) { if (!mInitialising && minute == getCurrentMinute()) { return; @@ -413,6 +580,14 @@ public class DateTimePicker extends FrameLayout { /** * @return true if this is in 24 hour view else false. */ + /** + * @classname: DateTimePicker + * @methodname: is24HourView + * @description:判断是否是24Hour视图 + * @date: 2024/1/7 10:00 + * @author: wangrunze + * @return:true if this is in 24 hour view else false. + */ public boolean is24HourView () { return mIs24HourView; } @@ -422,6 +597,14 @@ public class DateTimePicker extends FrameLayout { * * @param is24HourView True for 24 hour mode. False for AM/PM mode. */ + /** + * @classname: DateTimePicker + * @methodname: set24HourView + * @description:Set whether in 24 hour or AM/PM mode + * @date: 2024/1/7 10:01 + * @author: wangrunze + * @param:is24HourView True for 24 hour mode + */ public void set24HourView(boolean is24HourView) { if (mIs24HourView == is24HourView) { return; @@ -434,6 +617,13 @@ public class DateTimePicker extends FrameLayout { updateAmPmControl(); } + /** + * @classname: DateTimePicker + * @methodname: updateDateControl + * @description:更新时间管理 + * @date: 2023/12/29 11:53 + * @author: wangrunze + */ private void updateDateControl() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mDate.getTimeInMillis()); @@ -448,6 +638,13 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.invalidate(); } + /** + * @classname: DateTimePicker + * @methodname: updateDateControl + * @description:更新ampm管理 + * @date: 2023/12/29 11:53 + * @author: wangrunze + */ private void updateAmPmControl() { if (mIs24HourView) { mAmPmSpinner.setVisibility(View.GONE); @@ -458,6 +655,13 @@ public class DateTimePicker extends FrameLayout { } } + /** + * @classname: DateTimePicker + * @methodname: updateDateControl + * @description:更新小时管理 + * @date: 2023/12/29 11:53 + * @author: wangrunze + */ private void updateHourControl() { if (mIs24HourView) { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); @@ -476,6 +680,13 @@ public class DateTimePicker extends FrameLayout { mOnDateTimeChangedListener = callback; } + /** + * @classname: DateTimePicker + * @methodname: onDateTimeChanged + * @description:获取当前时间 + * @date: 2023/12/29 11:54 + * @author: wangrunze + */ private void onDateTimeChanged() { if (mOnDateTimeChangedListener != null) { mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), diff --git a/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..295baac 100644 --- a/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java @@ -29,17 +29,31 @@ import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; +/** + * @classname: DateTimePickerDialog + * @description:时间设置 + * @date: 2024/1/4 10:19 + * @author: wangrunze +*/ public class DateTimePickerDialog extends AlertDialog implements OnClickListener { private Calendar mDate = Calendar.getInstance(); private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; - private DateTimePicker mDateTimePicker; + private DateTimePicker mDateTimePicker;//DateTimePicker控件,控件一般用于让用户可以从日期列表中选择单个值。 public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } - + /** + * @classname: DateTimePickerDialog + * @methodname: DateTimePickerDialog + * @description:实现界面对话框 + * @date: 2024/1/4 10:26 + * @author: wangrunze + * @param:Context context + * @param:long date + */ public DateTimePickerDialog(Context context, long date) { super(context); mDateTimePicker = new DateTimePicker(context); @@ -64,14 +78,35 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener updateTitle(mDate.getTimeInMillis()); } + /** + * @classname: DateTimePickerDialog + * @methodname: set24HourView + * @description:设置24小时 + * @date: 2024/1/4 10:34 + * @author: wangrunze + */ public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } - + /** + * @classname: DateTimePickerDialog + * @methodname: setOnDateTimeSetListener + * @description:实现时间日期滚动选择按钮监听 + * @date: 2024/1/4 10:43 + * @author: wangrunze + * @param:OnDateTimeSetListener callBack + */ public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; } - + /** + * @classname: DateTimePickerDialog + * @methodname: updateTitle + * @description:更新标题 + * @date: 2024/1/4 10:55 + * @author: wangrunze + * @param:long date + */ private void updateTitle(long date) { int flag = DateUtils.FORMAT_SHOW_YEAR | @@ -80,7 +115,15 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); } - + /** + * @classname: DateTimePickerDialog + * @methodname: onClick + * @description:设置按钮 + * @date: 2024/1/4 10:58 + * @author: wangrunze + * @param:DialogInterface arg0 + * @param:int arg1 + */ public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); diff --git a/src/main/java/net/micode/notes/ui/DropdownMenu.java b/src/main/java/net/micode/notes/ui/DropdownMenu.java index 613dc74..15ba7bb 100644 --- a/src/main/java/net/micode/notes/ui/DropdownMenu.java +++ b/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -26,12 +26,26 @@ import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; - +/** + * @classname: DropdownMenu + * @description:下拉菜单 + * @date: 2024/1/4 11:00 + * @author: wangrunze +*/ public class DropdownMenu { private Button mButton; private PopupMenu mPopupMenu; private Menu mMenu; - + /** + * @classname: DropdownMenu + * @methodname: DropdownMenu + * @description:创建下拉菜单 + * @date: 2024/1/4 11:02 + * @author: wangrunze + * @param:Context context + * @param:Button button + * @param:int menuId + */ public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); @@ -44,17 +58,38 @@ public class DropdownMenu { } }); } - + /** + * @classname: DropdownMenu + * @methodname: setOnDropdownMenuItemClickListener + * @description:实现下拉菜单按钮监听 + * @date: 2024/1/4 11:03 + * @author: wangrunze + * @param:OnMenuItemClickListener listener + */ public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); } } - + /** + * @classname: DropdownMenu + * @methodname: findItem + * @description:菜单初始化,显示菜单的选项 + * @date: 2024/1/4 11:04 + * @author: wangrunze + * @param:int id + */ public MenuItem findItem(int id) { return mMenu.findItem(id); } - + /** + * @classname: DropdownMenu + * @methodname: setTitle + * @description:设置标题 + * @date: 2024/1/4 11:05 + * @author: wangrunze + * @param:CharSequence title + */ public void setTitle(CharSequence title) { mButton.setText(title); } diff --git a/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/main/java/net/micode/notes/ui/FoldersListAdapter.java index 96b77da..2debb05 100644 --- a/src/main/java/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/main/java/net/micode/notes/ui/FoldersListAdapter.java @@ -28,26 +28,57 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * @classname: FoldersListAdapter + * @description:便签数据库和用户的交互 + * @date: 2024/1/4 11:07 + * @author: wangrunze +*/ 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; - + /** + * @classname: FoldersListAdapter + * @methodname: FoldersListAdapter + * @description:数据库操作 + * @date: 2024/1/4 11:08 + * @author: wangrunze + * @param:Context context + * @param: Cursor c + */ public FoldersListAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub } - + /** + * @classname: FoldersListAdapter + * @methodname: newView + * @description:创建一个文件夹,对于各文件夹中子标签的初始化 + * @date: 2024/1/4 11:09 + * @author: wangrunze + * @param:Context context + * @param:Cursor cursor + * @param:ViewGroup parent + */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new FolderListItem(context); } - + /** + * @classname: FoldersListAdapter + * @methodname: bindView + * @description:将各个布局文件绑定起来 + * @date: 2024/1/4 11:10 + * @author: wangrunze + * @param:View view + * @param:Context context + * @param:Cursor cursor + */ @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof FolderListItem) { @@ -56,22 +87,49 @@ public class FoldersListAdapter extends CursorAdapter { ((FolderListItem) view).bind(folderName); } } - + /** + * @classname: FoldersListAdapter + * @methodname: getFolderName + * @description:获取文件夹名称 + * @date: 2024/1/4 11:10 + * @author: wangrunze + * @param:Context context + * @param:int position + */ public String getFolderName(Context context, int position) { Cursor cursor = (Cursor) getItem(position); return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); } - + /** + * @classname: FoldersListAdapter + * @description:关于文件夹操作 + * @date: 2024/1/4 11:11 + * @author: wangrunze + */ private class FolderListItem extends LinearLayout { private TextView mName; - + /** + * @classname: FolderListItem + * @methodname: FolderListItem + * @description:初始化文件夹 + * @date: 2024/1/4 11:12 + * @author: wangrunze + * @param:Context context + */ public FolderListItem(Context context) { super(context); inflate(context, R.layout.folder_list_item, this); mName = (TextView) findViewById(R.id.tv_folder_name); } - + /** + * @classname: FolderListItem + * @methodname: bind + * @description:设置文件夹名称 + * @date: 2024/1/4 11:13 + * @author: wangrunze + * @param:String name + */ public void bind(String name) { mName.setText(name); } diff --git a/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 462f91f..9738ffd 100644 --- a/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -78,6 +78,7 @@ import java.util.regex.Pattern; * @date: 2023/12/27 0:08 * @author: Xia Yanbo */ + public class NoteEditActivity extends Activity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { //定义视图组件的基本数据(后面出现在了操作菜可选项里) @@ -604,6 +605,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { menu.findItem(R.id.menu_delete_remind).setVisible(false); } + return true; } /** @@ -652,6 +654,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0); } +// else if(item.getItemId()== R.id.menu_secret) +// { +// mWorkingNote.setSecretMode(); +// +// } +// else if(item.getItemId()== R.id.menu_quit_secret) +// { +// mWorkingNote.setSecretMode(); +// } //分享 else if(item.getItemId()== R.id.menu_share) { @@ -748,10 +759,6 @@ public class NoteEditActivity extends Activity implements OnClickListener, * @description: * @date: 2023/12/25 21:34 * @author: Xia Yanbo - * @param: - * @param: - * @param: - * @return: */ public void onClockAlertChanged(long date, boolean set) { /** @@ -847,7 +854,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, int index = 0; for (String item : items) { if(!TextUtils.isEmpty(item)) { - mEditTextList.addView(getListItem(item, index));//添加列表项(标记:实现的关键步骤addView) + mEditTextList.addView(getListItem(item, index));//添加列表项(标记:实现的关键步骤addView,getlistitem) index++; } } diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index 6394b05..8e0ca96 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -95,38 +95,28 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER }; - private ListEditState mState; - - private BackgroundQueryHandler mBackgroundQueryHandler; - - private NotesListAdapter mNotesListAdapter; - - private ListView mNotesListView; - - private Button mAddNewNote; - - private boolean mDispatch; - - private int mOriginY; - - private int mDispatchY; - - private TextView mTitleBar; - - private long mCurrentFolderId; - - private ContentResolver mContentResolver; - - private ModeCallback mModeCallBack; + // 声明一些私有成员变量。 + private ListEditState mState; // 当前列表的编辑状态 + private BackgroundQueryHandler mBackgroundQueryHandler; // 用于在后台执行查询的处理程序 + private NotesListAdapter mNotesListAdapter; // 笔记列表的适配器 + private ListView mNotesListView; // 显示笔记列表的视图 + private Button mAddNewNote; // 添加新笔记的按钮 + private boolean mDispatch; // 一个标志,可能用于控制事件分发 + private int mOriginY; // 原始Y坐标,可能用于触摸事件处理 + private int mDispatchY; // 分发的Y坐标,也可能用于触摸事件处理 + private TextView mTitleBar; // 标题栏文本视图 + private long mCurrentFolderId; // 当前文件夹的ID + private ContentResolver mContentResolver; // 内容解析器,用于访问应用的数据 + private ModeCallback mModeCallBack; // 模式回调接口的实现,可能用于在不同的操作模式之间切换 private static final String TAG = "NotesListActivity"; public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; - + //正在关注的笔记数据对象 private NoteItemData mFocusNoteDataItem; private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; - + //拼接访问串 private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " @@ -134,10 +124,21 @@ 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; - + //表示是否在私密模式 + public static int secret_mode = 0; + + /** + * @classname: NotesListActivity + * @methodname onCreate + * @description:完成活动的初始化 + * @date: 2024/1/4 11:47 + * @author: Xia Yanbo + * @param:savedInstanceState保存的状态 + */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //根据布局文件呈现菜单视图 setContentView(R.layout.note_list); initResources(); @@ -146,13 +147,25 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt */ setAppInfoFromRawRes(); } - + /** + * @classname: NotesListActivity + * @methodname onActivityResult + * @description:当从活动中得到返回调用,处理返回的结果 + * @date: 2024/1/4 11:49 + * @author: Xia Yanbo + * @param:requestCode请求码 + * @param:resultCode结果码 + * @param:data 意图的数据 + */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK - && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { + // 根据请求的代码类型进行相应的处理 + if (resultCode == RESULT_OK // 如果返回的结果码是RESULT_OK,表示操作成功 + && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { // 并且请求码是打开节点或新建节点 + // 清空笔记列表的适配器游标(可能是在执行打开或新建节点操作后,刷新或重置列表) mNotesListAdapter.changeCursor(null); - } else { + } else { // 其他情况 + // 调用父类的onActivityResult方法,将结果传递给上层处理。 super.onActivityResult(requestCode, resultCode, data); } } @@ -412,10 +425,35 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private void startAsyncNotesListQuery() { String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION : NORMAL_SELECTION; - mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, - Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { - String.valueOf(mCurrentFolderId) - }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + if(secret_mode == 0) { + mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, + Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[]{ + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + } + else{ + String str1 = "520"; + String [] PROJECTION = new String [] { //定义一个新的PROJECTION数组,只换掉SNIPPET + NoteColumns.ID, + NoteColumns.ALERTED_DATE, + NoteColumns.BG_COLOR_ID, + NoteColumns.CREATED_DATE, + NoteColumns.HAS_ATTACHMENT, + NoteColumns.MODIFIED_DATE, + NoteColumns.NOTES_COUNT, + NoteColumns.PARENT_ID, +// NoteColumns.SNIPPET, + str1, + NoteColumns.TYPE, + NoteColumns.WIDGET_ID, + NoteColumns.WIDGET_TYPE, + }; + mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, + Notes.CONTENT_NOTE_URI, PROJECTION, selection, new String[]{ + String.valueOf(mCurrentFolderId) + }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); + + } } private final class BackgroundQueryHandler extends AsyncQueryHandler { @@ -772,6 +810,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } else { Log.e(TAG, "Wrong state:" + mState); } + if(secret_mode == 1) + menu.findItem(R.id.menu_secret).setVisible(false); + else + menu.findItem(R.id.menu_quit_secret).setVisible(false); return true; } @@ -804,6 +846,50 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt else if(item.getItemId()==R.id.menu_search) { onSearchRequested(); } + else if(item.getItemId()==R.id.menu_secret) + {//进入私密模式 + secret_mode = 1; + AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this); + dialog.setTitle("重要提醒"); + dialog.setMessage("您确认进入私密模式吗?"); + dialog.setCancelable(false); + dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + startAsyncNotesListQuery(); + Toast.makeText(NotesListActivity.this,"您已进入私密模式",Toast.LENGTH_SHORT).show(); + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which){} + }); + dialog.show(); + startAsyncNotesListQuery(); + Toast.makeText(this,"您已进入私密模式",Toast.LENGTH_SHORT).show(); + } + else if(item.getItemId()==R.id.menu_quit_secret) + { //退出私密模式 + secret_mode = 0; + AlertDialog.Builder dialog = new AlertDialog.Builder(NotesListActivity.this); + dialog.setTitle("重要提醒"); + dialog.setMessage("您确认退出私密模式吗?"); + dialog.setCancelable(false); + dialog.setPositiveButton("确认", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + startAsyncNotesListQuery(); + Toast.makeText(NotesListActivity.this,"您已退出私密模式",Toast.LENGTH_SHORT).show(); + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which){} + }); + dialog.show(); + + } + return true; } @@ -941,4 +1027,16 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } return false; } + + public static void setSecretMode() { + if(secret_mode==0) + { + secret_mode=1; + } + else{ + secret_mode=0; + } + } + } + diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java index ec6f819..cc0cc85 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java @@ -31,7 +31,12 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.ResourceParser; import net.micode.notes.ui.NoteEditActivity; import net.micode.notes.ui.NotesListActivity; - +/** + * @classname: NoteWidgetProvider + * @description:桌面插件操作 + * @date: 2024/1/7 10:22 + * @author: wangrunze +*/ public abstract class NoteWidgetProvider extends AppWidgetProvider { public static final String [] PROJECTION = new String [] { NoteColumns.ID, @@ -45,6 +50,15 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { private static final String TAG = "NoteWidgetProvider"; + /** + * @classname: NoteWidgetProvider + * @methodname: onDeleted + * @description:删除插件 + * @date: 2024/1/7 10:23 + * @author: wangrunze + * @param:Context context + * @param:int[] appWidgetIds + */ @Override public void onDeleted(Context context, int[] appWidgetIds) { ContentValues values = new ContentValues(); @@ -56,7 +70,15 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { new String[] { String.valueOf(appWidgetIds[i])}); } } - + /** + * @classname: NoteWidgetProvider + * @methodname: getNoteWidgetInfo + * @description:设置插件 + * @date: 2024/1/7 10:23 + * @author: wangrunze + * @param:Context context + * @param:int widgetId + */ private Cursor getNoteWidgetInfo(Context context, int widgetId) { return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, @@ -64,11 +86,30 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, null); } - + /** + * @classname: NoteWidgetProvider + * @methodname: update + * @description:更新插件 + * @date: 2024/1/7 10:24 + * @author: wangrunze + * @param:Context context + * @param:AppWidgetManager appWidgetManager + * @param:int[] appWidgetIds + */ protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { update(context, appWidgetManager, appWidgetIds, false); } - + /** + * @classname: NoteWidgetProvider + * @methodname: update + * @description:更新插件 + * @date: 2024/1/7 10:24 + * @author: wangrunze + * @param:Context context + * @param:AppWidgetManager appWidgetManager + * @param:int[] appWidgetIds + * @param:boolean privacyMode + */ private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, boolean privacyMode) { for (int i = 0; i < appWidgetIds.length; i++) { diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java index adcb2f7..1fff72e 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java @@ -23,24 +23,61 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * @classname: NoteWidgetProvider_2x + * @description:设置2*2大小插件 + * @date: 2024/1/7 10:27 + * @author: wangrunze +*/ public class NoteWidgetProvider_2x extends NoteWidgetProvider { @Override + /** + * @classname: NoteWidgetProvider_2x + * @methodname: onUpdate + * @description:更新插件 + * @date: 2024/1/7 10:29 + * @author: wangrunze + * @param:Context context + * @param:AppWidgetManager appWidgetManager + * @param:int[] appWidgetIds + */ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.update(context, appWidgetManager, appWidgetIds); } @Override + /** + * @classname: NoteWidgetProvider_2x + * @methodname: getLayoutId + * @description:布局文件的资源ID + * @date: 2024/1/7 10:30 + * @author: wangrunze + */ protected int getLayoutId() { return R.layout.widget_2x; } @Override + /** + * @classname: NoteWidgetProvider_2x + * @methodname: getBgResourceId + * @description:获取其2倍大小的背景资源ID + * @date: 2024/1/7 10:31 + * @author: wangrunze + * @param:int bgId + */ protected int getBgResourceId(int bgId) { return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); } @Override + /** + * @classname: NoteWidgetProvider_2x + * @methodname: getWidgetType + * @description:获取背景类型 + * @date: 2024/1/7 10:31 + * @author: wangrunze + */ protected int getWidgetType() { return Notes.TYPE_WIDGET_2X; } diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java index c12a02e..33c820d 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java @@ -23,23 +23,59 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * @classname: NoteWidgetProvider_4x + * @description:设置大小为4*1的插件 + * @date: 2024/1/7 10:32 + * @author: wangrunze +*/ public class NoteWidgetProvider_4x extends NoteWidgetProvider { @Override + /** + * @classname: NoteWidgetProvider_4x + * @methodname: onUpdate + * @description:更新插件 + * @date: 2024/1/7 10:32 + * @author: wangrunze + * @param:Context context + * @param:AppWidgetManager appWidgetManager + * @param: int[] appWidgetIds + */ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.update(context, appWidgetManager, appWidgetIds); } - + /** + * @classname: NoteWidgetProvider_4x + * @methodname: getLayoutId + * @description:布局文件的资源ID + * @date: 2024/1/7 10:33 + * @author: wangrunze + */ protected int getLayoutId() { return R.layout.widget_4x; } @Override + /** + * @classname: NoteWidgetProvider_4x + * @methodname: getBgResourceId + * @description:获取其4倍大小的背景资源ID + * @date: 2024/1/7 10:33 + * @author: wangrunze + * @param:int bgId + */ protected int getBgResourceId(int bgId) { return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); } @Override + /** + * @classname: NoteWidgetProvider_4x + * @methodname: getWidgetType + * @description:获取背景类型 + * @date: 2024/1/7 10:34 + * @author: wangrunze + */ protected int getWidgetType() { return Notes.TYPE_WIDGET_4X; } diff --git a/src/main/res/menu/note_list.xml b/src/main/res/menu/note_list.xml index 42ea736..9903e2e 100644 --- a/src/main/res/menu/note_list.xml +++ b/src/main/res/menu/note_list.xml @@ -36,4 +36,12 @@ + + + + diff --git a/src/main/res/menu/sub_folder.xml b/src/main/res/menu/sub_folder.xml index b00de26..41fe907 100644 --- a/src/main/res/menu/sub_folder.xml +++ b/src/main/res/menu/sub_folder.xml @@ -21,4 +21,11 @@ + + + \ No newline at end of file diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 09f75ed..214a5eb 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -71,6 +71,8 @@ 确认要删除该条便签吗? 确认删除文件夹及所包含的便签吗? 已将所选 %1$d 条便签移到 %2$s 文件夹 + 私密模式 + 退出私密模式 SD卡被占用,不能操作 导出文本时发生错误,请检查SD卡 diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 55df868..c54b8ad 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -75,6 +75,8 @@ Confirm to delete the selected %d notes? Confirm to delete this note? Have moved selected %1$d notes to %2$s folder + secret model + quit secret model SD card busy, not available now Export failed, please check SD card diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index d750e65..ad0d90d 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -64,6 +64,6 @@ \ No newline at end of file