();
}
- if(sContactCache.containsKey(phoneNumber)) {/*如果缓存中已经有该电话号码对应的联系人名字,就直接返回*/
+ if(sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
String selection = CALLER_ID_SELECTION.replace("+",
- PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));//将电话号码转换为最小匹配模式,用于筛选
+ PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
new String [] { Phone.DISPLAY_NAME },
- selection,//使用筛选条件
+ selection,
new String[] { phoneNumber },
null);
- if (cursor != null && cursor.moveToFirst()) {//如果找到了符合条件的联系人
+ if (cursor != null && cursor.moveToFirst()) {
try {
- String name = cursor.getString(0);//获取联系人名字
- sContactCache.put(phoneNumber, name);//将电话号码和联系人名字添加到缓存中
- return name;//返回联系人名字
+ String name = cursor.getString(0);
+ sContactCache.put(phoneNumber, name);
+ return name;
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, " Cursor get string error " + e.toString());
return null;
} finally {
- cursor.close();//关闭游标
+ cursor.close();
}
- } else {/*没找到*/
+ } else {
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
diff --git a/src/main/java/net/micode/notes/data/Notes.java b/src/main/java/net/micode/notes/data/Notes.java
index aba2dbb..8762500 100644
--- a/src/main/java/net/micode/notes/data/Notes.java
+++ b/src/main/java/net/micode/notes/data/Notes.java
@@ -17,11 +17,17 @@
package net.micode.notes.data;
import android.net.Uri;
-//Notes类就定义了很多常量,是小米便签的数据库
+/**
+ * @Package: net.micode.notes.data
+ * @ClassName: Notes
+ * @Description:
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/21 19:32
+ * @Version: 1.0
+ */
public class Notes {
public static final String AUTHORITY = "micode_notes";
public static final String TAG = "Notes";
- //三个type
public static final int TYPE_NOTE = 0;
public static final int TYPE_FOLDER = 1;
public static final int TYPE_SYSTEM = 2;
@@ -32,7 +38,6 @@ public class Notes {
* {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder
* {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records
*/
- //不同种类的文件夹
public static final int ID_ROOT_FOLDER = 0;
public static final int ID_TEMPARAY_FOLDER = -1;
public static final int ID_CALL_RECORD_FOLDER = -2;
@@ -48,12 +53,12 @@ public class Notes {
public static final int TYPE_WIDGET_INVALIDE = -1;
public static final int TYPE_WIDGET_2X = 0;
public static final int TYPE_WIDGET_4X = 1;
- //数据常量 包括普通note和call_note
+
public static class DataConstants {
public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
}
- //两个指针,一个找便签和文件夹,一个用来找数据
+
/**
* Uri to query all notes and folders
*/
@@ -62,201 +67,72 @@ public class Notes {
/**
* Uri to query data
*/
-
public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
- //Notecolumns类,用于创建数据库的表头
+
public interface NoteColumns {
- //具体每一项都给了英文注释
- /**
- * The unique ID for a row
- * Type: INTEGER (long)
- */
+
public static final String ID = "_id";
- /**
- * The parent's id for note or folder
- * Type: INTEGER (long)
- */
public static final String PARENT_ID = "parent_id";
- /**
- * Created data for note or folder
- * Type: INTEGER (long)
- */
public static final String CREATED_DATE = "created_date";
- /**
- * Latest modified date
- * Type: INTEGER (long)
- */
public static final String MODIFIED_DATE = "modified_date";
-
- /**
- * Alert date
- * Type: INTEGER (long)
- */
public static final String ALERTED_DATE = "alert_date";
- /**
- * Folder's name or text content of note
- * Type: TEXT
- */
public static final String SNIPPET = "snippet";
- /**
- * Note's widget id
- * Type: INTEGER (long)
- */
public static final String WIDGET_ID = "widget_id";
- /**
- * Note's widget type
- * Type: INTEGER (long)
- */
public static final String WIDGET_TYPE = "widget_type";
- /**
- * Note's background color's id
- * Type: INTEGER (long)
- */
public static final String BG_COLOR_ID = "bg_color_id";
- /**
- * For text note, it doesn't has attachment, for multi-media
- * note, it has at least one attachment
- * Type: INTEGER
- */
public static final String HAS_ATTACHMENT = "has_attachment";
- /**
- * Folder's count of notes
- * Type: INTEGER (long)
- */
public static final String NOTES_COUNT = "notes_count";
- /**
- * The file type: folder or note
- * Type: INTEGER
- */
public static final String TYPE = "type";
- /**
- * The last sync id
- * Type: INTEGER (long)
- */
public static final String SYNC_ID = "sync_id";
- /**
- * Sign to indicate local modified or not
- * Type: INTEGER
- */
public static final String LOCAL_MODIFIED = "local_modified";
- /**
- * Original parent id before moving into temporary folder
- * Type : INTEGER
- */
public static final String ORIGIN_PARENT_ID = "origin_parent_id";
- /**
- * The gtask id
- * Type : TEXT
- */
public static final String GTASK_ID = "gtask_id";
- /**
- * The version code
- * Type : INTEGER (long)
- */
public static final String VERSION = "version";
+ }
- public static final String PASSWORD = "password";
-
- public static final String IMPORTANCE = "importance";
- }//便签的各种属性
- /*
- * 便签数据在数据库中的表头
- */
public interface DataColumns {
- /**
- * The unique ID for a row
- * Type: INTEGER (long)
- */
+
public static final String ID = "_id";
- /**
- * The MIME type of the item represented by this row.
- * Type: Text
- */
public static final String MIME_TYPE = "mime_type";
- /**
- * The reference id to note that this data belongs to
- * Type: INTEGER (long)
- */
public static final String NOTE_ID = "note_id";
- /**
- * Created data for note or folder
- * Type: INTEGER (long)
- */
public static final String CREATED_DATE = "created_date";
- /**
- * Latest modified date
- * Type: INTEGER (long)
- */
public static final String MODIFIED_DATE = "modified_date";
- /**
- * Data's content
- * Type: TEXT
- */
public static final String CONTENT = "content";
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * integer data type
- * Type: INTEGER
- */
public static final String DATA1 = "data1";
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * integer data type
- * Type: INTEGER
- */
public static final String DATA2 = "data2";
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- * Type: TEXT
- */
public static final String DATA3 = "data3";
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- * Type: TEXT
- */
public static final String DATA4 = "data4";
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- * Type: TEXT
- */
public static final String DATA5 = "data5";
- }//一个便签内部各种数据类型
+ }
public static final class TextNote implements DataColumns {
- /**
- * Mode to indicate the text in check list mode or not
- * Type: Integer 1:check list mode 0: normal mode
- */
+
public static final String MODE = DATA1;
public static final int MODE_CHECK_LIST = 1;
@@ -266,19 +142,12 @@ public class Notes {
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
- }//一种是文本textnote
+ }
public static final class CallNote implements DataColumns {
- /**
- * Call date for this record
- * Type: INTEGER (long)
- */
+
public static final String CALL_DATE = DATA1;
- /**
- * Phone number for this record
- * Type: TEXT
- */
public static final String PHONE_NUMBER = DATA3;
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note";
@@ -286,5 +155,5 @@ public class Notes {
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
- }//另一种是通话类型的callnote
+ }
}
diff --git a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
index bedbf65..1f05bbf 100644
--- a/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
+++ b/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java
@@ -16,22 +16,31 @@
package net.micode.notes.data;
-import android.content.ContentValues;
+import android.content.ContentValues;//就是用于保存一些数据(string boolean ...)信息,这些信息可以被数据库操作时使用。
import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteDatabase;//主要提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query()。配合content.values
+import android.database.sqlite.SQLiteOpenHelper;//用来管理数据的创建和版本更新
import android.util.Log;
-//引用了同一个包中的另一个子包Notes中一些接口
+
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
-//数据库操作
+/**
+ * @Package: net.micode.notes.data
+ * @ClassName: NotesDatabaseHelper
+ * @Description: 便签数据库操作底层实现
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/21 19:46
+ * @Version: 1.0
+ */
public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "note.db";
private static final int DB_VERSION = 4;
- //接口两部分一个Note一个DATA
+ /**
+ * 接口,创建数据库表头
+ */
public interface TABLE {
public static final String NOTE = "note";
@@ -41,7 +50,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "NotesDatabaseHelper";
private static NotesDatabaseHelper mInstance;
- //基于NoteColumn创建一个NOTE_TABLE表格,并附上初始数据
+ /**
+ * 便签的属性数据库
+ */
private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," +
@@ -62,7 +73,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
")";
- //主要基于datacolumn来创建DATA_TABLE
+ /**
+ * 便签的内容数据库
+ */
private static final String CREATE_DATA_TABLE_SQL =
"CREATE TABLE " + TABLE.DATA + "(" +
DataColumns.ID + " INTEGER PRIMARY KEY," +
@@ -77,13 +90,13 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
")";
- //这个数据是关于INDEX编号的
+
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
/**
- * Increase folder's note count when move note to the folder
+ * 文件夹内移进便签时需要修改的数据
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_update "+
@@ -93,9 +106,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
- //移入note时触发,修改一系列数据,从哪来之类的
+
/**
- * Decrease folder's note count when move note from folder
+ * 便签移出文件夹时需要修改的数据
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_update " +
@@ -106,9 +119,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
" END";
- //移除Note时触发,与上面移入对应
+
/**
- * Increase folder's note count when insert new note to the folder
+ * 插入(新建)便签时需要修改的数据
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_insert " +
@@ -118,9 +131,9 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
- //插入Note
+
/**
- * Decrease folder's note count when delete note from the folder
+ * 删除便签时需要修改的数据
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_delete " +
@@ -131,7 +144,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0;" +
" END";
- //删除note
+
/**
* Update note's content when insert data with type {@link DataConstants#NOTE}
*/
@@ -144,7 +157,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
" END";
- //当给note插入新数据时触发
+
/**
* Update note's content when data with {@link DataConstants#NOTE} type has changed
*/
@@ -156,7 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
" WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";//note数据被修改update
+ " END";
/**
* Update note's content when data with {@link DataConstants#NOTE} type has deleted
@@ -169,7 +182,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.SNIPPET + "=''" +
" WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
- " END";//更新已经删除的便签的数据
+ " END";
/**
* Delete datas belong to note which has been deleted
@@ -180,7 +193,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" BEGIN" +
" DELETE FROM " + TABLE.DATA +
" WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
- " END";//删除 已经被删除的便签的数据
+ " END";
/**
* Delete notes belong to folder which has been deleted
@@ -191,7 +204,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" BEGIN" +
" DELETE FROM " + TABLE.NOTE +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";//删除 已删除folder文件夹 中的便签要修改的数据
+ " END";
/**
* Move notes belong to folder which has been moved to trash folder
@@ -204,12 +217,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
" WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";//移动trash_folder中的便签
+ " END";
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
- //构造函数
+
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL);
reCreateNoteTableTriggers(db);
@@ -233,49 +246,48 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
- }//数据库操作的API,重新创建
-
+ }
+ /**
+ * @method createSystemFolder
+ * @description: 创建系统缺省文件夹:通话记录、缺省根目录、临时文件夹、回收文件夹
+ * @date: 2023/12/21 20:19
+ * @author: WuShuxian
+ * @param: db
+ * @return: void
+ */
private void createSystemFolder(SQLiteDatabase db) {
ContentValues values = new ContentValues();
- /**
- * call record foler for call notes
- */
+ //通话记录文件夹
values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- /**
- * root folder which is default folder
- */
+ //缺省根目录
values.clear();
values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- /**
- * temporary folder which is used for moving note
- */
+ //临时文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- /**
- * create trash folder
- */
+ //回收站文件夹
values.clear();
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- }//创建系统文件夹
+ }
public void createDataTable(SQLiteDatabase db) {
db.execSQL(CREATE_DATA_TABLE_SQL);
reCreateDataTableTriggers(db);
db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
Log.d(TAG, "data table has been created");
- }//创建数据表格
+ }
private void reCreateDataTableTriggers(SQLiteDatabase db) {
db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
@@ -285,38 +297,45 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
- }//类似于recreatenotetable,重新创建触发器
+ }
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
- }//sync同步,同一时刻只有一个线程执行
+ }
@Override
public void onCreate(SQLiteDatabase db) {
- createNoteTable(db);
- createDataTable(db);
- }//创建Note Data两个表格
-
+ createNoteTable(db);//属性数据库
+ createDataTable(db);//内容数据库
+ }
+ /**
+ * @method onUpgrade
+ * @description: 便签版本更新?没有使用者判断不了
+ * @date: 2023/12/21 20:42
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false;
boolean skipV2 = false;
-
+ //V1->V2
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // this upgrade including the upgrade from v2 to v3
oldVersion++;
}
-
+ //V2->V3
if (oldVersion == 2 && !skipV2) {
upgradeToV3(db);
reCreateTriggers = true;
oldVersion++;
}
-
+ //V3->V4
if (oldVersion == 3) {
upgradeToV4(db);
oldVersion++;
@@ -331,15 +350,19 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
throw new IllegalStateException("Upgrade notes database to version " + newVersion
+ "fails");
}
- }//数据库版本更新
-
+ }
+ /**
+ * 升级到V2,修改相应数据库
+ */
private void upgradeToV2(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);
db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);
createNoteTable(db);
createDataTable(db);
- }//更新到V2
-
+ }
+ /**
+ * 升级到V3,修改相应数据库
+ */
private void upgradeToV3(SQLiteDatabase db) {
// drop unused triggers
db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
@@ -353,10 +376,12 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper {
values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
db.insert(TABLE.NOTE, null, values);
- }//更新到V3
-
+ }
+ /**
+ * 升级到V4,修改相应数据库
+ */
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
- }//更新到V4
+ }
}
diff --git a/src/main/java/net/micode/notes/data/NotesProvider.java b/src/main/java/net/micode/notes/data/NotesProvider.java
index 6897999..ddb2282 100644
--- a/src/main/java/net/micode/notes/data/NotesProvider.java
+++ b/src/main/java/net/micode/notes/data/NotesProvider.java
@@ -1,5 +1,22 @@
+/*
+ * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package net.micode.notes.data;
+
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentUris;
@@ -16,15 +33,19 @@ import net.micode.notes.R;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
-//为存储和获取数据提供接口。可以在不同的应用程序之间共享数据
-//ContentProvider提供的方法
-//query:查询
-//insert:插入
-//update:更新
-//delete:删除
-//getType:得到数据类型
+
+/**
+ * @Package: net.micode.notes.data
+ * @ClassName: NotesProvider
+ * @Description: 为存储和获取数据提供接口。可以在不同的应用程序之间共享数据
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/21 20:50
+ * @Version: 1.0
+ */
public class NotesProvider extends ContentProvider {
- // UriMatcher用于匹配Uri
+ /**
+ * UriMatcher用于匹配Uri
+ */
private static final UriMatcher mMatcher;
private NotesDatabaseHelper mHelper;
@@ -40,9 +61,7 @@ public class NotesProvider extends ContentProvider {
private static final int URI_SEARCH_SUGGEST = 6;
static {
- // 创建UriMatcher时,调用UriMatcher(UriMatcher.NO_MATCH)表示不匹配任何路径的返回码
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- // 把需要匹配Uri路径全部给注册上
mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE);
mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM);
mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA);
@@ -53,43 +72,44 @@ public class NotesProvider extends ContentProvider {
}
/**
+ * 搜索字段
* x'0A' represents the '\n' character in sqlite. For title and content in the search result,
* we will trim '\n' and white space in order to show more information.
*/
- // 声明 NOTES_SEARCH_PROJECTION
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
- + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
- + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
- + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
- + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
- // 声明NOTES_SNIPPET_SEARCH_QUERY
+ + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
+
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
- + " FROM " + TABLE.NOTE
- + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
- + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
- + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
+ + " FROM " + TABLE.NOTE
+ + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
@Override
- // Context只有在onCreate()中才被初始化
- // 对mHelper进行实例化
public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext());
return true;
}
-
+ /**
+ * @Package: net.micode.notes.data
+ * @ClassName: NotesProvider
+ * @Description: 查询Uri在数据库中的位置
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/21 21:06
+ * @Version: 1.0
+ */
@Override
- // 查询uri在数据库中对应的位置
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
+ String sortOrder) {
Cursor c = null;
- // 获取可读数据库
- SQLiteDatabase db = mHelper.getReadableDatabase();
+ SQLiteDatabase db = mHelper.getReadableDatabase();//读数据库
String id = null;
- // 匹配查找uri
switch (mMatcher.match(uri)) {
- // 对于不同的匹配值,在数据库中查找相应的条目
case URI_NOTE:
c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null,
sortOrder);
@@ -111,7 +131,6 @@ public class NotesProvider extends ContentProvider {
case URI_SEARCH:
case URI_SEARCH_SUGGEST:
if (sortOrder != null || projection != null) {
- // 不合法的参数异常
throw new IllegalArgumentException(
"do not specify sortOrder, selection, selectionArgs, or projection" + "with this query");
}
@@ -119,8 +138,6 @@ public class NotesProvider extends ContentProvider {
String searchString = null;
if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) {
if (uri.getPathSegments().size() > 1) {
- // getPathSegments()方法得到一个String的List,
- // 在uri.getPathSegments().get(1)为第2个元素
searchString = uri.getPathSegments().get(1);
}
} else {
@@ -132,7 +149,7 @@ public class NotesProvider extends ContentProvider {
}
try {
- searchString = String.format("%%%s%%", searchString);
+ searchString = String.format("%%%s%%", searchString);//在新建便签并输入内容保存后会跳到这里,暂时不知道为什么
c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,
new String[] { searchString });
} catch (IllegalStateException ex) {
@@ -140,7 +157,6 @@ public class NotesProvider extends ContentProvider {
}
break;
default:
- // 抛出异常
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (c != null) {
@@ -149,18 +165,22 @@ public class NotesProvider extends ContentProvider {
return c;
}
+ /**
+ * @method insert
+ * @description: 插入一个Uri,只有新建便签并保存后才会触发,修改内容不会触发
+ * @date: 2023/12/21 21:16
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
- // 插入一个uri
public Uri insert(Uri uri, ContentValues values) {
- // 获得可写的数据库
SQLiteDatabase db = mHelper.getWritableDatabase();
long dataId = 0, noteId = 0, insertedId = 0;
switch (mMatcher.match(uri)) {
- // 新增一个条目
case URI_NOTE:
insertedId = noteId = db.insert(TABLE.NOTE, null, values);
break;
- // 如果存在,查找NOTE_ID
case URI_DATA:
if (values.containsKey(DataColumns.NOTE_ID)) {
noteId = values.getAsLong(DataColumns.NOTE_ID);
@@ -173,7 +193,6 @@ public class NotesProvider extends ContentProvider {
throw new IllegalArgumentException("Unknown URI " + uri);
}
// Notify the note uri
- // notifyChange获得一个ContextResolver对象并且更新里面的内容
if (noteId > 0) {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);
@@ -185,17 +204,20 @@ public class NotesProvider extends ContentProvider {
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
}
- // 返回插入的uri的路径
return ContentUris.withAppendedId(uri, insertedId);
}
-
+ /**
+ * @method delete
+ * @description: 删除一个Uri,删除便签时会触发
+ * @date: 2023/12/21 21:17
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
- // 删除一个uri
public int delete(Uri uri, String selection, String[] selectionArgs) {
- //Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。
int count = 0;
String id = null;
- // 获得可写的数据库
SQLiteDatabase db = mHelper.getWritableDatabase();
boolean deleteData = false;
switch (mMatcher.match(uri)) {
@@ -204,7 +226,7 @@ public class NotesProvider extends ContentProvider {
count = db.delete(TABLE.NOTE, selection, selectionArgs);
break;
case URI_NOTE_ITEM:
- id = uri.getPathSegments().get(1);
+ id = uri.getPathSegments().get(1);//修改便签内容时会触发,原因不明
/**
* ID that smaller than 0 is system folder which is not allowed to
* trash
@@ -237,9 +259,15 @@ public class NotesProvider extends ContentProvider {
}
return count;
}
-
+ /**
+ * @method update
+ * @description: 更新Uri,修改便签时会触发。期间会跳到delete中执行,原因不明
+ * @date: 2023/12/21 21:19
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
- // 更新一个uri
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
String id = null;
@@ -279,12 +307,10 @@ public class NotesProvider extends ContentProvider {
return count;
}
- // 将字符串解析成规定格式
private String parseSelection(String selection) {
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
}
- //增加一个noteVersion
private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
StringBuilder sql = new StringBuilder(120);
sql.append("UPDATE ");
@@ -307,7 +333,6 @@ public class NotesProvider extends ContentProvider {
sql.append(selectString);
}
- // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句
mHelper.getWritableDatabase().execSQL(sql.toString());
}
@@ -317,4 +342,4 @@ public class NotesProvider extends ContentProvider {
return null;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/net/micode/notes/gtask/data/MetaData.java b/src/main/java/net/micode/notes/gtask/data/MetaData.java
index 3a2050b..9b96094 100644
--- a/src/main/java/net/micode/notes/gtask/data/MetaData.java
+++ b/src/main/java/net/micode/notes/gtask/data/MetaData.java
@@ -24,12 +24,26 @@ import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: MetaData
+ * @Description: 一些元数据的操作
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/22 21:45
+ * @Version: 1.0
+ */
public class MetaData extends Task {
private final static String TAG = MetaData.class.getSimpleName();
private String mRelatedGid = null;
-
+ /**
+ * @method setMeta
+ * @description: 生成元数据库
+ * @date: 2023/12/24 20:07
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public void setMeta(String gid, JSONObject metaInfo) {
try {
metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
@@ -48,7 +62,14 @@ public class MetaData extends Task {
public boolean isWorthSaving() {
return getNotes() != null;
}
-
+ /**
+ * @method setContentByRemoteJSON
+ * @description: 从远程Json对象设置元数据库内容
+ * @date: 2023/12/24 20:11
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
public void setContentByRemoteJSON(JSONObject js) {
super.setContentByRemoteJSON(js);
@@ -62,7 +83,14 @@ public class MetaData extends Task {
}
}
}
-
+ /**
+ * @method setContentByLocalJSON
+ * @description: 根据本地Json对象设置元数据库内容
+ * @date: 2023/12/24 20:12
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
public void setContentByLocalJSON(JSONObject js) {
// this function should not be called
diff --git a/src/main/java/net/micode/notes/gtask/data/Node.java b/src/main/java/net/micode/notes/gtask/data/Node.java
index 63950e0..c3ebd5a 100644
--- a/src/main/java/net/micode/notes/gtask/data/Node.java
+++ b/src/main/java/net/micode/notes/gtask/data/Node.java
@@ -19,24 +19,50 @@ package net.micode.notes.gtask.data;
import android.database.Cursor;
import org.json.JSONObject;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: Node
+ * @Description: 定义了同步节点:多个关于同步的常量,实现类似于Git的版本控制
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/21 21:30
+ * @Version: 1.0
+ */
public abstract class Node {
+ /**
+ * 本地与云端一致
+ */
public static final int SYNC_ACTION_NONE = 0;
-
+ /**
+ * 需要云端添加内容
+ */
public static final int SYNC_ACTION_ADD_REMOTE = 1;
-
+ /**
+ * 需要本地添加内容
+ */
public static final int SYNC_ACTION_ADD_LOCAL = 2;
-
+ /**
+ * 需要删除云端的内容
+ */
public static final int SYNC_ACTION_DEL_REMOTE = 3;
-
+ /**
+ * 需要删除本地的内容
+ */
public static final int SYNC_ACTION_DEL_LOCAL = 4;
-
+ /**
+ * 本地同步到云端
+ */
public static final int SYNC_ACTION_UPDATE_REMOTE = 5;
-
+ /**
+ * 云端同步到本地
+ */
public static final int SYNC_ACTION_UPDATE_LOCAL = 6;
-
+ /**
+ * 同步出现冲突
+ */
public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;
-
+ /**
+ * 同步错误
+ */
public static final int SYNC_ACTION_ERROR = 8;
private String mGid;
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 d3ec3be..76ffb9f 100644
--- a/src/main/java/net/micode/notes/gtask/data/SqlData.java
+++ b/src/main/java/net/micode/notes/gtask/data/SqlData.java
@@ -34,7 +34,15 @@ import net.micode.notes.gtask.exception.ActionFailureException;
import org.json.JSONException;
import org.json.JSONObject;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: SqlData
+ * @Description: 用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)
+ * SqlData其实就是也就是所谓数据中的数据
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:13
+ * @Version: 1.0
+ */
public class SqlData {
private static final String TAG = SqlData.class.getSimpleName();
@@ -44,7 +52,9 @@ public class SqlData {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
-
+ /**
+ * 以下五个变量作为sql表中5列的编号
+ */
public static final int DATA_ID_COLUMN = 0;
public static final int DATA_MIME_TYPE_COLUMN = 1;
@@ -70,7 +80,14 @@ public class SqlData {
private String mDataContentData3;
private ContentValues mDiffDataValues;
-
+ /**
+ * @method SqlData
+ * @description: 构造函数,用于初始化数据
+ * @date: 2023/12/24 20:17
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;
@@ -81,14 +98,28 @@ public class SqlData {
mDataContentData3 = "";
mDiffDataValues = new ContentValues();
}
-
+ /**
+ * @method SqlData
+ * @description: 构造函数,根据已有数据初始化一个新的数据对象
+ * @date: 2023/12/24 20:17
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);
mDiffDataValues = new ContentValues();
}
-
+ /**
+ * @method loadFromCursor
+ * @description: 从光标处加载数据
+ * @date: 2023/12/24 20:18
+ * @author: WuShuxian
+ * @param: c:光标的位置
+ * @return: void
+ */
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
@@ -96,7 +127,14 @@ public class SqlData {
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
-
+ /**
+ * @method setContent
+ * @description: 设置用于共享的数据,并提供异常抛出与处理机制
+ * @date: 2023/12/24 20:19
+ * @author: WuShuxian
+ * @param: js: Json对象
+ * @return: void
+ */
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
@@ -143,7 +181,16 @@ public class SqlData {
js.put(DataColumns.DATA3, mDataContentData3);
return js;
}
-
+ /**
+ * @method commit
+ * @description: commit函数用于把当前造作所做的修改保存到数据库
+ * @date: 2023/12/24 20:21
+ * @author: WuShuxian
+ * @param: noteId:要保存的便签ID
+ * validateVersion:判断此次修改是否合法
+ * version:版本号
+ * @return: void
+ */
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {
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 79a4095..ae97d68 100644
--- a/src/main/java/net/micode/notes/gtask/data/SqlNote.java
+++ b/src/main/java/net/micode/notes/gtask/data/SqlNote.java
@@ -37,7 +37,14 @@ import org.json.JSONObject;
import java.util.ArrayList;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: SqlNote
+ * @Description: 用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:23
+ * @Version: 1.0
+ */
public class SqlNote {
private static final String TAG = SqlNote.class.getSimpleName();
@@ -121,17 +128,24 @@ public class SqlNote {
private ContentValues mDiffNoteValues;
private ArrayList mDataList;
-
+ /**
+ * @method SqlNote
+ * @description: 构造函数,初始化context的所有数据
+ * @date: 2023/12/24 20:24
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public SqlNote(Context context) {
mContext = context;
mContentResolver = context.getContentResolver();
- mIsCreate = true;
+ mIsCreate = true;//用于标识构造方法
mId = INVALID_ID;
mAlertDate = 0;
mBgColorId = ResourceParser.getDefaultBgId(context);
- mCreatedDate = System.currentTimeMillis();
+ mCreatedDate = System.currentTimeMillis();//调用系统函数获得创建时间
mHasAttachment = 0;
- mModifiedDate = System.currentTimeMillis();
+ mModifiedDate = System.currentTimeMillis();//最后一次修改时间初始化为创建时间
mParentId = 0;
mSnippet = "";
mType = Notes.TYPE_NOTE;
@@ -142,22 +156,36 @@ public class SqlNote {
mDiffNoteValues = new ContentValues();
mDataList = new ArrayList();
}
-
+ /**
+ * @method SqlNote
+ * @description: 构造函数,根据光标所指向的已有数据构造新对象
+ * @date: 2023/12/24 20:25
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public SqlNote(Context context, Cursor c) {
mContext = context;
mContentResolver = context.getContentResolver();
- mIsCreate = false;
+ mIsCreate = false;//用于标识构造方法
loadFromCursor(c);
mDataList = new ArrayList();
if (mType == Notes.TYPE_NOTE)
loadDataContent();
mDiffNoteValues = new ContentValues();
}
-
+ /**
+ * @method SqlNote
+ * @description: 构造函数,根据ID构造新对象
+ * @date: 2023/12/24 20:27
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public SqlNote(Context context, long id) {
mContext = context;
mContentResolver = context.getContentResolver();
- mIsCreate = false;
+ mIsCreate = false;//标识构造方法
loadFromCursor(id);
mDataList = new ArrayList();
if (mType == Notes.TYPE_NOTE)
@@ -199,7 +227,14 @@ public class SqlNote {
mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
mVersion = c.getLong(VERSION_COLUMN);
}
-
+ /**
+ * @method loadDataContent
+ * @description: 通过content机制获取共享数据并加载到数据库当前游标处
+ * @date: 2023/12/24 20:29
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
private void loadDataContent() {
Cursor c = null;
mDataList.clear();
@@ -439,7 +474,14 @@ public class SqlNote {
public boolean isNoteType() {
return mType == Notes.TYPE_NOTE;
}
-
+ /**
+ * @method commit
+ * @description: commit函数用于把当前所做的修改保存到数据库
+ * @date: 2023/12/24 20:30
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public void commit(boolean validateVersion) {
if (mIsCreate) {
if (mId == INVALID_ID && mDiffNoteValues.containsKey(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 6a19454..bafeb0f 100644
--- a/src/main/java/net/micode/notes/gtask/data/Task.java
+++ b/src/main/java/net/micode/notes/gtask/data/Task.java
@@ -31,7 +31,14 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: Task
+ * @Description: Node类的子类,用于支持任务列表的操作
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:31
+ * @Version: 1.0
+ */
public class Task extends Node {
private static final String TAG = Task.class.getSimpleName();
@@ -53,22 +60,25 @@ public class Task extends Node {
mParent = null;
mMetaInfo = null;
}
-
+ /**
+ * @method getCreateAction
+ * @description: 获取创建信息,以Json格式返回
+ * @date: 2023/12/24 20:33
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public JSONObject getCreateAction(int actionId) {
JSONObject js = new JSONObject();
try {
- // action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
- // action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
- // index
js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this));
- // entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
@@ -79,17 +89,13 @@ public class Task extends Node {
}
js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
- // parent_id
js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid());
- // dest_parent_type
js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE,
GTaskStringUtils.GTASK_JSON_TYPE_GROUP);
- // list_id
js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid());
- // prior_sibling_id
if (mPriorSibling != null) {
js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid());
}
@@ -102,22 +108,25 @@ public class Task extends Node {
return js;
}
-
+ /**
+ * @method getUpdateAction
+ * @description: 获取创建动作,以Json格式返回
+ * @date: 2023/12/24 20:34
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
public JSONObject getUpdateAction(int actionId) {
JSONObject js = new JSONObject();
try {
- // action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
- // action_id
js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
- // id
js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
- // entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
if (getNotes() != null) {
@@ -138,32 +147,26 @@ public class Task extends Node {
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
- // id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
}
- // last_modified
if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
}
- // name
if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
}
- // notes
if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) {
setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES));
}
- // deleted
if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) {
setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED));
}
- // completed
if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) {
setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED));
}
@@ -208,7 +211,6 @@ public class Task extends Node {
String name = getName();
try {
if (mMetaInfo == null) {
- // new task created from web
if (name == null) {
Log.w(TAG, "the note seems to be an empty one");
return null;
@@ -225,7 +227,6 @@ public class Task extends Node {
js.put(GTaskStringUtils.META_HEAD_NOTE, note);
return js;
} else {
- // synced task
JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
@@ -275,29 +276,24 @@ public class Task extends Node {
return SYNC_ACTION_UPDATE_LOCAL;
}
- // validate the note id now
+ // 立即验证note id
if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) {
Log.w(TAG, "note id doesn't match");
return SYNC_ACTION_UPDATE_LOCAL;
}
if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
- // there is no local update
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // no update both side
return SYNC_ACTION_NONE;
} else {
- // apply remote to local
return SYNC_ACTION_UPDATE_LOCAL;
}
} else {
- // validate gtask id
if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {
Log.e(TAG, "gtask id doesn't match");
return SYNC_ACTION_ERROR;
}
if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // local modification only
return SYNC_ACTION_UPDATE_REMOTE;
} else {
return SYNC_ACTION_UPDATE_CONFLICT;
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 4ea21c5..56802e9 100644
--- a/src/main/java/net/micode/notes/gtask/data/TaskList.java
+++ b/src/main/java/net/micode/notes/gtask/data/TaskList.java
@@ -29,7 +29,14 @@ import org.json.JSONObject;
import java.util.ArrayList;
-
+/**
+ * @Package: net.micode.notes.gtask.data
+ * @ClassName: TaskList
+ * @Description: 对Node的拓展,主要用于支持任务列表的操作
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:40
+ * @Version: 1.0
+ */
public class TaskList extends Node {
private static final String TAG = TaskList.class.getSimpleName();
@@ -47,17 +54,13 @@ public class TaskList extends Node {
JSONObject js = new JSONObject();
try {
- // action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
+ GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);// 动作类型
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
+ js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);// 动作编号
- // index
js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex);
- // entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
@@ -78,17 +81,13 @@ public class TaskList extends Node {
JSONObject js = new JSONObject();
try {
- // action_type
js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
+ GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);//动作类型
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
+ js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);//动作编号
- // id
js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
- // entity_delta
JSONObject entity = new JSONObject();
entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
@@ -106,17 +105,14 @@ public class TaskList extends Node {
public void setContentByRemoteJSON(JSONObject js) {
if (js != null) {
try {
- // id
if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
}
- // last_modified
if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
}
- // name
if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
}
@@ -225,7 +221,6 @@ public class TaskList extends Node {
if (task != null && !mChildren.contains(task)) {
ret = mChildren.add(task);
if (ret) {
- // need to set prior sibling and parent
task.setPriorSibling(mChildren.isEmpty() ? null : mChildren
.get(mChildren.size() - 1));
task.setParent(this);
@@ -244,7 +239,7 @@ public class TaskList extends Node {
if (task != null && pos == -1) {
mChildren.add(index, task);
- // update the task list
+ // 更新任务列表
Task preTask = null;
Task afterTask = null;
if (index != 0)
@@ -267,11 +262,9 @@ public class TaskList extends Node {
ret = mChildren.remove(task);
if (ret) {
- // reset prior sibling and parent
task.setPriorSibling(null);
task.setParent(null);
- // update the task list
if (index != mChildren.size()) {
mChildren.get(index).setPriorSibling(
index == 0 ? null : mChildren.get(index - 1));
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 15504be..e46c70a 100644
--- a/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java
+++ b/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java
@@ -15,8 +15,19 @@
*/
package net.micode.notes.gtask.exception;
-
+/**
+ * @Package: net.micode.notes.gtask.exception
+ * @ClassName: ActionFailureException
+ * @Description: 支持小米便签运行过程中的运行异常处理
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:45
+ * @Version: 1.0
+ */
public class ActionFailureException extends RuntimeException {
+ /**
+ * serialVersionUID相当于java类的身份证。主要用于版本控制
+ * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性
+ */
private static final long serialVersionUID = 4425249765923293627L;
public ActionFailureException() {
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 b08cfb1..4291ece 100644
--- a/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java
+++ b/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java
@@ -15,8 +15,19 @@
*/
package net.micode.notes.gtask.exception;
-
+/**
+ * @Package: net.micode.notes.gtask.exception
+ * @ClassName: NetworkFailureException
+ * @Description: 支持小米便签运行过程中的网络异常处理
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:46
+ * @Version: 1.0
+ */
public class NetworkFailureException extends Exception {
+ /**
+ * serialVersionUID相当于java类的身份证。主要用于版本控制。
+ * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性
+ */
private static final long serialVersionUID = 2107610287180234136L;
public NetworkFailureException() {
diff --git a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
index 0e332f3..075abe0 100644
--- a/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
+++ b/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java
@@ -28,7 +28,14 @@ import net.micode.notes.R;
import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;
-
+/**
+ * @Package: net.micode.notes.gtask.remote
+ * @ClassName: GTaskASyncTask
+ * @Description: 异步操作类,实现GTask的异步操作过程
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:49
+ * @Version: 1.0
+ */
public class GTaskASyncTask extends AsyncTask {
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
@@ -62,9 +69,22 @@ public class GTaskASyncTask extends AsyncTask {
message
});
}
-
+ /**
+ * @method showNotification
+ * @description: 向用户提示当前同步的状态,是一个用于交互的方法
+ * @date: 2023/12/24 20:50
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
private void showNotification(int tickerId, String content) {
+ Notification notification = new Notification(R.drawable.notification, mContext
+ .getString(tickerId), System.currentTimeMillis());
+ notification.defaults = Notification.DEFAULT_LIGHTS;
+ notification.flags = Notification.FLAG_AUTO_CANCEL;
PendingIntent pendingIntent;
+ //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象
+ //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), 0);
@@ -73,21 +93,18 @@ public class GTaskASyncTask extends AsyncTask {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), 0);
}
-
-
- Notification.Builder builder = new Notification.Builder(mContext)
- .setAutoCancel(true)
- .setContentTitle(mContext.getString(R.string.app_name))
- .setContentText(content)
- .setContentIntent(pendingIntent)
- .setWhen(System.currentTimeMillis())
- .setOngoing(true);
- Notification notification=builder.getNotification();
+ //notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
+ //pendingIntent);
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
-
-
-
+ /**
+ * @method doInBackground
+ * @description: 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间
+ * @date: 2023/12/24 20:51
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
@@ -95,6 +112,14 @@ public class GTaskASyncTask extends AsyncTask {
return mTaskManager.sync(mContext, this);
}
+ /**
+ * @method onProgressUpdate
+ * @description: 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度
+ * @date: 2023/12/24 20:51
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
@@ -103,6 +128,14 @@ public class GTaskASyncTask extends AsyncTask {
}
}
+ /**
+ * @method onPostExecute
+ * @description: 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI
+ * @date: 2023/12/24 20:51
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
@Override
protected void onPostExecute(Integer result) {
if (result == GTaskManager.STATE_SUCCESS) {
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..f8a0547 100644
--- a/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
+++ b/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
@@ -60,7 +60,14 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
-
+/**
+ * @Package: net.micode.notes.gtask.remote
+ * @ClassName: GTaskClient
+ * @Description: 实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 20:55
+ * @Version: 1.0
+ */
public class GTaskClient {
private static final String TAG = GTaskClient.class.getSimpleName();
@@ -90,6 +97,12 @@ public class GTaskClient {
private JSONArray mUpdateArray;
+ /**
+ * @method GTaskClient
+ * @description: 构造函数
+ * @date: 2023/12/24 20:56
+ * @author: WuShuxian
+ */
private GTaskClient() {
mHttpClient = null;
mGetUrl = GTASK_GET_URL;
@@ -108,35 +121,40 @@ public class GTaskClient {
}
return mInstance;
}
-
+ /**
+ * @method login
+ * @description: 用来实现登录操作,有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录
+ * @date: 2023/12/24 21:15
+ * @author: WuShuxian
+ * @param: activity
+ * @return: boolean
+ */
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;
}
- // need to re-login after account switch
+ // 重新登陆操作
if (mLoggedin
&& !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity
.getSyncAccountName(activity))) {
mLoggedin = false;
}
-
+ //如果没超过时间,则不需要重新登录
if (mLoggedin) {
Log.d(TAG, "already logged in");
return true;
}
- mLastLoginTime = System.currentTimeMillis();
- String authToken = loginGoogleAccount(activity, false);
+ mLastLoginTime = System.currentTimeMillis();//更新最后登录时间为系统当前的时间
+ String authToken = loginGoogleAccount(activity, false);//判断是否登录到谷歌账户
if (authToken == null) {
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"))) {
StringBuilder url = new StringBuilder(GTASK_URL).append("a/");
@@ -150,8 +168,7 @@ public class GTaskClient {
mLoggedin = true;
}
}
-
- // try to login with google official url
+ //如果用户账户无法登录,则使用谷歌官方的URI进行登录
if (!mLoggedin) {
mGetUrl = GTASK_GET_URL;
mPostUrl = GTASK_POST_URL;
@@ -163,7 +180,14 @@ public class GTaskClient {
mLoggedin = true;
return true;
}
-
+ /**
+ * @method loginGoogleAccount
+ * @description: 具体实现登录谷歌账户的方法
+ * @date: 2023/12/24 23:07
+ * @author: WuShuxian
+ * @param: activity
+ * @return: String
+ */
private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
String authToken;
AccountManager accountManager = AccountManager.get(activity);
@@ -176,6 +200,7 @@ public class GTaskClient {
String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
Account account = null;
+ //遍历获得的accounts信息,寻找已经记录过的账户信息
for (Account a : accounts) {
if (a.name.equals(accountName)) {
account = a;
@@ -189,7 +214,7 @@ public class GTaskClient {
return null;
}
- // get the token now
+ //获取令牌
AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account,
"goanna_mobile", null, activity, null, null);
try {
@@ -206,11 +231,16 @@ public class GTaskClient {
return authToken;
}
-
+ /**
+ * @method tryToLoginGtask
+ * @description: 尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法
+ * @date: 2023/12/24 21:01
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
private boolean tryToLoginGtask(Activity activity, String authToken) {
if (!loginGtask(authToken)) {
- // maybe the auth token is out of date, now let's invalidate the
- // token and try again
authToken = loginGoogleAccount(activity, true);
if (authToken == null) {
Log.e(TAG, "login google account failed");
@@ -224,26 +254,33 @@ public class GTaskClient {
}
return true;
}
-
+ /**
+ * @method loginGtask
+ * @description: 具体实现登录操作
+ * @date: 2023/12/24 21:05
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
private boolean loginGtask(String authToken) {
int timeoutConnection = 10000;
- int timeoutSocket = 15000;
- HttpParams httpParameters = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
- HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
+ int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口
+ HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类
+ HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间
+ HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间
mHttpClient = new DefaultHttpClient(httpParameters);
BasicCookieStore localBasicCookieStore = new BasicCookieStore();
mHttpClient.setCookieStore(localBasicCookieStore);
HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false);
- // 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);
- // get the cookie now
+ //获取CookieStore里存放的cookie,如果存有“GTL”,则cookie有效
List cookies = mHttpClient.getCookieStore().getCookies();
boolean hasAuthCookie = false;
for (Cookie cookie : cookies) {
@@ -255,7 +292,7 @@ public class GTaskClient {
Log.w(TAG, "it seems that there is no auth cookie");
}
- // get the client version
+ //获取client的内容
String resString = getResponseContent(response.getEntity());
String jsBegin = "_setup(";
String jsEnd = ")}";
@@ -272,7 +309,6 @@ public class GTaskClient {
e.printStackTrace();
return false;
} catch (Exception e) {
- // simply catch all exceptions
Log.e(TAG, "httpget gtask_url failed");
return false;
}
@@ -283,14 +319,24 @@ public class GTaskClient {
private int getActionId() {
return mActionId++;
}
-
+ /**
+ * @method createHttpPost
+ * @description: 实例化创建一个用于向网络传输数据的对象
+ * @date: 2023/12/24 23:13
+ * @author: WuShuxian
+ */
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;
}
-
+ /**
+ * @method getResponseContent
+ * @description: 通过URL获取响应后返回的数据,也就是网络上的数据和资源
+ * @date: 2023/12/24 21:06
+ * @author: WuShuxian
+ */
private String getResponseContent(HttpEntity entity) throws IOException {
String contentEncoding = null;
if (entity.getContentEncoding() != null) {
@@ -322,13 +368,20 @@ public class GTaskClient {
input.close();
}
}
-
+ /**
+ * @method postRequest
+ * @description: 通过Json发送请求
+ * @date: 2023/12/24 21:07
+ * @author: WuShuxian
+ * @param: js
+ * @return:
+ */
private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
throw new ActionFailureException("not logged in");
}
-
+ //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里
HttpPost httpPost = createHttpPost();
try {
LinkedList list = new LinkedList();
@@ -336,9 +389,8 @@ public class GTaskClient {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
httpPost.setEntity(entity);
- // execute the post
HttpResponse response = mHttpClient.execute(httpPost);
- String jsString = getResponseContent(response.getEntity());
+ String jsString = getResponseContent(response.getEntity());//得到返回的数据和资源
return new JSONObject(jsString);
} catch (ClientProtocolException e) {
@@ -359,21 +411,25 @@ public class GTaskClient {
throw new ActionFailureException("error occurs when posting request");
}
}
-
+ /**
+ * @method createTask
+ * @description: 创建单个任务
+ * @date: 2023/12/24 21:08
+ * @author: WuShuxian
+ * @param: task
+ * @return: void
+ */
public void createTask(Task task) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
- // action_list
actionList.put(task.getCreateAction(getActionId()));
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
- // client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
- // post
JSONObject jsResponse = postRequest(jsPost);
JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
@@ -385,25 +441,29 @@ public class GTaskClient {
throw new ActionFailureException("create task: handing jsonobject failed");
}
}
-
+ /**
+ * @method createTaskList
+ * @description: 建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid
+ * @date: 2023/12/24 21:09
+ * @author: WuShuxian
+ * @param: tasklist
+ * @return: void
+ */
public void createTaskList(TaskList tasklist) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
- // action_list
actionList.put(tasklist.getCreateAction(getActionId()));
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
- // client version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
- // post
- JSONObject jsResponse = postRequest(jsPost);
+ JSONObject jsResponse = postRequest(jsPost);//得到任务的返回信息
JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
- tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
+ tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));//设置task的new_id
} catch (JSONException e) {
Log.e(TAG, e.toString());
@@ -417,10 +477,8 @@ public class GTaskClient {
try {
JSONObject jsPost = new JSONObject();
- // action_list
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray);
- // client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
postRequest(jsPost);
@@ -432,11 +490,17 @@ public class GTaskClient {
}
}
}
-
+ /**
+ * @method addUpdateNode
+ * @description: 添加更新的事项
+ * @date: 2023/12/24 23:19
+ * @author: WuShuxian
+ * @param: node
+ * @return: void
+ */
public void addUpdateNode(Node node) throws NetworkFailureException {
if (node != null) {
- // too many update items may result in an error
- // set max to 10 items
+ //设置更新(同步)项目数量上限:10
if (mUpdateArray != null && mUpdateArray.length() > 10) {
commitUpdate();
}
@@ -446,7 +510,14 @@ public class GTaskClient {
mUpdateArray.put(node.getUpdateAction(getActionId()));
}
}
-
+ /**
+ * @method moveTask
+ * @description: 移动task,比如讲task移动到不同的task列表中去
+ * @date: 2023/12/24 23:19
+ * @author: WuShuxian
+ * @param: task、preParent、curParent
+ * @return: void
+ */
public void moveTask(Task task, TaskList preParent, TaskList curParent)
throws NetworkFailureException {
commitUpdate();
@@ -455,26 +526,22 @@ public class GTaskClient {
JSONArray actionList = new JSONArray();
JSONObject action = new JSONObject();
- // action_list
+ // 动作序列
action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE);
action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid());
if (preParent == curParent && task.getPriorSibling() != null) {
- // put prioring_sibing_id only if moving within the tasklist and
- // it is not the first one
- action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());
+ action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());//设置优先级ID,只有当移动是发生在文件中
}
action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid());
action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid());
if (preParent != curParent) {
- // put the dest_list only if moving between tasklists
- action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());
+ action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());//仅当在任务列表之间移动时才放入dest_list
}
actionList.put(action);
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
+ jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);//将ACTION_LIST加入到jsPost中
- // client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
postRequest(jsPost);
@@ -485,22 +552,27 @@ public class GTaskClient {
throw new ActionFailureException("move task: handing jsonobject failed");
}
}
-
+ /**
+ * @method deleteNode
+ * @description: 删除操作节点
+ * @date: 2023/12/24 23:22
+ * @author: WuShuxian
+ * @param: node
+ * @return: void
+ */
public void deleteNode(Node node) throws NetworkFailureException {
commitUpdate();
try {
JSONObject jsPost = new JSONObject();
JSONArray actionList = new JSONArray();
- // action_list
node.setDeleted(true);
- actionList.put(node.getUpdateAction(getActionId()));
+ actionList.put(node.getUpdateAction(getActionId()));//获取删除操作的ID,加入actionLiast
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
- // client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
- postRequest(jsPost);
+ postRequest(jsPost);//使用postRequest发送删除后的结果
mUpdateArray = null;
} catch (JSONException e) {
Log.e(TAG, e.toString());
@@ -508,7 +580,14 @@ public class GTaskClient {
throw new ActionFailureException("delete node: handing jsonobject failed");
}
}
-
+ /**
+ * @method getTaskLists
+ * @description: 获取任务列表
+ * @date: 2023/12/24 23:24
+ * @author: WuShuxian
+ * @param: void
+ * @return:
+ */
public JSONArray getTaskLists() throws NetworkFailureException {
if (!mLoggedin) {
Log.e(TAG, "please login first");
@@ -520,8 +599,8 @@ public class GTaskClient {
HttpResponse response = null;
response = mHttpClient.execute(httpGet);
- // get the task list
- String resString = getResponseContent(response.getEntity());
+ // 获取任务列表,把筛选出的字符串放入jsString
+ String resString = getResponseContent(response.getEntity());//从网上获取数据
String jsBegin = "_setup(";
String jsEnd = ")}";
int begin = resString.indexOf(jsBegin);
@@ -546,7 +625,14 @@ public class GTaskClient {
throw new ActionFailureException("get task lists: handing jasonobject failed");
}
}
-
+ /**
+ * @method getTaskList
+ * @description: 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务
+ * @date: 2023/12/24 23:28
+ * @author: WuShuxian
+ * @param: listGid
+ * @return:
+ */
public JSONArray getTaskList(String listGid) throws NetworkFailureException {
commitUpdate();
try {
@@ -554,7 +640,6 @@ public class GTaskClient {
JSONArray actionList = new JSONArray();
JSONObject action = new JSONObject();
- // action_list
action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL);
action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
@@ -563,7 +648,6 @@ public class GTaskClient {
actionList.put(action);
jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
- // client_version
jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
JSONObject jsResponse = postRequest(jsPost);
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..e7771a2 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,14 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
-
+/**
+ * @Package: net.micode.notes.gtask.remote
+ * @ClassName: GTaskManager
+ * @Description: 同步管理操作
+ * @Author: WuShuxian
+ * @CreateDate: 2023/12/24 21:13
+ * @Version: 1.0
+ */
public class GTaskManager {
private static final String TAG = GTaskManager.class.getSimpleName();
@@ -86,10 +93,17 @@ public class GTaskManager {
private HashMap mGidToNid;
private HashMap mNidToGid;
-
+ /**
+ * @method GTaskManager
+ * @description: 构造函数,初始化实例对象
+ * @date: 2023/12/24 23:30
+ * @author: WuShuxian
+ * @param: void
+ * @return: void
+ */
private GTaskManager() {
- mSyncing = false;
- mCancelled = false;
+ mSyncing = false;//正在同步,flase代表未执行
+ mCancelled = false;//全局标识,flase代表可以执行
mGTaskListHashMap = new HashMap();
mGTaskHashMap = new HashMap();
mMetaHashMap = new HashMap();
@@ -98,7 +112,14 @@ public class GTaskManager {
mGidToNid = new HashMap();
mNidToGid = new HashMap();
}
-
+ /**
+ * @method getInstance
+ * @description: 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下
+ * @date: 2023/12/24 23:31
+ * @author: WuShuxian
+ * @param: void
+ * @return: GTaskManager
+ */
public static synchronized GTaskManager getInstance() {
if (mInstance == null) {
mInstance = new GTaskManager();
@@ -107,10 +128,17 @@ public class GTaskManager {
}
public synchronized void setActivityContext(Activity activity) {
- // used for getting authtoken
mActivity = activity;
}
-
+ /**
+ * @method sync
+ * @description: 用于同步的核心函数,实现了本地同步操作和远端同步操作
+ * @date: 2023/12/24 23:32
+ * @author: WuShuxian
+ * @param: context:获取上下文
+ * asyncTask:用于同步的异步操作类
+ * @return: int
+ */
public int sync(Context context, GTaskASyncTask asyncTask) {
if (mSyncing) {
Log.d(TAG, "Sync is in progress");
@@ -127,8 +155,9 @@ public class GTaskManager {
mGidToNid.clear();
mNidToGid.clear();
+ //进行同步操作,并作异常处理:网络异常、操作异常
try {
- GTaskClient client = GTaskClient.getInstance();
+ GTaskClient client = GTaskClient.getInstance();//创建一个实例:client
client.resetUpdateArray();
// login google task
@@ -139,18 +168,19 @@ public class GTaskManager {
}
// get the task list from google
+ //从google获取task list
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list));
initGTaskList();
- // do content sync work
+ //进行同步操作
asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));
syncContent();
} catch (NetworkFailureException e) {
Log.e(TAG, e.toString());
- return STATE_NETWORK_ERROR;
+ return STATE_NETWORK_ERROR;//网络异常
} catch (ActionFailureException e) {
Log.e(TAG, e.toString());
- return STATE_INTERNAL_ERROR;
+ return STATE_INTERNAL_ERROR;//操作异常
} catch (Exception e) {
Log.e(TAG, e.toString());
e.printStackTrace();
@@ -167,7 +197,14 @@ public class GTaskManager {
return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
}
-
+ /**
+ * @method initGTaskList
+ * @description: 初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList
+ * @date: 2023/12/24 23:39
+ * @author: WuShuxian
+ * @param:
+ * @return:
+ */
private void initGTaskList() throws NetworkFailureException {
if (mCancelled)
return;
@@ -175,7 +212,7 @@ public class GTaskManager {
try {
JSONArray jsTaskLists = client.getTaskLists();
- // init meta list first
+ //初始化元列表
mMetaList = null;
for (int i = 0; i < jsTaskLists.length(); i++) {
JSONObject object = jsTaskLists.getJSONObject(i);
diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java
index d8eb50b..d1eff49 100644
--- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java
+++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java
@@ -46,6 +46,7 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider {
NoteColumns.SNIPPET
};
+
public static final int COLUMN_ID = 0;
public static final int COLUMN_BG_COLOR_ID = 1;
public static final int COLUMN_SNIPPET = 2;