From 5d6e330e56feb258041a18b43600337cb621723b Mon Sep 17 00:00:00 2001 From: lyx <2464329504@qq.com> Date: Sun, 10 Nov 2024 13:13:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/net/micode/notes/data/Notes.java | 24 +- .../notes/data/NotesDatabaseHelper.java | 68 ++-- .../net/micode/notes/data/NotesProvider.java | 70 ++-- .../net/micode/notes/gtask/data/MetaData.java | 40 +- .../src/net/micode/notes/gtask/data/Node.java | 28 +- .../net/micode/notes/gtask/data/SqlData.java | 68 ++-- .../net/micode/notes/gtask/data/SqlNote.java | 114 +++--- .../src/net/micode/notes/gtask/data/Task.java | 14 +- .../net/micode/notes/gtask/data/TaskList.java | 44 +- .../exception/ActionFailureException.java | 14 +- .../exception/NetworkFailureException.java | 14 +- .../notes/gtask/remote/GTaskASyncTask.java | 42 +- .../notes/gtask/remote/GTaskClient.java | 184 ++++----- .../notes/gtask/remote/GTaskManager.java | 158 +++---- .../notes/gtask/remote/GTaskSyncService.java | 40 +- .../src/net/micode/notes/model/Note.java | 64 +-- .../net/micode/notes/model/WorkingNote.java | 120 +++--- .../net/micode/notes/tool/BackupUtils.java | 56 +-- .../src/net/micode/notes/tool/DataUtils.java | 46 +-- .../micode/notes/tool/GTaskStringUtils.java | 4 +- .../net/micode/notes/tool/ResourceParser.java | 28 +- .../micode/notes/ui/AlarmAlertActivity.java | 100 ++--- .../micode/notes/ui/AlarmInitReceiver.java | 16 +- .../net/micode/notes/ui/AlarmReceiver.java | 10 +- .../net/micode/notes/ui/DateTimePicker.java | 76 ++-- .../micode/notes/ui/DateTimePickerDialog.java | 32 +- .../src/net/micode/notes/ui/DropdownMenu.java | 14 +- .../micode/notes/ui/FoldersListAdapter.java | 24 +- .../net/micode/notes/ui/NoteEditActivity.java | 384 +++++++++--------- .../src/net/micode/notes/ui/NoteEditText.java | 124 +++--- .../src/net/micode/notes/ui/NoteItemData.java | 34 +- .../micode/notes/ui/NotesListActivity.java | 88 ++-- .../net/micode/notes/ui/NotesListAdapter.java | 112 ++--- .../net/micode/notes/ui/NotesListItem.java | 54 +-- .../notes/ui/NotesPreferenceActivity.java | 248 +++++------ 35 files changed, 1278 insertions(+), 1278 deletions(-) diff --git a/src/Notes-master/src/net/micode/notes/data/Notes.java b/src/Notes-master/src/net/micode/notes/data/Notes.java index 6aad9cd..1cdfe5e 100644 --- a/src/Notes-master/src/net/micode/notes/data/Notes.java +++ b/src/Notes-master/src/net/micode/notes/data/Notes.java @@ -18,12 +18,12 @@ package net.micode.notes.data; import android.content.ContentUris; import android.net.Uri; -// Notes 类中定义了很多常量,这些常量大多是int型和string型 +// Notes 绫讳腑瀹氫箟浜嗗緢澶氬父閲忥紝杩欎簺甯搁噺澶у鏄痠nt鍨嬪拰string鍨 public class Notes { public static final String AUTHORITY = "micode_notes"; public static final String TAG = "Notes"; - //以下三个常量对NoteColumns.TYPE的值进行设置时会用到 + //浠ヤ笅涓変釜甯搁噺瀵筃oteColumns.TYPE鐨勫艰繘琛岃缃椂浼氱敤鍒 public static final int TYPE_NOTE = 0; public static final int TYPE_FOLDER = 1; public static final int TYPE_SYSTEM = 2; @@ -72,7 +72,7 @@ public class Notes { */ public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + -AUTHORITY + "/note");//定义查询便签和文件夹的指针。 +AUTHORITY + "/note");//瀹氫箟鏌ヨ渚跨鍜屾枃浠跺す鐨勬寚閽堛 // public static final Uri my_URI = ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI , 10); @@ -81,9 +81,9 @@ AUTHORITY + "/note");// */ public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + -AUTHORITY + "/data");//定义查找数据的指针。 +AUTHORITY + "/data");//瀹氫箟鏌ユ壘鏁版嵁鐨勬寚閽堛 - // 定义NoteColumns的常量,用于后面创建数据库的表头 + // 瀹氫箟NoteColumns鐨勫父閲,鐢ㄤ簬鍚庨潰鍒涘缓鏁版嵁搴撶殑琛ㄥご public interface NoteColumns { /** * The unique ID for a row @@ -95,7 +95,7 @@ AUTHORITY + "/data");// * The parent's id for note or folder *

Type: INTEGER (long)

*/ - public static final String PARENT_ID = "parent_id";//为什么会有parent_id + public static final String PARENT_ID = "parent_id";//涓轰粈涔堜細鏈塸arent_id /** * Created data for note or folder @@ -163,7 +163,7 @@ AUTHORITY + "/data");// * The last sync id *

Type: INTEGER (long)

*/ - public static final String SYNC_ID = "sync_id";//同步 + public static final String SYNC_ID = "sync_id";//鍚屾 /** * Sign to indicate local modified or not @@ -188,9 +188,9 @@ AUTHORITY + "/data");// *

Type : INTEGER (long)

*/ public static final String VERSION = "version"; - }//这些常量主要是定义便签的属性的。 + }//杩欎簺甯搁噺涓昏鏄畾涔変究绛剧殑灞炴х殑銆 - // 定义DataColumns的常量,用于后面创建数据库的表头 + // 瀹氫箟DataColumns鐨勫父閲,鐢ㄤ簬鍚庨潰鍒涘缓鏁版嵁搴撶殑琛ㄥご public interface DataColumns { /** * The unique ID for a row @@ -268,7 +268,7 @@ used for *

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 @@ -289,7 +289,7 @@ used for public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); - }//文本内容的数据结构 + }//鏂囨湰鍐呭鐨勬暟鎹粨鏋 public static final class CallNote implements DataColumns { /** @@ -315,5 +315,5 @@ AUTHORITY + "/text_note"); public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); - }//电话内容的数据结构 + }//鐢佃瘽鍐呭鐨勬暟鎹粨鏋 } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java index f9129bd..66463b2 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java @@ -16,23 +16,23 @@ package net.micode.notes.data; -import android.content.ContentValues;//就是用于保存一些数据(string boolean byte double float int long short ...)信息,这些信息可以被数据库操作时使用。 -import android.content.Context;//加载和访问资源。(android中主要是这两个功能,但是这里具体不清楚) -import android.database.sqlite.SQLiteDatabase;//主要提供了对应于添加、删除、更新、查询的操作方法: insert()、delete()、update()和query()。配合content.values -import android.database.sqlite.SQLiteOpenHelper;//用来管理数据的创建和版本更新 +import android.content.ContentValues;//灏辨槸鐢ㄤ簬淇濆瓨涓浜涙暟鎹紙string boolean byte double float int long short ...锛変俊鎭紝杩欎簺淇℃伅鍙互琚暟鎹簱鎿嶄綔鏃朵娇鐢ㄣ +import android.content.Context;//鍔犺浇鍜岃闂祫婧愩傦紙android涓富瑕佹槸杩欎袱涓姛鑳斤紝浣嗘槸杩欓噷鍏蜂綋涓嶆竻妤氾級 +import android.database.sqlite.SQLiteDatabase;//涓昏鎻愪緵浜嗗搴斾簬娣诲姞銆佸垹闄ゃ佹洿鏂般佹煡璇㈢殑鎿嶄綔鏂规硶锛 insert()銆乨elete()銆乽pdate()鍜宷uery()銆傞厤鍚坈ontent.values +import android.database.sqlite.SQLiteOpenHelper;//鐢ㄦ潵绠$悊鏁版嵁鐨勫垱寤哄拰鐗堟湰鏇存柊 import android.util.Log; import net.micode.notes.data.Notes.DataColumns; import net.micode.notes.data.Notes.DataConstants; import net.micode.notes.data.Notes.NoteColumns; -//数据库操作,用SQLOpenhelper,对一些note和文件进行数据库的操作,比如删除文件后,将文件里的note也相应删除 +//鏁版嵁搴撴搷浣滐紝鐢⊿QLOpenhelper,瀵逛竴浜沶ote鍜屾枃浠惰繘琛屾暟鎹簱鐨勬搷浣滐紝姣斿鍒犻櫎鏂囦欢鍚庯紝灏嗘枃浠堕噷鐨刵ote涔熺浉搴斿垹闄 public class NotesDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "note.db"; private static final int DB_VERSION = 4; - public interface TABLE { //接口,分成note和data,在后面的程序里分别使用过 + public interface TABLE { //鎺ュ彛锛屽垎鎴恘ote鍜宒ata锛屽湪鍚庨潰鐨勭▼搴忛噷鍒嗗埆浣跨敤杩 public static final String NOTE = "note"; public static final String DATA = "data"; @@ -61,7 +61,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + - ")";//数据库中需要存储的项目的名称,就相当于创建一个表格的表头的内容。 + ")";//鏁版嵁搴撲腑闇瑕佸瓨鍌ㄧ殑椤圭洰鐨勫悕绉帮紝灏辩浉褰撲簬鍒涘缓涓涓〃鏍肩殑琛ㄥご鐨勫唴瀹广 private static final String CREATE_DATA_TABLE_SQL = "CREATE TABLE " + TABLE.DATA + "(" + @@ -76,11 +76,11 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + - ")";//和上面的功能一样,主要是存储的项目不同 + ")";//鍜屼笂闈㈢殑鍔熻兘涓鏍凤紝涓昏鏄瓨鍌ㄧ殑椤圭洰涓嶅悓 private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = "CREATE INDEX IF NOT EXISTS note_id_index ON " + - TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";//存储便签编号的一个数据表格 + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";//瀛樺偍渚跨缂栧彿鐨勪竴涓暟鎹〃鏍 /** * Increase folder's note count when move note to the folder @@ -92,7 +92,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END";//在文件夹中移入一个Note之后需要更改的数据的表格。 + " END";//鍦ㄦ枃浠跺す涓Щ鍏ヤ竴涓狽ote涔嬪悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Decrease folder's note count when move note from folder @@ -105,7 +105,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + - " END";//在文件夹中移出一个Note之后需要更改的数据的表格。 + " END";//鍦ㄦ枃浠跺す涓Щ鍑轰竴涓狽ote涔嬪悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Increase folder's note count when insert new note to the folder @@ -117,7 +117,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END";//在文件夹中插入一个Note之后需要更改的数据的表格。 + " END";//鍦ㄦ枃浠跺す涓彃鍏ヤ竴涓狽ote涔嬪悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Decrease folder's note count when delete note from the folder @@ -130,7 +130,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END";//在文件夹中删除一个Note之后需要更改的数据的表格。 + " END";//鍦ㄦ枃浠跺す涓垹闄や竴涓狽ote涔嬪悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Update note's content when insert data with type {@link DataConstants#NOTE} @@ -143,7 +143,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END";//在文件夹中对一个Note导入新的数据之后需要更改的数据的表格。 + " END";//鍦ㄦ枃浠跺す涓涓涓狽ote瀵煎叆鏂扮殑鏁版嵁涔嬪悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Update note's content when data with {@link DataConstants#NOTE} type has changed @@ -156,7 +156,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END";//Note数据被修改后需要更改的数据的表格。 + " END";//Note鏁版嵁琚慨鏀瑰悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Update note's content when data with {@link DataConstants#NOTE} type has deleted @@ -169,7 +169,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.SNIPPET + "=''" + " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END";//Note数据被删除后需要更改的数据的表格。 + " END";//Note鏁版嵁琚垹闄ゅ悗闇瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Delete datas belong to note which has been deleted @@ -180,7 +180,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 +191,7 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " BEGIN" + " DELETE FROM " + TABLE.NOTE + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//删除已删除的文件夹的便签后需要更改的数据的表格。 + " END";//鍒犻櫎宸插垹闄ょ殑鏂囦欢澶圭殑渚跨鍚庨渶瑕佹洿鏀圭殑鏁版嵁鐨勮〃鏍笺 /** * Move notes belong to folder which has been moved to trash folder @@ -204,18 +204,18 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { " UPDATE " + TABLE.NOTE + " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//还原垃圾桶中便签后需要更改的数据的表格。 + " 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); createSystemFolder(db); Log.d(TAG, "note table has been created"); - }//创建表格(用来存储标签属性) + }//鍒涘缓琛ㄦ牸锛堢敤鏉ュ瓨鍌ㄦ爣绛惧睘鎬э級 private void reCreateNoteTableTriggers(SQLiteDatabase db) { db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); @@ -233,8 +233,8 @@ 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); - }//execSQL是数据库操作的API,主要是更改行为的SQL语句。 - //在这里主要是用来重新创建上述定义的表格用的,先删除原来有的数据库的触发器再重新创建新的数据库 + }//execSQL鏄暟鎹簱鎿嶄綔鐨凙PI锛屼富瑕佹槸鏇存敼琛屼负鐨凷QL璇彞銆 + //鍦ㄨ繖閲屼富瑕佹槸鐢ㄦ潵閲嶆柊鍒涘缓涓婅堪瀹氫箟鐨勮〃鏍肩敤鐨勶紝鍏堝垹闄ゅ師鏉ユ湁鐨勬暟鎹簱鐨勮Е鍙戝櫒鍐嶉噸鏂板垱寤烘柊鐨勬暟鎹簱 private void createSystemFolder(SQLiteDatabase db) { ContentValues values = new ContentValues(); @@ -269,14 +269,14 @@ 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); - }//创建几个系统文件夹 + }//鍒涘缓鍑犱釜绯荤粺鏂囦欢澶 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"); @@ -286,22 +286,22 @@ 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); - }//同上面的execSQL + }//鍚屼笂闈㈢殑execSQL static synchronized NotesDatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new NotesDatabaseHelper(context); } return mInstance; - }//上网查是为解决同一时刻只能有一个线程执行. - //在写程序库代码时,有时有一个类需要被所有的其它类使用, - //但又要求这个类只能被实例化一次,是个服务类,定义一次,其它类使用同一个这个类的实例 + }//涓婄綉鏌ユ槸涓鸿В鍐冲悓涓鏃跺埢鍙兘鏈変竴涓嚎绋嬫墽琛. + //鍦ㄥ啓绋嬪簭搴撲唬鐮佹椂锛屾湁鏃舵湁涓涓被闇瑕佽鎵鏈夌殑鍏跺畠绫讳娇鐢紝 + //浣嗗張瑕佹眰杩欎釜绫诲彧鑳借瀹炰緥鍖栦竴娆★紝鏄釜鏈嶅姟绫伙紝瀹氫箟涓娆★紝鍏跺畠绫讳娇鐢ㄥ悓涓涓繖涓被鐨勫疄渚 @Override public void onCreate(SQLiteDatabase db) { createNoteTable(db); createDataTable(db); - }//实现两个表格(上面创建的两个表格) + }//瀹炵幇涓や釜琛ㄦ牸锛堜笂闈㈠垱寤虹殑涓や釜琛ㄦ牸锛 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { @@ -334,14 +334,14 @@ public class NotesDatabaseHelper extends SQLiteOpenHelper { throw new IllegalStateException("Upgrade notes database to version " + newVersion + "fails"); } - }//数据库版本的更新(数据库内容的更改) + }//鏁版嵁搴撶増鏈殑鏇存柊锛堟暟鎹簱鍐呭鐨勬洿鏀癸級 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版本 + }//鏇存柊鍒癡2鐗堟湰 private void upgradeToV3(SQLiteDatabase db) { // drop unused triggers @@ -356,10 +356,10 @@ 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版本 + }//鏇存柊鍒癡3鐗堟湰 private void upgradeToV4(SQLiteDatabase db) { db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0"); - }//更新到V4版本,但是不知道V2、V3、V4是什么意思 + }//鏇存柊鍒癡4鐗堟湰,浣嗘槸涓嶇煡閬揤2銆乂3銆乂4鏄粈涔堟剰鎬 } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java index b67144b..1ed1bd8 100644 --- a/src/Notes-master/src/net/micode/notes/data/NotesProvider.java +++ b/src/Notes-master/src/net/micode/notes/data/NotesProvider.java @@ -32,15 +32,15 @@ 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:得到数据类型 +//涓哄瓨鍌ㄥ拰鑾峰彇鏁版嵁鎻愪緵鎺ュ彛銆傚彲浠ュ湪涓嶅悓鐨勫簲鐢ㄧ▼搴忎箣闂村叡浜暟鎹 +//ContentProvider鎻愪緵鐨勬柟娉 +//query锛氭煡璇 +//insert锛氭彃鍏 +//update锛氭洿鏂 +//delete锛氬垹闄 +//getType锛氬緱鍒版暟鎹被鍨 public class NotesProvider extends ContentProvider { - // UriMatcher用于匹配Uri + // UriMatcher鐢ㄤ簬鍖归厤Uri private static final UriMatcher mMatcher; private NotesDatabaseHelper mHelper; @@ -56,9 +56,9 @@ public class NotesProvider extends ContentProvider { private static final int URI_SEARCH_SUGGEST = 6; static { - // 创建UriMatcher时,调用UriMatcher(UriMatcher.NO_MATCH)表示不匹配任何路径的返回码 + // 鍒涘缓UriMatcher鏃讹紝璋冪敤UriMatcher(UriMatcher.NO_MATCH)琛ㄧず涓嶅尮閰嶄换浣曡矾寰勭殑杩斿洖鐮 mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - // 把需要匹配Uri路径全部给注册上 + // 鎶婇渶瑕佸尮閰峌ri璺緞鍏ㄩ儴缁欐敞鍐屼笂 mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); @@ -72,7 +72,7 @@ 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 + // 澹版槑 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 + "," @@ -80,7 +80,7 @@ public class NotesProvider extends ContentProvider { + 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 + // 澹版槑NOTES_SNIPPET_SEARCH_QUERY private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION + " FROM " + TABLE.NOTE + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" @@ -88,24 +88,24 @@ public class NotesProvider extends ContentProvider { + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; @Override - // Context只有在onCreate()中才被初始化 - // 对mHelper进行实例化 + // Context鍙湁鍦╫nCreate()涓墠琚垵濮嬪寲 + // 瀵筸Helper杩涜瀹炰緥鍖 public boolean onCreate() { mHelper = NotesDatabaseHelper.getInstance(getContext()); return true; } @Override - // 查询uri在数据库中对应的位置 + // 鏌ヨuri鍦ㄦ暟鎹簱涓搴旂殑浣嶇疆 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor c = null; - // 获取可读数据库 + // 鑾峰彇鍙鏁版嵁搴 SQLiteDatabase db = mHelper.getReadableDatabase(); String id = null; - // 匹配查找uri + // 鍖归厤鏌ユ壘uri switch (mMatcher.match(uri)) { - // 对于不同的匹配值,在数据库中查找相应的条目 + // 瀵逛簬涓嶅悓鐨勫尮閰嶅硷紝鍦ㄦ暟鎹簱涓煡鎵剧浉搴旂殑鏉$洰 case URI_NOTE: c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, sortOrder); @@ -127,7 +127,7 @@ 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"); } @@ -135,8 +135,8 @@ 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个元素 + // getPathSegments()鏂规硶寰楀埌涓涓猄tring鐨凩ist锛 + // 鍦╱ri.getPathSegments().get(1)涓虹2涓厓绱 searchString = uri.getPathSegments().get(1); } } else { @@ -156,7 +156,7 @@ public class NotesProvider extends ContentProvider { } break; default: - // 抛出异常 + // 鎶涘嚭寮傚父 throw new IllegalArgumentException("Unknown URI " + uri); } if (c != null) { @@ -166,17 +166,17 @@ public class NotesProvider extends ContentProvider { } @Override - // 插入一个uri + // 鎻掑叆涓涓猽ri 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 + // 濡傛灉瀛樺湪锛屾煡鎵綨OTE_ID case URI_DATA: if (values.containsKey(DataColumns.NOTE_ID)) { noteId = values.getAsLong(DataColumns.NOTE_ID); @@ -189,7 +189,7 @@ public class NotesProvider extends ContentProvider { throw new IllegalArgumentException("Unknown URI " + uri); } // Notify the note uri - // notifyChange获得一个ContextResolver对象并且更新里面的内容 + // notifyChange鑾峰緱涓涓狢ontextResolver瀵硅薄骞朵笖鏇存柊閲岄潰鐨勫唴瀹 if (noteId > 0) { getContext().getContentResolver().notifyChange( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); @@ -201,17 +201,17 @@ public class NotesProvider extends ContentProvider { ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); } - // 返回插入的uri的路径 + // 杩斿洖鎻掑叆鐨剈ri鐨勮矾寰 return ContentUris.withAppendedId(uri, insertedId); } @Override - // 删除一个uri + // 鍒犻櫎涓涓猽ri public int delete(Uri uri, String selection, String[] selectionArgs) { - //Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 + //Uri浠h〃瑕佹搷浣滅殑鏁版嵁锛孉ndroid涓婂彲鐢ㄧ殑姣忕璧勬簮 -鍖呮嫭 鍥惧儚銆佽棰戠墖娈点侀煶棰戣祫婧愮瓑閮藉彲浠ョ敤Uri鏉ヨ〃绀恒 int count = 0; String id = null; - // 获得可写的数据库 + // 鑾峰緱鍙啓鐨勬暟鎹簱 SQLiteDatabase db = mHelper.getWritableDatabase(); boolean deleteData = false; switch (mMatcher.match(uri)) { @@ -255,7 +255,7 @@ public class NotesProvider extends ContentProvider { } @Override - // 更新一个uri + // 鏇存柊涓涓猽ri public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; String id = null; @@ -295,12 +295,12 @@ public class NotesProvider extends ContentProvider { return count; } - // 将字符串解析成规定格式 + // 灏嗗瓧绗︿覆瑙f瀽鎴愯瀹氭牸寮 private String parseSelection(String selection) { return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); } - //增加一个noteVersion + //澧炲姞涓涓猲oteVersion private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { StringBuilder sql = new StringBuilder(120); sql.append("UPDATE "); @@ -323,7 +323,7 @@ public class NotesProvider extends ContentProvider { sql.append(selectString); } - // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句 + // execSQL()鏂规硶鍙互鎵цinsert銆乨elete銆乽pdate鍜孋REATE TABLE涔嬬被鏈夋洿鏀硅涓虹殑SQL璇彞 mHelper.getWritableDatabase().execSQL(sql.toString()); } diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java index 8fc4fd9..7955905 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/MetaData.java @@ -18,41 +18,41 @@ package net.micode.notes.gtask.data; public class MetaData extends Task { /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 + * 鍔熻兘鎻忚堪锛氬緱鍒扮被鐨勭畝鍐欏悕绉板瓨鍏ュ瓧绗︿覆TAG涓 + * 瀹炵幇杩囩▼锛氳皟鐢╣etSimpleName ()鍑芥暟 */ private final static String TAG = MetaData.class.getSimpleName(); private String mRelatedGid = null; /* - * 功能描述:设置数据,即生成元数据库 - * 实现过程:调用JSONObject库函数put (),Task类中的setNotes ()和setName ()函数 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳缃暟鎹紝鍗崇敓鎴愬厓鏁版嵁搴 + * 瀹炵幇杩囩▼锛氳皟鐢↗SONObject搴撳嚱鏁皃ut ()锛孴ask绫讳腑鐨剆etNotes ()鍜宻etName ()鍑芥暟 + * 鍙傛暟娉ㄨВ锛 */ public void setMeta(String gid, JSONObject metaInfo) { - //对函数块进行注释 + //瀵瑰嚱鏁板潡杩涜娉ㄩ噴 try { metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); /* - * 将这对键值放入metaInfo这个jsonobject对象中 + * 灏嗚繖瀵归敭鍊兼斁鍏etaInfo杩欎釜jsonobject瀵硅薄涓 */ } catch (JSONException e) { Log.e(TAG, "failed to put related gid"); /* - * 输出错误信息 + * 杈撳嚭閿欒淇℃伅 */ } setNotes(metaInfo.toString()); setName(GTaskStringUtils.META_NOTE_NAME); } /* - * 功能描述:获取相关联的Gid + * 鍔熻兘鎻忚堪锛氳幏鍙栫浉鍏宠仈鐨凣id */ public String getRelatedGid() { return mRelatedGid; } /* - * 功能描述:判断当前数据是否为空,若为空则返回真即值得保存 + * 鍔熻兘鎻忚堪锛氬垽鏂綋鍓嶆暟鎹槸鍚︿负绌猴紝鑻ヤ负绌哄垯杩斿洖鐪熷嵆鍊煎緱淇濆瓨 * Made By CuiCan */ @Override @@ -60,9 +60,9 @@ public class MetaData extends Task { return getNotes() != null; } /* - * 功能描述:使用远程json数据对象设置元数据内容 - * 实现过程:调用父类Task中的setContentByRemoteJSON ()函数,并 - * 参数注解: + * 鍔熻兘鎻忚堪锛氫娇鐢ㄨ繙绋媕son鏁版嵁瀵硅薄璁剧疆鍏冩暟鎹唴瀹 + * 瀹炵幇杩囩▼锛氳皟鐢ㄧ埗绫籘ask涓殑setContentByRemoteJSON ()鍑芥暟锛屽苟 + * 鍙傛暟娉ㄨВ锛 */ @Override public void setContentByRemoteJSON(JSONObject js) { @@ -74,14 +74,14 @@ public class MetaData extends Task { } catch (JSONException e) { Log.w(TAG, "failed to get related gid"); /* - * 输出警告信息 + * 杈撳嚭璀﹀憡淇℃伅 */ mRelatedGid = null; } } } /* - * 功能描述:使用本地json数据对象设置元数据内容,一般不会用到,若用到,则抛出异常 + * 鍔熻兘鎻忚堪锛氫娇鐢ㄦ湰鍦癹son鏁版嵁瀵硅薄璁剧疆鍏冩暟鎹唴瀹癸紝涓鑸笉浼氱敤鍒帮紝鑻ョ敤鍒帮紝鍒欐姏鍑哄紓甯 * Made By CuiCan */ @Override @@ -89,30 +89,30 @@ public class MetaData extends Task { // this function should not be called throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); /* - * 传递非法参数异常 + * 浼犻掗潪娉曞弬鏁板紓甯 */ } /* - * 功能描述:从元数据内容中获取本地json对象,一般不会用到,若用到,则抛出异常 + * 鍔熻兘鎻忚堪锛氫粠鍏冩暟鎹唴瀹逛腑鑾峰彇鏈湴json瀵硅薄锛屼竴鑸笉浼氱敤鍒帮紝鑻ョ敤鍒帮紝鍒欐姏鍑哄紓甯 * Made By CuiCan */ @Override public JSONObject getLocalJSONFromContent() { throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); /* - * 传递非法参数异常 + * 浼犻掗潪娉曞弬鏁板紓甯 * Made By Cui Can */ } /* - * 功能描述:获取同步动作状态,一般不会用到,若用到,则抛出异常 + * 鍔熻兘鎻忚堪锛氳幏鍙栧悓姝ュ姩浣滅姸鎬侊紝涓鑸笉浼氱敤鍒帮紝鑻ョ敤鍒帮紝鍒欐姏鍑哄紓甯 * Made By CuiCan */ @Override public int getSyncAction(Cursor c) { throw new IllegalAccessError("MetaData:getSyncAction should not be called"); /* - * 传递非法参数异常 + * 浼犻掗潪娉曞弬鏁板紓甯 * Made By Cui Can */ } diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java index 6ae96fe..ce1fce9 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Node.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Node.java @@ -21,36 +21,36 @@ import android.database.Cursor; import org.json.JSONObject; /** - * 应该是同步操作的基础数据类型,定义了相关指示同步操作的常量 - * 关键字:abstract + * 搴旇鏄悓姝ユ搷浣滅殑鍩虹鏁版嵁绫诲瀷锛屽畾涔変簡鐩稿叧鎸囩ず鍚屾鎿嶄綔鐨勫父閲 + * 鍏抽敭瀛楋細abstract */ public abstract class Node { - //定义了各种用于表征同步状态的常量 - public static final int SYNC_ACTION_NONE = 0;// 本地和云端都无可更新内容(即本地和云端内容一致) + //瀹氫箟浜嗗悇绉嶇敤浜庤〃寰佸悓姝ョ姸鎬佺殑甯搁噺 + public static final int SYNC_ACTION_NONE = 0;// 鏈湴鍜屼簯绔兘鏃犲彲鏇存柊鍐呭锛堝嵆鏈湴鍜屼簯绔唴瀹逛竴鑷达級 - public static final int SYNC_ACTION_ADD_REMOTE = 1;// 需要在远程云端增加内容 + public static final int SYNC_ACTION_ADD_REMOTE = 1;// 闇瑕佸湪杩滅▼浜戠澧炲姞鍐呭 - public static final int SYNC_ACTION_ADD_LOCAL = 2;// 需要在本地增加内容 + 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_REMOTE = 3;// 闇瑕佸湪杩滅▼浜戠鍒犻櫎鍐呭 - public static final int SYNC_ACTION_DEL_LOCAL = 4;// 需要在本地删除内容 + 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_REMOTE = 5;// 闇瑕佸皢鏈湴鍐呭鏇存柊鍒拌繙绋嬩簯绔 - public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 需要将远程云端内容更新到本地 + public static final int SYNC_ACTION_UPDATE_LOCAL = 6;// 闇瑕佸皢杩滅▼浜戠鍐呭鏇存柊鍒版湰鍦 - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 同步出现冲突 + public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;// 鍚屾鍑虹幇鍐茬獊 - public static final int SYNC_ACTION_ERROR = 8;// 同步出现错误 + public static final int SYNC_ACTION_ERROR = 8;// 鍚屾鍑虹幇閿欒 private String mGid; private String mName; - private long mLastModified;//记录最后一次修改时间 + private long mLastModified;//璁板綍鏈鍚庝竴娆′慨鏀规椂闂 - private boolean mDeleted;//表征是否被删除 + private boolean mDeleted;//琛ㄥ緛鏄惁琚垹闄 public Node() { mGid = null; diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java index e785c76..90cefc7 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlData.java @@ -15,41 +15,41 @@ */ /* - * Description:用于支持小米便签最底层的数据库相关操作,和sqlnote的关系上是子集关系,即data是note的子集(节点)。 - * SqlData其实就是也就是所谓数据中的数据 + * Description锛氱敤浜庢敮鎸佸皬绫充究绛炬渶搴曞眰鐨勬暟鎹簱鐩稿叧鎿嶄綔锛屽拰sqlnote鐨勫叧绯讳笂鏄瓙闆嗗叧绯伙紝鍗砫ata鏄痭ote鐨勫瓙闆嗭紙鑺傜偣锛夈 + * SqlData鍏跺疄灏辨槸涔熷氨鏄墍璋撴暟鎹腑鐨勬暟鎹 */ package net.micode.notes.gtask.data; /* - * 功能描述: - * 实现过程: - * 参数注解: + * 鍔熻兘鎻忚堪锛 + * 瀹炵幇杩囩▼锛 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public class SqlData { /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 + * 鍔熻兘鎻忚堪锛氬緱鍒扮被鐨勭畝鍐欏悕绉板瓨鍏ュ瓧绗︿覆TAG涓 + * 瀹炵幇杩囩▼锛氳皟鐢╣etSimpleName ()鍑芥暟 * Made By CuiCan */ private static final String TAG = SqlData.class.getSimpleName(); - private static final int INVALID_ID = -99999;//为mDataId置初始值-99999 + private static final int INVALID_ID = -99999;//涓簃DataId缃垵濮嬪-99999 /** - * 来自Notes类中定义的DataColumn中的一些常量 + * 鏉ヨ嚜Notes绫讳腑瀹氫箟鐨凞ataColumn涓殑涓浜涘父閲 */ - // 集合了interface DataColumns中所有SF常量 + // 闆嗗悎浜唅nterface DataColumns涓墍鏈塖F甯搁噺 public static final String[] PROJECTION_DATA = new String[] { DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, DataColumns.DATA3 }; /** - * 以下五个变量作为sql表中5列的编号 + * 浠ヤ笅浜斾釜鍙橀噺浣滀负sql琛ㄤ腑5鍒楃殑缂栧彿 */ public static final int DATA_ID_COLUMN = 0; @@ -62,7 +62,7 @@ public class SqlData { public static final int DATA_CONTENT_DATA_3_COLUMN = 4; private ContentResolver mContentResolver; - //判断是否直接用Content生成,是为true,否则为false + //鍒ゆ柇鏄惁鐩存帴鐢–ontent鐢熸垚锛屾槸涓簍rue锛屽惁鍒欎负false private boolean mIsCreate; private long mDataId; @@ -78,16 +78,16 @@ public class SqlData { private ContentValues mDiffDataValues; /* - * 功能描述:构造函数,用于初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: + * 鍔熻兘鎻忚堪锛氭瀯閫犲嚱鏁帮紝鐢ㄤ簬鍒濆鍖栨暟鎹 + * 鍙傛暟娉ㄨВ锛歮ContentResolver鐢ㄤ簬鑾峰彇ContentProvider鎻愪緵鐨勬暟鎹 + * 鍙傛暟娉ㄨВ锛 mIsCreate琛ㄥ緛褰撳墠鏁版嵁鏄敤鍝鏂瑰紡鍒涘缓锛堜袱绉嶆瀯閫犲嚱鏁扮殑鍙傛暟涓嶅悓锛 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public SqlData(Context context) { mContentResolver = context.getContentResolver(); mIsCreate = true; - mDataId = INVALID_ID;//mDataId置初始值-99999 + mDataId = INVALID_ID;//mDataId缃垵濮嬪-99999 mDataMimeType = DataConstants.NOTE; mDataContent = ""; mDataContentData1 = 0; @@ -97,10 +97,10 @@ public class SqlData { /* - * 功能描述:构造函数,初始化数据 - * 参数注解:mContentResolver用于获取ContentProvider提供的数据 - * 参数注解: mIsCreate表征当前数据是用哪种方式创建(两种构造函数的参数不同) - * 参数注解: + * 鍔熻兘鎻忚堪锛氭瀯閫犲嚱鏁帮紝鍒濆鍖栨暟鎹 + * 鍙傛暟娉ㄨВ锛歮ContentResolver鐢ㄤ簬鑾峰彇ContentProvider鎻愪緵鐨勬暟鎹 + * 鍙傛暟娉ㄨВ锛 mIsCreate琛ㄥ緛褰撳墠鏁版嵁鏄敤鍝鏂瑰紡鍒涘缓锛堜袱绉嶆瀯閫犲嚱鏁扮殑鍙傛暟涓嶅悓锛 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public SqlData(Context context, Cursor c) { @@ -111,8 +111,8 @@ public class SqlData { } /* - * 功能描述:从光标处加载数据 - * 从当前的光标处将五列的数据加载到该类的对象 + * 鍔熻兘鎻忚堪锛氫粠鍏夋爣澶勫姞杞芥暟鎹 + * 浠庡綋鍓嶇殑鍏夋爣澶勫皢浜斿垪鐨勬暟鎹姞杞藉埌璇ョ被鐨勫璞 * Made By CuiCan */ private void loadFromCursor(Cursor c) { @@ -125,12 +125,12 @@ public class SqlData { /* - * 功能描述:设置用于共享的数据,并提供异常抛出与处理机制 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳缃敤浜庡叡浜殑鏁版嵁锛屽苟鎻愪緵寮傚父鎶涘嚭涓庡鐞嗘満鍒 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void setContent(JSONObject js) throws JSONException { - //如果传入的JSONObject对象中有DataColumns.ID这一项,则设置,否则设为INVALID_ID + //濡傛灉浼犲叆鐨凧SONObject瀵硅薄涓湁DataColumns.ID杩欎竴椤癸紝鍒欒缃紝鍚﹀垯璁句负INVALID_ID long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; if (mIsCreate || mDataId != dataId) { mDiffDataValues.put(DataColumns.ID, dataId); @@ -165,8 +165,8 @@ public class SqlData { /* - * 功能描述:获取共享的数据内容,并提供异常抛出与处理机制 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏鍙栧叡浜殑鏁版嵁鍐呭锛屽苟鎻愪緵寮傚父鎶涘嚭涓庡鐞嗘満鍒 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public JSONObject getContent() throws JSONException { @@ -174,7 +174,7 @@ public class SqlData { Log.e(TAG, "it seems that we haven't created this in database yet"); return null; } - //创建JSONObject对象。并将相关数据放入其中,并返回。 + //鍒涘缓JSONObject瀵硅薄銆傚苟灏嗙浉鍏虫暟鎹斁鍏ュ叾涓紝骞惰繑鍥炪 JSONObject js = new JSONObject(); js.put(DataColumns.ID, mDataId); js.put(DataColumns.MIME_TYPE, mDataMimeType); @@ -185,8 +185,8 @@ public class SqlData { } /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: + * 鍔熻兘鎻忚堪锛歝ommit鍑芥暟鐢ㄤ簬鎶婂綋鍓嶉犱綔鎵鍋氱殑淇敼淇濆瓨鍒版暟鎹簱 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void commit(long noteId, boolean validateVersion, long version) { @@ -229,9 +229,9 @@ public class SqlData { } /* - * 功能描述:获取当前id - * 实现过程: - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏鍙栧綋鍓峣d + * 瀹炵幇杩囩▼锛 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public long getId() { diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java index 7c1ae6b..9dc30c5 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java @@ -15,28 +15,28 @@ */ /* - * Description:用于支持小米便签最底层的数据库相关操作,和sqldata的关系上是父集关系,即note是data的子父集。 - * 和SqlData相比,SqlNote算是真正意义上的数据了。 + * Description锛氱敤浜庢敮鎸佸皬绫充究绛炬渶搴曞眰鐨勬暟鎹簱鐩稿叧鎿嶄綔锛屽拰sqldata鐨勫叧绯讳笂鏄埗闆嗗叧绯伙紝鍗硁ote鏄痙ata鐨勫瓙鐖堕泦銆 + * 鍜孲qlData鐩告瘮锛孲qlNote绠楁槸鐪熸鎰忎箟涓婄殑鏁版嵁浜嗐 */ package net.micode.notes.gtask.data; /* - * 功能描述: - * 实现过程: - * 参数注解: + * 鍔熻兘鎻忚堪锛 + * 瀹炵幇杩囩▼锛 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public class SqlNote { /* - * 功能描述:得到类的简写名称存入字符串TAG中 - * 实现过程:调用getSimpleName ()函数 + * 鍔熻兘鎻忚堪锛氬緱鍒扮被鐨勭畝鍐欏悕绉板瓨鍏ュ瓧绗︿覆TAG涓 + * 瀹炵幇杩囩▼锛氳皟鐢╣etSimpleName ()鍑芥暟 * Made By CuiCan */ private static final String TAG = SqlNote.class.getSimpleName(); private static final int INVALID_ID = -99999; - // 集合了interface NoteColumns中所有SF常量(17个) + // 闆嗗悎浜唅nterface NoteColumns涓墍鏈塖F甯搁噺锛17涓級 public static final String[] PROJECTION_NOTE = new String[] { NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, @@ -46,7 +46,7 @@ public class SqlNote { NoteColumns.VERSION }; - //以下设置17个列的编号 + //浠ヤ笅璁剧疆17涓垪鐨勭紪鍙 public static final int ID_COLUMN = 0; public static final int ALERTED_DATE_COLUMN = 1; @@ -81,7 +81,7 @@ public class SqlNote { public static final int VERSION_COLUMN = 16; - //一下定义了17个内部的变量,其中12个可以由content中获得,5个需要初始化为0或者new + //涓涓嬪畾涔変簡17涓唴閮ㄧ殑鍙橀噺锛屽叾涓12涓彲浠ョ敱content涓幏寰楋紝5涓渶瑕佸垵濮嬪寲涓0鎴栬卬ew private Context mContext; private ContentResolver mContentResolver; @@ -119,12 +119,12 @@ public class SqlNote { private ArrayList mDataList; /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: + * 鍔熻兘鎻忚堪锛氭瀯閫犲嚱鏁 + * 鍙傛暟娉ㄨВ锛 mIsCreate鐢ㄤ簬鏍囩ず鏋勯犳柟寮 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ - //构造函数只有context,对所有的变量进行初始化 + //鏋勯犲嚱鏁板彧鏈塩ontext锛屽鎵鏈夌殑鍙橀噺杩涜鍒濆鍖 public SqlNote(Context context) { mContext = context; mContentResolver = context.getContentResolver(); @@ -132,9 +132,9 @@ public class SqlNote { 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; @@ -148,12 +148,12 @@ public class SqlNote { /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: + * 鍔熻兘鎻忚堪锛氭瀯閫犲嚱鏁 + * 鍙傛暟娉ㄨВ锛 mIsCreate鐢ㄤ簬鏍囩ず鏋勯犳柟寮 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ - //构造函数有context和一个数据库的cursor,多数变量通过cursor指向的一条记录直接进行初始化 + //鏋勯犲嚱鏁版湁context鍜屼竴涓暟鎹簱鐨刢ursor锛屽鏁板彉閲忛氳繃cursor鎸囧悜鐨勪竴鏉¤褰曠洿鎺ヨ繘琛屽垵濮嬪寲 public SqlNote(Context context, Cursor c) { mContext = context; mContentResolver = context.getContentResolver(); @@ -168,9 +168,9 @@ public class SqlNote { /* - * 功能描述:构造函数 - * 参数注解: mIsCreate用于标示构造方式 - * 参数注解: + * 鍔熻兘鎻忚堪锛氭瀯閫犲嚱鏁 + * 鍙傛暟娉ㄨВ锛 mIsCreate鐢ㄤ簬鏍囩ず鏋勯犳柟寮 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public SqlNote(Context context, long id) { @@ -186,7 +186,7 @@ public class SqlNote { } /* - * 功能描述:通过id从光标处加载数据 + * 鍔熻兘鎻忚堪锛氶氳繃id浠庡厜鏍囧鍔犺浇鏁版嵁 * Made By CuiCan */ private void loadFromCursor(long id) { @@ -195,11 +195,11 @@ public class SqlNote { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", new String[] { String.valueOf(id) - }, null);//通过id获得对应的ContentResolver中的cursor + }, null);//閫氳繃id鑾峰緱瀵瑰簲鐨凜ontentResolver涓殑cursor if (c != null) { c.moveToNext(); - loadFromCursor(c);//然后加载数据进行初始化,这样函数 - //SqlNote(Context context, long id)与SqlNote(Context context, long id)的实现方式基本相同 + loadFromCursor(c);//鐒跺悗鍔犺浇鏁版嵁杩涜鍒濆鍖栵紝杩欐牱鍑芥暟 + //SqlNote(Context context, long id)涓嶴qlNote(Context context, long id)鐨勫疄鐜版柟寮忓熀鏈浉鍚 } else { Log.w(TAG, "loadFromCursor: cursor = null"); } @@ -210,11 +210,11 @@ public class SqlNote { } /* - * 功能描述:通过游标从光标处加载数据 + * 鍔熻兘鎻忚堪锛氶氳繃娓告爣浠庡厜鏍囧鍔犺浇鏁版嵁 * Made By CuiCan */ private void loadFromCursor(Cursor c) { - //直接从一条记录中的获得以下变量的初始值 + //鐩存帴浠庝竴鏉¤褰曚腑鐨勮幏寰椾互涓嬪彉閲忕殑鍒濆鍊 mId = c.getLong(ID_COLUMN); mAlertDate = c.getLong(ALERTED_DATE_COLUMN); mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); @@ -230,8 +230,8 @@ public class SqlNote { } /* - * 功能描述:通过content机制获取共享数据并加载到数据库当前游标处 - * 参数注解: + * 鍔熻兘鎻忚堪锛氶氳繃content鏈哄埗鑾峰彇鍏变韩鏁版嵁骞跺姞杞藉埌鏁版嵁搴撳綋鍓嶆父鏍囧 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ private void loadDataContent() { @@ -261,8 +261,8 @@ public class SqlNote { } /* - * 功能描述:设置通过content机制用于共享的数据信息 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳缃氳繃content鏈哄埗鐢ㄤ簬鍏变韩鐨勬暟鎹俊鎭 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public boolean setContent(JSONObject js) { @@ -398,8 +398,8 @@ public class SqlNote { } /* - * 功能描述:获取content机制提供的数据并加载到note中 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏鍙朿ontent鏈哄埗鎻愪緵鐨勬暟鎹苟鍔犺浇鍒皀ote涓 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public JSONObject getContent() { @@ -412,7 +412,7 @@ public class SqlNote { } JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) {//类型为note时 + if (mType == Notes.TYPE_NOTE) {//绫诲瀷涓簄ote鏃 note.put(NoteColumns.ID, mId); note.put(NoteColumns.ALERTED_DATE, mAlertDate); note.put(NoteColumns.BG_COLOR_ID, mBgColorId); @@ -435,7 +435,7 @@ public class SqlNote { } } js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//类型为文件夹或者 + } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {//绫诲瀷涓烘枃浠跺す鎴栬 note.put(NoteColumns.ID, mId); note.put(NoteColumns.TYPE, mType); note.put(NoteColumns.SNIPPET, mSnippet); @@ -451,8 +451,8 @@ public class SqlNote { } /* - * 功能描述:给当前id设置父id - * 参数注解: + * 鍔熻兘鎻忚堪锛氱粰褰撳墠id璁剧疆鐖秈d + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void setParentId(long id) { @@ -461,8 +461,8 @@ public class SqlNote { } /* - * 功能描述:给当前id设置Gtaskid - * 参数注解: + * 鍔熻兘鎻忚堪锛氱粰褰撳墠id璁剧疆Gtaskid + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void setGtaskId(String gid) { @@ -470,8 +470,8 @@ public class SqlNote { } /* - * 功能描述:给当前id设置同步id - * 参数注解: + * 鍔熻兘鎻忚堪锛氱粰褰撳墠id璁剧疆鍚屾id + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void setSyncId(long syncId) { @@ -479,8 +479,8 @@ public class SqlNote { } /* - * 功能描述:初始化本地修改,即撤销所有当前修改 - * 参数注解: + * 鍔熻兘鎻忚堪锛氬垵濮嬪寲鏈湴淇敼锛屽嵆鎾ら攢鎵鏈夊綋鍓嶄慨鏀 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void resetLocalModified() { @@ -488,8 +488,8 @@ public class SqlNote { } /* - * 功能描述:获得当前id - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏寰楀綋鍓峣d + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public long getId() { @@ -497,8 +497,8 @@ public class SqlNote { } /* - * 功能描述:获得当前id的父id - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏寰楀綋鍓峣d鐨勭埗id + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public long getParentId() { @@ -506,8 +506,8 @@ public class SqlNote { } /* - * 功能描述:获取小片段即用于显示的部分便签内容 - * 参数注解: + * 鍔熻兘鎻忚堪锛氳幏鍙栧皬鐗囨鍗崇敤浜庢樉绀虹殑閮ㄥ垎渚跨鍐呭 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public String getSnippet() { @@ -515,8 +515,8 @@ public class SqlNote { } /* - * 功能描述:判断是否为便签类型 - * 参数注解: + * 鍔熻兘鎻忚堪锛氬垽鏂槸鍚︿负渚跨绫诲瀷 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public boolean isNoteType() { @@ -524,8 +524,8 @@ public class SqlNote { } /* - * 功能描述:commit函数用于把当前造作所做的修改保存到数据库 - * 参数注解: + * 鍔熻兘鎻忚堪锛歝ommit鍑芥暟鐢ㄤ簬鎶婂綋鍓嶉犱綔鎵鍋氱殑淇敼淇濆瓨鍒版暟鎹簱 + * 鍙傛暟娉ㄨВ锛 * Made By CuiCan */ public void commit(boolean validateVersion) { @@ -546,7 +546,7 @@ public class SqlNote { } if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) {//直接使用sqldata中的实现 + for (SqlData sqlData : mDataList) {//鐩存帴浣跨敤sqldata涓殑瀹炵幇 sqlData.commit(mId, false, -1); } } @@ -558,7 +558,7 @@ public class SqlNote { if (mDiffNoteValues.size() > 0) { mVersion ++; int result = 0; - if (!validateVersion) {//构造字符串 + if (!validateVersion) {//鏋勯犲瓧绗︿覆 result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" + NoteColumns.ID + "=?)", new String[] { String.valueOf(mId) diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java index 730a9b3..76ad5a4 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/Task.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/Task.java @@ -19,22 +19,22 @@ package net.micode.notes.gtask.data; public class Task extends Node { private static final String TAG = Task.class.getSimpleName(); - private boolean mCompleted;//是否完成 + private boolean mCompleted;//鏄惁瀹屾垚 private String mNotes; - private JSONObject mMetaInfo;//将在实例中存储数据的类型 + private JSONObject mMetaInfo;//灏嗗湪瀹炰緥涓瓨鍌ㄦ暟鎹殑绫诲瀷 - private Task mPriorSibling;//对应的优先兄弟Task的指针(待完善) + private Task mPriorSibling;//瀵瑰簲鐨勪紭鍏堝厔寮烼ask鐨勬寚閽堬紙寰呭畬鍠勶級 - private TaskList mParent;//所在的任务列表的指针 + private TaskList mParent;//鎵鍦ㄧ殑浠诲姟鍒楄〃鐨勬寚閽 public Task() { super(); mCompleted = false; mNotes = null; - mPriorSibling = null;//TaskList中当前Task前面的Task的指针 - mParent = null;//当前Task所在的TaskList + mPriorSibling = null;//TaskList涓綋鍓峊ask鍓嶉潰鐨凾ask鐨勬寚閽 + mParent = null;//褰撳墠Task鎵鍦ㄧ殑TaskList mMetaInfo = null; } @@ -163,7 +163,7 @@ public class Task extends Node { } } - public void setContentByLocalJSON(JSONObject js) { // metadata ʵʩ + public void setContentByLocalJSON(JSONObject js) { //锟斤拷metadata锟斤拷锟斤拷实施 if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) || !js.has(GTaskStringUtils.META_HEAD_DATA)) { Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); diff --git a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java index af1fd9d..aa27ff0 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java +++ b/src/Notes-master/src/net/micode/notes/gtask/data/TaskList.java @@ -17,11 +17,11 @@ package net.micode.notes.gtask.data; public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName();//tag标记 + private static final String TAG = TaskList.class.getSimpleName();//tag鏍囪 - private int mIndex;//当前TaskList的指针 + private int mIndex;//褰撳墠TaskList鐨勬寚閽 - private ArrayList mChildren;//类中主要的保存数据的单元,用来实现一个以Task为元素的ArrayList + private ArrayList mChildren;//绫讳腑涓昏鐨勪繚瀛樻暟鎹殑鍗曞厓锛岀敤鏉ュ疄鐜颁竴涓互Task涓哄厓绱犵殑ArrayList public TaskList() { super(); @@ -31,7 +31,7 @@ public class TaskList extends Node { /* (non-Javadoc) * @see net.micode.notes.gtask.data.Node#getCreateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 + * 鐢熸垚骞惰繑鍥炰竴涓寘鍚簡涓瀹氭暟鎹殑JSONObject瀹炰綋 */ public JSONObject getCreateAction(int actionId) { JSONObject js = new JSONObject(); @@ -48,7 +48,7 @@ public class TaskList extends Node { js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); // entity_delta - JSONObject entity = new JSONObject();//entity实体 + JSONObject entity = new JSONObject();//entity瀹炰綋 entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, @@ -66,7 +66,7 @@ public class TaskList extends Node { /* (non-Javadoc) * @see net.micode.notes.gtask.data.Node#getUpdateAction(int) - * 生成并返回一个包含了一定数据的JSONObject实体 + * 鐢熸垚骞惰繑鍥炰竴涓寘鍚簡涓瀹氭暟鎹殑JSONObject瀹炰綋 */ public JSONObject getUpdateAction(int actionId) { JSONObject js = new JSONObject(); @@ -212,7 +212,7 @@ public class TaskList extends Node { /** * @return - * 功能:获得TaskList的大小,即mChildren的大小 + * 鍔熻兘锛氳幏寰桾askList鐨勫ぇ灏忥紝鍗砿Children鐨勫ぇ灏 */ public int getChildTaskCount() { return mChildren.size(); @@ -220,8 +220,8 @@ public class TaskList extends Node { /** * @param task - * @return 返回值为是否成功添加任务。 - * 功能:在当前任务表末尾添加新的任务。 + * @return 杩斿洖鍊间负鏄惁鎴愬姛娣诲姞浠诲姟銆 + * 鍔熻兘锛氬湪褰撳墠浠诲姟琛ㄦ湯灏炬坊鍔犳柊鐨勪换鍔° */ public boolean addChildTask(Task task) { boolean ret = false; @@ -232,8 +232,8 @@ public class TaskList extends Node { task.setPriorSibling(mChildren.isEmpty() ? null : mChildren .get(mChildren.size() - 1)); task.setParent(this); - //注意:每一次ArrayList的变化都要紧跟相关Task中PriorSibling的更改 - //,接下来几个函数都有相关操作 + //娉ㄦ剰锛氭瘡涓娆rrayList鐨勫彉鍖栭兘瑕佺揣璺熺浉鍏砊ask涓璓riorSibling鐨勬洿鏀 + //锛屾帴涓嬫潵鍑犱釜鍑芥暟閮芥湁鐩稿叧鎿嶄綔 } } return ret; @@ -243,7 +243,7 @@ public class TaskList extends Node { * @param task * @param index * @return - * 功能:在当前任务表的指定位置添加新的任务。 + * 鍔熻兘锛氬湪褰撳墠浠诲姟琛ㄧ殑鎸囧畾浣嶇疆娣诲姞鏂扮殑浠诲姟銆 */ public boolean addChildTask(Task task, int index) { if (index < 0 || index > mChildren.size()) { @@ -273,8 +273,8 @@ public class TaskList extends Node { /** * @param task - * @return 返回删除是否成功 - * 功能:删除TaskList中的一个Task + * @return 杩斿洖鍒犻櫎鏄惁鎴愬姛 + * 鍔熻兘锛氬垹闄askList涓殑涓涓猅ask */ public boolean removeChildTask(Task task) { boolean ret = false; @@ -301,7 +301,7 @@ public class TaskList extends Node { * @param task * @param index * @return - * 功能:将当前TaskList中含有的某个Task移到index位置 + * 鍔熻兘锛氬皢褰撳墠TaskList涓惈鏈夌殑鏌愪釜Task绉诲埌index浣嶇疆 */ public boolean moveChildTask(Task task, int index) { @@ -319,13 +319,13 @@ public class TaskList extends Node { if (pos == index) return true; return (removeChildTask(task) && addChildTask(task, index)); - //利用已实现好的功能完成当下功能; + //鍒╃敤宸插疄鐜板ソ鐨勫姛鑳藉畬鎴愬綋涓嬪姛鑳斤紱 } /** * @param gid - * @return返回寻找结果 - * 功能:按gid寻找Task + * @return杩斿洖瀵绘壘缁撴灉 + * 鍔熻兘锛氭寜gid瀵绘壘Task */ public Task findChildTaskByGid(String gid) { for (int i = 0; i < mChildren.size(); i++) { @@ -340,7 +340,7 @@ public class TaskList extends Node { /** * @param task * @return - * 功能:返回指定Task的index + * 鍔熻兘锛氳繑鍥炴寚瀹歍ask鐨刬ndex */ public int getChildTaskIndex(Task task) { return mChildren.indexOf(task); @@ -349,7 +349,7 @@ public class TaskList extends Node { /** * @param index * @return - * 功能:返回指定index的Task + * 鍔熻兘锛氳繑鍥炴寚瀹歩ndex鐨凾ask */ public Task getChildTaskByIndex(int index) { if (index < 0 || index >= mChildren.size()) { @@ -362,10 +362,10 @@ public class TaskList extends Node { /** * @param gid * @return - * 功能:返回指定gid的Task + * 鍔熻兘锛氳繑鍥炴寚瀹歡id鐨凾ask */ public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) {//一种常见的ArrayList的遍历方法(四种,见精读笔记) + for (Task task : mChildren) {//涓绉嶅父瑙佺殑ArrayList鐨勯亶鍘嗘柟娉曪紙鍥涚锛岃绮捐绗旇锛 if (task.getGid().equals(gid)) return task; } diff --git a/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java b/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java index 4724176..47aaba5 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java +++ b/src/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java @@ -15,7 +15,7 @@ */ /* - * Description:支持小米便签运行过程中的运行异常处理。 + * Description锛氭敮鎸佸皬绫充究绛捐繍琛岃繃绋嬩腑鐨勮繍琛屽紓甯稿鐞嗐 */ package net.micode.notes.gtask.exception; @@ -23,8 +23,8 @@ package net.micode.notes.gtask.exception; public class ActionFailureException extends RuntimeException { private static final long serialVersionUID = 4425249765923293627L; /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * serialVersionUID鐩稿綋浜巎ava绫荤殑韬唤璇併備富瑕佺敤浜庣増鏈帶鍒躲 + * serialVersionUID浣滅敤鏄簭鍒楀寲鏃朵繚鎸佺増鏈殑鍏煎鎬э紝鍗冲湪鐗堟湰鍗囩骇鏃跺弽搴忓垪鍖栦粛淇濇寔瀵硅薄鐨勫敮涓鎬с * Made By Cuican */ @@ -32,10 +32,10 @@ public class ActionFailureException extends RuntimeException { super(); } /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * 鍦↗AVA绫讳腑浣跨敤super鏉ュ紩鐢ㄧ埗绫荤殑鎴愬垎锛岀敤this鏉ュ紩鐢ㄥ綋鍓嶅璞. + * 濡傛灉涓涓被浠庡彟澶栦竴涓被缁ф壙锛屾垜浠琻ew杩欎釜瀛愮被鐨勫疄渚嬪璞$殑鏃跺欙紝杩欎釜瀛愮被瀵硅薄閲岄潰浼氭湁涓涓埗绫诲璞° + * 鎬庝箞鍘诲紩鐢ㄩ噷闈㈢殑鐖剁被瀵硅薄鍛紵浣跨敤super鏉ュ紩鐢 + * 涔熷氨鏄锛屾澶剆uper()浠ュ強super (paramString)鍙涓烘槸Exception ()鍜孍xception (paramString) * Made By Cuican */ public ActionFailureException(String paramString) { diff --git a/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java index e22fc27..91d1ade 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java +++ b/src/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -15,7 +15,7 @@ */ /* - * Description:支持小米便签运行过程中的网络异常处理。 + * Description锛氭敮鎸佸皬绫充究绛捐繍琛岃繃绋嬩腑鐨勭綉缁滃紓甯稿鐞嗐 */ package net.micode.notes.gtask.exception; @@ -23,8 +23,8 @@ package net.micode.notes.gtask.exception; public class NetworkFailureException extends Exception { private static final long serialVersionUID = 2107610287180234136L; /* - * serialVersionUID相当于java类的身份证。主要用于版本控制。 - * serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 + * serialVersionUID鐩稿綋浜巎ava绫荤殑韬唤璇併備富瑕佺敤浜庣増鏈帶鍒躲 + * serialVersionUID浣滅敤鏄簭鍒楀寲鏃朵繚鎸佺増鏈殑鍏煎鎬э紝鍗冲湪鐗堟湰鍗囩骇鏃跺弽搴忓垪鍖栦粛淇濇寔瀵硅薄鐨勫敮涓鎬с * Made By Cuican */ @@ -33,10 +33,10 @@ public class NetworkFailureException extends Exception { } /* - * 在JAVA类中使用super来引用父类的成分,用this来引用当前对象. - * 如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。 - * 怎么去引用里面的父类对象呢?使用super来引用 - * 也就是说,此处super()以及super (paramString)可认为是Exception ()和Exception (paramString) + * 鍦↗AVA绫讳腑浣跨敤super鏉ュ紩鐢ㄧ埗绫荤殑鎴愬垎锛岀敤this鏉ュ紩鐢ㄥ綋鍓嶅璞. + * 濡傛灉涓涓被浠庡彟澶栦竴涓被缁ф壙锛屾垜浠琻ew杩欎釜瀛愮被鐨勫疄渚嬪璞$殑鏃跺欙紝杩欎釜瀛愮被瀵硅薄閲岄潰浼氭湁涓涓埗绫诲璞° + * 鎬庝箞鍘诲紩鐢ㄩ噷闈㈢殑鐖剁被瀵硅薄鍛紵浣跨敤super鏉ュ紩鐢 + * 涔熷氨鏄锛屾澶剆uper()浠ュ強super (paramString)鍙涓烘槸Exception ()鍜孍xception (paramString) * Made By Cuican */ public NetworkFailureException(String paramString) { diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java index 57da5cd..681217d 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -17,12 +17,12 @@ package net.micode.notes.gtask.remote; -/*异步操作类,实现GTask的异步操作过程 - * 主要方法: - * private void showNotification(int tickerId, String content) 向用户提示当前同步的状态,是一个用于交互的方法 - * protected Integer doInBackground(Void... unused) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间 - * protected void onProgressUpdate(String... progress) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 - * protected void onPostExecute(Integer result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI +/*寮傛鎿嶄綔绫伙紝瀹炵幇GTask鐨勫紓姝ユ搷浣滆繃绋 + * 涓昏鏂规硶锛 + * private void showNotification(int tickerId, String content) 鍚戠敤鎴锋彁绀哄綋鍓嶅悓姝ョ殑鐘舵侊紝鏄竴涓敤浜庝氦浜掔殑鏂规硶 + * protected Integer doInBackground(Void... unused) 姝ゆ柟娉曞湪鍚庡彴绾跨▼鎵ц锛屽畬鎴愪换鍔$殑涓昏宸ヤ綔锛岄氬父闇瑕佽緝闀跨殑鏃堕棿 + * protected void onProgressUpdate(String... progress) 鍙互浣跨敤杩涘害鏉″鍔犵敤鎴蜂綋楠屽害銆 姝ゆ柟娉曞湪涓荤嚎绋嬫墽琛岋紝鐢ㄤ簬鏄剧ず浠诲姟鎵ц鐨勮繘搴︺ + * protected void onPostExecute(Integer result) 鐩稿綋浜嶩andler 澶勭悊UI鐨勬柟寮忥紝鍦ㄨ繖閲岄潰鍙互浣跨敤鍦╠oInBackground 寰楀埌鐨勭粨鏋滃鐞嗘搷浣淯I */ public class GTaskASyncTask extends AsyncTask { @@ -53,7 +53,7 @@ public class GTaskASyncTask extends AsyncTask { mTaskManager.cancelSync(); } - public void publishProgess(String message) { // 发布进度单位,系统将会调用onProgressUpdate()方法更新这些值 + public void publishProgess(String message) { // 鍙戝竷杩涘害鍗曚綅锛岀郴缁熷皢浼氳皟鐢╫nProgressUpdate()鏂规硶鏇存柊杩欎簺鍊 publishProgress(new String[] { message }); @@ -62,43 +62,43 @@ public class GTaskASyncTask extends AsyncTask { 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; //一个描述了想要启动一个Activity、Broadcast或是Service的意图 + notification.defaults = Notification.DEFAULT_LIGHTS; // 璋冪敤绯荤粺鑷甫鐏厜 + notification.flags = Notification.FLAG_AUTO_CANCEL; // 鐐瑰嚮娓呴櫎鎸夐挳鎴栫偣鍑婚氱煡鍚庝細鑷姩娑堝け + PendingIntent pendingIntent; //涓涓弿杩颁簡鎯宠鍚姩涓涓狝ctivity銆丅roadcast鎴栨槸Service鐨勬剰鍥 if (tickerId != R.string.ticker_success) { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), 0); //如果同步不成功,那么从系统取得一个用于启动一个NotesPreferenceActivity的PendingIntent对象 + NotesPreferenceActivity.class), 0); //濡傛灉鍚屾涓嶆垚鍔燂紝閭d箞浠庣郴缁熷彇寰椾竴涓敤浜庡惎鍔ㄤ竴涓狽otesPreferenceActivity鐨凱endingIntent瀵硅薄 } else { pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), 0); //如果同步成功,那么从系统取得一个用于启动一个NotesListActivity的PendingIntent对象 + NotesListActivity.class), 0); //濡傛灉鍚屾鎴愬姛锛岄偅涔堜粠绯荤粺鍙栧緱涓涓敤浜庡惎鍔ㄤ竴涓狽otesListActivity鐨凱endingIntent瀵硅薄 } notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content, pendingIntent); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//通过NotificationManager对象的notify()方法来执行一个notification的消息 + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);//閫氳繃NotificationManager瀵硅薄鐨刵otify锛堬級鏂规硶鏉ユ墽琛屼竴涓猲otification鐨勬秷鎭 } @Override protected Integer doInBackground(Void... unused) { publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); //利用getString,将把 NotesPreferenceActivity.getSyncAccountName(mContext))的字符串内容传进sync_progress_login中 - return mTaskManager.sync(mContext, this); //进行后台同步具体操作 + .getSyncAccountName(mContext))); //鍒╃敤getString,灏嗘妸 NotesPreferenceActivity.getSyncAccountName(mContext))鐨勫瓧绗︿覆鍐呭浼犺繘sync_progress_login涓 + return mTaskManager.sync(mContext, this); //杩涜鍚庡彴鍚屾鍏蜂綋鎿嶄綔 } @Override protected void onProgressUpdate(String... progress) { showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { //instanceof 判断mContext是否是GTaskSyncService的实例 + if (mContext instanceof GTaskSyncService) { //instanceof 鍒ゆ柇mContext鏄惁鏄疓TaskSyncService鐨勫疄渚 ((GTaskSyncService) mContext).sendBroadcast(progress[0]); } } @Override - protected void onPostExecute(Integer result) { //用于在执行完后台任务后更新UI,显示结果 + protected void onPostExecute(Integer result) { //鐢ㄤ簬鍦ㄦ墽琛屽畬鍚庡彴浠诲姟鍚庢洿鏂癠I,鏄剧ず缁撴灉 if (result == GTaskManager.STATE_SUCCESS) { showNotification(R.string.ticker_success, mContext.getString( R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //设置最新同步的时间 + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); //璁剧疆鏈鏂板悓姝ョ殑鏃堕棿 } else if (result == GTaskManager.STATE_NETWORK_ERROR) { showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { @@ -106,11 +106,11 @@ public class GTaskASyncTask extends AsyncTask { } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { showNotification(R.string.ticker_cancel, mContext .getString(R.string.error_sync_cancelled)); - } //几种不同情况下的结果显示 + } //鍑犵涓嶅悓鎯呭喌涓嬬殑缁撴灉鏄剧ず if (mOnCompleteListener != null) { - new Thread(new Runnable() { //这里好像是方法内的一个线程,但是并不太懂什么意思 + new Thread(new Runnable() { //杩欓噷濂藉儚鏄柟娉曞唴鐨勪竴涓嚎绋嬶紝浣嗘槸骞朵笉澶噦浠涔堟剰鎬 - public void run() { //完成后的操作,使用onComplete()将所有值都重新初始化,相当于完成一次操作 + public void run() { //瀹屾垚鍚庣殑鎿嶄綔锛屼娇鐢╫nComplete()灏嗘墍鏈夊奸兘閲嶆柊鍒濆鍖栵紝鐩稿綋浜庡畬鎴愪竴娆℃搷浣 mOnCompleteListener.onComplete(); } }).start(); diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java index c0fb022..cd0a8d5 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java @@ -17,13 +17,13 @@ package net.micode.notes.gtask.remote; /* - * 主要功能:实现GTASK的登录操作,进行GTASK任务的创建,创建任务列表,从网络上获取任务和任务列表的内容 - * 主要使用类或技术:accountManager JSONObject HttpParams authToken Gid + * 涓昏鍔熻兘锛氬疄鐜癎TASK鐨勭櫥褰曟搷浣滐紝杩涜GTASK浠诲姟鐨勫垱寤猴紝鍒涘缓浠诲姟鍒楄〃锛屼粠缃戠粶涓婅幏鍙栦换鍔″拰浠诲姟鍒楄〃鐨勫唴瀹 + * 涓昏浣跨敤绫绘垨鎶鏈細accountManager JSONObject HttpParams authToken Gid */ public class GTaskClient { private static final String TAG = GTaskClient.class.getSimpleName(); - private static final String GTASK_URL = "https://mail.google.com/tasks/"; //这个是指定的URL + private static final String GTASK_URL = "https://mail.google.com/tasks/"; //杩欎釜鏄寚瀹氱殑URL private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; @@ -61,9 +61,9 @@ public class GTaskClient { mUpdateArray = null; } - /*用来获取的实例化对象 - * 使用 getInstance() - * 返回mInstance这个实例化对象 + /*鐢ㄦ潵鑾峰彇鐨勫疄渚嬪寲瀵硅薄 + * 浣跨敤 getInstance() + * 杩斿洖mInstance杩欎釜瀹炰緥鍖栧璞 */ public static synchronized GTaskClient getInstance() { if (mInstance == null) { @@ -72,50 +72,50 @@ public class GTaskClient { return mInstance; } - /*用来实现登录操作的函数,传入的参数是一个Activity - * 设置登录操作限制时间,如果超时则需要重新登录 - * 有两种登录方式,使用用户自己的URL登录或者使用谷歌官方的URL登录 - * 返回true或者false,即最后是否登陆成功 + /*鐢ㄦ潵瀹炵幇鐧诲綍鎿嶄綔鐨勫嚱鏁帮紝浼犲叆鐨勫弬鏁版槸涓涓狝ctivity + * 璁剧疆鐧诲綍鎿嶄綔闄愬埗鏃堕棿锛屽鏋滆秴鏃跺垯闇瑕侀噸鏂扮櫥褰 + * 鏈変袱绉嶇櫥褰曟柟寮忥紝浣跨敤鐢ㄦ埛鑷繁鐨刄RL鐧诲綍鎴栬呬娇鐢ㄨ胺姝屽畼鏂圭殑URL鐧诲綍 + * 杩斿洖true鎴栬協alse锛屽嵆鏈鍚庢槸鍚︾櫥闄嗘垚鍔 */ public boolean login(Activity activity) { // we suppose that the cookie would expire after 5 minutes // then we need to re-login - //判断距离最后一次登录操作是否超过5分钟 + //鍒ゆ柇璺濈鏈鍚庝竴娆$櫥褰曟搷浣滄槸鍚﹁秴杩5鍒嗛挓 final long interval = 1000 * 60 * 5; if (mLastLoginTime + interval < System.currentTimeMillis()) { mLoggedin = false; } - // need to re-login after account switch 重新登录操作 + // 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() //将用户账号名改为统一格式(小写)后判断是否为一个谷歌账号地址 + //灏濊瘯浣跨敤鐢ㄦ埛鑷繁鐨勫煙鍚嶇櫥褰 + if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() //灏嗙敤鎴疯处鍙峰悕鏀逛负缁熶竴鏍煎紡锛堝皬鍐欙級鍚庡垽鏂槸鍚︿负涓涓胺姝岃处鍙峰湴鍧 .endsWith("googlemail.com"))) { StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); int index = mAccount.name.indexOf('@') + 1; String suffix = mAccount.name.substring(index); url.append(suffix + "/"); - mGetUrl = url.toString() + "ig"; //设置用户对应的getUrl - mPostUrl = url.toString() + "r/ig"; //设置用户对应的postUrl + mGetUrl = url.toString() + "ig"; //璁剧疆鐢ㄦ埛瀵瑰簲鐨刧etUrl + mPostUrl = url.toString() + "r/ig"; //璁剧疆鐢ㄦ埛瀵瑰簲鐨刾ostUrl if (tryToLoginGtask(activity, authToken)) { mLoggedin = true; @@ -123,7 +123,7 @@ public class GTaskClient { } // try to login with google official url - //如果用户账户无法登录,则使用谷歌官方的URI进行登录 + //濡傛灉鐢ㄦ埛璐︽埛鏃犳硶鐧诲綍锛屽垯浣跨敤璋锋瓕瀹樻柟鐨刄RI杩涜鐧诲綍 if (!mLoggedin) { mGetUrl = GTASK_GET_URL; mPostUrl = GTASK_POST_URL; @@ -136,15 +136,15 @@ public class GTaskClient { return true; } - /*具体实现登录谷歌账户的方法 - * 使用令牌机制 - * 使用AccountManager来管理注册账号 - * 返回值是账号的令牌 + /*鍏蜂綋瀹炵幇鐧诲綍璋锋瓕璐︽埛鐨勬柟娉 + * 浣跨敤浠ょ墝鏈哄埗 + * 浣跨敤AccountManager鏉ョ鐞嗘敞鍐岃处鍙 + * 杩斿洖鍊兼槸璐﹀彿鐨勪护鐗 */ private String loginGoogleAccount(Activity activity, boolean invalidateToken) { - String authToken; //令牌,是登录操作保证安全性的一个方法 - AccountManager accountManager = AccountManager.get(activity);//AccountManager这个类给用户提供了集中注册账号的接口 - Account[] accounts = accountManager.getAccountsByType("com.google");//获取全部以com.google结尾的account + String authToken; //浠ょ墝锛屾槸鐧诲綍鎿嶄綔淇濊瘉瀹夊叏鎬х殑涓涓柟娉 + AccountManager accountManager = AccountManager.get(activity);//AccountManager杩欎釜绫荤粰鐢ㄦ埛鎻愪緵浜嗛泦涓敞鍐岃处鍙风殑鎺ュ彛 + Account[] accounts = accountManager.getAccountsByType("com.google");//鑾峰彇鍏ㄩ儴浠om.google缁撳熬鐨刟ccount if (accounts.length == 0) { Log.e(TAG, "there is no available google account"); @@ -153,7 +153,7 @@ public class GTaskClient { String accountName = NotesPreferenceActivity.getSyncAccountName(activity); Account account = null; - //遍历获得的accounts信息,寻找已经记录过的账户信息 + //閬嶅巻鑾峰緱鐨刟ccounts淇℃伅锛屽鎵惧凡缁忚褰曡繃鐨勮处鎴蜂俊鎭 for (Account a : accounts) { if (a.name.equals(accountName)) { account = a; @@ -168,13 +168,13 @@ public class GTaskClient { } // get the token now - //获取选中账号的令牌 + //鑾峰彇閫変腑璐﹀彿鐨勪护鐗 AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, "goanna_mobile", null, activity, null, null); try { Bundle authTokenBundle = accountManagerFuture.getResult(); authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); - //如果是invalidateToken,那么需要调用invalidateAuthToken(String, String)方法废除这个无效token + //濡傛灉鏄痠nvalidateToken锛岄偅涔堥渶瑕佽皟鐢╥nvalidateAuthToken(String, String)鏂规硶搴熼櫎杩欎釜鏃犳晥token if (invalidateToken) { accountManager.invalidateAuthToken("com.google", authToken); loginGoogleAccount(activity, false); @@ -187,12 +187,12 @@ public class GTaskClient { return authToken; } - //尝试登陆Gtask,这只是一个预先判断令牌是否是有效以及是否能登上GTask的方法,而不是具体实现登陆的方法 + //灏濊瘯鐧婚檰Gtask锛岃繖鍙槸涓涓鍏堝垽鏂护鐗屾槸鍚︽槸鏈夋晥浠ュ強鏄惁鑳界櫥涓奊Task鐨勬柟娉,鑰屼笉鏄叿浣撳疄鐜扮櫥闄嗙殑鏂规硶 private boolean tryToLoginGtask(Activity activity, String authToken) { if (!loginGtask(authToken)) { // maybe the auth token is out of authTokedate, now let's invalidate the // token and try again - //删除过一个无效的authToken,申请一个新的后再次尝试登陆 + //鍒犻櫎杩囦竴涓棤鏁堢殑authToken锛岀敵璇蜂竴涓柊鐨勫悗鍐嶆灏濊瘯鐧婚檰 authToken = loginGoogleAccount(activity, true); if (authToken == null) { Log.e(TAG, "login google account failed"); @@ -207,27 +207,27 @@ public class GTaskClient { return true; } - //实现登录GTask的具体操作 + //瀹炵幇鐧诲綍GTask鐨勫叿浣撴搷浣 private boolean loginGtask(String authToken) { int timeoutConnection = 10000; - int timeoutSocket = 15000; //socket是一种通信连接实现数据的交换的端口 - HttpParams httpParameters = new BasicHttpParams(); //实例化一个新的HTTP参数类 - HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//设置连接超时时间 - HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//设置设置端口超时时间 + int timeoutSocket = 15000; //socket鏄竴绉嶉氫俊杩炴帴瀹炵幇鏁版嵁鐨勪氦鎹㈢殑绔彛 + HttpParams httpParameters = new BasicHttpParams(); //瀹炰緥鍖栦竴涓柊鐨凥TTP鍙傛暟绫 + HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);//璁剧疆杩炴帴瓒呮椂鏃堕棿 + HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);//璁剧疆璁剧疆绔彛瓒呮椂鏃堕棿 mHttpClient = new DefaultHttpClient(httpParameters); - BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //设置本地cookie + BasicCookieStore localBasicCookieStore = new BasicCookieStore(); //璁剧疆鏈湴cookie mHttpClient.setCookieStore(localBasicCookieStore); HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); // login gtask try { - String loginUrl = mGetUrl + "?auth=" + authToken; //设置登录的url - HttpGet httpGet = new HttpGet(loginUrl); //通过登录的uri实例化网页上资源的查找 + String loginUrl = mGetUrl + "?auth=" + authToken; //璁剧疆鐧诲綍鐨剈rl + HttpGet httpGet = new HttpGet(loginUrl); //閫氳繃鐧诲綍鐨剈ri瀹炰緥鍖栫綉椤典笂璧勬簮鐨勬煡鎵 HttpResponse response = null; response = mHttpClient.execute(httpGet); // get the cookie now - //获取CookieStore里存放的cookie,看如果存有“GTL(不知道什么意思)”,则说明有验证成功的有效的cookie + //鑾峰彇CookieStore閲屽瓨鏀剧殑cookie,鐪嬪鏋滃瓨鏈夆淕TL(涓嶇煡閬撲粈涔堟剰鎬)鈥濓紝鍒欒鏄庢湁楠岃瘉鎴愬姛鐨勬湁鏁堢殑cookie List cookies = mHttpClient.getCookieStore().getCookies(); boolean hasAuthCookie = false; for (Cookie cookie : cookies) { @@ -240,7 +240,7 @@ public class GTaskClient { } // get the client version - //获取client的内容,具体操作是在返回的Content中截取从_setup(开始到)}中间的字符串内容,也就是gtask_url的内容 + //鑾峰彇client鐨勫唴瀹癸紝鍏蜂綋鎿嶄綔鏄湪杩斿洖鐨凜ontent涓埅鍙栦粠_setup(寮濮嬪埌)}涓棿鐨勫瓧绗︿覆鍐呭锛屼篃灏辨槸gtask_url鐨勫唴瀹 String resString = getResponseContent(response.getEntity()); String jsBegin = "_setup("; String jsEnd = ")}"; @@ -269,9 +269,9 @@ public class GTaskClient { return mActionId++; } - /*实例化创建一个用于向网络传输数据的对象 - * 使用HttpPost类 - * 返回一个httpPost实例化对象,但里面还没有内容 + /*瀹炰緥鍖栧垱寤轰竴涓敤浜庡悜缃戠粶浼犺緭鏁版嵁鐨勫璞 + * 浣跨敤HttpPost绫 + * 杩斿洖涓涓猦ttpPost瀹炰緥鍖栧璞★紝浣嗛噷闈㈣繕娌℃湁鍐呭 */ private HttpPost createHttpPost() { HttpPost httpPost = new HttpPost(mPostUrl); @@ -280,28 +280,28 @@ public class GTaskClient { return httpPost; } - /*通过URL获取响应后返回的数据,也就是网络上的数据和资源 - * 使用getContentEncoding()获取网络上的资源和数据 - * 返回值就是获取到的资源 + /*閫氳繃URL鑾峰彇鍝嶅簲鍚庤繑鍥炵殑鏁版嵁锛屼篃灏辨槸缃戠粶涓婄殑鏁版嵁鍜岃祫婧 + * 浣跨敤getContentEncoding()鑾峰彇缃戠粶涓婄殑璧勬簮鍜屾暟鎹 + * 杩斿洖鍊煎氨鏄幏鍙栧埌鐨勮祫婧 */ private String getResponseContent(HttpEntity entity) throws IOException { String contentEncoding = null; - if (entity.getContentEncoding() != null) {//通过URL得到HttpEntity对象,如果不为空则使用getContent()方法创建一个流将数据从网络都过来 + if (entity.getContentEncoding() != null) {//閫氳繃URL寰楀埌HttpEntity瀵硅薄锛屽鏋滀笉涓虹┖鍒欎娇鐢╣etContent锛堬級鏂规硶鍒涘缓涓涓祦灏嗘暟鎹粠缃戠粶閮借繃鏉 contentEncoding = entity.getContentEncoding().getValue(); Log.d(TAG, "encoding: " + contentEncoding); } InputStream input = entity.getContent(); - if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP是使用DEFLATE进行压缩数据的另一个压缩库 + if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {//GZIP鏄娇鐢―EFLATE杩涜鍘嬬缉鏁版嵁鐨勫彟涓涓帇缂╁簱 input = new GZIPInputStream(entity.getContent()); - } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩 + } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {//DEFLATE鏄竴涓棤涓撳埄鐨勫帇缂╃畻娉曪紝瀹冨彲浠ュ疄鐜版棤鎹熸暟鎹帇缂 Inflater inflater = new Inflater(true); input = new InflaterInputStream(entity.getContent(), inflater); } try { InputStreamReader isr = new InputStreamReader(input); - BufferedReader br = new BufferedReader(isr);//是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了时候,再读入内存,是为了提供读的效率而设计的 + BufferedReader br = new BufferedReader(isr);//鏄竴涓寘瑁呯被锛屽畠鍙互鍖呰瀛楃娴侊紝灏嗗瓧绗︽祦鏀惧叆缂撳瓨閲岋紝鍏堟妸瀛楃璇诲埌缂撳瓨閲岋紝鍒扮紦瀛樻弧浜嗘椂鍊欙紝鍐嶈鍏ュ唴瀛橈紝鏄负浜嗘彁渚涜鐨勬晥鐜囪岃璁$殑 StringBuilder sb = new StringBuilder(); while (true) { @@ -316,28 +316,28 @@ public class GTaskClient { } } - /*通过JSON发送请求 - * 请求的具体内容在json的实例化对象js中然后传入 - * 利用UrlEncodedFormEntity entity和httpPost.setEntity(entity)方法把js中的内容放置到httpPost中 - * 执行请求后使用getResponseContent方法得到返回的数据和资源 - * 将资源再次放入json后返回 + /*閫氳繃JSON鍙戦佽姹 + * 璇锋眰鐨勫叿浣撳唴瀹瑰湪json鐨勫疄渚嬪寲瀵硅薄js涓劧鍚庝紶鍏 + * 鍒╃敤UrlEncodedFormEntity entity鍜宧ttpPost.setEntity(entity)鏂规硶鎶妀s涓殑鍐呭鏀剧疆鍒癶ttpPost涓 + * 鎵ц璇锋眰鍚庝娇鐢╣etResponseContent鏂规硶寰楀埌杩斿洖鐨勬暟鎹拰璧勬簮 + * 灏嗚祫婧愬啀娆℃斁鍏son鍚庤繑鍥 */ private JSONObject postRequest(JSONObject js) throws NetworkFailureException { - if (!mLoggedin) {//未登录 + if (!mLoggedin) {//鏈櫥褰 Log.e(TAG, "please login first"); throw new ActionFailureException("not logged in"); } - //实例化一个httpPost的对象用来向服务器传输数据,在这里就是发送请求,而请求的内容在js里 + //瀹炰緥鍖栦竴涓猦ttpPost鐨勫璞$敤鏉ュ悜鏈嶅姟鍣ㄤ紶杈撴暟鎹紝鍦ㄨ繖閲屽氨鏄彂閫佽姹傦紝鑰岃姹傜殑鍐呭鍦╦s閲 HttpPost httpPost = createHttpPost(); try { LinkedList list = new LinkedList(); list.add(new BasicNameValuePair("r", js.toString())); - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()的形式比较单一,是普通的键值对 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); //UrlEncodedFormEntity()鐨勫舰寮忔瘮杈冨崟涓锛屾槸鏅氱殑閿煎 httpPost.setEntity(entity); // execute the post - //执行这个请求 + //鎵ц杩欎釜璇锋眰 HttpResponse response = mHttpClient.execute(httpPost); String jsString = getResponseContent(response.getEntity()); return new JSONObject(jsString); @@ -361,11 +361,11 @@ public class GTaskClient { } } - /*创建单个任务 - * 传入参数是一个.gtask.data.Task包里Task类的对象 - * 利用json获取Task里的内容,并且创建相应的jsPost - * 利用postRequest得到任务的返回信息 - * 使用task.setGid设置task的new_ID + /*鍒涘缓鍗曚釜浠诲姟 + * 浼犲叆鍙傛暟鏄竴涓.gtask.data.Task鍖呴噷Task绫荤殑瀵硅薄 + * 鍒╃敤json鑾峰彇Task閲岀殑鍐呭,骞朵笖鍒涘缓鐩稿簲鐨刯sPost + * 鍒╃敤postRequest寰楀埌浠诲姟鐨勮繑鍥炰俊鎭 + * 浣跨敤task.setGid璁剧疆task鐨刵ew_ID */ public void createTask(Task task) throws NetworkFailureException { commitUpdate(); @@ -394,7 +394,7 @@ public class GTaskClient { } /* - * 创建一个任务列表,与createTask几乎一样,区别就是最后设置的是tasklist的gid + * 鍒涘缓涓涓换鍔″垪琛紝涓巆reateTask鍑犱箮涓鏍凤紝鍖哄埆灏辨槸鏈鍚庤缃殑鏄痶asklist鐨刧id */ public void createTaskList(TaskList tasklist) throws NetworkFailureException { commitUpdate(); @@ -423,9 +423,9 @@ public class GTaskClient { } /* - * 同步更新操作 - * 使用JSONObject进行数据存储,使用jsPost.put,Put的信息包括UpdateArray和ClientVersion - * 使用postRequest发送这个jspost,进行处理 + * 鍚屾鏇存柊鎿嶄綔 + * 浣跨敤JSONObject杩涜鏁版嵁瀛樺偍锛屼娇鐢╦sPost.put锛孭ut鐨勪俊鎭寘鎷琔pdateArray鍜孋lientVersion + * 浣跨敤postRequest鍙戦佽繖涓猨spost,杩涜澶勭悊 */ public void commitUpdate() throws NetworkFailureException { if (mUpdateArray != null) { @@ -449,8 +449,8 @@ public class GTaskClient { } /* - * 添加更新的事项 - * 调用commitUpdate()实现 + * 娣诲姞鏇存柊鐨勪簨椤 + * 璋冪敤commitUpdate()瀹炵幇 */ public void addUpdateNode(Node node) throws NetworkFailureException { if (node != null) { @@ -467,10 +467,10 @@ public class GTaskClient { } /* - * 移动task,比如讲task移动到不同的task列表中去 - * 通过getGid获取task所属列表的gid - * 通过JSONObject.put(String name, Object value)函数设置移动后的task的相关属性值,从而达到移动的目的 - * 最后还是通过postRequest进行更新后的发送 + * 绉诲姩task,姣斿璁瞭ask绉诲姩鍒颁笉鍚岀殑task鍒楄〃涓幓 + * 閫氳繃getGid鑾峰彇task鎵灞炲垪琛ㄧ殑gid + * 閫氳繃JSONObject.put(String name, Object value)鍑芥暟璁剧疆绉诲姩鍚庣殑task鐨勭浉鍏冲睘鎬у硷紝浠庤岃揪鍒扮Щ鍔ㄧ殑鐩殑 + * 鏈鍚庤繕鏄氳繃postRequest杩涜鏇存柊鍚庣殑鍙戦 */ public void moveTask(Task task, TaskList preParent, TaskList curParent) throws NetworkFailureException { @@ -488,17 +488,17 @@ public class GTaskClient { if (preParent == curParent && task.getPriorSibling() != null) { // put prioring_sibing_id only if moving within the tasklist and // it is not the first one - //设置优先级ID,只有当移动是发生在文件中 + //璁剧疆浼樺厛绾D锛屽彧鏈夊綋绉诲姩鏄彂鐢熷湪鏂囦欢涓 action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); } - action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); //设置移动前所属列表 - action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); //设置当前所属列表 + 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()); } actionList.put(action); - //最后将ACTION_LIST加入到jsPost中 + //鏈鍚庡皢ACTION_LIST鍔犲叆鍒癹sPost涓 jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); // client_version @@ -514,9 +514,9 @@ public class GTaskClient { } /* - * 删除操作节点 - * 还是利用JSON - * 删除过后使用postRequest发送删除后的结果 + * 鍒犻櫎鎿嶄綔鑺傜偣 + * 杩樻槸鍒╃敤JSON + * 鍒犻櫎杩囧悗浣跨敤postRequest鍙戦佸垹闄ゅ悗鐨勭粨鏋 */ public void deleteNode(Node node) throws NetworkFailureException { commitUpdate(); @@ -526,7 +526,7 @@ public class GTaskClient { // action_list node.setDeleted(true); - actionList.put(node.getUpdateAction(getActionId())); //这里会获取到删除操作的ID,加入到actionLiast中 + actionList.put(node.getUpdateAction(getActionId())); //杩欓噷浼氳幏鍙栧埌鍒犻櫎鎿嶄綔鐨処D锛屽姞鍏ュ埌actionLiast涓 jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); // client_version @@ -542,9 +542,9 @@ public class GTaskClient { } /* - * 获取任务列表 - * 首先通过GetURI使用getResponseContent从网上获取数据 - * 然后筛选出"_setup("到)}的部分,并且从中获取GTASK_JSON_LISTS的内容返回 + * 鑾峰彇浠诲姟鍒楄〃 + * 棣栧厛閫氳繃GetURI浣跨敤getResponseContent浠庣綉涓婅幏鍙栨暟鎹 + * 鐒跺悗绛涢夊嚭"_setup("鍒)}鐨勯儴鍒嗭紝骞朵笖浠庝腑鑾峰彇GTASK_JSON_LISTS鐨勫唴瀹硅繑鍥 */ public JSONArray getTaskLists() throws NetworkFailureException { if (!mLoggedin) { @@ -558,7 +558,7 @@ public class GTaskClient { response = mHttpClient.execute(httpGet); // get the task list - //筛选工作,把筛选出的字符串放入jsString + //绛涢夊伐浣滐紝鎶婄瓫閫夊嚭鐨勫瓧绗︿覆鏀惧叆jsString String resString = getResponseContent(response.getEntity()); String jsBegin = "_setup("; String jsEnd = ")}"; @@ -569,7 +569,7 @@ public class GTaskClient { jsString = resString.substring(begin + jsBegin.length(), end); } JSONObject js = new JSONObject(jsString); - //获取GTASK_JSON_LISTS + //鑾峰彇GTASK_JSON_LISTS return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); } catch (ClientProtocolException e) { Log.e(TAG, e.toString()); @@ -587,7 +587,7 @@ public class GTaskClient { } /* - * 通过传入的TASKList的gid,从网络上获取相应属于这个任务列表的任务 + * 閫氳繃浼犲叆鐨凾ASKList鐨刧id,浠庣綉缁滀笂鑾峰彇鐩稿簲灞炰簬杩欎釜浠诲姟鍒楄〃鐨勪换鍔 */ public JSONArray getTaskList(String listGid) throws NetworkFailureException { commitUpdate(); @@ -600,7 +600,7 @@ public class GTaskClient { action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //这里设置为传入的listGid + action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); //杩欓噷璁剧疆涓轰紶鍏ョ殑listGid action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); actionList.put(action); jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); @@ -621,7 +621,7 @@ public class GTaskClient { return mAccount; } - //重置更新的内容 + //閲嶇疆鏇存柊鐨勫唴瀹 public void resetUpdateArray() { mUpdateArray = null; } diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java index 14e07d9..b76b370 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java @@ -38,25 +38,25 @@ public class GTaskManager { private HashMap mGidToNid; private HashMap mNidToGid; - private GTaskManager() { //对象初始化函数 - mSyncing = false; //正在同步,flase代表未执行 - mCancelled = false; //全局标识,flase代表可以执行 - mGTaskListHashMap = new HashMap(); //<>代表Java的泛型,就是创建一个用类型作为参数的类。 + private GTaskManager() { //瀵硅薄鍒濆鍖栧嚱鏁 + mSyncing = false; //姝e湪鍚屾,flase浠h〃鏈墽琛 + mCancelled = false; //鍏ㄥ眬鏍囪瘑锛宖lase浠h〃鍙互鎵ц + mGTaskListHashMap = new HashMap(); //<>浠h〃Java鐨勬硾鍨,灏辨槸鍒涘缓涓涓敤绫诲瀷浣滀负鍙傛暟鐨勭被銆 mGTaskHashMap = new HashMap(); mMetaHashMap = new HashMap(); mMetaList = null; mLocalDeleteIdMap = new HashSet(); mGidToNid = new HashMap(); //GoogleID to NodeID?? - mNidToGid = new HashMap(); //NodeID to GoogleID???通过hashmap散列表建立映射 + mNidToGid = new HashMap(); //NodeID to GoogleID???閫氳繃hashmap鏁e垪琛ㄥ缓绔嬫槧灏 } /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 - * 功能:类初始化函数 + * 鍖呭惈鍏抽敭瀛梥ynchronized锛岃瑷绾у悓姝ワ紝鎸囨槑璇ュ嚱鏁板彲鑳借繍琛屽湪澶氱嚎绋嬬殑鐜涓嬨 + * 鍔熻兘锛氱被鍒濆鍖栧嚱鏁 * @author TTS * @return GtaskManger */ - public static synchronized GTaskManager getInstance() { //可能运行在多线程环境下,使用语言级同步--synchronized + public static synchronized GTaskManager getInstance() { //鍙兘杩愯鍦ㄥ绾跨▼鐜涓嬶紝浣跨敤璇█绾у悓姝--synchronized if (mInstance == null) { mInstance = new GTaskManager(); } @@ -64,7 +64,7 @@ public class GTaskManager { } /** - * 包含关键字synchronized,语言级同步,指明该函数可能运行在多线程的环境下。 + * 鍖呭惈鍏抽敭瀛梥ynchronized锛岃瑷绾у悓姝ワ紝鎸囨槑璇ュ嚱鏁板彲鑳借繍琛屽湪澶氱嚎绋嬬殑鐜涓嬨 * @author TTS * @param activity */ @@ -74,16 +74,16 @@ public class GTaskManager { } /** - * 核心函数 - * 功能:实现了本地同步操作和远端同步操作 + * 鏍稿績鍑芥暟 + * 鍔熻兘锛氬疄鐜颁簡鏈湴鍚屾鎿嶄綔鍜岃繙绔悓姝ユ搷浣 * @author TTS - * @param context-----获取上下文 - * @param asyncTask-------用于同步的异步操作类 + * @param context-----鑾峰彇涓婁笅鏂 + * @param asyncTask-------鐢ㄤ簬鍚屾鐨勫紓姝ユ搷浣滅被 * @return int */ - public int sync(Context context, GTaskASyncTask asyncTask) { //核心函数 + public int sync(Context context, GTaskASyncTask asyncTask) { //鏍稿績鍑芥暟 if (mSyncing) { - Log.d(TAG, "Sync is in progress"); //创建日志文件(调试信息),debug + Log.d(TAG, "Sync is in progress"); //鍒涘缓鏃ュ織鏂囦欢锛堣皟璇曚俊鎭級锛宒ebug return STATE_SYNC_IN_PROGRESS; } mContext = context; @@ -98,8 +98,8 @@ public class GTaskManager { mNidToGid.clear(); try { - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client--客户机 - client.resetUpdateArray(); //JSONArray类型,reset即置为NULL + GTaskClient client = GTaskClient.getInstance(); //getInstance鍗充负鍒涘缓涓涓疄渚,client--瀹㈡埛鏈 + client.resetUpdateArray(); //JSONArray绫诲瀷锛宺eset鍗崇疆涓篘ULL // login google task if (!mCancelled) { @@ -110,15 +110,15 @@ public class GTaskManager { // get the task list from google asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); - initGTaskList(); //获取Google上的JSONtasklist转为本地TaskList + initGTaskList(); //鑾峰彇Google涓婄殑JSONtasklist杞负鏈湴TaskList // do content sync work asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); syncContent(); - } catch (NetworkFailureException e) { //分为两种异常,此类异常为网络异常 - Log.e(TAG, e.toString()); //创建日志文件(调试信息),error + } catch (NetworkFailureException e) { //鍒嗕负涓ょ寮傚父锛屾绫诲紓甯镐负缃戠粶寮傚父 + Log.e(TAG, e.toString()); //鍒涘缓鏃ュ織鏂囦欢锛堣皟璇曚俊鎭級锛宔rror return STATE_NETWORK_ERROR; - } catch (ActionFailureException e) { //此类异常为操作异常 + } catch (ActionFailureException e) { //姝ょ被寮傚父涓烘搷浣滃紓甯 Log.e(TAG, e.toString()); return STATE_INTERNAL_ERROR; } catch (Exception e) { @@ -139,8 +139,8 @@ public class GTaskManager { } /** - *功能:初始化GtaskList,获取Google上的JSONtasklist转为本地TaskList。 - *获得的数据存储在mMetaList,mGTaskListHashMap,mGTaskHashMap + *鍔熻兘锛氬垵濮嬪寲GtaskList锛岃幏鍙朑oogle涓婄殑JSONtasklist杞负鏈湴TaskList銆 + *鑾峰緱鐨勬暟鎹瓨鍌ㄥ湪mMetaList锛宮GTaskListHashMap锛宮GTaskHashMap *@author TTS *@exception NetworkFailureException *@return void @@ -148,31 +148,31 @@ public class GTaskManager { private void initGTaskList() throws NetworkFailureException { if (mCancelled) return; - GTaskClient client = GTaskClient.getInstance(); //getInstance即为创建一个实例,client应指远端客户机 + GTaskClient client = GTaskClient.getInstance(); //getInstance鍗充负鍒涘缓涓涓疄渚嬶紝client搴旀寚杩滅瀹㈡埛鏈 try { - //Json对象是Name Value对(即子元素)的无序集合,相当于一个Map对象。JsonObject类是bantouyan-json库对Json对象的抽象,提供操纵Json对象的各种方法。 - //其格式为{"key1":value1,"key2",value2....};key 必须是字符串。 - //因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。 - JSONArray jsTaskLists = client.getTaskLists(); //原注释为get task list------lists??? + //Json瀵硅薄鏄疦ame Value瀵(鍗冲瓙鍏冪礌)鐨勬棤搴忛泦鍚堬紝鐩稿綋浜庝竴涓狹ap瀵硅薄銆侸sonObject绫绘槸bantouyan-json搴撳Json瀵硅薄鐨勬娊璞★紝鎻愪緵鎿嶇旱Json瀵硅薄鐨勫悇绉嶆柟娉曘 + //鍏舵牸寮忎负{"key1":value1,"key2",value2....};key 蹇呴』鏄瓧绗︿覆銆 + //鍥犱负ajax璇锋眰涓嶅埛鏂伴〉闈紝浣嗛厤鍚坖s鍙互瀹炵幇灞閮ㄥ埛鏂帮紝鍥犳json甯稿父琚敤鏉ヤ綔涓哄紓姝ヨ姹傜殑杩斿洖瀵硅薄浣跨敤銆 + JSONArray jsTaskLists = client.getTaskLists(); //鍘熸敞閲婁负get task list------lists锛燂紵锛 // init meta list first - mMetaList = null; //TaskList类型 + mMetaList = null; //TaskList绫诲瀷 for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject与JSONArray一个为对象,一个为数组。此处取出单个JASONObject + JSONObject object = jsTaskLists.getJSONObject(i); //JSONObject涓嶫SONArray涓涓负瀵硅薄锛屼竴涓负鏁扮粍銆傛澶勫彇鍑哄崟涓狫ASONObject String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); if (name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - mMetaList = new TaskList(); //MetaList意为元表,Tasklist类型,此处为初始化 - mMetaList.setContentByRemoteJSON(object); //将JSON中部分数据复制到自己定义的对象中相对应的数据:name->mname... + mMetaList = new TaskList(); //MetaList鎰忎负鍏冭〃,Tasklist绫诲瀷锛屾澶勪负鍒濆鍖 + mMetaList.setContentByRemoteJSON(object); //灏咼SON涓儴鍒嗘暟鎹鍒跺埌鑷繁瀹氫箟鐨勫璞′腑鐩稿搴旂殑鏁版嵁锛歯ame->mname... // load meta data - JSONArray jsMetas = client.getTaskList(gid); //原注释为get action_list------list??? + JSONArray jsMetas = client.getTaskList(gid); //鍘熸敞閲婁负get action_list------list锛燂紵锛 for (int j = 0; j < jsMetas.length(); j++) { object = (JSONObject) jsMetas.getJSONObject(j); - MetaData metaData = new MetaData(); //继承自Node + MetaData metaData = new MetaData(); //缁ф壙鑷狽ode metaData.setContentByRemoteJSON(object); - if (metaData.isWorthSaving()) { //if not worth to save,metadata将不加入mMetaList + if (metaData.isWorthSaving()) { //if not worth to save锛宮etadata灏嗕笉鍔犲叆mMetaList mMetaList.addChildTask(metaData); if (metaData.getGid() != null) { mMetaHashMap.put(metaData.getRelatedGid(), metaData); @@ -193,16 +193,16 @@ public class GTaskManager { // init task list for (int i = 0; i < jsTaskLists.length(); i++) { JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //通过getString函数传入本地某个标志数据的名称,获取其在远端的名称。 + String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); //閫氳繃getString鍑芥暟浼犲叆鏈湴鏌愪釜鏍囧織鏁版嵁鐨勫悕绉帮紝鑾峰彇鍏跺湪杩滅鐨勫悕绉般 String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - TaskList tasklist = new TaskList(); //继承自Node + TaskList tasklist = new TaskList(); //缁ф壙鑷狽ode tasklist.setContentByRemoteJSON(object); mGTaskListHashMap.put(gid, tasklist); - mGTaskHashMap.put(gid, tasklist); //为什么加两遍??? + mGTaskHashMap.put(gid, tasklist); //涓轰粈涔堝姞涓ら亶锛燂紵锛 // load tasks JSONArray jsTasks = client.getTaskList(gid); @@ -227,17 +227,17 @@ public class GTaskManager { } /** - * 功能:本地内容同步操作 + * 鍔熻兘锛氭湰鍦板唴瀹瑰悓姝ユ搷浣 * @throws NetworkFailureException - * @return 无返回值 + * @return 鏃犺繑鍥炲 */ - private void syncContent() throws NetworkFailureException { //本地内容同步操作 + private void syncContent() throws NetworkFailureException { //鏈湴鍐呭鍚屾鎿嶄綔 int syncType; - Cursor c = null; //数据库指针 + Cursor c = null; //鏁版嵁搴撴寚閽 String gid; //GoogleID?? - Node node; //Node包含Sync_Action的不同类型 + Node node; //Node鍖呭惈Sync_Action鐨勪笉鍚岀被鍨 - mLocalDeleteIdMap.clear(); //HashSet类型 + mLocalDeleteIdMap.clear(); //HashSet绫诲瀷 if (mCancelled) { return; @@ -285,8 +285,8 @@ public class GTaskManager { node = mGTaskHashMap.get(gid); if (node != null) { mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //通过hashmap建立联系 - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //通过hashmap建立联系 + mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); //閫氳繃hashmap寤虹珛鑱旂郴 + mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); //閫氳繃hashmap寤虹珛鑱旂郴 syncType = node.getSyncAction(c); } else { if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { @@ -311,14 +311,14 @@ public class GTaskManager { } // go through remaining items - Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator迭代器 + Iterator> iter = mGTaskHashMap.entrySet().iterator(); //Iterator杩唬鍣 while (iter.hasNext()) { Map.Entry entry = iter.next(); node = entry.getValue(); doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); } - // mCancelled can be set by another thread, so we neet to check one by //thread----线程 + // mCancelled can be set by another thread, so we neet to check one by //thread----绾跨▼ // one // clear local delete table if (!mCancelled) { @@ -336,7 +336,7 @@ public class GTaskManager { } /** - * 功能: + * 鍔熻兘锛 * @author TTS * @throws NetworkFailureException */ @@ -466,7 +466,7 @@ public class GTaskManager { } /** - * 功能:syncType分类,addLocalNode,addRemoteNode,deleteNode,updateLocalNode,updateRemoteNode + * 鍔熻兘锛歴yncType鍒嗙被锛宎ddLocalNode锛宎ddRemoteNode锛宒eleteNode锛寀pdateLocalNode锛寀pdateRemoteNode * @author TTS * @param syncType * @param node @@ -520,7 +520,7 @@ public class GTaskManager { } /** - * 功能:本地增加Node + * 鍔熻兘锛氭湰鍦板鍔燦ode * @author TTS * @param node * @throws NetworkFailureException @@ -600,10 +600,10 @@ public class GTaskManager { } /** - * 功能:update本地node + * 鍔熻兘锛歶pdate鏈湴node * @author TTS * @param node - * ----同步操作的基础数据类型 + * ----鍚屾鎿嶄綔鐨勫熀纭鏁版嵁绫诲瀷 * @param c * ----Cursor * @throws NetworkFailureException @@ -632,11 +632,11 @@ public class GTaskManager { } /** - * 功能:远程增加Node - * 需要updateRemoteMeta + * 鍔熻兘锛氳繙绋嬪鍔燦ode + * 闇瑕乽pdateRemoteMeta * @author TTS * @param node - * ----同步操作的基础数据类型 + * ----鍚屾鎿嶄綔鐨勫熀纭鏁版嵁绫诲瀷 * @param c * --Cursor * @throws NetworkFailureException @@ -646,7 +646,7 @@ public class GTaskManager { return; } - SqlNote sqlNote = new SqlNote(mContext, c); //从本地mContext中获取内容 + SqlNote sqlNote = new SqlNote(mContext, c); //浠庢湰鍦癿Context涓幏鍙栧唴瀹 Node n; // update remotely @@ -656,12 +656,12 @@ public class GTaskManager { String parentGid = mNidToGid.get(sqlNote.getParentId()); if (parentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); //调试信息 + Log.e(TAG, "cannot find task's parent tasklist"); //璋冭瘯淇℃伅 throw new ActionFailureException("cannot add remote task"); } - mGTaskListHashMap.get(parentGid).addChildTask(task); //在本地生成的GTaskList中增加子结点 + mGTaskListHashMap.get(parentGid).addChildTask(task); //鍦ㄦ湰鍦扮敓鎴愮殑GTaskList涓鍔犲瓙缁撶偣 - //登录远程服务器,创建Task + //鐧诲綍杩滅▼鏈嶅姟鍣紝鍒涘缓Task GTaskClient.getInstance().createTask(task); n = (Node) task; @@ -679,7 +679,7 @@ public class GTaskManager { else folderName += sqlNote.getSnippet(); - //iterator迭代器,通过统一的接口迭代所有的map元素 + //iterator杩唬鍣紝閫氳繃缁熶竴鐨勬帴鍙h凯浠f墍鏈夌殑map鍏冪礌 Iterator> iter = mGTaskListHashMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); @@ -711,16 +711,16 @@ public class GTaskManager { sqlNote.resetLocalModified(); sqlNote.commit(true); - // gid-id mapping //创建id间的映射 + // gid-id mapping //鍒涘缓id闂寸殑鏄犲皠 mGidToNid.put(n.getGid(), sqlNote.getId()); mNidToGid.put(sqlNote.getId(), n.getGid()); } /** - * 功能:更新远端的Node,包含meta更新(updateRemoteMeta) + * 鍔熻兘锛氭洿鏂拌繙绔殑Node锛屽寘鍚玬eta鏇存柊(updateRemoteMeta) * @author TTS * @param node - * ----同步操作的基础数据类型 + * ----鍚屾鎿嶄綔鐨勫熀纭鏁版嵁绫诲瀷 * @param c * --Cursor * @throws NetworkFailureException @@ -734,7 +734,7 @@ public class GTaskManager { // update remotely node.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(node); //GTaskClient用途为从本地登陆远端服务器 + GTaskClient.getInstance().addUpdateNode(node); //GTaskClient鐢ㄩ斾负浠庢湰鍦扮櫥闄嗚繙绔湇鍔″櫒 // update meta updateRemoteMeta(node.getGid(), sqlNote); @@ -743,17 +743,17 @@ public class GTaskManager { if (sqlNote.isNoteType()) { Task task = (Task) node; TaskList preParentList = task.getParent(); - //preParentList为通过node获取的父节点列表 + //preParentList涓洪氳繃node鑾峰彇鐨勭埗鑺傜偣鍒楄〃 String curParentGid = mNidToGid.get(sqlNote.getParentId()); - //curParentGid为通过光标在数据库中找到sqlNote的mParentId,再通过mNidToGid由long类型转为String类型的Gid + //curParentGid涓洪氳繃鍏夋爣鍦ㄦ暟鎹簱涓壘鍒皊qlNote鐨刴ParentId锛屽啀閫氳繃mNidToGid鐢眑ong绫诲瀷杞负String绫诲瀷鐨凣id if (curParentGid == null) { Log.e(TAG, "cannot find task's parent tasklist"); throw new ActionFailureException("cannot update remote task"); } TaskList curParentList = mGTaskListHashMap.get(curParentGid); - //通过HashMap找到对应Gid的TaskList + //閫氳繃HashMap鎵惧埌瀵瑰簲Gid鐨凾askList if (preParentList != curParentList) { //????????????? preParentList.removeChildTask(task); @@ -764,17 +764,17 @@ public class GTaskManager { // clear local modified flag sqlNote.resetLocalModified(); - //commit到本地数据库 + //commit鍒版湰鍦版暟鎹簱 sqlNote.commit(true); } /** - * 功能:升级远程meta。 meta---元数据----计算机文件系统管理数据---管理数据的数据。 + * 鍔熻兘锛氬崌绾ц繙绋媘eta銆 meta---鍏冩暟鎹----璁$畻鏈烘枃浠剁郴缁熺鐞嗘暟鎹---绠$悊鏁版嵁鐨勬暟鎹 * @author TTS * @param gid - * ---GoogleID为String类型 + * ---GoogleID涓篠tring绫诲瀷 * @param sqlNote - * ---同步前的数据库操作,故使用类SqlNote + * ---鍚屾鍓嶇殑鏁版嵁搴撴搷浣滐紝鏁呬娇鐢ㄧ被SqlNote * @throws NetworkFailureException */ private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { @@ -794,7 +794,7 @@ public class GTaskManager { } /** - * 功能:刷新本地,给sync的ID对应上最后更改过的对象 + * 鍔熻兘锛氬埛鏂版湰鍦帮紝缁檚ync鐨処D瀵瑰簲涓婃渶鍚庢洿鏀硅繃鐨勫璞 * @author TTS * @return void * @throws NetworkFailureException @@ -804,7 +804,7 @@ public class GTaskManager { return; } - // get the latest gtask list //获取最近的(最晚的)gtask list + // get the latest gtask list //鑾峰彇鏈杩戠殑锛堟渶鏅氱殑锛塯task list mGTaskHashMap.clear(); mGTaskListHashMap.clear(); mMetaHashMap.clear(); @@ -815,16 +815,16 @@ public class GTaskManager { c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(type<>? AND parent_id<>?)", new String[] { String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); //query语句:五个参数,NoteColumns.TYPE + " DESC"-----为按类型递减顺序返回查询结果。new String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------为选择参数。"(type<>? AND parent_id<>?)"-------指明返回行过滤器。SqlNote.PROJECTION_NOTE--------应返回的数据列的名字。Notes.CONTENT_NOTE_URI--------contentProvider包含所有数据集所对应的uri + }, NoteColumns.TYPE + " DESC"); //query璇彞锛氫簲涓弬鏁帮紝NoteColumns.TYPE + " DESC"-----涓烘寜绫诲瀷閫掑噺椤哄簭杩斿洖鏌ヨ缁撴灉銆俷ew String[] {String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)}------涓洪夋嫨鍙傛暟銆"(type<>? AND parent_id<>?)"-------鎸囨槑杩斿洖琛岃繃婊ゅ櫒銆係qlNote.PROJECTION_NOTE--------搴旇繑鍥炵殑鏁版嵁鍒楃殑鍚嶅瓧銆侼otes.CONTENT_NOTE_URI--------contentProvider鍖呭惈鎵鏈夋暟鎹泦鎵瀵瑰簲鐨剈ri if (c != null) { while (c.moveToNext()) { String gid = c.getString(SqlNote.GTASK_ID_COLUMN); Node node = mGTaskHashMap.get(gid); if (node != null) { mGTaskHashMap.remove(gid); - ContentValues values = new ContentValues(); //在ContentValues中创建键值对。准备通过contentResolver写入数据 + ContentValues values = new ContentValues(); //鍦–ontentValues涓垱寤洪敭鍊煎銆傚噯澶囬氳繃contentResolver鍐欏叆鏁版嵁 values.put(NoteColumns.SYNC_ID, node.getLastModified()); - mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //进行批量更改,选择参数为NULL,应该可以用insert替换,参数分别为表名和需要更新的value对象。 + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, //杩涜鎵归噺鏇存敼锛岄夋嫨鍙傛暟涓篘ULL锛屽簲璇ュ彲浠ョ敤insert鏇挎崲锛屽弬鏁板垎鍒负琛ㄥ悕鍜岄渶瑕佹洿鏂扮殑value瀵硅薄銆 c.getLong(SqlNote.ID_COLUMN)), values, null, null); } else { Log.e(TAG, "something is missed"); @@ -844,7 +844,7 @@ public class GTaskManager { } /** - * 功能:获取同步账号,mAccount.name + * 鍔熻兘锛氳幏鍙栧悓姝ヨ处鍙,mAccount.name * @author TTS * @return String */ @@ -853,7 +853,7 @@ public class GTaskManager { } /** - * 功能:取消同步,置mCancelled为true + * 鍔熻兘锛氬彇娑堝悓姝ワ紝缃甿Cancelled涓簍rue * @author TTS */ public void cancelSync() { diff --git a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java index 448ee3b..3e3005d 100644 --- a/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java +++ b/src/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java @@ -17,19 +17,19 @@ package net.micode.notes.gtask.remote; /* - * Service是在一段不定的时间运行在后台,不和用户交互的应用组件 - * 主要方法: - * private void startSync() 启动一个同步工作 - * private void cancelSync() 取消同步 + * Service鏄湪涓娈典笉瀹氱殑鏃堕棿杩愯鍦ㄥ悗鍙帮紝涓嶅拰鐢ㄦ埛浜や簰鐨勫簲鐢ㄧ粍浠 + * 涓昏鏂规硶锛 + * private void startSync() 鍚姩涓涓悓姝ュ伐浣 + * private void cancelSync() 鍙栨秷鍚屾 * public void onCreate() - * public int onStartCommand(Intent intent, int flags, int startId) service生命周期的组成部分,相当于重启service(比如在被暂停之后),而不是创建一个新的service - * public void onLowMemory() 在没有内存的情况下如果存在service则结束掉这的service + * public int onStartCommand(Intent intent, int flags, int startId) service鐢熷懡鍛ㄦ湡鐨勭粍鎴愰儴鍒嗭紝鐩稿綋浜庨噸鍚痵ervice锛堟瘮濡傚湪琚殏鍋滀箣鍚庯級锛岃屼笉鏄垱寤轰竴涓柊鐨剆ervice + * public void onLowMemory() 鍦ㄦ病鏈夊唴瀛樼殑鎯呭喌涓嬪鏋滃瓨鍦╯ervice鍒欑粨鏉熸帀杩欑殑service * public IBinder onBind() - * public void sendBroadcast(String msg) 发送同步的相关通知 + * public void sendBroadcast(String msg) 鍙戦佸悓姝ョ殑鐩稿叧閫氱煡 * public static void startSync(Activity activity) * public static void cancelSync(Context context) - * public static boolean isSyncing() 判读是否在进行同步 - * public static String getProgressString() 获取当前进度的信息 + * public static boolean isSyncing() 鍒よ鏄惁鍦ㄨ繘琛屽悓姝 + * public static String getProgressString() 鑾峰彇褰撳墠杩涘害鐨勪俊鎭 */ public class GTaskSyncService extends Service { @@ -51,7 +51,7 @@ public class GTaskSyncService extends Service { private static String mSyncProgress = ""; - //开始一个同步的工作 + //寮濮嬩竴涓悓姝ョ殑宸ヤ綔 private void startSync() { if (mSyncTask == null) { mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { @@ -62,7 +62,7 @@ public class GTaskSyncService extends Service { } }); sendBroadcast(""); - mSyncTask.execute(); //这个函数让任务是以单线程队列方式或线程池队列方式运行 + mSyncTask.execute(); //杩欎釜鍑芥暟璁╀换鍔℃槸浠ュ崟绾跨▼闃熷垪鏂瑰紡鎴栫嚎绋嬫睜闃熷垪鏂瑰紡杩愯 } } @@ -74,7 +74,7 @@ public class GTaskSyncService extends Service { } @Override - public void onCreate() { //初始化一个service + public void onCreate() { //鍒濆鍖栦竴涓猻ervice mSyncTask = null; } @@ -83,7 +83,7 @@ public class GTaskSyncService extends Service { Bundle bundle = intent.getExtras(); if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { - //两种情况,开始同步或者取消同步 + //涓ょ鎯呭喌锛屽紑濮嬪悓姝ユ垨鑰呭彇娑堝悓姝 case ACTION_START_SYNC: startSync(); break; @@ -93,7 +93,7 @@ public class GTaskSyncService extends Service { default: break; } - return START_STICKY; //等待新的intent来是这个service继续运行 + return START_STICKY; //绛夊緟鏂扮殑intent鏉ユ槸杩欎釜service缁х画杩愯 } return super.onStartCommand(intent, flags, startId); } @@ -105,26 +105,26 @@ public class GTaskSyncService extends Service { } } - public IBinder onBind(Intent intent) { //不知道干吗用的 + public IBinder onBind(Intent intent) { //涓嶇煡閬撳共鍚楃敤鐨 return null; } public void sendBroadcast(String msg) { mSyncProgress = msg; - Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //创建一个新的Intent - intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //附加INTENT中的相应参数的值 + Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); //鍒涘缓涓涓柊鐨処ntent + intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); //闄勫姞INTENT涓殑鐩稿簲鍙傛暟鐨勫 intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); - sendBroadcast(intent); //发送这个通知 + sendBroadcast(intent); //鍙戦佽繖涓氱煡 } - public static void startSync(Activity activity) {//执行一个service,service的内容里的同步动作就是开始同步 + public static void startSync(Activity activity) {//鎵ц涓涓猻ervice锛宻ervice鐨勫唴瀹归噷鐨勫悓姝ュ姩浣滃氨鏄紑濮嬪悓姝 GTaskManager.getInstance().setActivityContext(activity); Intent intent = new Intent(activity, GTaskSyncService.class); intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); activity.startService(intent); } - public static void cancelSync(Context context) {//执行一个service,service的内容里的同步动作就是取消同步 + public static void cancelSync(Context context) {//鎵ц涓涓猻ervice锛宻ervice鐨勫唴瀹归噷鐨勫悓姝ュ姩浣滃氨鏄彇娑堝悓姝 Intent intent = new Intent(context, GTaskSyncService.class); intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); context.startService(intent); diff --git a/src/Notes-master/src/net/micode/notes/model/Note.java b/src/Notes-master/src/net/micode/notes/model/Note.java index b15c11d..9e541d8 100644 --- a/src/Notes-master/src/net/micode/notes/model/Note.java +++ b/src/Notes-master/src/net/micode/notes/model/Note.java @@ -16,15 +16,15 @@ package net.micode.notes.model; -import android.content.ContentProviderOperation;//批量的更新、插入、删除数据。 -import android.content.ContentProviderResult;//操作的结果 -import android.content.ContentUris;//用于添加和获取Uri后面的ID -import android.content.ContentValues;//一种用来存储基本数据类型数据的存储机制 -import android.content.Context;//需要用该类来弄清楚调用者的实例 -import android.content.OperationApplicationException;//操作应用程序容错 -import android.net.Uri;//表示待操作的数据 -import android.os.RemoteException;//远程容错 -import android.util.Log;//输出日志,比如说出错、警告等 +import android.content.ContentProviderOperation;//鎵归噺鐨勬洿鏂般佹彃鍏ャ佸垹闄ゆ暟鎹 +import android.content.ContentProviderResult;//鎿嶄綔鐨勭粨鏋 +import android.content.ContentUris;//鐢ㄤ簬娣诲姞鍜岃幏鍙朥ri鍚庨潰鐨処D +import android.content.ContentValues;//涓绉嶇敤鏉ュ瓨鍌ㄥ熀鏈暟鎹被鍨嬫暟鎹殑瀛樺偍鏈哄埗 +import android.content.Context;//闇瑕佺敤璇ョ被鏉ュ紕娓呮璋冪敤鑰呯殑瀹炰緥 +import android.content.OperationApplicationException;//鎿嶄綔搴旂敤绋嬪簭瀹归敊 +import android.net.Uri;//琛ㄧず寰呮搷浣滅殑鏁版嵁 +import android.os.RemoteException;//杩滅▼瀹归敊 +import android.util.Log;//杈撳嚭鏃ュ織锛屾瘮濡傝鍑洪敊銆佽鍛婄瓑 public class Note { // private ContentValues mNoteDiffValues; @@ -43,17 +43,17 @@ public class Note { 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);//将数据写入数据库表格 + values.put(NoteColumns.PARENT_ID, folderId);//灏嗘暟鎹啓鍏ユ暟鎹簱琛ㄦ牸 Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); - //ContentResolver()主要是实现外部应用对ContentProvider中的数据 - //进行添加、删除、修改和查询操作 + //ContentResolver()涓昏鏄疄鐜板閮ㄥ簲鐢ㄥContentProvider涓殑鏁版嵁 + //杩涜娣诲姞銆佸垹闄ゃ佷慨鏀瑰拰鏌ヨ鎿嶄綔 long noteId = 0; try { noteId = Long.valueOf(uri.getPathSegments().get(1)); } catch (NumberFormatException e) { Log.e(TAG, "Get note id error :" + e.toString()); noteId = 0; - }//try-catch异常处理 + }//try-catch寮傚父澶勭悊 if (noteId == -1) { throw new IllegalStateException("Wrong note id:" + noteId); } @@ -63,37 +63,37 @@ public class Note { public Note() { 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()); - }//设置数据库表格的标签属性数据 + }//璁剧疆鏁版嵁搴撹〃鏍肩殑鏍囩灞炴ф暟鎹 public void setTextData(String key, String value) { mNoteData.setTextData(key, value); - }//设置数据库表格的标签文本内容的数据 + }//璁剧疆鏁版嵁搴撹〃鏍肩殑鏍囩鏂囨湰鍐呭鐨勬暟鎹 public void setTextDataId(long id) { mNoteData.setTextDataId(id); - }//设置文本数据的ID + }//璁剧疆鏂囨湰鏁版嵁鐨処D public long getTextDataId() { return mNoteData.mTextDataId; - }//得到文本数据的ID + }//寰楀埌鏂囨湰鏁版嵁鐨処D public void setCallDataId(long id) { mNoteData.setCallDataId(id); - }//设置电话号码数据的ID + }//璁剧疆鐢佃瘽鍙风爜鏁版嵁鐨処D public void setCallData(String key, String value) { mNoteData.setCallData(key, value); - }//得到电话号码数据的ID + }//寰楀埌鐢佃瘽鍙风爜鏁版嵁鐨処D public boolean isLocalModified() { return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - }//判断是否是本地修改 + }//鍒ゆ柇鏄惁鏄湰鍦颁慨鏀 public boolean syncNote(Context context, long noteId) { if (noteId <= 0) { @@ -123,16 +123,16 @@ public class Note { } return true; - }//判断数据是否同步 + }//鍒ゆ柇鏁版嵁鏄惁鍚屾 - private class NoteData {//定义一个基本的便签内容的数据类,主要包含文本数据和电话号码数据 + private class NoteData {//瀹氫箟涓涓熀鏈殑渚跨鍐呭鐨勬暟鎹被锛屼富瑕佸寘鍚枃鏈暟鎹拰鐢佃瘽鍙风爜鏁版嵁 private long mTextDataId; - private ContentValues mTextDataValues;//文本数据 + private ContentValues mTextDataValues;//鏂囨湰鏁版嵁 private long mCallDataId; - private ContentValues mCallDataValues;//电话号码数据 + private ContentValues mCallDataValues;//鐢佃瘽鍙风爜鏁版嵁 private static final String TAG = "NoteData"; @@ -142,7 +142,7 @@ public class Note { mTextDataId = 0; mCallDataId = 0; } - //下面是上述几个函数的具体实现 + //涓嬮潰鏄笂杩板嚑涓嚱鏁扮殑鍏蜂綋瀹炵幇 boolean isLocalModified() { return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; } @@ -172,17 +172,17 @@ public class Note { mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } - //下面函数的作用是将新的数据通过Uri的操作存储到数据库 + //涓嬮潰鍑芥暟鐨勪綔鐢ㄦ槸灏嗘柊鐨勬暟鎹氳繃Uri鐨勬搷浣滃瓨鍌ㄥ埌鏁版嵁搴 Uri pushIntoContentResolver(Context context, long noteId) { /** * Check for safety */ if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); - }//判断数据是否合法 + }//鍒ゆ柇鏁版嵁鏄惁鍚堟硶 ArrayList operationList = new ArrayList(); - ContentProviderOperation.Builder builder = null;//数据库的操作列表 + ContentProviderOperation.Builder builder = null;//鏁版嵁搴撶殑鎿嶄綔鍒楄〃 if(mTextDataValues.size() > 0) { mTextDataValues.put(DataColumns.NOTE_ID, noteId); @@ -204,7 +204,7 @@ public class Note { operationList.add(builder.build()); } mTextDataValues.clear(); - }//把文本数据存入DataColumns + }//鎶婃枃鏈暟鎹瓨鍏ataColumns if(mCallDataValues.size() > 0) { mCallDataValues.put(DataColumns.NOTE_ID, noteId); @@ -226,7 +226,7 @@ public class Note { operationList.add(builder.build()); } mCallDataValues.clear(); - }//把电话号码数据存入DataColumns + }//鎶婄數璇濆彿鐮佹暟鎹瓨鍏ataColumns if (operationList.size() > 0) { try { @@ -241,7 +241,7 @@ public class Note { Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); return null; } - }//存储过程中的异常处理 + }//瀛樺偍杩囩▼涓殑寮傚父澶勭悊 return null; } } diff --git a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java index cecc1fd..9c02710 100644 --- a/src/Notes-master/src/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/src/net/micode/notes/model/WorkingNote.java @@ -40,7 +40,7 @@ public class WorkingNote { private NoteSettingChangedListener mNoteSettingStatusListener; - // 声明 DATA_PROJECTION字符串数组 + // 澹版槑 DATA_PROJECTION瀛楃涓叉暟缁 public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, DataColumns.CONTENT, @@ -51,7 +51,7 @@ public class WorkingNote { DataColumns.DATA4, }; - // 声明 NOTE_PROJECTION字符串数组 + // 澹版槑 NOTE_PROJECTION瀛楃涓叉暟缁 public static final String[] NOTE_PROJECTION = new String[] { NoteColumns.PARENT_ID, NoteColumns.ALERTED_DATE, @@ -85,7 +85,7 @@ public class WorkingNote { mWidgetType = Notes.TYPE_WIDGET_INVALIDE; } - // WorkingNote的构造函数 + // WorkingNote鐨勬瀯閫犲嚱鏁 // Existing note construct private WorkingNote(Context context, long noteId, long folderId) { mContext = context; @@ -96,14 +96,14 @@ public class WorkingNote { loadNote(); } - // 加载Note - // 通过数据库调用query函数找到第一个条目 + // 鍔犺浇Note + // 閫氳繃鏁版嵁搴撹皟鐢╭uery鍑芥暟鎵惧埌绗竴涓潯鐩 private void loadNote() { Cursor cursor = mContext.getContentResolver().query( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, null, null); - // 若存在,储存相应信息 + // 鑻ュ瓨鍦紝鍌ㄥ瓨鐩稿簲淇℃伅 if (cursor != null) { if (cursor.moveToFirst()) { mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); @@ -114,7 +114,7 @@ public class WorkingNote { mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); } cursor.close(); - // 若不存在,报错 + // 鑻ヤ笉瀛樺湪锛屾姤閿 } else { Log.e(TAG, "No note with id:" + mNoteId); throw new IllegalArgumentException("Unable to find note with id " + mNoteId); @@ -122,7 +122,7 @@ public class WorkingNote { loadNoteData(); } - // 加载NoteData + // 鍔犺浇NoteData private void loadNoteData() { Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { @@ -130,8 +130,8 @@ public class WorkingNote { }, null); if (cursor != null) { - // 查到信息不为空 - if (cursor.moveToFirst()) { // 查看第一项是否存在 + // 鏌ュ埌淇℃伅涓嶄负绌 + if (cursor.moveToFirst()) { // 鏌ョ湅绗竴椤规槸鍚﹀瓨鍦 do { String type = cursor.getString(DATA_MIME_TYPE_COLUMN); if (DataConstants.NOTE.equals(type)) { @@ -143,7 +143,7 @@ public class WorkingNote { } else { Log.d(TAG, "Wrong note type with type:" + type); } - } while (cursor.moveToNext());//查阅所有项,直到为空 + } while (cursor.moveToNext());//鏌ラ槄鎵鏈夐」,鐩村埌涓虹┖ } cursor.close(); } else { @@ -152,12 +152,12 @@ public class WorkingNote { } } - // 创建空的Note - // 传参:context,文件夹id,widget,背景颜色 + // 鍒涘缓绌虹殑Note + // 浼犲弬锛歝ontext锛屾枃浠跺すid锛寃idget锛岃儗鏅鑹 public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, int widgetType, int defaultBgColorId) { WorkingNote note = new WorkingNote(context, folderId); - // 设定相关属性 + // 璁惧畾鐩稿叧灞炴 note.setBgColorId(defaultBgColorId); note.setWidgetId(widgetId); note.setWidgetType(widgetType); @@ -168,10 +168,10 @@ public class WorkingNote { return new WorkingNote(context, id, 0); } - // 保存Note + // 淇濆瓨Note public synchronized boolean saveNote() { - if (isWorthSaving()) { //是否值得保存 - if (!existInDatabase()) { // 是否存在数据库中 + if (isWorthSaving()) { //鏄惁鍊煎緱淇濆瓨 + if (!existInDatabase()) { // 鏄惁瀛樺湪鏁版嵁搴撲腑 if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { Log.e(TAG, "Create new note fail with id:" + mNoteId); return false; @@ -194,14 +194,14 @@ public class WorkingNote { } } - // 是否在数据库中存在 + // 鏄惁鍦ㄦ暟鎹簱涓瓨鍦 public boolean existInDatabase() { return mNoteId > 0; } - // 是否值得保存 + // 鏄惁鍊煎緱淇濆瓨 private boolean isWorthSaving() { - // 被删除,或(不在数据库中 内容为空),或 本地已保存过 + // 琚垹闄わ紝鎴栵紙涓嶅湪鏁版嵁搴撲腑 鍐呭涓虹┖锛夛紝鎴 鏈湴宸蹭繚瀛樿繃 if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) || (existInDatabase() && !mNote.isLocalModified())) { return false; @@ -211,13 +211,13 @@ public class WorkingNote { } - // 设置mNoteSettingStatusListener + // 璁剧疆mNoteSettingStatusListener public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { mNoteSettingStatusListener = l; } - // 设置AlertDate - // 若 mAlertDate与data不同,则更改mAlertDate并设定NoteValue + // 璁剧疆AlertDate + // 鑻 mAlertDate涓巇ata涓嶅悓锛屽垯鏇存敼mAlertDate骞惰瀹歂oteValue public void setAlertDate(long date, boolean set) { if (date != mAlertDate) { mAlertDate = date; @@ -228,20 +228,20 @@ public class WorkingNote { } } - // 设定删除标记 + // 璁惧畾鍒犻櫎鏍囪 public void markDeleted(boolean mark) { - // 设定标记 + // 璁惧畾鏍囪 mIsDeleted = mark; if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onWidgetChanged(); - // 调用mNoteSettingStatusListener的 onWidgetChanged方法 + // 璋冪敤mNoteSettingStatusListener鐨 onWidgetChanged鏂规硶 } } - // 设定背景颜色 + // 璁惧畾鑳屾櫙棰滆壊 public void setBgColorId(int id) { - if (id != mBgColorId) { //设定条件 id != mBgColorId + if (id != mBgColorId) { //璁惧畾鏉′欢 id != mBgColorId mBgColorId = id; if (mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onBackgroundColorChanged(); @@ -250,10 +250,10 @@ public class WorkingNote { } } - // 设定检查列表模式 - // 参数:mode + // 璁惧畾妫鏌ュ垪琛ㄦā寮 + // 鍙傛暟锛歮ode public void setCheckListMode(int mode) { - if (mMode != mode) { //设定条件 mMode != mode + if (mMode != mode) { //璁惧畾鏉′欢 mMode != mode if (mNoteSettingStatusListener != null) { mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); } @@ -263,107 +263,107 @@ public class WorkingNote { } - // 设定WidgetType - // 参数:type + // 璁惧畾WidgetType + // 鍙傛暟锛歵ype public void setWidgetType(int type) { - if (type != mWidgetType) {//设定条件 type != mWidgetType + if (type != mWidgetType) {//璁惧畾鏉′欢 type != mWidgetType mWidgetType = type; mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); - // 调用Note的setNoteValue方法更改WidgetType + // 璋冪敤Note鐨剆etNoteValue鏂规硶鏇存敼WidgetType } } - // 设定WidgetId - // 参数:id + // 璁惧畾WidgetId + // 鍙傛暟锛歩d public void setWidgetId(int id) { - if (id != mWidgetId) {//设定条件 id != mWidgetId + if (id != mWidgetId) {//璁惧畾鏉′欢 id != mWidgetId mWidgetId = id; mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); - // 调用Note的setNoteValue方法更改WidgetId + // 璋冪敤Note鐨剆etNoteValue鏂规硶鏇存敼WidgetId } } - // 设定WorkingTex - // 参数:更改的text + // 璁惧畾WorkingTex + // 鍙傛暟锛氭洿鏀圭殑text public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) {//设定条件 mContent, text内容不同 + if (!TextUtils.equals(mContent, text)) {//璁惧畾鏉′欢 mContent, text鍐呭涓嶅悓 mContent = text; mNote.setTextData(DataColumns.CONTENT, mContent); - // 调用Note的setTextData方法更改WorkingText + // 璋冪敤Note鐨剆etTextData鏂规硶鏇存敼WorkingText } } - // 转变mNote的CallData及CallNote信息 - // 参数:String phoneNumber, long callDate + // 杞彉mNote鐨凜allData鍙奀allNote淇℃伅 + // 鍙傛暟锛歋tring phoneNumber, long callDate 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); } - // 获取Content + // 鑾峰彇Content public String getContent() { return mContent; } - // 获取AlertDate + // 鑾峰彇AlertDate public long getAlertDate() { return mAlertDate; } - // 获取ModifiedDate + // 鑾峰彇ModifiedDate public long getModifiedDate() { return mModifiedDate; } - // 获取背景颜色来源id + // 鑾峰彇鑳屾櫙棰滆壊鏉ユ簮id public int getBgColorResId() { return NoteBgResources.getNoteBgResource(mBgColorId); } - // 获取背景颜色id + // 鑾峰彇鑳屾櫙棰滆壊id public int getBgColorId() { return mBgColorId; } - // 获取标题背景颜色id + // 鑾峰彇鏍囬鑳屾櫙棰滆壊id public int getTitleBgResId() { return NoteBgResources.getNoteTitleBgResource(mBgColorId); } - // 获取CheckListMode + // 鑾峰彇CheckListMode public int getCheckListMode() { return mMode; } - // 获取便签id + // 鑾峰彇渚跨id public long getNoteId() { return mNoteId; } - // 获取文件夹id + // 鑾峰彇鏂囦欢澶筰d public long getFolderId() { return mFolderId; } - // 获取WidgetId + // 鑾峰彇WidgetId public int getWidgetId() { return mWidgetId; } - // 获取WidgetType + // 鑾峰彇WidgetType public int getWidgetType() { return mWidgetType; } - // 创建接口 NoteSettingChangedListener,便签更新监视 - // 为NoteEditActivity提供接口 - // 提供函数有 + // 鍒涘缓鎺ュ彛 NoteSettingChangedListener,渚跨鏇存柊鐩戣 + // 涓篘oteEditActivity鎻愪緵鎺ュ彛 + // 鎻愪緵鍑芥暟鏈 public interface NoteSettingChangedListener { /** * Called when the background color of current note has just changed diff --git a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java index 740fdbb..f97e027 100644 --- a/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/BackupUtils.java @@ -19,14 +19,14 @@ package net.micode.notes.tool; public class BackupUtils { private static final String TAG = "BackupUtils"; // Singleton stuff - private static BackupUtils sInstance; //类里面为什么可以定义自身类的对象? + private static BackupUtils sInstance; //绫婚噷闈负浠涔堝彲浠ュ畾涔夎嚜韬被鐨勫璞★紵 public static synchronized BackupUtils getInstance(Context context) { - //ynchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A) - //运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。 - //它包括两种用法:synchronized 方法和 synchronized 块。 + //ynchronized 鍏抽敭瀛楋紝浠h〃杩欎釜鏂规硶鍔犻攣,鐩稿綋浜庝笉绠″摢涓涓嚎绋嬶紙渚嬪绾跨▼A锛 + //杩愯鍒拌繖涓柟娉曟椂,閮借妫鏌ユ湁娌℃湁鍏跺畠绾跨▼B锛堟垨鑰匔銆 D绛夛級姝e湪鐢ㄨ繖涓柟娉(鎴栬呰绫荤殑鍏朵粬鍚屾鏂规硶)锛屾湁鐨勮瘽瑕佺瓑姝e湪浣跨敤synchronized鏂规硶鐨勭嚎绋婤锛堟垨鑰匔 銆丏锛夎繍琛屽畬杩欎釜鏂规硶鍚庡啀杩愯姝ょ嚎绋婣,娌℃湁鐨勮瘽,閿佸畾璋冪敤鑰,鐒跺悗鐩存帴杩愯銆 + //瀹冨寘鎷袱绉嶇敤娉曪細synchronized 鏂规硶鍜 synchronized 鍧椼 if (sInstance == null) { - //如果当前备份不存在,则新声明一个 + //濡傛灉褰撳墠澶囦唤涓嶅瓨鍦紝鍒欐柊澹版槑涓涓 sInstance = new BackupUtils(context); } return sInstance; @@ -36,24 +36,24 @@ public class BackupUtils { * Following states are signs to represents backup or restore * status */ - // Currently, the sdcard is not mounted SD卡没有被装入手机 + // Currently, the sdcard is not mounted SD鍗℃病鏈夎瑁呭叆鎵嬫満 public static final int STATE_SD_CARD_UNMOUONTED = 0; - // The backup file not exist 备份文件夹不存在 + // The backup file not exist 澶囦唤鏂囦欢澶逛笉瀛樺湪 public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; - // The data is not well formated, may be changed by other programs 数据已被破坏,可能被修改 + // The data is not well formated, may be changed by other programs 鏁版嵁宸茶鐮村潖锛屽彲鑳借淇敼 public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails 超时异常 + // Some run-time exception which causes restore or backup fails 瓒呮椂寮傚父 public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success 成功存储 + // Backup or restore success 鎴愬姛瀛樺偍 public static final int STATE_SUCCESS = 4; private TextExport mTextExport; - private BackupUtils(Context context) { //初始化函数 + private BackupUtils(Context context) { //鍒濆鍖栧嚱鏁 mTextExport = new TextExport(context); } - private static boolean externalStorageAvailable() { //外部存储功能是否可用 + private static boolean externalStorageAvailable() { //澶栭儴瀛樺偍鍔熻兘鏄惁鍙敤 return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } @@ -112,11 +112,11 @@ public class BackupUtils { public TextExport(Context context) { TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); mContext = context; - mFileName = ""; //为什么为空? + mFileName = ""; //涓轰粈涔堜负绌? mFileDirectory = ""; } - private String getFormat(int id) { //获取文本的组成部分 + private String getFormat(int id) { //鑾峰彇鏂囨湰鐨勭粍鎴愰儴鍒 return TEXT_FORMAT[id]; } @@ -124,7 +124,7 @@ public class BackupUtils { * Export the folder identified by folder id to text */ private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder 通过查询parent id是文件夹id的note来选出制定ID文件夹下的Note + // Query notes belong to this folder 閫氳繃鏌ヨparent id鏄枃浠跺すid鐨刵ote鏉ラ夊嚭鍒跺畾ID鏂囦欢澶逛笅鐨凬ote Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { folderId @@ -133,13 +133,13 @@ public class BackupUtils { if (notesCursor != null) { if (notesCursor.moveToFirst()) { do { - // Print note's last modified date ps里面保存有这份note的日期 + // Print note's last modified date ps閲岄潰淇濆瓨鏈夎繖浠絥ote鐨勬棩鏈 ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( mContext.getString(R.string.format_datetime_mdhm), notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); // Query data belong to this note String noteId = notesCursor.getString(NOTE_COLUMN_ID); - exportNoteToText(noteId, ps); //将文件导出到text + exportNoteToText(noteId, ps); //灏嗘枃浠跺鍑哄埌text } while (notesCursor.moveToNext()); } notesCursor.close(); @@ -155,7 +155,7 @@ public class BackupUtils { noteId }, null); - if (dataCursor != null) { //利用光标来扫描内容,区别为callnote和note两种,靠ps.printline输出 + if (dataCursor != null) { //鍒╃敤鍏夋爣鏉ユ壂鎻忓唴瀹癸紝鍖哄埆涓篶allnote鍜宯ote涓ょ锛岄潬ps.printline杈撳嚭 if (dataCursor.moveToFirst()) { do { String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); @@ -165,7 +165,7 @@ public class BackupUtils { long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); String location = dataCursor.getString(DATA_COLUMN_CONTENT); - if (!TextUtils.isEmpty(phoneNumber)) { //判断是否为空字符 + if (!TextUtils.isEmpty(phoneNumber)) { //鍒ゆ柇鏄惁涓虹┖瀛楃 ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), phoneNumber)); } @@ -202,7 +202,7 @@ public class BackupUtils { /** * Note will be exported as text which is user readable */ - public int exportToText() { //总函数,调用上面的exportFolder和exportNote + public int exportToText() { //鎬诲嚱鏁帮紝璋冪敤涓婇潰鐨別xportFolder鍜宔xportNote if (!externalStorageAvailable()) { Log.d(TAG, "Media was not mounted"); return STATE_SD_CARD_UNMOUONTED; @@ -213,7 +213,7 @@ public class BackupUtils { Log.e(TAG, "get print stream error"); return STATE_SYSTEM_ERROR; } - // First export folder and its notes 导出文件夹,就是导出里面包含的便签 + // First export folder and its notes 瀵煎嚭鏂囦欢澶癸紝灏辨槸瀵煎嚭閲岄潰鍖呭惈鐨勪究绛 Cursor folderCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -241,7 +241,7 @@ public class BackupUtils { folderCursor.close(); } - // Export notes in root's folder 将根目录里的便签导出(由于不属于任何文件夹,因此无法通过文件夹导出来实现这一部分便签的导出) + // Export notes in root's folder 灏嗘牴鐩綍閲岀殑渚跨瀵煎嚭锛堢敱浜庝笉灞炰簬浠讳綍鏂囦欢澶癸紝鍥犳鏃犳硶閫氳繃鏂囦欢澶瑰鍑烘潵瀹炵幇杩欎竴閮ㄥ垎渚跨鐨勫鍑猴級 Cursor noteCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -281,7 +281,7 @@ public class BackupUtils { PrintStream ps = null; try { FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); //将ps输出流输出到特定的文件,目的就是导出到文件,而不是直接输出 + ps = new PrintStream(fos); //灏唒s杈撳嚭娴佽緭鍑哄埌鐗瑰畾鐨勬枃浠讹紝鐩殑灏辨槸瀵煎嚭鍒版枃浠讹紝鑰屼笉鏄洿鎺ヨ緭鍑 } catch (FileNotFoundException e) { e.printStackTrace(); return null; @@ -298,16 +298,16 @@ public class BackupUtils { */ private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); //外部(SD卡)的存储路径 - sb.append(context.getString(filePathResId)); //文件的存储路径 - File filedir = new File(sb.toString()); //filedir应该就是用来存储路径信息 + sb.append(Environment.getExternalStorageDirectory()); //澶栭儴锛圫D鍗★級鐨勫瓨鍌ㄨ矾寰 + sb.append(context.getString(filePathResId)); //鏂囦欢鐨勫瓨鍌ㄨ矾寰 + File filedir = new File(sb.toString()); //filedir搴旇灏辨槸鐢ㄦ潵瀛樺偍璺緞淇℃伅 sb.append(context.getString( fileNameFormatResId, DateFormat.format(context.getString(R.string.format_date_ymd), System.currentTimeMillis()))); File file = new File(sb.toString()); - try { //如果这些文件不存在,则新建 + try { //濡傛灉杩欎簺鏂囦欢涓嶅瓨鍦紝鍒欐柊寤 if (!filedir.exists()) { filedir.mkdir(); } @@ -320,7 +320,7 @@ public class BackupUtils { } catch (IOException e) { e.printStackTrace(); } -// try catch 异常处理 +// try catch 寮傚父澶勭悊 return null; } } diff --git a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java index 595ea45..efdf24e 100644 --- a/src/Notes-master/src/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/DataUtils.java @@ -18,7 +18,7 @@ package net.micode.notes.tool; public class DataUtils { public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { //直接删除多个笔记 + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { //鐩存帴鍒犻櫎澶氫釜绗旇 if (ids == null) { Log.d(TAG, "the ids is null"); return true; @@ -28,19 +28,19 @@ public class DataUtils { return true; } - ArrayList operationList = new ArrayList(); //提供一个任务列表 + ArrayList operationList = new ArrayList(); //鎻愪緵涓涓换鍔″垪琛 for (long id : ids) { if(id == Notes.ID_ROOT_FOLDER) { Log.e(TAG, "Don't delete system folder root"); continue; - } //如果发现是根文件夹,则不删除 + } //濡傛灉鍙戠幇鏄牴鏂囦欢澶癸紝鍒欎笉鍒犻櫎 ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //用newDelete实现删除功能 + .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //鐢╪ewDelete瀹炵幇鍒犻櫎鍔熻兘 operationList.add(builder.build()); // } try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。 - //数据库事务,数据库事务是由一组数据库操作序列组成,事务作为一个整体被执行 + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);//涓绘満鍚嶏紙鎴栧彨Authority锛夌敤浜庡敮涓鏍囪瘑杩欎釜ContentProvider锛屽閮ㄨ皟鐢ㄨ呭彲浠ユ牴鎹繖涓爣璇嗘潵鎵惧埌瀹冦 + //鏁版嵁搴撲簨鍔★紝鏁版嵁搴撲簨鍔℃槸鐢变竴缁勬暟鎹簱鎿嶄綔搴忓垪缁勬垚锛屼簨鍔′綔涓轰竴涓暣浣撹鎵ц if (results == null || results.length == 0 || results[0] == null) { Log.d(TAG, "delete notes failed, ids:" + ids.toString()); return false; @@ -59,7 +59,7 @@ public class DataUtils { values.put(NoteColumns.PARENT_ID, desFolderId); values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); //对需要移动的便签进行数据更新,然后用update实现 + resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); //瀵归渶瑕佺Щ鍔ㄧ殑渚跨杩涜鏁版嵁鏇存柊锛岀劧鍚庣敤update瀹炵幇 } public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, @@ -72,14 +72,14 @@ public class DataUtils { ArrayList operationList = new ArrayList(); for (long id : ids) { ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //通过withAppendedId方法,为该Uri加上ID + .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); //閫氳繃withAppendedId鏂规硶锛屼负璇ri鍔犱笂ID builder.withValue(NoteColumns.PARENT_ID, folderId); builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); operationList.add(builder.build()); - }//将ids里包含的每一列的数据逐次加入到operationList中,等待最后的批量处理 + }//灏唅ds閲屽寘鍚殑姣忎竴鍒楃殑鏁版嵁閫愭鍔犲叆鍒皁perationList涓紝绛夊緟鏈鍚庣殑鎵归噺澶勭悊 try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch一次性处理一个操作列表 + ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); //applyBatch涓娆℃у鐞嗕竴涓搷浣滃垪琛 if (results == null || results.length == 0 || results[0] == null) { Log.d(TAG, "delete notes failed, ids:" + ids.toString()); return false; @@ -101,7 +101,7 @@ public class DataUtils { new String[] { "COUNT(*)" }, NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); //筛选条件:源文件不为trash folder + null); //绛涢夋潯浠讹細婧愭枃浠朵笉涓簍rash folder int count = 0; if(cursor != null) { @@ -119,15 +119,15 @@ public class DataUtils { } public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), //通过withAppendedId方法,为该Uri加上ID + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), //閫氳繃withAppendedId鏂规硶锛屼负璇ri鍔犱笂ID null, NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, new String [] {String.valueOf(type)}, - null); //查询条件:type符合,且不属于垃圾文件夹 + null); //鏌ヨ鏉′欢锛歵ype绗﹀悎锛屼笖涓嶅睘浜庡瀮鍦炬枃浠跺す boolean exist = false; if (cursor != null) { - if (cursor.getCount() > 0) {//用getcount函数判断cursor是否为空 + if (cursor.getCount() > 0) {//鐢╣etcount鍑芥暟鍒ゆ柇cursor鏄惁涓虹┖ exist = true; } cursor.close(); @@ -169,7 +169,7 @@ public class DataUtils { " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + " AND " + NoteColumns.SNIPPET + "=?", new String[] { name }, null); - //通过名字查询文件是否存在 + //閫氳繃鍚嶅瓧鏌ヨ鏂囦欢鏄惁瀛樺湪 boolean exist = false; if(cursor != null) { if(cursor.getCount() > 0) { @@ -185,7 +185,7 @@ public class DataUtils { new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, NoteColumns.PARENT_ID + "=?", new String[] { String.valueOf(folderId) }, - null); //查询条件:父ID是传入的folderId; + null); //鏌ヨ鏉′欢锛氱埗ID鏄紶鍏ョ殑folderId; HashSet set = null; if (c != null) { @@ -194,13 +194,13 @@ public class DataUtils { do { try { AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); //0对应的NoteColumns.WIDGET_ID - widget.widgetType = c.getInt(1); //1对应的NoteColumns.WIDGET_TYPE + widget.widgetId = c.getInt(0); //0瀵瑰簲鐨凬oteColumns.WIDGET_ID + widget.widgetType = c.getInt(1); //1瀵瑰簲鐨凬oteColumns.WIDGET_TYPE set.add(widget); } catch (IndexOutOfBoundsException e) { Log.e(TAG, e.toString()); } - } while (c.moveToNext()); //查询下一条 + } while (c.moveToNext()); //鏌ヨ涓嬩竴鏉 } c.close(); } @@ -233,12 +233,12 @@ public class DataUtils { + CallNote.PHONE_NUMBER + ",?)", new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, null); - //通过数据库操作,查询条件是(callDate和phoneNumber匹配传入参数的值) + //閫氳繃鏁版嵁搴撴搷浣滐紝鏌ヨ鏉′欢鏄紙callDate鍜宲honeNumber鍖归厤浼犲叆鍙傛暟鐨勫硷級 if (cursor != null) { if (cursor.moveToFirst()) { try { - return cursor.getLong(0); //0对应的CallNote.NOTE_ID + return cursor.getLong(0); //0瀵瑰簲鐨凜allNote.NOTE_ID } catch (IndexOutOfBoundsException e) { Log.e(TAG, "Get call note id fails " + e.toString()); } @@ -253,7 +253,7 @@ public class DataUtils { new String [] { NoteColumns.SNIPPET }, NoteColumns.ID + "=?", new String [] { String.valueOf(noteId)}, - null);//查询条件:noteId + null);//鏌ヨ鏉′欢锛歯oteId if (cursor != null) { String snippet = ""; @@ -265,7 +265,7 @@ public class DataUtils { } throw new IllegalArgumentException("Note is not found with id: " + noteId); } - public static String getFormattedSnippet(String snippet) { //对字符串进行格式处理,将字符串两头的空格去掉,同时将换行符去掉 + public static String getFormattedSnippet(String snippet) { //瀵瑰瓧绗︿覆杩涜鏍煎紡澶勭悊锛屽皢瀛楃涓蹭袱澶寸殑绌烘牸鍘绘帀锛屽悓鏃跺皢鎹㈣绗﹀幓鎺 if (snippet != null) { snippet = snippet.trim(); int index = snippet.indexOf('\n'); diff --git a/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java b/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java index dfc1ac6..ffbfa07 100644 --- a/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java +++ b/src/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java @@ -14,10 +14,10 @@ * limitations under the License. */ -//简介:定义了很多的静态字符串,目的就是为了提供jsonObject中相应字符串的"key"。把这些静态的定义单独写到了一个类里面,这是非常好的编程规范 +//绠浠嬶細瀹氫箟浜嗗緢澶氱殑闈欐佸瓧绗︿覆锛岀洰鐨勫氨鏄负浜嗘彁渚沯sonObject涓浉搴斿瓧绗︿覆鐨"key"銆傛妸杩欎簺闈欐佺殑瀹氫箟鍗曠嫭鍐欏埌浜嗕竴涓被閲岄潰锛岃繖鏄潪甯稿ソ鐨勭紪绋嬭鑼 package net.micode.notes.tool; -//这个类就是定义了一堆static string,实际就是为jsonObject提供Key,把这些定义全部写到一个类里,方便查看管理,是一个非常好的编程习惯 +//杩欎釜绫诲氨鏄畾涔変簡涓鍫唖tatic string锛屽疄闄呭氨鏄负jsonObject鎻愪緵Key锛屾妸杩欎簺瀹氫箟鍏ㄩ儴鍐欏埌涓涓被閲岋紝鏂逛究鏌ョ湅绠$悊锛屾槸涓涓潪甯稿ソ鐨勭紪绋嬩範鎯 public class GTaskStringUtils { public final static String GTASK_JSON_ACTION_ID = "action_id"; diff --git a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java index e1846a3..145497e 100644 --- a/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java +++ b/src/Notes-master/src/net/micode/notes/tool/ResourceParser.java @@ -16,19 +16,19 @@ package net.micode.notes.tool; -/*简介:字面意义是资源分析器,实际上就是获取资源并且在程序中使用,比如颜色图片等 - * 实现方法:主要利用R.java这个类,其中包括 - * R.id 组件资源引用 - * R.drawable 图片资源 (被使用) - * R.layout 布局资源 - * R.menu 菜单资源 - * R.String 文字资源 - * R.style 主题资源 (被使用) - * 在按顺序设置好相应的id后,就可以编写简单的getXXX函数获取需要的资源 +/*绠浠嬶細瀛楅潰鎰忎箟鏄祫婧愬垎鏋愬櫒锛屽疄闄呬笂灏辨槸鑾峰彇璧勬簮骞朵笖鍦ㄧ▼搴忎腑浣跨敤锛屾瘮濡傞鑹插浘鐗囩瓑 + * 瀹炵幇鏂规硶锛氫富瑕佸埄鐢≧.java杩欎釜绫伙紝鍏朵腑鍖呮嫭 + * R.id 缁勪欢璧勬簮寮曠敤 + * R.drawable 鍥剧墖璧勬簮 锛堣浣跨敤锛 + * R.layout 甯冨眬璧勬簮 + * R.menu 鑿滃崟璧勬簮 + * R.String 鏂囧瓧璧勬簮 + * R.style 涓婚璧勬簮 锛堣浣跨敤锛 + * 鍦ㄦ寜椤哄簭璁剧疆濂界浉搴旂殑id鍚庯紝灏卞彲浠ョ紪鍐欑畝鍗曠殑getXXX鍑芥暟鑾峰彇闇瑕佺殑璧勬簮 * - * 特殊的变量 : - * @BG_DEFAULT_COLOR 默认背景颜色(黄) - * BG_DEFAULT_FONT_SIZE 默认文本大小(中) + * 鐗规畩鐨勫彉閲 锛 + * @BG_DEFAULT_COLOR 榛樿鑳屾櫙棰滆壊锛堥粍锛 + * BG_DEFAULT_FONT_SIZE 榛樿鏂囨湰澶у皬锛堜腑锛 */ public class ResourceParser { @@ -73,7 +73,7 @@ public class ResourceParser { return BG_EDIT_TITLE_RESOURCES[id]; } } - //直接获取默认的背景颜色。看不太懂,这个PREFERENCE_SET_BG_COLOR_KEY是个final string,也就是说getBoolean肯定执行else,为什么要这么写 + //鐩存帴鑾峰彇榛樿鐨勮儗鏅鑹层傜湅涓嶅お鎳傦紝杩欎釜PREFERENCE_SET_BG_COLOR_KEY鏄釜final string,涔熷氨鏄getBoolean鑲畾鎵цelse锛屼负浠涔堣杩欎箞鍐 public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { @@ -171,7 +171,7 @@ public class ResourceParser { R.style.TextAppearanceSuper }; - //这里有一个容错的函数,防止输入的id大于资源总量,若如此,则自动返回默认的设置结果 + //杩欓噷鏈変竴涓閿欑殑鍑芥暟锛岄槻姝㈣緭鍏ョ殑id澶т簬璧勬簮鎬婚噺锛岃嫢濡傛锛屽垯鑷姩杩斿洖榛樿鐨勮缃粨鏋 public static int getTexAppearanceResource(int id) { /** * HACKME: Fix bug of store the resource id in shared preference. diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java index 7fc5aec..af5df76 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -40,44 +40,44 @@ import net.micode.notes.tool.DataUtils; import java.io.IOException; public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; //文本在数据库存储中的ID号 - private String mSnippet; //闹钟提示时出现的文本片段 + private long mNoteId; //鏂囨湰鍦ㄦ暟鎹簱瀛樺偍涓殑ID鍙 + private String mSnippet; //闂归挓鎻愮ず鏃跺嚭鐜扮殑鏂囨湰鐗囨 private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 - //onsaveInstanceState方法是用来保存Activity的状态的 - //能从onCreate的参数savedInsanceState中获得状态数据 + //Bundle绫诲瀷鐨勬暟鎹笌Map绫诲瀷鐨勬暟鎹浉浼硷紝閮芥槸浠ey-value鐨勫舰寮忓瓨鍌ㄦ暟鎹殑 + //onsaveInstanceState鏂规硶鏄敤鏉ヤ繚瀛楢ctivity鐨勭姸鎬佺殑 + //鑳戒粠onCreate鐨勫弬鏁皊avedInsanceState涓幏寰楃姸鎬佹暟鎹 requestWindowFeature(Window.FEATURE_NO_TITLE); - //界面显示——无标题 + //鐣岄潰鏄剧ず鈥斺旀棤鏍囬 final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); if (!isScreenOn()) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - //保持窗体点亮 + //淇濇寔绐椾綋鐐逛寒 | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - //将窗体点亮 + //灏嗙獥浣撶偣浜 | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON - //允许窗体点亮时锁屏 + //鍏佽绐椾綋鐐逛寒鏃堕攣灞 | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - }//在手机锁屏后如果到了闹钟提示时间,点亮屏幕 + }//鍦ㄦ墜鏈洪攣灞忓悗濡傛灉鍒颁簡闂归挓鎻愮ず鏃堕棿锛岀偣浜睆骞 Intent intent = getIntent(); try { mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); - //根据ID从数据库中获取标签的内容; - //getContentResolver()是实现数据共享,实例存储。 + //鏍规嵁ID浠庢暟鎹簱涓幏鍙栨爣绛剧殑鍐呭锛 + //getContentResolver锛堬級鏄疄鐜版暟鎹叡浜紝瀹炰緥瀛樺偍銆 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; - //判断标签片段是否达到符合长度 + //鍒ゆ柇鏍囩鐗囨鏄惁杈惧埌绗﹀悎闀垮害 } catch (IllegalArgumentException e) { e.printStackTrace(); return; @@ -85,35 +85,35 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD /* try { - // 代码区 + // 浠g爜鍖 } catch(Exception e) { - // 异常处理 + // 寮傚父澶勭悊 } - 代码区如果有错误,就会返回所写异常的处理。*/ + 浠g爜鍖哄鏋滄湁閿欒锛屽氨浼氳繑鍥炴墍鍐欏紓甯哥殑澶勭悊銆*/ mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); - //弹出对话框 + //寮瑰嚭瀵硅瘽妗 playAlarmSound(); - //闹钟提示音激发 + //闂归挓鎻愮ず闊虫縺鍙 } else { finish(); - //完成闹钟动作 + //瀹屾垚闂归挓鍔ㄤ綔 } } private boolean isScreenOn() { - //判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 + //鍒ゆ柇灞忓箷鏄惁閿佸睆锛岃皟鐢ㄧ郴缁熷嚱鏁板垽鏂紝鏈鍚庤繑鍥炲兼槸甯冨皵绫诲瀷 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } private void playAlarmSound() { - //闹钟提示音激发 + //闂归挓鎻愮ず闊虫縺鍙 Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - //调用系统的铃声管理URI,得到闹钟提示音 + //璋冪敤绯荤粺鐨勯搩澹扮鐞哢RI锛屽緱鍒伴椆閽熸彁绀洪煶 int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); @@ -124,19 +124,19 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); - //方法:setDataSource(Context context, Uri uri) - //解释:无返回值,设置多媒体数据来源【根据 Uri】 + //鏂规硶锛歴etDataSource(Context context, Uri uri) + //瑙i噴锛氭棤杩斿洖鍊硷紝璁剧疆澶氬獟浣撴暟鎹潵婧愩愭牴鎹 Uri銆 mPlayer.prepare(); - //准备同步 + //鍑嗗鍚屾 mPlayer.setLooping(true); - //设置是否循环播放 + //璁剧疆鏄惁寰幆鎾斁 mPlayer.start(); - //开始播放 + //寮濮嬫挱鏀 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); - //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 - //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 + //e.printStackTrace()鍑芥暟鍔熻兘鏄姏鍑哄紓甯革紝 杩樺皢鏄剧ず鍑烘洿娣辩殑璋冪敤淇℃伅 + //System.out.println(e)锛岃繖涓柟娉曟墦鍗板嚭寮傚父锛屽苟涓旇緭鍑哄湪鍝噷鍑虹幇鐨勫紓甯 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -151,57 +151,57 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); - //AlertDialog的构造方法全部是Protected的 - //所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 - //要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 - //如这里的dialog就是新建了一个AlertDialog + //AlertDialog鐨勬瀯閫犳柟娉曞叏閮ㄦ槸Protected鐨 + //鎵浠ヤ笉鑳界洿鎺ラ氳繃new涓涓狝lertDialog鏉ュ垱寤哄嚭涓涓狝lertDialog銆 + //瑕佸垱寤轰竴涓狝lertDialog锛屽氨瑕佺敤鍒癆lertDialog.Builder涓殑create()鏂规硶 + //濡傝繖閲岀殑dialog灏辨槸鏂板缓浜嗕竴涓狝lertDialog dialog.setTitle(R.string.app_name); - //为对话框设置标题 + //涓哄璇濇璁剧疆鏍囬 dialog.setMessage(mSnippet); - //为对话框设置内容 + //涓哄璇濇璁剧疆鍐呭 dialog.setPositiveButton(R.string.notealert_ok, this); - //给对话框添加"Yes"按钮 + //缁欏璇濇娣诲姞"Yes"鎸夐挳 if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); - }//对话框添加"No"按钮 + }//瀵硅瘽妗嗘坊鍔"No"鎸夐挳 dialog.show().setOnDismissListener(this); } public void onClick(DialogInterface dialog, int which) { switch (which) { - //用which来选择click后下一步的操作 + //鐢╳hich鏉ラ夋嫨click鍚庝笅涓姝ョ殑鎿嶄綔 case DialogInterface.BUTTON_NEGATIVE: - //这是取消操作 + //杩欐槸鍙栨秷鎿嶄綔 Intent intent = new Intent(this, NoteEditActivity.class); - //实现两个类间的数据传输 + //瀹炵幇涓や釜绫婚棿鐨勬暟鎹紶杈 intent.setAction(Intent.ACTION_VIEW); - //设置动作属性 + //璁剧疆鍔ㄤ綔灞炴 intent.putExtra(Intent.EXTRA_UID, mNoteId); - //实现key-value对 - //EXTRA_UID为key;mNoteId为键 + //瀹炵幇key-value瀵 + //EXTRA_UID涓簁ey锛沵NoteId涓洪敭 startActivity(intent); - //开始动作 + //寮濮嬪姩浣 break; default: - //这是确定操作 + //杩欐槸纭畾鎿嶄綔 break; } } public void onDismiss(DialogInterface dialog) { - //忽略 + //蹇界暐 stopAlarmSound(); - //停止闹钟声音 + //鍋滄闂归挓澹伴煶 finish(); - //完成该动作 + //瀹屾垚璇ュ姩浣 } private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); - //停止播放 + //鍋滄鎾斁 mPlayer.release(); - //释放MediaPlayer对象 + //閲婃斁MediaPlayer瀵硅薄 mPlayer = null; } } diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java index 16951b9..fa75f11 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java @@ -34,22 +34,22 @@ public class AlarmInitReceiver extends BroadcastReceiver { NoteColumns.ID, NoteColumns.ALERTED_DATE }; - //对数据库的操作,调用标签ID和闹钟时间 + //瀵规暟鎹簱鐨勬搷浣滐紝璋冪敤鏍囩ID鍜岄椆閽熸椂闂 private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; @Override public void onReceive(Context context, Intent intent) { long currentDate = System.currentTimeMillis(); - //System.currentTimeMillis()产生一个当前的毫秒 - //这个毫秒其实就是自1970年1月1日0时起的毫秒数 + //System.currentTimeMillis()浜х敓涓涓綋鍓嶇殑姣 + //杩欎釜姣鍏跺疄灏辨槸鑷1970骞1鏈1鏃0鏃惰捣鐨勬绉掓暟 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, - //将long变量currentDate转化为字符串 + //灏唋ong鍙橀噺currentDate杞寲涓哄瓧绗︿覆 null); - //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 + //Cursor鍦ㄨ繖閲岀殑浣滅敤鏄氳繃鏌ユ壘鏁版嵁搴撲腑鐨勬爣绛惧唴瀹癸紝鎵惧埌鍜屽綋鍓嶇郴缁熸椂闂寸浉绛夌殑鏍囩 if (c != null) { if (c.moveToFirst()) { @@ -65,8 +65,8 @@ public class AlarmInitReceiver extends BroadcastReceiver { } c.close(); } - //然而通过网上查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤 - //如新建Intent、PendingIntent以及AlarmManager等 - //这里就是根据数据库里的闹钟时间创建一个闹钟机制 + //鐒惰岄氳繃缃戜笂鏌ユ壘璧勬枡鍙戠幇锛屽浜庨椆閽熸満鍒剁殑鍚姩锛岄氬父闇瑕佷笂闈㈢殑鍑犱釜姝ラ + //濡傛柊寤篒ntent銆丳endingIntent浠ュ強AlarmManager绛 + //杩欓噷灏辨槸鏍规嵁鏁版嵁搴撻噷鐨勯椆閽熸椂闂村垱寤轰竴涓椆閽熸満鍒 } } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java b/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java index eb4b388..59f1eb3 100644 --- a/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java +++ b/src/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java @@ -24,13 +24,13 @@ public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { intent.setClass(context, AlarmAlertActivity.class); - //启动AlarmAlertActivity + //鍚姩AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 - //所以要新起一个栈装入启动的activity + //activity瑕佸瓨鍦ㄤ簬activity鐨勬爤涓紝鑰岄潪activity鐨勯斿緞鍚姩activity鏃跺繀鐒朵笉瀛樺湪涓涓猘ctivity鐨勬爤 + //鎵浠ヨ鏂拌捣涓涓爤瑁呭叆鍚姩鐨刟ctivity context.startActivity(intent); } } -//这是实现alarm这个功能最接近用户层的包,基于上面的两个包, -//作用还需要深究但是对于setClass和addFlags的 +//杩欐槸瀹炵幇alarm杩欎釜鍔熻兘鏈鎺ヨ繎鐢ㄦ埛灞傜殑鍖咃紝鍩轰簬涓婇潰鐨勪袱涓寘锛 +//浣滅敤杩橀渶瑕佹繁绌朵絾鏄浜巗etClass鍜宎ddFlags鐨 \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java index e00be38..4def445 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java +++ b/src/Notes-master/src/net/micode/notes/ui/DateTimePicker.java @@ -29,8 +29,8 @@ import android.widget.FrameLayout; import android.widget.NumberPicker; public class DateTimePicker extends FrameLayout { - //FrameLayout是布局模板之一 - //所有的子元素全部在屏幕的右上方 + //FrameLayout鏄竷灞妯℃澘涔嬩竴 + //鎵鏈夌殑瀛愬厓绱犲叏閮ㄥ湪灞忓箷鐨勫彸涓婃柟 private static final boolean DEFAULT_ENABLE_STATE = true; private static final int HOURS_IN_HALF_DAY = 12; @@ -46,15 +46,15 @@ public class DateTimePicker extends FrameLayout { private static final int MINUT_SPINNER_MAX_VAL = 59; private static final int AMPM_SPINNER_MIN_VAL = 0; private static final int AMPM_SPINNER_MAX_VAL = 1; - //初始化控件 + //鍒濆鍖栨帶浠 private final NumberPicker mDateSpinner; private final NumberPicker mHourSpinner; private final NumberPicker mMinuteSpinner; private final NumberPicker mAmPmSpinner; - //NumberPicker是数字选择器 - //这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午) + //NumberPicker鏄暟瀛楅夋嫨鍣 + //杩欓噷瀹氫箟鐨勫洓涓彉閲忓叏閮ㄦ槸鍦ㄨ缃椆閽熸椂闇瑕侀夋嫨鐨勫彉閲忥紙濡傛棩鏈熴佹椂銆佸垎銆佷笂鍗堟垨鑰呬笅鍗堬級 private Calendar mDate; - //定义了Calendar类型的变量mDate,用于操作时间 + //瀹氫箟浜咰alendar绫诲瀷鐨勫彉閲弇Date锛岀敤浜庢搷浣滄椂闂 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; private boolean mIsAm; @@ -74,49 +74,49 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - };//OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 - //将现在日期的值传递给mDate;updateDateControl是同步操作 + };//OnValueChangeListener锛岃繖鏄椂闂存敼鍙樼洃鍚櫒锛岃繖閲屼富瑕佹槸瀵规棩鏈熺殑鐩戝惉 + //灏嗙幇鍦ㄦ棩鏈熺殑鍊间紶閫掔粰mDate锛泆pdateDateControl鏄悓姝ユ搷浣 private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - //这里是对 小时(Hour) 的监听 + //杩欓噷鏄 灏忔椂锛圚our锛 鐨勭洃鍚 @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); - //声明一个Calendar的变量cal,便于后续的操作 + //澹版槑涓涓狢alendar鐨勫彉閲廲al锛屼究浜庡悗缁殑鎿嶄綔 if (!mIs24HourView) { if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; - //这里是对于12小时制时,晚上11点和12点交替时对日期的更改 + //杩欓噷鏄浜12灏忔椂鍒舵椂锛屾櫄涓11鐐瑰拰12鐐逛氦鏇挎椂瀵规棩鏈熺殑鏇存敼 } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 + //杩欓噷鏄浜12灏忔椂鍒舵椂锛屽噷鏅11鐐瑰拰12鐐逛氦鏇挎椂瀵规棩鏈熺殑鏇存敼 if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { mIsAm = !mIsAm; updateAmPmControl(); - }//这里是对于12小时制时,中午11点和12点交替时对AM和PM的更改 + }//杩欓噷鏄浜12灏忔椂鍒舵椂锛屼腑鍗11鐐瑰拰12鐐逛氦鏇挎椂瀵笰M鍜孭M鐨勬洿鏀 } else { if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; - //这里是对于24小时制时,晚上11点和12点交替时对日期的更改 + //杩欓噷鏄浜24灏忔椂鍒舵椂锛屾櫄涓11鐐瑰拰12鐐逛氦鏇挎椂瀵规棩鏈熺殑鏇存敼 } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - } //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 + } //杩欓噷鏄浜12灏忔椂鍒舵椂锛屽噷鏅11鐐瑰拰12鐐逛氦鏇挎椂瀵规棩鏈熺殑鏇存敼 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); - //通过数字选择器对newHour的赋值 + //閫氳繃鏁板瓧閫夋嫨鍣ㄥnewHour鐨勮祴鍊 mDate.set(Calendar.HOUR_OF_DAY, newHour); - //通过set函数将新的Hour值传给mDate + //閫氳繃set鍑芥暟灏嗘柊鐨凥our鍊间紶缁檓Date onDateTimeChanged(); if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); @@ -128,19 +128,19 @@ public class DateTimePicker extends FrameLayout { private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override - //这里是对 分钟(Minute)改变的监听 + //杩欓噷鏄 鍒嗛挓锛圡inute锛夋敼鍙樼殑鐩戝惉 public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; - //设置offset,作为小时改变的一个记录数据 + //璁剧疆offset锛屼綔涓哄皬鏃舵敼鍙樼殑涓涓褰曟暟鎹 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } - //如果原值为59,新值为0,则offset加1 - //如果原值为0,新值为59,则offset减1 + //濡傛灉鍘熷间负59锛屾柊鍊间负0锛屽垯offset鍔1 + //濡傛灉鍘熷间负0锛屾柊鍊间负59锛屽垯offset鍑1 if (offset != 0) { mDate.add(Calendar.HOUR_OF_DAY, offset); mHourSpinner.setValue(getCurrentHour()); @@ -160,7 +160,7 @@ public class DateTimePicker extends FrameLayout { }; private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - //对AM和PM的监听 + //瀵笰M鍜孭M鐨勭洃鍚 @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mIsAm = !mIsAm; @@ -181,22 +181,22 @@ public class DateTimePicker extends FrameLayout { public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); - }//通过对数据库的访问,获取当前的系统时间 + }//閫氳繃瀵规暟鎹簱鐨勮闂紝鑾峰彇褰撳墠鐨勭郴缁熸椂闂 public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); - }//上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 + }//涓婇潰鍑芥暟鐨勫緱鍒扮殑鏄竴涓ぉ鏂囨暟瀛楋紙1970鑷充粖鐨勭鏁帮級锛岄渶瑕丏ateFormat灏嗗叾鍙樺緱鏈夋剰涔 public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); - //获取系统时间 + //鑾峰彇绯荤粺鏃堕棿 mDate = Calendar.getInstance(); mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - //如果当前Activity里用到别的layout,比如对话框layout - //还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 - //然后再用findViewById()找到它上面的其它组件 + //濡傛灉褰撳墠Activity閲岀敤鍒板埆鐨刲ayout锛屾瘮濡傚璇濇layout + //杩樿璁剧疆杩欎釜layout涓婄殑鍏朵粬缁勪欢鐨勫唴瀹癸紝灏卞繀椤荤敤inflate()鏂规硶鍏堝皢瀵硅瘽妗嗙殑layout鎵惧嚭鏉 + //鐒跺悗鍐嶇敤findViewById()鎵惧埌瀹冧笂闈㈢殑鍏跺畠缁勪欢 mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); @@ -245,9 +245,9 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setEnabled(enabled); mIsEnabled = enabled; } - //存在疑问!!!!!!!!!!!!!setEnabled的作用 - //下面的代码通过原程序的注释已经比较清晰,另外可以通过函数名来判断 - //下面的各函数主要是对上面代码引用到的各函数功能的实现 + //瀛樺湪鐤戦棶锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒锛乻etEnabled鐨勪綔鐢 + //涓嬮潰鐨勪唬鐮侀氳繃鍘熺▼搴忕殑娉ㄩ噴宸茬粡姣旇緝娓呮櫚锛屽彟澶栧彲浠ラ氳繃鍑芥暟鍚嶆潵鍒ゆ柇 + //涓嬮潰鐨勫悇鍑芥暟涓昏鏄涓婇潰浠g爜寮曠敤鍒扮殑鍚勫嚱鏁板姛鑳界殑瀹炵幇 @Override public boolean isEnabled() { return mIsEnabled; @@ -260,7 +260,7 @@ public class DateTimePicker extends FrameLayout { */ public long getCurrentDateInTimeMillis() { return mDate.getTimeInMillis(); - }//实现函数——得到当前的秒数 + }//瀹炵幇鍑芥暟鈥斺斿緱鍒板綋鍓嶇殑绉掓暟 /** * Set the current date @@ -272,7 +272,7 @@ public class DateTimePicker extends FrameLayout { cal.setTimeInMillis(date); setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - }//实现函数功能——设置当前的时间,参数是date + }//瀹炵幇鍑芥暟鍔熻兘鈥斺旇缃綋鍓嶇殑鏃堕棿锛屽弬鏁版槸date /** * Set the current date @@ -290,14 +290,14 @@ public class DateTimePicker extends FrameLayout { setCurrentDay(dayOfMonth); setCurrentHour(hourOfDay); setCurrentMinute(minute); - }//实现函数功能——设置当前的时间,参数是各详细的变量 + }//瀹炵幇鍑芥暟鍔熻兘鈥斺旇缃綋鍓嶇殑鏃堕棿锛屽弬鏁版槸鍚勮缁嗙殑鍙橀噺 /** * Get current year * * @return The current year */ - //下面是得到year、month、day等值 + //涓嬮潰鏄緱鍒皔ear銆乵onth銆乨ay绛夊 public int getCurrentYear() { return mDate.get(Calendar.YEAR); } @@ -468,7 +468,7 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.setDisplayedValues(mDateDisplayValues); mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); mDateSpinner.invalidate(); - }// 对于星期几的算法 + }// 瀵逛簬鏄熸湡鍑犵殑绠楁硶 private void updateAmPmControl() { if (mIs24HourView) { @@ -477,7 +477,7 @@ public class DateTimePicker extends FrameLayout { int index = mIsAm ? Calendar.AM : Calendar.PM; mAmPmSpinner.setValue(index); mAmPmSpinner.setVisibility(View.VISIBLE); - }// 对于上下午操作的算法 + }// 瀵逛簬涓婁笅鍗堟搷浣滅殑绠楁硶 } private void updateHourControl() { @@ -487,7 +487,7 @@ public class DateTimePicker extends FrameLayout { } else { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - }// 对与小时的算法 + }// 瀵逛笌灏忔椂鐨勭畻娉 } /** diff --git a/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java index 0dcfb80..00a2409 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java @@ -32,25 +32,25 @@ import android.text.format.DateUtils; public class DateTimePickerDialog extends AlertDialog implements OnClickListener { private Calendar mDate = Calendar.getInstance(); - //创建一个Calendar类型的变量 mDate,方便时间的操作 + //鍒涘缓涓涓狢alendar绫诲瀷鐨勫彉閲 mDate锛屾柟渚挎椂闂寸殑鎿嶄綔 private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; - //声明一个时间日期滚动选择控件 mOnDateTimeSetListener + //澹版槑涓涓椂闂存棩鏈熸粴鍔ㄩ夋嫨鎺т欢 mOnDateTimeSetListener private DateTimePicker mDateTimePicker; - //DateTimePicker控件,控件一般用于让用户可以从日期列表中选择单个值。 - //运行时,单击控件边上的下拉箭头,会显示为两个部分:一个下拉列表,一个用于选择日期的 + //DateTimePicker鎺т欢锛屾帶浠朵竴鑸敤浜庤鐢ㄦ埛鍙互浠庢棩鏈熷垪琛ㄤ腑閫夋嫨鍗曚釜鍊笺 + //杩愯鏃讹紝鍗曞嚮鎺т欢杈逛笂鐨勪笅鎷夌澶达紝浼氭樉绀轰负涓や釜閮ㄥ垎锛氫竴涓笅鎷夊垪琛紝涓涓敤浜庨夋嫨鏃ユ湡鐨 public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } public DateTimePickerDialog(Context context, long date) { - //对该界面对话框的实例化 + //瀵硅鐣岄潰瀵硅瘽妗嗙殑瀹炰緥鍖 super(context); - //对数据库的操作 + //瀵规暟鎹簱鐨勬搷浣 mDateTimePicker = new DateTimePicker(context); setView(mDateTimePicker); - //添加一个子视图 + //娣诲姞涓涓瓙瑙嗗浘 mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { public void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute) { @@ -59,20 +59,20 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); mDate.set(Calendar.MINUTE, minute); - //将视图中的各选项设置为系统当前时间 + //灏嗚鍥句腑鐨勫悇閫夐」璁剧疆涓虹郴缁熷綋鍓嶆椂闂 updateTitle(mDate.getTimeInMillis()); } }); mDate.setTimeInMillis(date); - //得到系统时间 + //寰楀埌绯荤粺鏃堕棿 mDate.set(Calendar.SECOND, 0); - //将秒数设置为0 + //灏嗙鏁拌缃负0 mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); setButton(context.getString(R.string.datetime_dialog_ok), this); setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); - //设置按钮 + //璁剧疆鎸夐挳 set24HourView(DateFormat.is24HourFormat(this.getContext())); - //时间标准化打印 + //鏃堕棿鏍囧噯鍖栨墦鍗 updateTitle(mDate.getTimeInMillis()); } @@ -82,7 +82,7 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; - }//将时间日期滚动选择控件实例化 + }//灏嗘椂闂存棩鏈熸粴鍔ㄩ夋嫨鎺т欢瀹炰緥鍖 private void updateTitle(long date) { int flag = @@ -91,13 +91,13 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener DateUtils.FORMAT_SHOW_TIME; flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - }//android开发中常见日期管理工具类(API)——DateUtils:按照上下午显示时间 + }//android寮鍙戜腑甯歌鏃ユ湡绠$悊宸ュ叿绫伙紙API锛夆斺擠ateUtils锛氭寜鐓т笂涓嬪崍鏄剧ず鏃堕棿 public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } - }//第一个参数arg0是接收到点击事件的对话框 - //第二个参数arg1是该对话框上的按钮 + }//绗竴涓弬鏁癮rg0鏄帴鏀跺埌鐐瑰嚮浜嬩欢鐨勫璇濇 + //绗簩涓弬鏁癮rg1鏄瀵硅瘽妗嗕笂鐨勬寜閽 } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java b/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java index c8d0835..a5520b2 100644 --- a/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java +++ b/src/Notes-master/src/net/micode/notes/ui/DropdownMenu.java @@ -30,18 +30,18 @@ import net.micode.notes.R; public class DropdownMenu { private Button mButton; private PopupMenu mPopupMenu; - //声明一个下拉菜单 + //澹版槑涓涓笅鎷夎彍鍗 private Menu mMenu; public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); - //设置这个view的背景 + //璁剧疆杩欎釜view鐨勮儗鏅 mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); - //MenuInflater是用来实例化Menu目录下的Menu布局文件 - //根据ID来确认menu的内容选项 + //MenuInflater鏄敤鏉ュ疄渚嬪寲Menu鐩綍涓嬬殑Menu甯冨眬鏂囦欢 + //鏍规嵁ID鏉ョ‘璁enu鐨勫唴瀹归夐」 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); @@ -52,14 +52,14 @@ public class DropdownMenu { public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); - }//设置菜单的监听 + }//璁剧疆鑿滃崟鐨勭洃鍚 } public MenuItem findItem(int id) { return mMenu.findItem(id); - }//对于菜单选项的初始化,根据索引搜索菜单需要的选项 + }//瀵逛簬鑿滃崟閫夐」鐨勫垵濮嬪寲锛屾牴鎹储寮曟悳绱㈣彍鍗曢渶瑕佺殑閫夐」 public void setTitle(CharSequence title) { mButton.setText(title); - }//布局文件,设置标题 + }//甯冨眬鏂囦欢锛岃缃爣棰 } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java index 5bbf417..2c35db4 100644 --- a/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java @@ -30,14 +30,14 @@ import net.micode.notes.data.Notes.NoteColumns; public class FoldersListAdapter extends CursorAdapter { - //CursorAdapter是Cursor和ListView的接口 - //FoldersListAdapter继承了CursorAdapter的类 - //主要作用是便签数据库和用户的交互 - //这里就是用folder(文件夹)的形式展现给用户 + //CursorAdapter鏄疌ursor鍜孡istView鐨勬帴鍙 + //FoldersListAdapter缁ф壙浜咰ursorAdapter鐨勭被 + //涓昏浣滅敤鏄究绛炬暟鎹簱鍜岀敤鎴风殑浜や簰 + //杩欓噷灏辨槸鐢╢older锛堟枃浠跺す锛夌殑褰㈠紡灞曠幇缁欑敤鎴 public static final String [] PROJECTION = { NoteColumns.ID, NoteColumns.SNIPPET - };//调用数据库中便签的ID和片段 + };//璋冪敤鏁版嵁搴撲腑渚跨鐨処D鍜岀墖娈 public static final int ID_COLUMN = 0; public static final int NAME_COLUMN = 1; @@ -45,13 +45,13 @@ public class FoldersListAdapter extends CursorAdapter { public FoldersListAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub - }//数据库操作 + }//鏁版嵁搴撴搷浣 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { - //ViewGroup是容器 + //ViewGroup鏄鍣 return new FolderListItem(context); - }//创建一个文件夹,对于各文件夹中子标签的初始化 + }//鍒涘缓涓涓枃浠跺す锛屽浜庡悇鏂囦欢澶逛腑瀛愭爣绛剧殑鍒濆鍖 @Override public void bindView(View view, Context context, Cursor cursor) { @@ -60,22 +60,22 @@ public class FoldersListAdapter extends CursorAdapter { .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); ((FolderListItem) view).bind(folderName); } - }//将各个布局文件绑定起来 + }//灏嗗悇涓竷灞鏂囦欢缁戝畾璧锋潵 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); - }//根据数据库中标签的ID得到标签的各项内容 + }//鏍规嵁鏁版嵁搴撲腑鏍囩鐨処D寰楀埌鏍囩鐨勫悇椤瑰唴瀹 private class FolderListItem extends LinearLayout { private TextView mName; public FolderListItem(Context context) { super(context); - //操作数据库 + //鎿嶄綔鏁版嵁搴 inflate(context, R.layout.folder_list_item, this); - //根据布局文件的名字等信息将其找出来 + //鏍规嵁甯冨眬鏂囦欢鐨勫悕瀛楃瓑淇℃伅灏嗗叾鎵惧嚭鏉 mName = (TextView) findViewById(R.id.tv_folder_name); } diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java index 5bb17ae..3426c8a 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java @@ -74,8 +74,8 @@ import java.util.regex.Pattern; public class NoteEditActivity extends Activity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { - //该类主要是针对标签的编辑 - //继承了系统内部许多和监听有关的类 + //璇ョ被涓昏鏄拡瀵规爣绛剧殑缂栬緫 + //缁ф壙浜嗙郴缁熷唴閮ㄨ澶氬拰鐩戝惉鏈夊叧鐨勭被 private class HeadViewHolder { public TextView tvModified; @@ -85,7 +85,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public ImageView ibSetBgColor; } - //使用Map实现数据存储 + //浣跨敤Map瀹炵幇鏁版嵁瀛樺偍 private static final Map sBgSelectorBtnsMap = new HashMap(); static { sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); @@ -93,7 +93,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); - //put函数是将指定值和指定键相连 + //put鍑芥暟鏄皢鎸囧畾鍊煎拰鎸囧畾閿浉杩 } private static final Map sBgSelectorSelectionMap = new HashMap(); @@ -103,7 +103,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); - //put函数是将指定值和指定键相连 + //put鍑芥暟鏄皢鎸囧畾鍊煎拰鎸囧畾閿浉杩 } private static final Map sFontSizeBtnsMap = new HashMap(); @@ -112,7 +112,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); - //put函数是将指定值和指定键相连 + //put鍑芥暟鏄皢鎸囧畾鍊煎拰鎸囧畾閿浉杩 } private static final Map sFontSelectorSelectionMap = new HashMap(); @@ -121,7 +121,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); - //put函数是将指定值和指定键相连 + //put鍑芥暟鏄皢鎸囧畾鍊煎拰鎸囧畾閿浉杩 } private static final String TAG = "NoteEditActivity"; @@ -129,23 +129,23 @@ public class NoteEditActivity extends Activity implements OnClickListener, private HeadViewHolder mNoteHeaderHolder; private View mHeadViewPanel; - //私有化一个界面操作mHeadViewPanel,对表头的操作 + //绉佹湁鍖栦竴涓晫闈㈡搷浣渕HeadViewPanel锛屽琛ㄥご鐨勬搷浣 private View mNoteBgColorSelector; - //私有化一个界面操作mNoteBgColorSelector,对背景颜色的操作 + //绉佹湁鍖栦竴涓晫闈㈡搷浣渕NoteBgColorSelector锛屽鑳屾櫙棰滆壊鐨勬搷浣 private View mFontSizeSelector; - //私有化一个界面操作mFontSizeSelector,对标签字体的操作 + //绉佹湁鍖栦竴涓晫闈㈡搷浣渕FontSizeSelector锛屽鏍囩瀛椾綋鐨勬搷浣 private EditText mNoteEditor; - //声明编辑控件,对文本操作 + //澹版槑缂栬緫鎺т欢锛屽鏂囨湰鎿嶄綔 private View mNoteEditorPanel; - //私有化一个界面操作mNoteEditorPanel,文本编辑的控制板 + //绉佹湁鍖栦竴涓晫闈㈡搷浣渕NoteEditorPanel锛屾枃鏈紪杈戠殑鎺у埗鏉 //private WorkingNote mWorkingNote; public WorkingNote mWorkingNote; - //对模板WorkingNote的初始化 + //瀵规ā鏉縒orkingNote鐨勫垵濮嬪寲 private SharedPreferences mSharedPrefs; - //私有化SharedPreferences的数据存储方式 - //它的本质是基于XML文件存储key-value键值对数据 + //绉佹湁鍖朣haredPreferences鐨勬暟鎹瓨鍌ㄦ柟寮 + //瀹冪殑鏈川鏄熀浜嶺ML鏂囦欢瀛樺偍key-value閿煎鏁版嵁 private int mFontSizeId; - //用于操作字体的大小 + //鐢ㄤ簬鎿嶄綔瀛椾綋鐨勫ぇ灏 private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; @@ -154,7 +154,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); private LinearLayout mEditTextList; - //线性布局 + //绾挎у竷灞 private String mUserQuery; private Pattern mPattern; @@ -162,7 +162,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); - //对数据库的访问操作 + //瀵规暟鎹簱鐨勮闂搷浣 if (savedInstanceState == null && !initActivityState(getIntent())) { finish(); return; @@ -185,7 +185,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, return; } Log.d(TAG, "Restoring from killed activity"); - }//为防止内存不足时程序的终止,在这里有一个保存现场的函数 + }//涓洪槻姝㈠唴瀛樹笉瓒虫椂绋嬪簭鐨勭粓姝紝鍦ㄨ繖閲屾湁涓涓繚瀛樼幇鍦虹殑鍑芥暟 } private boolean initActivityState(Intent intent) { @@ -197,42 +197,42 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); mUserQuery = ""; - //如果用户实例化标签时,系统并未给出标签ID + //濡傛灉鐢ㄦ埛瀹炰緥鍖栨爣绛炬椂锛岀郴缁熷苟鏈粰鍑烘爣绛綢D /** * Starting from the searched result */ - //根据键值查找ID + //鏍规嵁閿兼煡鎵綢D if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); } - //如果ID在数据库中未找到 + //濡傛灉ID鍦ㄦ暟鎹簱涓湭鎵惧埌 if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { Intent jump = new Intent(this, NotesListActivity.class); startActivity(jump); - //程序将跳转到上面声明的intent——jump + //绋嬪簭灏嗚烦杞埌涓婇潰澹版槑鐨刬ntent鈥斺攋ump showToast(R.string.error_note_not_exist); finish(); return false; } - //ID在数据库中找到 + //ID鍦ㄦ暟鎹簱涓壘鍒 else { mWorkingNote = WorkingNote.load(this, noteId); if (mWorkingNote == null) { Log.e(TAG, "load note failed with note id" + noteId); - //打印出红色的错误信息 + //鎵撳嵃鍑虹孩鑹茬殑閿欒淇℃伅 finish(); return false; } } - //setSoftInputMode——软键盘输入模式 + //setSoftInputMode鈥斺旇蒋閿洏杈撳叆妯″紡 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { // intent.getAction() - // 大多用于broadcast发送广播时给机制(intent)设置一个action,就是一个字符串 - // 用户可以通过receive(接受)intent,通过 getAction得到的字符串,来决定做什么 + // 澶у鐢ㄤ簬broadcast鍙戦佸箍鎾椂缁欐満鍒讹紙intent锛夎缃竴涓猘ction锛屽氨鏄竴涓瓧绗︿覆 + // 鐢ㄦ埛鍙互閫氳繃receive锛堟帴鍙楋級intent锛岄氳繃 getAction寰楀埌鐨勫瓧绗︿覆锛屾潵鍐冲畾鍋氫粈涔 long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); @@ -240,7 +240,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, Notes.TYPE_WIDGET_INVALIDE); int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, ResourceParser.getDefaultBgId(this)); - // intent.getInt(Long、String)Extra是对各变量的语法分析 + // intent.getInt锛圠ong銆丼tring锛塃xtra鏄鍚勫彉閲忕殑璇硶鍒嗘瀽 // Parse call-record note String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); @@ -257,7 +257,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, finish(); return false; } - //将电话号码与手机的号码簿相关 + //灏嗙數璇濆彿鐮佷笌鎵嬫満鐨勫彿鐮佺翱鐩稿叧 } else { mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, bgResId); @@ -267,7 +267,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } else { mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, bgResId); - }//创建一个新的WorkingNote + }//鍒涘缓涓涓柊鐨刉orkingNote getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE @@ -288,10 +288,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, } private void initNoteScreen() { - //对界面的初始化操作 + //瀵圭晫闈㈢殑鍒濆鍖栨搷浣 mNoteEditor.setTextAppearance(this, TextAppearanceResources .getTexAppearanceResource(mFontSizeId)); - //设置外观 + //璁剧疆澶栬 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { switchToListMode(mWorkingNote.getContent()); } else { @@ -315,21 +315,21 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ showAlertHeader(); } - //设置闹钟的显示 + //璁剧疆闂归挓鐨勬樉绀 private void showAlertHeader() { if (mWorkingNote.hasClockAlert()) { long time = System.currentTimeMillis(); if (time > mWorkingNote.getAlertDate()) { mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); } - //如果系统时间大于了闹钟设置的时间,那么闹钟失效 + //濡傛灉绯荤粺鏃堕棿澶т簬浜嗛椆閽熻缃殑鏃堕棿锛岄偅涔堥椆閽熷け鏁 else { mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); } mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); - //显示闹钟开启的图标 + //鏄剧ず闂归挓寮鍚殑鍥炬爣 } else { mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); @@ -353,29 +353,29 @@ public class NoteEditActivity extends Activity implements OnClickListener, if (!mWorkingNote.existInDatabase()) { saveNote(); } - //在创建一个新的标签时,先在数据库中匹配 - //如果不存在,那么先在数据库中存储 + //鍦ㄥ垱寤轰竴涓柊鐨勬爣绛炬椂锛屽厛鍦ㄦ暟鎹簱涓尮閰 + //濡傛灉涓嶅瓨鍦紝閭d箞鍏堝湪鏁版嵁搴撲腑瀛樺偍 outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); } @Override - //MotionEvent是对屏幕触控的传递机制 + //MotionEvent鏄灞忓箷瑙︽帶鐨勪紶閫掓満鍒 public boolean dispatchTouchEvent(MotionEvent ev) { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE && !inRangeOfView(mNoteBgColorSelector, ev)) { mNoteBgColorSelector.setVisibility(View.GONE); return true; - }//颜色选择器在屏幕上可见 + }//棰滆壊閫夋嫨鍣ㄥ湪灞忓箷涓婂彲瑙 if (mFontSizeSelector.getVisibility() == View.VISIBLE && !inRangeOfView(mFontSizeSelector, ev)) { mFontSizeSelector.setVisibility(View.GONE); return true; - }//字体大小选择器在屏幕上可见 + }//瀛椾綋澶у皬閫夋嫨鍣ㄥ湪灞忓箷涓婂彲瑙 return super.dispatchTouchEvent(ev); } - //对屏幕触控的坐标进行操作 + //瀵瑰睆骞曡Е鎺х殑鍧愭爣杩涜鎿嶄綔 private boolean inRangeOfView(View view, MotionEvent ev) { int []location = new int[2]; view.getLocationOnScreen(location); @@ -385,7 +385,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, || ev.getX() > (x + view.getWidth()) || ev.getY() < y || ev.getY() > (y + view.getHeight())) - //如果触控的位置超出了给定的范围,返回false + //濡傛灉瑙︽帶鐨勪綅缃秴鍑轰簡缁欏畾鐨勮寖鍥达紝杩斿洖false { return false; } @@ -406,13 +406,13 @@ public class NoteEditActivity extends Activity implements OnClickListener, for (int id : sBgSelectorBtnsMap.keySet()) { ImageView iv = (ImageView) findViewById(id); iv.setOnClickListener(this); - }//对标签各项属性内容的初始化 + }//瀵规爣绛惧悇椤瑰睘鎬у唴瀹圭殑鍒濆鍖 mFontSizeSelector = findViewById(R.id.font_size_selector); for (int id : sFontSizeBtnsMap.keySet()) { View view = findViewById(id); view.setOnClickListener(this); - };//对字体大小的选择 + };//瀵瑰瓧浣撳ぇ灏忕殑閫夋嫨 mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE); /** @@ -434,7 +434,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } clearSettingState(); } - //和桌面小工具的同步 + //鍜屾闈㈠皬宸ュ叿鐨勫悓姝 private void updateWidget() { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { @@ -479,7 +479,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } mFontSizeSelector.setVisibility(View.GONE); } - }//************************存在问题 + }//************************瀛樺湪闂 @Override public void onBackPressed() { @@ -510,7 +510,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, } @Override - //对选择菜单的准备 + //瀵归夋嫨鑿滃崟鐨勫噯澶 public boolean onPrepareOptionsMenu(Menu menu) { if (isFinishing()) { return true; @@ -519,7 +519,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, menu.clear(); if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { getMenuInflater().inflate(R.menu.call_note_edit, menu); - // MenuInflater是用来实例化Menu目录下的Menu布局文件的 + // MenuInflater鏄敤鏉ュ疄渚嬪寲Menu鐩綍涓嬬殑Menu甯冨眬鏂囦欢鐨 } else { getMenuInflater().inflate(R.menu.note_edit, menu); } @@ -538,70 +538,70 @@ public class NoteEditActivity extends Activity implements OnClickListener, @Override /* - * 函数功能:动态改变菜单选项内容 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬姩鎬佹敼鍙樿彍鍗曢夐」鍐呭 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - //根据菜单的id来编剧相关项目 + //鏍规嵁鑿滃崟鐨刬d鏉ョ紪鍓х浉鍏抽」鐩 case R.id.menu_new_note: - //创建一个新的便签 + //鍒涘缓涓涓柊鐨勪究绛 createNewNote(); break; case R.id.menu_delete: - //删除便签 + //鍒犻櫎渚跨 AlertDialog.Builder builder = new AlertDialog.Builder(this); - //创建关于删除操作的对话框 + //鍒涘缓鍏充簬鍒犻櫎鎿嶄綔鐨勫璇濇 builder.setTitle(getString(R.string.alert_title_delete)); - // 设置标签的标题为alert_title_delete + // 璁剧疆鏍囩鐨勬爣棰樹负alert_title_delete builder.setIcon(android.R.drawable.ic_dialog_alert); - //设置对话框图标 + //璁剧疆瀵硅瘽妗嗗浘鏍 builder.setMessage(getString(R.string.alert_message_delete_note)); - //设置对话框内容 + //璁剧疆瀵硅瘽妗嗗唴瀹 builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - //建立按键监听器 + //寤虹珛鎸夐敭鐩戝惉鍣 public void onClick(DialogInterface dialog, int which) { - //点击所触发事件 + //鐐瑰嚮鎵瑙﹀彂浜嬩欢 deleteCurrentNote(); - // 删除单签便签 + // 鍒犻櫎鍗曠渚跨 finish(); } }); - //添加“YES”按钮 + //娣诲姞鈥淵ES鈥濇寜閽 builder.setNegativeButton(android.R.string.cancel, null); - //添加“NO”的按钮 + //娣诲姞鈥淣O鈥濈殑鎸夐挳 builder.show(); - //显示对话框 + //鏄剧ず瀵硅瘽妗 break; case R.id.menu_font_size: - //字体大小的编辑 + //瀛椾綋澶у皬鐨勭紪杈 mFontSizeSelector.setVisibility(View.VISIBLE); - // 将字体选择器置为可见 + // 灏嗗瓧浣撻夋嫨鍣ㄧ疆涓哄彲瑙 findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - // 通过id找到相应的大小 + // 閫氳繃id鎵惧埌鐩稿簲鐨勫ぇ灏 break; case R.id.menu_list_mode: - //选择列表模式 + //閫夋嫨鍒楄〃妯″紡 mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0); break; case R.id.menu_share: - //菜单共享 + //鑿滃崟鍏变韩 getWorkingText(); sendTo(this, mWorkingNote.getContent()); - // 用sendto函数将运行文本发送到遍历的本文内 + // 鐢╯endto鍑芥暟灏嗚繍琛屾枃鏈彂閫佸埌閬嶅巻鐨勬湰鏂囧唴 break; case R.id.menu_send_to_desktop: - //发送到桌面 + //鍙戦佸埌妗岄潰 sendToDesktop(); break; case R.id.menu_alert: - //创建提醒器 + //鍒涘缓鎻愰啋鍣 setReminder(); break; case R.id.menu_delete_remind: - //删除日期提醒 + //鍒犻櫎鏃ユ湡鎻愰啋 mWorkingNote.setAlertDate(0, false); break; default: @@ -611,21 +611,21 @@ public class NoteEditActivity extends Activity implements OnClickListener, } /* - * 函数功能:建立事件提醒器 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬缓绔嬩簨浠舵彁閱掑櫒 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void setReminder() { DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); - // 建立修改时间日期的对话框 + // 寤虹珛淇敼鏃堕棿鏃ユ湡鐨勫璇濇 d.setOnDateTimeSetListener(new OnDateTimeSetListener() { public void OnDateTimeSet(AlertDialog dialog, long date) { mWorkingNote.setAlertDate(date , true); - //选择提醒的日期 + //閫夋嫨鎻愰啋鐨勬棩鏈 } }); - //建立时间日期的监听器 + //寤虹珛鏃堕棿鏃ユ湡鐨勭洃鍚櫒 d.show(); - //显示对话框 + //鏄剧ず瀵硅瘽妗 } /** @@ -633,86 +633,86 @@ public class NoteEditActivity extends Activity implements OnClickListener, * and {@text/plain} type */ /* - * 函数功能:共享便签 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬叡浜究绛 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void sendTo(Context context, String info) { Intent intent = new Intent(Intent.ACTION_SEND); - //建立intent链接选项 + //寤虹珛intent閾炬帴閫夐」 intent.putExtra(Intent.EXTRA_TEXT, info); - //将需要传递的便签信息放入text文件中 + //灏嗛渶瑕佷紶閫掔殑渚跨淇℃伅鏀惧叆text鏂囦欢涓 intent.setType("text/plain"); - //编辑连接器的类型 + //缂栬緫杩炴帴鍣ㄧ殑绫诲瀷 context.startActivity(intent); - //在acti中进行链接 + //鍦╝cti涓繘琛岄摼鎺 } /* - * 函数功能:创建一个新的便签 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬垱寤轰竴涓柊鐨勪究绛 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void createNewNote() { // Firstly, save current editing notes - //保存当前便签 + //淇濆瓨褰撳墠渚跨 saveNote(); // For safety, start a new NoteEditActivity finish(); Intent intent = new Intent(this, NoteEditActivity.class); - //设置链接器 + //璁剧疆閾炬帴鍣 intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - //该活动定义为创建或编辑 + //璇ユ椿鍔ㄥ畾涔変负鍒涘缓鎴栫紪杈 intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); - //将运行便签的id添加到INTENT_EXTRA_FOLDER_ID标记中 + //灏嗚繍琛屼究绛剧殑id娣诲姞鍒癐NTENT_EXTRA_FOLDER_ID鏍囪涓 startActivity(intent); - //开始activity并链接 + //寮濮媋ctivity骞堕摼鎺 } /* - * 函数功能:删除当前便签 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬垹闄ゅ綋鍓嶄究绛 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void deleteCurrentNote() { if (mWorkingNote.existInDatabase()) { - //假如当前运行的便签内存有数据 + //鍋囧褰撳墠杩愯鐨勪究绛惧唴瀛樻湁鏁版嵁 HashSet ids = new HashSet(); long id = mWorkingNote.getNoteId(); if (id != Notes.ID_ROOT_FOLDER) { ids.add(id); - //如果不是头文件夹建立一个hash表把便签id存起来 + //濡傛灉涓嶆槸澶存枃浠跺す寤虹珛涓涓猦ash琛ㄦ妸渚跨id瀛樿捣鏉 } else { Log.d(TAG, "Wrong note id, should not happen"); - //否则报错 + //鍚﹀垯鎶ラ敊 } if (!isSyncMode()) { - //在非同步模式情况下 - //删除操作 + //鍦ㄩ潪鍚屾妯″紡鎯呭喌涓 + //鍒犻櫎鎿嶄綔 if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { Log.e(TAG, "Delete Note error"); } } else { - //同步模式 - //移动至垃圾文件夹的操作 + //鍚屾妯″紡 + //绉诲姩鑷冲瀮鍦炬枃浠跺す鐨勬搷浣 if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { Log.e(TAG, "Move notes to trash folder error, should not happens"); } } } mWorkingNote.markDeleted(true); - //将这些标签的删除标记置为true + //灏嗚繖浜涙爣绛剧殑鍒犻櫎鏍囪缃负true } /* - * 函数功能:判断是否为同步模式 - * 函数实现:直接看NotesPreferenceActivity中同步名称是否为空 + * 鍑芥暟鍔熻兘锛氬垽鏂槸鍚︿负鍚屾妯″紡 + * 鍑芥暟瀹炵幇锛氱洿鎺ョ湅NotesPreferenceActivity涓悓姝ュ悕绉版槸鍚︿负绌 */ private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } /* - * 函数功能:设置提醒时间 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳缃彁閱掓椂闂 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void onClockAlertChanged(long date, boolean set) { /** @@ -720,60 +720,60 @@ public class NoteEditActivity extends Activity implements OnClickListener, * alert clock, we should save the note first */ if (!mWorkingNote.existInDatabase()) { - //首先保存已有的便签 + //棣栧厛淇濆瓨宸叉湁鐨勪究绛 saveNote(); } if (mWorkingNote.getNoteId() > 0) { Intent intent = new Intent(this, AlarmReceiver.class); intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); - //若有有运行的便签就是建立一个链接器将标签id都存在uri中 + //鑻ユ湁鏈夎繍琛岀殑渚跨灏辨槸寤虹珛涓涓摼鎺ュ櫒灏嗘爣绛緄d閮藉瓨鍦╱ri涓 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); - //设置提醒管理器 + //璁剧疆鎻愰啋绠$悊鍣 showAlertHeader(); if(!set) { alarmManager.cancel(pendingIntent); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); } - //如果用户设置了时间,就通过提醒管理器设置一个监听事项 + //濡傛灉鐢ㄦ埛璁剧疆浜嗘椂闂达紝灏遍氳繃鎻愰啋绠$悊鍣ㄨ缃竴涓洃鍚簨椤 } else { /** * There is the condition that user has input nothing (the note is * not worthy saving), we have no note id, remind the user that he * should input something */ - //没有运行的便签就报错 + //娌℃湁杩愯鐨勪究绛惧氨鎶ラ敊 Log.e(TAG, "Clock alert setting error"); showToast(R.string.error_note_empty_for_clock); } } /* - * 函数功能:Widget发生改变的所触发的事件 + * 鍑芥暟鍔熻兘锛歐idget鍙戠敓鏀瑰彉鐨勬墍瑙﹀彂鐨勪簨浠 */ public void onWidgetChanged() { - updateWidget();//更新Widget + updateWidget();//鏇存柊Widget } /* - * 函数功能: 删除编辑文本框所触发的事件 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛 鍒犻櫎缂栬緫鏂囨湰妗嗘墍瑙﹀彂鐨勪簨浠 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void onEditTextDelete(int index, String text) { int childCount = mEditTextList.getChildCount(); if (childCount == 1) { return; } - //没有编辑框的话直接返回 + //娌℃湁缂栬緫妗嗙殑璇濈洿鎺ヨ繑鍥 for (int i = index + 1; i < childCount; i++) { ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) .setIndex(i - 1); - //通过id把编辑框存在便签编辑框中 + //閫氳繃id鎶婄紪杈戞瀛樺湪渚跨缂栬緫妗嗕腑 } mEditTextList.removeViewAt(index); - //删除特定位置的视图 + //鍒犻櫎鐗瑰畾浣嶇疆鐨勮鍥 NoteEditText edit = null; if(index == 0) { edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( @@ -782,16 +782,16 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( R.id.et_edit_text); } - //通过id把编辑框存在空的NoteEditText中 + //閫氳繃id鎶婄紪杈戞瀛樺湪绌虹殑NoteEditText涓 int length = edit.length(); edit.append(text); - edit.requestFocus();//请求优先完成该此 编辑 - edit.setSelection(length);//定位到length位置处的条目 + edit.requestFocus();//璇锋眰浼樺厛瀹屾垚璇ユ 缂栬緫 + edit.setSelection(length);//瀹氫綅鍒發ength浣嶇疆澶勭殑鏉$洰 } /* - * 函数功能:进入编辑文本框所触发的事件 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳繘鍏ョ紪杈戞枃鏈鎵瑙﹀彂鐨勪簨浠 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void onEditTextEnter(int index, String text) { /** @@ -799,84 +799,84 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ if(index > mEditTextList.getChildCount()) { Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); - //越界把偶偶 + //瓒婄晫鎶婂伓鍋 } View view = getListItem(text, index); mEditTextList.addView(view, index); - //建立一个新的视图并添加到编辑文本框内 + //寤虹珛涓涓柊鐨勮鍥惧苟娣诲姞鍒扮紪杈戞枃鏈鍐 NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.requestFocus();//请求优先操作 - edit.setSelection(0);//定位到起始位置 + edit.requestFocus();//璇锋眰浼樺厛鎿嶄綔 + edit.setSelection(0);//瀹氫綅鍒拌捣濮嬩綅缃 for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) .setIndex(i); - //遍历子文本框并设置对应对下标 + //閬嶅巻瀛愭枃鏈骞惰缃搴斿涓嬫爣 } } /* - * 函数功能:切换至列表模式 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬垏鎹㈣嚦鍒楄〃妯″紡 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void switchToListMode(String text) { mEditTextList.removeAllViews(); String[] items = text.split("\n"); int index = 0; - //清空所有视图,初始化下标 + //娓呯┖鎵鏈夎鍥撅紝鍒濆鍖栦笅鏍 for (String item : items) { if(!TextUtils.isEmpty(item)) { mEditTextList.addView(getListItem(item, index)); index++; - //遍历所有文本单元并添加到文本框中 + //閬嶅巻鎵鏈夋枃鏈崟鍏冨苟娣诲姞鍒版枃鏈涓 } } mEditTextList.addView(getListItem("", index)); mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); - //优先请求此操作 + //浼樺厛璇锋眰姝ゆ搷浣 mNoteEditor.setVisibility(View.GONE); - //便签编辑器不可见 + //渚跨缂栬緫鍣ㄤ笉鍙 mEditTextList.setVisibility(View.VISIBLE); - //将文本编辑框置为可见 + //灏嗘枃鏈紪杈戞缃负鍙 } /* - * 函数功能:获取高亮效果的反馈情况 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳幏鍙栭珮浜晥鏋滅殑鍙嶉鎯呭喌 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private Spannable getHighlightQueryResult(String fullText, String userQuery) { SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); - //新建一个效果选项 + //鏂板缓涓涓晥鏋滈夐」 if (!TextUtils.isEmpty(userQuery)) { mPattern = Pattern.compile(userQuery); - //将用户的询问进行解析 + //灏嗙敤鎴风殑璇㈤棶杩涜瑙f瀽 Matcher m = mPattern.matcher(fullText); - //建立一个状态机检查Pattern并进行匹配 + //寤虹珛涓涓姸鎬佹満妫鏌attern骞惰繘琛屽尮閰 int start = 0; while (m.find(start)) { spannable.setSpan( new BackgroundColorSpan(this.getResources().getColor( R.color.user_query_highlight)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - //设置背景颜色 + //璁剧疆鑳屾櫙棰滆壊 start = m.end(); - //跟新起始位置 + //璺熸柊璧峰浣嶇疆 } } return spannable; } /* - * 函数功能:获取列表项 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳幏鍙栧垪琛ㄩ」 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private View getListItem(String item, int index) { View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); - //创建一个视图 + //鍒涘缓涓涓鍥 final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - //创建一个文本编辑框并设置可见性 + //鍒涘缓涓涓枃鏈紪杈戞骞惰缃彲瑙佹 CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -887,15 +887,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } }); - //建立一个打钩框并设置监听器 + //寤虹珛涓涓墦閽╂骞惰缃洃鍚櫒 if (item.startsWith(TAG_CHECKED)) { - //选择勾选 + //閫夋嫨鍕鹃 cb.setChecked(true); edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); item = item.substring(TAG_CHECKED.length(), item.length()).trim(); } else if (item.startsWith(TAG_UNCHECKED)) { - //选择不勾选 + //閫夋嫨涓嶅嬀閫 cb.setChecked(false); edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); @@ -904,94 +904,94 @@ public class NoteEditActivity extends Activity implements OnClickListener, edit.setOnTextViewChangeListener(this); edit.setIndex(index); edit.setText(getHighlightQueryResult(item, mUserQuery)); - //运行编辑框的监听器对该行为作出反应,并设置下标及文本内容 + //杩愯缂栬緫妗嗙殑鐩戝惉鍣ㄥ璇ヨ涓轰綔鍑哄弽搴旓紝骞惰缃笅鏍囧強鏂囨湰鍐呭 return view; } /* - * 函数功能:便签内容发生改变所 触发的事件 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氫究绛惧唴瀹瑰彂鐢熸敼鍙樻墍 瑙﹀彂鐨勪簨浠 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void onTextChange(int index, boolean hasText) { if (index >= mEditTextList.getChildCount()) { Log.e(TAG, "Wrong index, should not happen"); return; - //越界报错 + //瓒婄晫鎶ラ敊 } if(hasText) { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); } else { mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); } - //如果内容不为空则将其子编辑框可见性置为可见,否则不可见 + //濡傛灉鍐呭涓嶄负绌哄垯灏嗗叾瀛愮紪杈戞鍙鎬х疆涓哄彲瑙侊紝鍚﹀垯涓嶅彲瑙 } /* - * 函数功能:检查模式和列表模式的切换 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氭鏌ユā寮忓拰鍒楄〃妯″紡鐨勫垏鎹 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void onCheckListModeChanged(int oldMode, int newMode) { if (newMode == TextNote.MODE_CHECK_LIST) { switchToListMode(mNoteEditor.getText().toString()); - //检查模式切换到列表模式 + //妫鏌ユā寮忓垏鎹㈠埌鍒楄〃妯″紡 } else { if (!getWorkingText()) { mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", "")); } - //若是获取到文本就改变其检查标记 + //鑻ユ槸鑾峰彇鍒版枃鏈氨鏀瑰彉鍏舵鏌ユ爣璁 mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); mEditTextList.setVisibility(View.GONE); mNoteEditor.setVisibility(View.VISIBLE); - //修改文本编辑器的内容和可见性 + //淇敼鏂囨湰缂栬緫鍣ㄧ殑鍐呭鍜屽彲瑙佹 } } /* - * 函数功能:设置勾选选项表并返回是否勾选的标记 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳缃嬀閫夐夐」琛ㄥ苟杩斿洖鏄惁鍕鹃夌殑鏍囪 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private boolean getWorkingText() { boolean hasChecked = false; - //初始化check标记 + //鍒濆鍖朿heck鏍囪 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - // 若模式为CHECK_LIST + // 鑻ユā寮忎负CHECK_LIST StringBuilder sb = new StringBuilder(); - //创建可变字符串 + //鍒涘缓鍙彉瀛楃涓 for (int i = 0; i < mEditTextList.getChildCount(); i++) { View view = mEditTextList.getChildAt(i); - //遍历所有子编辑框的视图 + //閬嶅巻鎵鏈夊瓙缂栬緫妗嗙殑瑙嗗浘 NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); if (!TextUtils.isEmpty(edit.getText())) { - //若文本不为空 + //鑻ユ枃鏈笉涓虹┖ if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { - //该选项框已打钩 + //璇ラ夐」妗嗗凡鎵撻挬 sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); hasChecked = true; - //扩展字符串为已打钩并把标记置true + //鎵╁睍瀛楃涓蹭负宸叉墦閽╁苟鎶婃爣璁扮疆true } else { sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); - //扩展字符串添加未打钩 + //鎵╁睍瀛楃涓叉坊鍔犳湭鎵撻挬 } } } mWorkingNote.setWorkingText(sb.toString()); - //利用编辑好的字符串设置运行便签的内容 + //鍒╃敤缂栬緫濂界殑瀛楃涓茶缃繍琛屼究绛剧殑鍐呭 } else { mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); - // 若不是该模式直接用编辑器中的内容设置运行中标签的内容 + // 鑻ヤ笉鏄妯″紡鐩存帴鐢ㄧ紪杈戝櫒涓殑鍐呭璁剧疆杩愯涓爣绛剧殑鍐呭 } return hasChecked; } /* - * 函数功能:保存便签 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氫繚瀛樹究绛 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private boolean saveNote() { getWorkingText(); boolean saved = mWorkingNote.saveNote(); - //运行 getWorkingText()之后保存 + //杩愯 getWorkingText()涔嬪悗淇濆瓨 if (saved) { /** * There are two modes from List view to edit view, open one note, @@ -1000,15 +1000,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, * new node requires to the top of the list. This code * {@link #RESULT_OK} is used to identify the create/edit state */ - //如英文注释所说链接RESULT_OK是为了识别保存的2种情况,一是创建后保存,二是修改后保存 + //濡傝嫳鏂囨敞閲婃墍璇撮摼鎺ESULT_OK鏄负浜嗚瘑鍒繚瀛樼殑2绉嶆儏鍐碉紝涓鏄垱寤哄悗淇濆瓨锛屼簩鏄慨鏀瑰悗淇濆瓨 setResult(RESULT_OK); } return saved; } /* - * 函数功能:将便签发送至桌面 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬皢渚跨鍙戦佽嚦妗岄潰 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void sendToDesktop() { /** @@ -1018,16 +1018,16 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ if (!mWorkingNote.existInDatabase()) { saveNote(); - //若不存在数据也就是新的标签就保存起来先 + //鑻ヤ笉瀛樺湪鏁版嵁涔熷氨鏄柊鐨勬爣绛惧氨淇濆瓨璧锋潵鍏 } if (mWorkingNote.getNoteId() > 0) { - //若是有内容 + //鑻ユ槸鏈夊唴瀹 Intent sender = new Intent(); Intent shortcutIntent = new Intent(this, NoteEditActivity.class); - //建立发送到桌面的连接器 + //寤虹珛鍙戦佸埌妗岄潰鐨勮繛鎺ュ櫒 shortcutIntent.setAction(Intent.ACTION_VIEW); - //链接为一个视图 + //閾炬帴涓轰竴涓鍥 shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, @@ -1035,12 +1035,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); sender.putExtra("duplicate", true); - //将便签的相关信息都添加到要发送的文件里 + //灏嗕究绛剧殑鐩稿叧淇℃伅閮芥坊鍔犲埌瑕佸彂閫佺殑鏂囦欢閲 sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); - //设置sneder的行为是发送 + //璁剧疆sneder鐨勮涓烘槸鍙戦 showToast(R.string.info_note_enter_desktop); sendBroadcast(sender); - //显示到桌面 + //鏄剧ず鍒版闈 } else { /** * There is the condition that user has input nothing (the note is @@ -1049,33 +1049,33 @@ public class NoteEditActivity extends Activity implements OnClickListener, */ Log.e(TAG, "Send to desktop error"); showToast(R.string.error_note_empty_for_send_to_desktop); - //空便签直接报错 + //绌轰究绛剧洿鎺ユ姤閿 } } /* - * 函数功能:编辑小图标的标题 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氱紪杈戝皬鍥炬爣鐨勬爣棰 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private String makeShortcutIconTitle(String content) { content = content.replace(TAG_CHECKED, ""); content = content.replace(TAG_UNCHECKED, ""); return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, SHORTCUT_ICON_TITLE_MAX_LEN) : content; - //直接设置为content中的内容并返回,有勾选和未勾选2种 + //鐩存帴璁剧疆涓篶ontent涓殑鍐呭骞惰繑鍥烇紝鏈夊嬀閫夊拰鏈嬀閫2绉 } /* - * 函数功能:显示提示的视图 - * 函数实现:根据下标显示对应的提示 + * 鍑芥暟鍔熻兘锛氭樉绀烘彁绀虹殑瑙嗗浘 + * 鍑芥暟瀹炵幇锛氭牴鎹笅鏍囨樉绀哄搴旂殑鎻愮ず */ private void showToast(int resId) { showToast(resId, Toast.LENGTH_SHORT); } /* - * 函数功能:持续显示提示的视图 - * 函数实现:根据下标和持续的时间(duration)编辑提示视图并显示 + * 鍑芥暟鍔熻兘锛氭寔缁樉绀烘彁绀虹殑瑙嗗浘 + * 鍑芥暟瀹炵幇锛氭牴鎹笅鏍囧拰鎸佺画鐨勬椂闂达紙duration锛夌紪杈戞彁绀鸿鍥惧苟鏄剧ず */ private void showToast(int resId, int duration) { Toast.makeText(this, resId, duration).show(); diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteEditText.java b/src/Notes-master/src/net/micode/notes/ui/NoteEditText.java index eb983f2..ca9c209 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteEditText.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteEditText.java @@ -37,7 +37,7 @@ import net.micode.notes.R; import java.util.HashMap; import java.util.Map; -//继承edittext,设置便签设置文本框 +//缁ф壙edittext锛岃缃究绛捐缃枃鏈 public class NoteEditText extends EditText { private static final String TAG = "NoteEditText"; private int mIndex; @@ -47,7 +47,7 @@ public class NoteEditText extends EditText { private static final String SCHEME_HTTP = "http:" ; private static final String SCHEME_EMAIL = "mailto:" ; - ///建立一个字符和整数的hash表,用于链接电话,网站,还有邮箱 + ///寤虹珛涓涓瓧绗﹀拰鏁存暟鐨刪ash琛紝鐢ㄤ簬閾炬帴鐢佃瘽锛岀綉绔欙紝杩樻湁閭 private static final Map sSchemaActionResMap = new HashMap(); static { sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); @@ -58,20 +58,20 @@ public class NoteEditText extends EditText { /** * Call by the {@link NoteEditActivity} to delete or add edit text */ - //在NoteEditActivity中删除或添加文本的操作,可以看做是一个文本是否被变的标记,英文注释已说明的很清楚 + //鍦∟oteEditActivity涓垹闄ゆ垨娣诲姞鏂囨湰鐨勬搷浣滐紝鍙互鐪嬪仛鏄竴涓枃鏈槸鍚﹁鍙樼殑鏍囪锛岃嫳鏂囨敞閲婂凡璇存槑鐨勫緢娓呮 public interface OnTextViewChangeListener { /** * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens * and the text is null */ - //处理删除按键时的操作 + //澶勭悊鍒犻櫎鎸夐敭鏃剁殑鎿嶄綔 void onEditTextDelete(int index, String text); /** * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} * happen */ - //处理进入按键时的操作 + //澶勭悊杩涘叆鎸夐敭鏃剁殑鎿嶄綔 void onEditTextEnter(int index, String text); /** @@ -82,43 +82,43 @@ public class NoteEditText extends EditText { private OnTextViewChangeListener mOnTextViewChangeListener; - //根据context设置文本 + //鏍规嵁context璁剧疆鏂囨湰 public NoteEditText(Context context) { - super(context, null);//用super引用父类变量 + super(context, null);//鐢╯uper寮曠敤鐖剁被鍙橀噺 mIndex = 0; } - //设置当前光标 + //璁剧疆褰撳墠鍏夋爣 public void setIndex(int index) { mIndex = index; } - //初始化文本修改标记 + //鍒濆鍖栨枃鏈慨鏀规爣璁 public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } - //AttributeSet 百度了一下是自定义空控件属性,用于维护便签动态变化的属性 - //初始化便签 + //AttributeSet 鐧惧害浜嗕竴涓嬫槸鑷畾涔夌┖鎺т欢灞炴э紝鐢ㄤ簬缁存姢渚跨鍔ㄦ佸彉鍖栫殑灞炴 + //鍒濆鍖栦究绛 public NoteEditText(Context context, AttributeSet attrs) { super(context, attrs, android.R.attr.editTextStyle); } - // 根据defstyle自动初始化 + // 鏍规嵁defstyle鑷姩鍒濆鍖 public NoteEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated construct or stub } @Override - //view里的函数,处理手机屏幕的所有事件 - /*参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息, - 例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。*/ + //view閲岀殑鍑芥暟锛屽鐞嗘墜鏈哄睆骞曠殑鎵鏈変簨浠 + /*鍙傛暟event涓烘墜鏈哄睆骞曡Е鎽镐簨浠跺皝瑁呯被鐨勫璞★紝鍏朵腑灏佽浜嗚浜嬩欢鐨勬墍鏈変俊鎭紝 + 渚嬪瑙︽懜鐨勪綅缃佽Е鎽哥殑绫诲瀷浠ュ強瑙︽懜鐨勬椂闂寸瓑銆傝瀵硅薄浼氬湪鐢ㄦ埛瑙︽懜鎵嬫満灞忓箷鏃惰鍒涘缓銆*/ public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { - //重写了需要处理屏幕被按下的事件 + //閲嶅啓浜嗛渶瑕佸鐞嗗睆骞曡鎸変笅鐨勪簨浠 case MotionEvent.ACTION_DOWN: - //跟新当前坐标值 + //璺熸柊褰撳墠鍧愭爣鍊 int x = (int) event.getX(); int y = (int) event.getY(); x -= getTotalPaddingLeft(); @@ -126,12 +126,12 @@ public class NoteEditText extends EditText { x += getScrollX(); y += getScrollY(); - //用布局控件layout根据x,y的新值设置新的位置 + //鐢ㄥ竷灞鎺т欢layout鏍规嵁x,y鐨勬柊鍊艰缃柊鐨勪綅缃 Layout layout = getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); - //更新光标新的位置 + //鏇存柊鍏夋爣鏂扮殑浣嶇疆 Selection.setSelection(getText(), off); break; } @@ -141,146 +141,146 @@ public class NoteEditText extends EditText { @Override /* - * 函数功能:处理用户按下一个键盘按键时会触发 的事件 - * 实现过程:如下注释 + * 鍑芥暟鍔熻兘锛氬鐞嗙敤鎴锋寜涓嬩竴涓敭鐩樻寜閿椂浼氳Е鍙 鐨勪簨浠 + * 瀹炵幇杩囩▼锛氬涓嬫敞閲 */ public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { - //根据按键的 Unicode 编码值来处理 + //鏍规嵁鎸夐敭鐨 Unicode 缂栫爜鍊兼潵澶勭悊 case KeyEvent.KEYCODE_ENTER: - //“进入”按键 + //鈥滆繘鍏モ濇寜閿 if (mOnTextViewChangeListener != null) { return false; } break; case KeyEvent.KEYCODE_DEL: - //“删除”按键 + //鈥滃垹闄も濇寜閿 mSelectionStartBeforeDelete = getSelectionStart(); break; default: break; } - //继续执行父类的其他点击事件 + //缁х画鎵ц鐖剁被鐨勫叾浠栫偣鍑讳簨浠 return super.onKeyDown(keyCode, event); } @Override /* - * 函数功能:处理用户松开一个键盘按键时会触发 的事件 - * 实现方式:如下注释 + * 鍑芥暟鍔熻兘锛氬鐞嗙敤鎴锋澗寮涓涓敭鐩樻寜閿椂浼氳Е鍙 鐨勪簨浠 + * 瀹炵幇鏂瑰紡锛氬涓嬫敞閲 */ public boolean onKeyUp(int keyCode, KeyEvent event) { switch(keyCode) { - //根据按键的 Unicode 编码值来处理,有删除和进入2种操作 + //鏍规嵁鎸夐敭鐨 Unicode 缂栫爜鍊兼潵澶勭悊锛屾湁鍒犻櫎鍜岃繘鍏2绉嶆搷浣 case KeyEvent.KEYCODE_DEL: if (mOnTextViewChangeListener != null) { - //若是被修改过 + //鑻ユ槸琚慨鏀硅繃 if (0 == mSelectionStartBeforeDelete && mIndex != 0) { - //若之前有被修改并且文档不为空 + //鑻ヤ箣鍓嶆湁琚慨鏀瑰苟涓旀枃妗d笉涓虹┖ mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); - //利用上文OnTextViewChangeListener对KEYCODE_DEL按键情况的删除函数进行删除 + //鍒╃敤涓婃枃OnTextViewChangeListener瀵筀EYCODE_DEL鎸夐敭鎯呭喌鐨勫垹闄ゅ嚱鏁拌繘琛屽垹闄 return true; } } else { Log.d(TAG, "OnTextViewChangeListener was not seted"); - //其他情况报错,文档的改动监听器并没有建立 + //鍏朵粬鎯呭喌鎶ラ敊锛屾枃妗g殑鏀瑰姩鐩戝惉鍣ㄥ苟娌℃湁寤虹珛 } break; case KeyEvent.KEYCODE_ENTER: - //同上也是分为监听器是否建立2种情况 + //鍚屼笂涔熸槸鍒嗕负鐩戝惉鍣ㄦ槸鍚﹀缓绔2绉嶆儏鍐 if (mOnTextViewChangeListener != null) { int selectionStart = getSelectionStart(); - //获取当前位置 + //鑾峰彇褰撳墠浣嶇疆 String text = getText().subSequence(selectionStart, length()).toString(); - //获取当前文本 + //鑾峰彇褰撳墠鏂囨湰 setText(getText().subSequence(0, selectionStart)); - //根据获取的文本设置当前文本 + //鏍规嵁鑾峰彇鐨勬枃鏈缃綋鍓嶆枃鏈 mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - //当{@link KeyEvent#KEYCODE_ENTER}添加新文本 + //褰搟@link KeyEvent#KEYCODE_ENTER}娣诲姞鏂版枃鏈 } else { Log.d(TAG, "OnTextViewChangeListener was not seted"); - //其他情况报错,文档的改动监听器并没有建立 + //鍏朵粬鎯呭喌鎶ラ敊锛屾枃妗g殑鏀瑰姩鐩戝惉鍣ㄥ苟娌℃湁寤虹珛 } break; default: break; } - //继续执行父类的其他按键弹起的事件 + //缁х画鎵ц鐖剁被鐨勫叾浠栨寜閿脊璧风殑浜嬩欢 return super.onKeyUp(keyCode, event); } @Override /* - * 函数功能:当焦点发生变化时,会自动调用该方法来处理焦点改变的事件 - * 实现方式:如下注释 - * 参数:focused表示触发该事件的View是否获得了焦点,当该控件获得焦点时,Focused等于true,否则等于false。 - direction表示焦点移动的方向,用数值表示 - Rect:表示在触发事件的View的坐标系中,前一个获得焦点的矩形区域,即表示焦点是从哪里来的。如果不可用则为null + * 鍑芥暟鍔熻兘锛氬綋鐒︾偣鍙戠敓鍙樺寲鏃讹紝浼氳嚜鍔ㄨ皟鐢ㄨ鏂规硶鏉ュ鐞嗙劍鐐规敼鍙樼殑浜嬩欢 + * 瀹炵幇鏂瑰紡锛氬涓嬫敞閲 + * 鍙傛暟锛歠ocused琛ㄧず瑙﹀彂璇ヤ簨浠剁殑View鏄惁鑾峰緱浜嗙劍鐐癸紝褰撹鎺т欢鑾峰緱鐒︾偣鏃讹紝Focused绛変簬true锛屽惁鍒欑瓑浜巉alse銆 + direction琛ㄧず鐒︾偣绉诲姩鐨勬柟鍚戯紝鐢ㄦ暟鍊艰〃绀 + Rect锛氳〃绀哄湪瑙﹀彂浜嬩欢鐨刅iew鐨勫潗鏍囩郴涓紝鍓嶄竴涓幏寰楃劍鐐圭殑鐭╁舰鍖哄煙锛屽嵆琛ㄧず鐒︾偣鏄粠鍝噷鏉ョ殑銆傚鏋滀笉鍙敤鍒欎负null */ protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (mOnTextViewChangeListener != null) { - //若监听器已经建立 + //鑻ョ洃鍚櫒宸茬粡寤虹珛 if (!focused && TextUtils.isEmpty(getText())) { - //获取到焦点并且文本不为空 + //鑾峰彇鍒扮劍鐐瑰苟涓旀枃鏈笉涓虹┖ mOnTextViewChangeListener.onTextChange(mIndex, false); - //mOnTextViewChangeListener子函数,置false隐藏事件选项 + //mOnTextViewChangeListener瀛愬嚱鏁帮紝缃甪alse闅愯棌浜嬩欢閫夐」 } else { mOnTextViewChangeListener.onTextChange(mIndex, true); - //mOnTextViewChangeListener子函数,置true显示事件选项 + //mOnTextViewChangeListener瀛愬嚱鏁帮紝缃畉rue鏄剧ず浜嬩欢閫夐」 } } - //继续执行父类的其他焦点变化的事件 + //缁х画鎵ц鐖剁被鐨勫叾浠栫劍鐐瑰彉鍖栫殑浜嬩欢 super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override /* - * 函数功能:生成上下文菜单 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氱敓鎴愪笂涓嬫枃鑿滃崟 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ protected void onCreateContextMenu(ContextMenu menu) { if (getText() instanceof Spanned) { - //有文本存在 + //鏈夋枃鏈瓨鍦 int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); - //获取文本开始和结尾位置 + //鑾峰彇鏂囨湰寮濮嬪拰缁撳熬浣嶇疆 int min = Math.min(selStart, selEnd); int max = Math.max(selStart, selEnd); - //获取开始到结尾的最大值和最小值 + //鑾峰彇寮濮嬪埌缁撳熬鐨勬渶澶у煎拰鏈灏忓 final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); - //设置url的信息的范围值 + //璁剧疆url鐨勪俊鎭殑鑼冨洿鍊 if (urls.length == 1) { int defaultResId = 0; for(String schema: sSchemaActionResMap.keySet()) { - //获取计划表中所有的key值 + //鑾峰彇璁″垝琛ㄤ腑鎵鏈夌殑key鍊 if(urls[0].getURL().indexOf(schema) >= 0) { - //若url可以添加则在添加后将defaultResId置为key所映射的值 + //鑻rl鍙互娣诲姞鍒欏湪娣诲姞鍚庡皢defaultResId缃负key鎵鏄犲皠鐨勫 defaultResId = sSchemaActionResMap.get(schema); break; } } if (defaultResId == 0) { - //defaultResId == 0则说明url并没有添加任何东西,所以置为连接其他SchemaActionResMap的值 + //defaultResId == 0鍒欒鏄巙rl骞舵病鏈夋坊鍔犱换浣曚笢瑗匡紝鎵浠ョ疆涓鸿繛鎺ュ叾浠朣chemaActionResMap鐨勫 defaultResId = R.string.note_link_other; } - //建立菜单 + //寤虹珛鑿滃崟 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() { - //新建按键监听器 + //鏂板缓鎸夐敭鐩戝惉鍣 public boolean onMenuItemClick(MenuItem item) { // goto a new intent urls[0].onClick(NoteEditText.this); - //根据相应的文本设置菜单的按键 + //鏍规嵁鐩稿簲鐨勬枃鏈缃彍鍗曠殑鎸夐敭 return true; } }); } } - //继续执行父类的其他菜单创建的事件 + //缁х画鎵ц鐖剁被鐨勫叾浠栬彍鍗曞垱寤虹殑浜嬩欢 super.onCreateContextMenu(menu); } } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java index a3b3781..36653a3 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java +++ b/src/Notes-master/src/net/micode/notes/ui/NoteItemData.java @@ -41,7 +41,7 @@ public class NoteItemData { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, }; - //常量标记和数据就不一一标记了,意义翻译基本就知道 + //甯搁噺鏍囪鍜屾暟鎹氨涓嶄竴涓鏍囪浜嗭紝鎰忎箟缈昏瘧鍩烘湰灏辩煡閬 private static final int ID_COLUMN = 0; private static final int ALERTED_DATE_COLUMN = 1; private static final int BG_COLOR_ID_COLUMN = 2; @@ -75,9 +75,9 @@ public class NoteItemData { private boolean mIsOnlyOneItem; private boolean mIsOneNoteFollowingFolder; private boolean mIsMultiNotesFollowingFolder; - //初始化NoteItemData,主要利用光标cursor获取的东西 + //鍒濆鍖朜oteItemData锛屼富瑕佸埄鐢ㄥ厜鏍嘽ursor鑾峰彇鐨勪笢瑗 public NoteItemData(Context context, Cursor cursor) { - //getxxx为转换格式 + //getxxx涓鸿浆鎹㈡牸寮 mId = cursor.getLong(ID_COLUMN); mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); @@ -93,11 +93,11 @@ public class NoteItemData { mWidgetId = cursor.getInt(WIDGET_ID_COLUMN); mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN); - //初始化电话号码的信息 + //鍒濆鍖栫數璇濆彿鐮佺殑淇℃伅 mPhoneNumber = ""; if (mParentId == Notes.ID_CALL_RECORD_FOLDER) { mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId); - if (!TextUtils.isEmpty(mPhoneNumber)) {//mphonenumber里有符合字符串,则用contart功能连接 + if (!TextUtils.isEmpty(mPhoneNumber)) {//mphonenumber閲屾湁绗﹀悎瀛楃涓诧紝鍒欑敤contart鍔熻兘杩炴帴 mName = Contact.getContact(context, mPhoneNumber); if (mName == null) { mName = mPhoneNumber; @@ -110,35 +110,35 @@ public class NoteItemData { } checkPostion(cursor); } - ///根据鼠标的位置设置标记,和位置 + ///鏍规嵁榧犳爣鐨勪綅缃缃爣璁帮紝鍜屼綅缃 private void checkPostion(Cursor cursor) { - //初始化几个标记,cursor具体功能笔记中已提到,不一一叙述 + //鍒濆鍖栧嚑涓爣璁帮紝cursor鍏蜂綋鍔熻兘绗旇涓凡鎻愬埌锛屼笉涓涓鍙欒堪 mIsLastItem = cursor.isLast() ? true : false; mIsFirstItem = cursor.isFirst() ? true : false; mIsOnlyOneItem = (cursor.getCount() == 1); - //初始化“多重子文件”“单一子文件”2个标记 + //鍒濆鍖栤滃閲嶅瓙鏂囦欢鈥濃滃崟涓瀛愭枃浠垛2涓爣璁 mIsMultiNotesFollowingFolder = false; mIsOneNoteFollowingFolder = false; - //主要是设置上诉2标记 - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {//若是note格式并且不是第一个元素 + //涓昏鏄缃笂璇2鏍囪 + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {//鑻ユ槸note鏍煎紡骞朵笖涓嶆槸绗竴涓厓绱 int position = cursor.getPosition(); - if (cursor.moveToPrevious()) {//获取光标位置后看上一行 + if (cursor.moveToPrevious()) {//鑾峰彇鍏夋爣浣嶇疆鍚庣湅涓婁竴琛 if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {//若光标满足系统或note格式 + || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {//鑻ュ厜鏍囨弧瓒崇郴缁熸垨note鏍煎紡 if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true;//若是数据行数大于但前位置+1则设置成正确 + mIsMultiNotesFollowingFolder = true;//鑻ユ槸鏁版嵁琛屾暟澶т簬浣嗗墠浣嶇疆+1鍒欒缃垚姝g‘ } else { - mIsOneNoteFollowingFolder = true;//否则单一文件夹标记为true + mIsOneNoteFollowingFolder = true;//鍚﹀垯鍗曚竴鏂囦欢澶规爣璁颁负true } } - if (!cursor.moveToNext()) {//若不能再往下走则报错 + if (!cursor.moveToNext()) {//鑻ヤ笉鑳藉啀寰涓嬭蛋鍒欐姤閿 throw new IllegalStateException("cursor move to previous but can't move back"); } } } } -///以下都是获取标记没什么好说的,不过倒数第二个需要说明下,很具体看下面 +///浠ヤ笅閮芥槸鑾峰彇鏍囪娌′粈涔堝ソ璇寸殑锛屼笉杩囧掓暟绗簩涓渶瑕佽鏄庝笅锛屽緢鍏蜂綋鐪嬩笅闈 public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; } @@ -219,7 +219,7 @@ public class NoteItemData { return (mAlertDate > 0); } - //若数据父id为保存至文件夹模式的id且满足电话号码单元不为空,则isCallRecord为true + //鑻ユ暟鎹埗id涓轰繚瀛樿嚦鏂囦欢澶规ā寮忕殑id涓旀弧瓒崇數璇濆彿鐮佸崟鍏冧笉涓虹┖锛屽垯isCallRecord涓簍rue public boolean isCallRecord() { return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); } diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java index 9e88f59..8228541 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListActivity.java @@ -77,12 +77,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashSet; -//主界面,一进入就是这个界面 +//涓荤晫闈紝涓杩涘叆灏辨槸杩欎釜鐣岄潰 /** * @author k * */ -public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { //没有用特定的标签加注释。。。感觉没有什么用 +public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { //娌℃湁鐢ㄧ壒瀹氱殑鏍囩鍔犳敞閲娿傘傘傛劅瑙夋病鏈変粈涔堢敤 private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; private static final int FOLDER_LIST_QUERY_TOKEN = 1; @@ -93,7 +93,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private static final int MENU_FOLDER_CHANGE_NAME = 2; - private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; //单行超过80个字符 + private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; //鍗曡瓒呰繃80涓瓧绗 private enum ListEditState { NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER @@ -140,13 +140,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt private final static int REQUEST_CODE_NEW_NODE = 103; @Override - // 创建类 - protected void onCreate(final Bundle savedInstanceState) { //需要是final类型 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 - // final类不能被继承,没有子类,final类中的方法默认是final的。 - //final方法不能被子类的方法覆盖,但可以被继承。 - //final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 - //final不能用于修饰构造方法。 - super.onCreate(savedInstanceState); // 调用父类的onCreate函数 + // 鍒涘缓绫 + protected void onCreate(final Bundle savedInstanceState) { //闇瑕佹槸final绫诲瀷 鏍规嵁绋嬪簭涓婁笅鏂囩幆澧冿紝Java鍏抽敭瀛梖inal鏈夆滆繖鏄棤娉曟敼鍙樼殑鈥濇垨鑰呪滅粓鎬佺殑鈥濆惈涔夛紝瀹冨彲浠ヤ慨楗伴潪鎶借薄绫汇侀潪鎶借薄绫绘垚鍛樻柟娉曞拰鍙橀噺銆備綘鍙兘鍑轰簬涓ょ鐞嗚В鑰岄渶瑕侀樆姝㈡敼鍙橈細璁捐鎴栨晥鐜囥 + // final绫讳笉鑳借缁ф壙锛屾病鏈夊瓙绫伙紝final绫讳腑鐨勬柟娉曢粯璁ゆ槸final鐨勩 + //final鏂规硶涓嶈兘琚瓙绫荤殑鏂规硶瑕嗙洊锛屼絾鍙互琚户鎵裤 + //final鎴愬憳鍙橀噺琛ㄧず甯搁噺锛屽彧鑳借璧嬪间竴娆★紝璧嬪煎悗鍊间笉鍐嶆敼鍙樸 + //final涓嶈兘鐢ㄤ簬淇グ鏋勯犳柟娉曘 + super.onCreate(savedInstanceState); // 璋冪敤鐖剁被鐨刼nCreate鍑芥暟 setContentView(R.layout.note_list); initResources(); @@ -157,32 +157,32 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } @Override - // 返回一些子模块完成的数据交给主Activity处理 + // 杩斿洖涓浜涘瓙妯″潡瀹屾垚鐨勬暟鎹氦缁欎富Activity澶勭悊 protected void onActivityResult(int requestCode, int resultCode, Intent data) { - // 结果值 和 要求值 符合要求 + // 缁撴灉鍊 鍜 瑕佹眰鍊 绗﹀悎瑕佹眰 if (resultCode == RESULT_OK && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { mNotesListAdapter.changeCursor(null); } else { super.onActivityResult(requestCode, resultCode, data); - // 调用 Activity 的onActivityResult() + // 璋冪敤 Activity 鐨刼nActivityResult锛堬級 } } private void setAppInfoFromRawRes() { - // Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。 + // Android骞冲彴缁欐垜浠彁渚涗簡涓涓猄haredPreferences绫伙紝瀹冩槸涓涓交閲忕骇鐨勫瓨鍌ㄧ被锛岀壒鍒傚悎鐢ㄤ簬淇濆瓨杞欢閰嶇疆鍙傛暟銆 SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { StringBuilder sb = new StringBuilder(); InputStream in = null; try { - // 把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后, - // 以openRawResource方法(不带后缀的资源文件名)打开这个文件。 + // 鎶婅祫婧愭枃浠舵斁鍒板簲鐢ㄧ▼搴忕殑/raw/raw涓嬶紝閭d箞灏卞彲浠ュ湪搴旂敤涓娇鐢╣etResources鑾峰彇璧勬簮鍚, + // 浠penRawResource鏂规硶锛堜笉甯﹀悗缂鐨勮祫婧愭枃浠跺悕锛夋墦寮杩欎釜鏂囦欢銆 in = getResources().openRawResource(R.raw.introduction); if (in != null) { InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; // 自行定义的数值,使用者不知道有什么意义 + char [] buf = new char[1024]; // 鑷瀹氫箟鐨勬暟鍊硷紝浣跨敤鑰呬笉鐭ラ亾鏈変粈涔堟剰涔 int len = 0; while ((len = br.read(buf)) > 0) { sb.append(buf, 0, len); @@ -205,13 +205,13 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } } - // 创建空的WorkingNote + // 鍒涘缓绌虹殑WorkingNote WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, ResourceParser.RED); note.setWorkingText(sb.toString()); if (note.saveNote()) { - // 更新保存note的信息 + // 鏇存柊淇濆瓨note鐨勪俊鎭 sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); } else { Log.e(TAG, "Save introduction note error"); @@ -226,21 +226,21 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt startAsyncNotesListQuery(); } - // 初始化资源 + // 鍒濆鍖栬祫婧 private void initResources() { - mContentResolver = this.getContentResolver(); // 获取应用程序的数据,得到类似数据表的东西 + mContentResolver = this.getContentResolver(); // 鑾峰彇搴旂敤绋嬪簭鐨勬暟鎹紝寰楀埌绫讳技鏁版嵁琛ㄧ殑涓滆タ mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); mCurrentFolderId = Notes.ID_ROOT_FOLDER; - // findViewById 是安卓编程的定位函数,主要是引用.R文件里的引用名 - mNotesListView = (ListView) findViewById(R.id.notes_list); // 绑定XML中的ListView,作为Item的容器 + // findViewById 鏄畨鍗撶紪绋嬬殑瀹氫綅鍑芥暟锛屼富瑕佹槸寮曠敤.R鏂囦欢閲岀殑寮曠敤鍚 + mNotesListView = (ListView) findViewById(R.id.notes_list); // 缁戝畾XML涓殑ListView锛屼綔涓篒tem鐨勫鍣 mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), null, false); mNotesListView.setOnItemClickListener(new OnListItemClickListener()); mNotesListView.setOnItemLongClickListener(this); mNotesListAdapter = new NotesListAdapter(this); mNotesListView.setAdapter(mNotesListAdapter); - mAddNewNote = (Button) findViewById(R.id.btn_new_note);// 在activity中要获取该按钮 + mAddNewNote = (Button) findViewById(R.id.btn_new_note);// 鍦╝ctivity涓鑾峰彇璇ユ寜閽 mAddNewNote.setOnClickListener(this); mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); mDispatch = false; @@ -251,7 +251,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt mModeCallBack = new ModeCallback(); } - // 继承自ListView.MultiChoiceModeListener 和 OnMenuItemClickListener + // 缁ф壙鑷狶istView.MultiChoiceModeListener 鍜 OnMenuItemClickListener private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { private DropdownMenu mDropDownMenu; private ActionMode mActionMode; @@ -290,12 +290,12 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt return true; } - // 更新菜单 + // 鏇存柊鑿滃崟 private void updateMenu() { int selectedCount = mNotesListAdapter.getSelectedCount(); // Update dropdown menu String format = getResources().getString(R.string.menu_select_title, selectedCount); - mDropDownMenu.setTitle(format); // 更改标题 + mDropDownMenu.setTitle(format); // 鏇存敼鏍囬 MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); if (item != null) { if (mNotesListAdapter.isAllSelected()) { @@ -388,7 +388,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /** * HACKME:When click the transparent part of "New Note" button, dispatch * the event to the list view behind this button. The transparent part of - * "New Note" button could be expressed by formula y=-0.12x+94锛圲nit:pixel锛 + * "New Note" button could be expressed by formula y=-0.12x+94閿涘湶nit:pixel閿涳拷 * and the line top of the button. The coordinate based on left of the "New * Note" button. The 94 represents maximum height of the transparent part. * Notice that, if the background of the button changes, the formula should @@ -688,7 +688,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /* (non-Javadoc) * @see android.app.Activity#onBackPressed() - * 按返回键时根据情况更改类中的数据 + * 鎸夎繑鍥為敭鏃舵牴鎹儏鍐垫洿鏀圭被涓殑鏁版嵁 */ @Override public void onBackPressed() { switch (mState) { @@ -716,7 +716,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /** * @param appWidgetId * @param appWidgetType - * 根据不同类型的widget更新插件,通过intent传送数据 + * 鏍规嵁涓嶅悓绫诲瀷鐨剋idget鏇存柊鎻掍欢锛岄氳繃intent浼犻佹暟鎹 */ private void updateWidget(int appWidgetId, int appWidgetType) { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); @@ -738,7 +738,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } /** - * 声明监听器,建立菜单,包括名称,视图,删除操作,更改名称操作; + * 澹版槑鐩戝惉鍣紝寤虹珛鑿滃崟锛屽寘鎷悕绉帮紝瑙嗗浘锛屽垹闄ゆ搷浣滐紝鏇存敼鍚嶇О鎿嶄綔锛 */ private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { @@ -761,7 +761,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /* (non-Javadoc) * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) - * 针对menu中不同的选择进行不同的处理,里面详细注释 + * 閽堝menu涓笉鍚岀殑閫夋嫨杩涜涓嶅悓鐨勫鐞嗭紝閲岄潰璇︾粏娉ㄩ噴 */ @Override public boolean onContextItemSelected(MenuItem item) { @@ -771,10 +771,10 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } switch (item.getItemId()) { case MENU_FOLDER_VIEW: - openFolder(mFocusNoteDataItem);//打开对应文件 + openFolder(mFocusNoteDataItem);//鎵撳紑瀵瑰簲鏂囦欢 break; case MENU_FOLDER_DELETE: - AlertDialog.Builder builder = new AlertDialog.Builder(this);//设置确认是否删除的对话框 + AlertDialog.Builder builder = new AlertDialog.Builder(this);//璁剧疆纭鏄惁鍒犻櫎鐨勫璇濇 builder.setTitle(getString(R.string.alert_title_delete)); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setMessage(getString(R.string.alert_message_delete_folder)); @@ -785,7 +785,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } }); builder.setNegativeButton(android.R.string.cancel, null); - builder.show();//显示对话框 + builder.show();//鏄剧ず瀵硅瘽妗 break; case MENU_FOLDER_CHANGE_NAME: showCreateOrModifyFolderDialog(false); @@ -857,7 +857,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /* (non-Javadoc) * @see android.app.Activity#onSearchRequested() - * 直接调用startSearch函数 + * 鐩存帴璋冪敤startSearch鍑芥暟 */ @Override public boolean onSearchRequested() { @@ -866,7 +866,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } /** - * 函数功能:实现将便签导出到文本功能 + * 鍑芥暟鍔熻兘锛氬疄鐜板皢渚跨瀵煎嚭鍒版枃鏈姛鑳 */ private void exportNoteToText() { final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); @@ -912,14 +912,14 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /** * @return - * 功能:判断是否正在同步 + * 鍔熻兘锛氬垽鏂槸鍚︽鍦ㄥ悓姝 */ private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } /** - * 功能:跳转到PreferenceActivity界面 + * 鍔熻兘锛氳烦杞埌PreferenceActivity鐣岄潰 */ private void startPreferenceActivity() { Activity from = getParent() != null ? getParent() : this; @@ -929,7 +929,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /** * @author k - * 函数功能:实现对便签列表项的点击事件(短按) + * 鍑芥暟鍔熻兘锛氬疄鐜板渚跨鍒楄〃椤圭殑鐐瑰嚮浜嬩欢锛堢煭鎸夛級 */ private class OnListItemClickListener implements OnItemClickListener { @@ -973,7 +973,7 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt } /** - * 查询目标文件 + * 鏌ヨ鐩爣鏂囦欢 */ private void startQueryDestinationFolders() { String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; @@ -995,9 +995,9 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt /* (non-Javadoc) * @see android.widget.AdapterView.OnItemLongClickListener#onItemLongClick(android.widget.AdapterView, android.view.View, int, long) - * 长按某一项时进行的操作 - * 如果长按的是便签,则通过ActionMode菜单实现;如果长按的是文件夹,则通过ContextMenu菜单实现; - * 具体ActionMOde菜单和ContextMenu菜单的详细见精度笔记 + * 闀挎寜鏌愪竴椤规椂杩涜鐨勬搷浣 + * 濡傛灉闀挎寜鐨勬槸渚跨锛屽垯閫氳繃ActionMode鑿滃崟瀹炵幇锛涘鏋滈暱鎸夌殑鏄枃浠跺す锛屽垯閫氳繃ContextMenu鑿滃崟瀹炵幇锛 + * 鍏蜂綋ActionMOde鑿滃崟鍜孋ontextMenu鑿滃崟鐨勮缁嗚绮惧害绗旇 */ public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { if (view instanceof NotesListItem) { diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java b/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java index c943961..b79c464 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java @@ -33,18 +33,18 @@ import java.util.Iterator; /* - * 功能:直译为便签表连接器,继承了CursorAdapter,它为cursor和ListView提供了连接的桥梁。 - * 所以NotesListAdapter实现的是鼠标和编辑便签链接的桥梁 + * 鍔熻兘锛氱洿璇戜负渚跨琛ㄨ繛鎺ュ櫒锛岀户鎵夸簡CursorAdapter锛屽畠涓篶ursor鍜孡istView鎻愪緵浜嗚繛鎺ョ殑妗ユ銆 + * 鎵浠otesListAdapter瀹炵幇鐨勬槸榧犳爣鍜岀紪杈戜究绛鹃摼鎺ョ殑妗ユ */ public class NotesListAdapter extends CursorAdapter { private static final String TAG = "NotesListAdapter"; private Context mContext; private HashMap mSelectedIndex; - private int mNotesCount; //便签数 - private boolean mChoiceMode; //选择模式标记 + private int mNotesCount; //渚跨鏁 + private boolean mChoiceMode; //閫夋嫨妯″紡鏍囪 /* - * 桌面widget的属性,包括编号和类型 + * 妗岄潰widget鐨勫睘鎬э紝鍖呮嫭缂栧彿鍜岀被鍨 */ public static class AppWidgetAttribute { public int widgetId; @@ -52,61 +52,61 @@ public class NotesListAdapter extends CursorAdapter { }; /* - * 函数功能:初始化便签链接器 - * 函数实现:根据传进来的内容设置相关变量 + * 鍑芥暟鍔熻兘锛氬垵濮嬪寲渚跨閾炬帴鍣 + * 鍑芥暟瀹炵幇锛氭牴鎹紶杩涙潵鐨勫唴瀹硅缃浉鍏冲彉閲 */ public NotesListAdapter(Context context) { - super(context, null); //父类对象置空 - mSelectedIndex = new HashMap(); //新建选项下标的hash表 + super(context, null); //鐖剁被瀵硅薄缃┖ + mSelectedIndex = new HashMap(); //鏂板缓閫夐」涓嬫爣鐨刪ash琛 mContext = context; mNotesCount = 0; } @Override /* - * 函数功能:新建一个视图来存储光标所指向的数据 - * 函数实现:使用兄弟类NotesListItem新建一个项目选项 + * 鍑芥暟鍔熻兘锛氭柊寤轰竴涓鍥炬潵瀛樺偍鍏夋爣鎵鎸囧悜鐨勬暟鎹 + * 鍑芥暟瀹炵幇锛氫娇鐢ㄥ厔寮熺被NotesListItem鏂板缓涓涓」鐩夐」 */ public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); } /* - * 函数功能:将已经存在的视图和鼠标指向的数据进行捆绑 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬皢宸茬粡瀛樺湪鐨勮鍥惧拰榧犳爣鎸囧悜鐨勬暟鎹繘琛屾崋缁 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof NotesListItem) { - //若view是NotesListItem的一个实例 + //鑻iew鏄疦otesListItem鐨勪竴涓疄渚 NoteItemData itemData = new NoteItemData(context, cursor); ((NotesListItem) view).bind(context, itemData, mChoiceMode, isSelectedItem(cursor.getPosition())); - //则新建一个项目选项并且用bind跟将view和鼠标,内容,便签数据捆绑在一起 + //鍒欐柊寤轰竴涓」鐩夐」骞朵笖鐢╞ind璺熷皢view鍜岄紶鏍囷紝鍐呭锛屼究绛炬暟鎹崋缁戝湪涓璧 } } /* - * 函数功能:设置勾选框 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳缃嬀閫夋 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void setCheckedItem(final int position, final boolean checked) { mSelectedIndex.put(position, checked); - //根据定位和是否勾选设置下标 + //鏍规嵁瀹氫綅鍜屾槸鍚﹀嬀閫夎缃笅鏍 notifyDataSetChanged(); - //在修改后刷新activity + //鍦ㄤ慨鏀瑰悗鍒锋柊activity } /* - * 函数功能:判断单选按钮是否勾选 + * 鍑芥暟鍔熻兘锛氬垽鏂崟閫夋寜閽槸鍚﹀嬀閫 */ public boolean isInChoiceMode() { return mChoiceMode; } /* - * 函数功能:设置单项选项框 - * 函数实现:重置下标并且根据参数mode设置选项 + * 鍑芥暟鍔熻兘锛氳缃崟椤归夐」妗 + * 鍑芥暟瀹炵幇锛氶噸缃笅鏍囧苟涓旀牴鎹弬鏁癿ode璁剧疆閫夐」 */ public void setChoiceMode(boolean mode) { mSelectedIndex.clear(); @@ -114,12 +114,12 @@ public class NotesListAdapter extends CursorAdapter { } /* - * 函数功能:选择全部选项 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氶夋嫨鍏ㄩ儴閫夐」 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public void selectAll(boolean checked) { Cursor cursor = getCursor(); - //获取光标位置 + //鑾峰彇鍏夋爣浣嶇疆 for (int i = 0; i < getCount(); i++) { if (cursor.moveToPosition(i)) { if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { @@ -127,28 +127,28 @@ public class NotesListAdapter extends CursorAdapter { } } } - //遍历所有光标可用的位置在判断为便签类型之后勾选单项框 + //閬嶅巻鎵鏈夊厜鏍囧彲鐢ㄧ殑浣嶇疆鍦ㄥ垽鏂负渚跨绫诲瀷涔嬪悗鍕鹃夊崟椤规 } /* - * 函数功能:建立选择项的下标列表 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬缓绔嬮夋嫨椤圭殑涓嬫爣鍒楄〃 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public HashSet getSelectedItemIds() { HashSet itemSet = new HashSet(); - //建立hash表 + //寤虹珛hash琛 for (Integer position : mSelectedIndex.keySet()) { - //遍历所有的关键 + //閬嶅巻鎵鏈夌殑鍏抽敭 if (mSelectedIndex.get(position) == true) { - //若光标位置可用 + //鑻ュ厜鏍囦綅缃彲鐢 Long id = getItemId(position); if (id == Notes.ID_ROOT_FOLDER) { - //原文件不需要添加 + //鍘熸枃浠朵笉闇瑕佹坊鍔 Log.d(TAG, "Wrong item id, should not happen"); } else { itemSet.add(id); } - //则将id该下标假如选项集合中 + //鍒欏皢id璇ヤ笅鏍囧亣濡傞夐」闆嗗悎涓 } } @@ -157,17 +157,17 @@ public class NotesListAdapter extends CursorAdapter { } /* - * 函数功能:建立桌面Widget的选项表 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬缓绔嬫闈idget鐨勯夐」琛 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { if (mSelectedIndex.get(position) == true) { Cursor c = (Cursor) getItem(position); - //以上4句和getSelectedItemIds一样,不再重复 + //浠ヤ笂4鍙ュ拰getSelectedItemIds涓鏍凤紝涓嶅啀閲嶅 if (c != null) { - //光标位置可用的话就建立新的Widget属性并编辑下标和类型,最后添加到选项集中 + //鍏夋爣浣嶇疆鍙敤鐨勮瘽灏卞缓绔嬫柊鐨刉idget灞炴у苟缂栬緫涓嬫爣鍜岀被鍨嬶紝鏈鍚庢坊鍔犲埌閫夐」闆嗕腑 AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); @@ -186,21 +186,21 @@ public class NotesListAdapter extends CursorAdapter { } /* - * 函数功能:获取选项个数 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳幏鍙栭夐」涓暟 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public int getSelectedCount() { Collection values = mSelectedIndex.values(); - //首先获取选项下标的值 + //棣栧厛鑾峰彇閫夐」涓嬫爣鐨勫 if (null == values) { return 0; } Iterator iter = values.iterator(); - //初始化叠加器 + //鍒濆鍖栧彔鍔犲櫒 int count = 0; while (iter.hasNext()) { if (true == iter.next()) { - //若value值为真计数+1 + //鑻alue鍊间负鐪熻鏁+1 count++; } } @@ -208,18 +208,18 @@ public class NotesListAdapter extends CursorAdapter { } /* - * 函数功能:判断是否全部选中 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬垽鏂槸鍚﹀叏閮ㄩ変腑 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public boolean isAllSelected() { int checkedCount = getSelectedCount(); return (checkedCount != 0 && checkedCount == mNotesCount); - //获取选项数看是否等于便签的个数 + //鑾峰彇閫夐」鏁扮湅鏄惁绛変簬渚跨鐨勪釜鏁 } /* - * 函数功能:判断是否为选项表 - * 函数实现:通过传递的下标来确定 + * 鍑芥暟鍔熻兘锛氬垽鏂槸鍚︿负閫夐」琛 + * 鍑芥暟瀹炵幇锛氶氳繃浼犻掔殑涓嬫爣鏉ョ‘瀹 */ public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { @@ -230,44 +230,44 @@ public class NotesListAdapter extends CursorAdapter { @Override /* - * 函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氬湪activity鍐呭鍙戠敓灞閮ㄥ彉鍔ㄧ殑鏃跺欏洖璋冭鍑芥暟璁$畻渚跨鐨勬暟閲 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ protected void onContentChanged() { super.onContentChanged(); - //执行基类函数 + //鎵ц鍩虹被鍑芥暟 calcNotesCount(); } @Override /* - * 函数功能:在activity光标发生局部变动的时候回调该函数计算便签的数量 + * 鍑芥暟鍔熻兘锛氬湪activity鍏夋爣鍙戠敓灞閮ㄥ彉鍔ㄧ殑鏃跺欏洖璋冭鍑芥暟璁$畻渚跨鐨勬暟閲 */ public void changeCursor(Cursor cursor) { super.changeCursor(cursor); - //执行基类函数 + //鎵ц鍩虹被鍑芥暟 calcNotesCount(); } /* - * 函数功能:计算便签数量 + * 鍑芥暟鍔熻兘锛氳绠椾究绛炬暟閲 * */ private void calcNotesCount() { mNotesCount = 0; for (int i = 0; i < getCount(); i++) { - //获取总数同时遍历 + //鑾峰彇鎬绘暟鍚屾椂閬嶅巻 Cursor c = (Cursor) getItem(i); if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { mNotesCount++; - //若该位置不为空并且文本类型为便签就+1 + //鑻ヨ浣嶇疆涓嶄负绌哄苟涓旀枃鏈被鍨嬩负渚跨灏+1 } } else { Log.e(TAG, "Invalid cursor"); return; } - //否则报错 + //鍚﹀垯鎶ラ敊 } } } \ No newline at end of file diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java index 8a5afbc..3ce0614 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesListItem.java @@ -30,43 +30,43 @@ import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; -//创建便签列表项目选项 +//鍒涘缓渚跨鍒楄〃椤圭洰閫夐」 public class NotesListItem extends LinearLayout { - private ImageView mAlert;//闹钟图片 - private TextView mTitle; //标题 - private TextView mTime; //时间 + private ImageView mAlert;//闂归挓鍥剧墖 + private TextView mTitle; //鏍囬 + private TextView mTime; //鏃堕棿 private TextView mCallName; // - private NoteItemData mItemData; //标签数据 - private CheckBox mCheckBox; //打钩框 + private NoteItemData mItemData; //鏍囩鏁版嵁 + private CheckBox mCheckBox; //鎵撻挬妗 - /*初始化基本信息*/ + /*鍒濆鍖栧熀鏈俊鎭*/ public NotesListItem(Context context) { - super(context); //super()它的主要作用是调整调用父类构造函数的顺序 - inflate(context, R.layout.note_item, this);//Inflate可用于将一个xml中定义的布局控件找出来,这里的xml是r。layout - //findViewById用于从contentView中查找指定ID的View,转换出来的形式根据需要而定; + super(context); //super()瀹冪殑涓昏浣滅敤鏄皟鏁磋皟鐢ㄧ埗绫绘瀯閫犲嚱鏁扮殑椤哄簭 + inflate(context, R.layout.note_item, this);//Inflate鍙敤浜庡皢涓涓獂ml涓畾涔夌殑甯冨眬鎺т欢鎵惧嚭鏉,杩欓噷鐨剎ml鏄痳銆俵ayout + //findViewById鐢ㄤ簬浠巆ontentView涓煡鎵炬寚瀹欼D鐨刅iew锛岃浆鎹㈠嚭鏉ョ殑褰㈠紡鏍规嵁闇瑕佽屽畾; mAlert = (ImageView) findViewById(R.id.iv_alert_icon); mTitle = (TextView) findViewById(R.id.tv_title); mTime = (TextView) findViewById(R.id.tv_time); mCallName = (TextView) findViewById(R.id.tv_name); mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); } - ///根据data的属性对各个控件的属性的控制,主要是可见性Visibility,内容setText,格式setTextAppearance + ///鏍规嵁data鐨勫睘鎬у鍚勪釜鎺т欢鐨勫睘鎬х殑鎺у埗锛屼富瑕佹槸鍙鎬isibility锛屽唴瀹箂etText锛屾牸寮弒etTextAppearance public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { if (choiceMode && data.getType() == Notes.TYPE_NOTE) { - mCheckBox.setVisibility(View.VISIBLE); ///设置可见行为可见 - mCheckBox.setChecked(checked); ///格子打钩 + mCheckBox.setVisibility(View.VISIBLE); ///璁剧疆鍙琛屼负鍙 + mCheckBox.setChecked(checked); ///鏍煎瓙鎵撻挬 } else { mCheckBox.setVisibility(View.GONE); } mItemData = data; - ///设置控件属性,一共三种情况,由data的id和父id是否与保存到文件夹的id一致来决定 + ///璁剧疆鎺т欢灞炴э紝涓鍏变笁绉嶆儏鍐碉紝鐢眃ata鐨刬d鍜岀埗id鏄惁涓庝繚瀛樺埌鏂囦欢澶圭殑id涓鑷存潵鍐冲畾 if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { mCallName.setVisibility(View.GONE); mAlert.setVisibility(View.VISIBLE); - //设置该textview的style + //璁剧疆璇extview鐨剆tyle mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - //settext为设置内容 + //settext涓鸿缃唴瀹 mTitle.setText(context.getString(R.string.call_record_folder_name) + context.getString(R.string.format_folder_files_count, data.getNotesCount())); mAlert.setImageResource(R.drawable.call_record); @@ -75,9 +75,9 @@ public class NotesListItem extends LinearLayout { mCallName.setText(data.getCallName()); mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - ///关于闹钟的设置 + ///鍏充簬闂归挓鐨勮缃 if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock);//图片来源的设置 + mAlert.setImageResource(R.drawable.clock);//鍥剧墖鏉ユ簮鐨勮缃 mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); @@ -85,7 +85,7 @@ public class NotesListItem extends LinearLayout { } else { mCallName.setVisibility(View.GONE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - ///设置title格式 + ///璁剧疆title鏍煎紡 if (data.getType() == Notes.TYPE_FOLDER) { mTitle.setText(data.getSnippet() + context.getString(R.string.format_folder_files_count, @@ -94,35 +94,35 @@ public class NotesListItem extends LinearLayout { } else { mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock);///设置图片来源 + mAlert.setImageResource(R.drawable.clock);///璁剧疆鍥剧墖鏉ユ簮 mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); } } } - ///设置内容,获取相关时间,从data里编辑的日期中获取 + ///璁剧疆鍐呭锛岃幏鍙栫浉鍏虫椂闂达紝浠巇ata閲岀紪杈戠殑鏃ユ湡涓幏鍙 mTime. setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); setBackground(data); } - //根据data的文件属性来设置背景 + //鏍规嵁data鐨勬枃浠跺睘鎬ф潵璁剧疆鑳屾櫙 private void setBackground(NoteItemData data) { int id = data.getBgColorId(); - //,若是note型文件,则4种情况,对于4种不同情况的背景来源 + //锛岃嫢鏄痭ote鍨嬫枃浠讹紝鍒4绉嶆儏鍐碉紝瀵逛簬4绉嶄笉鍚屾儏鍐电殑鑳屾櫙鏉ユ簮 if (data.getType() == Notes.TYPE_NOTE) { - //单个数据并且只有一个子文件夹 + //鍗曚釜鏁版嵁骞朵笖鍙湁涓涓瓙鏂囦欢澶 if (data.isSingle() || data.isOneFollowingFolder()) { setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); - } else if (data.isLast()) {//是最后一个数据 + } else if (data.isLast()) {//鏄渶鍚庝竴涓暟鎹 setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); - } else if (data.isFirst() || data.isMultiFollowingFolder()) {//是一个数据并有多个子文件夹 + } else if (data.isFirst() || data.isMultiFollowingFolder()) {//鏄竴涓暟鎹苟鏈夊涓瓙鏂囦欢澶 setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); } else { setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } } else { - //若不是note直接调用文件夹的背景来源 + //鑻ヤ笉鏄痭ote鐩存帴璋冪敤鏂囦欢澶圭殑鑳屾櫙鏉ユ簮 setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } diff --git a/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java b/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java index 8ddce7f..34a1ebc 100644 --- a/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java @@ -48,91 +48,91 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; /* - *该类功能:NotesPreferenceActivity,在小米便签中主要实现的是对背景颜色和字体大小的数据储存。 - * 继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity + *璇ョ被鍔熻兘锛歂otesPreferenceActivity锛屽湪灏忕背渚跨涓富瑕佸疄鐜扮殑鏄鑳屾櫙棰滆壊鍜屽瓧浣撳ぇ灏忕殑鏁版嵁鍌ㄥ瓨銆 + * 缁ф壙浜哖referenceActivity涓昏鍔熻兘涓哄绯荤粺淇℃伅鍜岄厤缃繘琛岃嚜鍔ㄤ繚瀛樼殑Activity */ public class NotesPreferenceActivity extends PreferenceActivity { public static final String PREFERENCE_NAME = "notes_preferences"; - //优先名 + //浼樺厛鍚 public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; - //同步账号 + //鍚屾璐﹀彿 public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; - //同步时间 + //鍚屾鏃堕棿 public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; - //同步密码 + //鍚屾瀵嗙爜 private static final String AUTHORITIES_FILTER_KEY = "authorities"; - //本地密码 + //鏈湴瀵嗙爜 private PreferenceCategory mAccountCategory; - //账户分组 + //璐︽埛鍒嗙粍 private GTaskReceiver mReceiver; - //同步任务接收器 + //鍚屾浠诲姟鎺ユ敹鍣 private Account[] mOriAccounts; - //账户 + //璐︽埛 private boolean mHasAddedAccount; - //账户的hash标记 + //璐︽埛鐨刪ash鏍囪 @Override /* - *函数功能:创建一个activity,在函数里要完成所有的正常静态设置 - *参数:Bundle icicle:存放了 activity 当前的状态 - *函数实现:如下注释 + *鍑芥暟鍔熻兘锛氬垱寤轰竴涓猘ctivity锛屽湪鍑芥暟閲岃瀹屾垚鎵鏈夌殑姝e父闈欐佽缃 + *鍙傛暟锛欱undle icicle锛氬瓨鏀句簡 activity 褰撳墠鐨勭姸鎬 + *鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ protected void onCreate(Bundle icicle) { - //先执行父类的创建函数 + //鍏堟墽琛岀埗绫荤殑鍒涘缓鍑芥暟 super.onCreate(icicle); /* using the app icon for navigation */ getActionBar().setDisplayHomeAsUpEnabled(true); - //给左上角图标的左边加上一个返回的图标 + //缁欏乏涓婅鍥炬爣鐨勫乏杈瑰姞涓婁竴涓繑鍥炵殑鍥炬爣 addPreferencesFromResource(R.xml.preferences); - //添加xml来源并显示 xml + //娣诲姞xml鏉ユ簮骞舵樉绀 xml mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); - //根据同步账户关键码来初始化分组 + //鏍规嵁鍚屾璐︽埛鍏抽敭鐮佹潵鍒濆鍖栧垎缁 mReceiver = new GTaskReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); registerReceiver(mReceiver, filter); - //初始化同步组件 + //鍒濆鍖栧悓姝ョ粍浠 mOriAccounts = null; View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - //获取listvivew,ListView的作用:用于列出所有选择 + //鑾峰彇listvivew锛孡istView鐨勪綔鐢:鐢ㄤ簬鍒楀嚭鎵鏈夐夋嫨 getListView().addHeaderView(header, null, true); - //在listview组件上方添加其他组件 + //鍦╨istview缁勪欢涓婃柟娣诲姞鍏朵粬缁勪欢 } @Override /* - * 函数功能:activity交互功能的实现,用于接受用户的输入 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛歛ctivity浜や簰鍔熻兘鐨勫疄鐜帮紝鐢ㄤ簬鎺ュ彈鐢ㄦ埛鐨勮緭鍏 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ protected void onResume() { - //先执行父类 的交互实现 + //鍏堟墽琛岀埗绫 鐨勪氦浜掑疄鐜 super.onResume(); // need to set sync account automatically if user has added a new // account if (mHasAddedAccount) { - //若用户新加了账户则自动设置同步账户 + //鑻ョ敤鎴锋柊鍔犱簡璐︽埛鍒欒嚜鍔ㄨ缃悓姝ヨ处鎴 Account[] accounts = getGoogleAccounts(); - //获取google同步账户 + //鑾峰彇google鍚屾璐︽埛 if (mOriAccounts != null && accounts.length > mOriAccounts.length) { - //若原账户不为空且当前账户有增加 + //鑻ュ師璐︽埛涓嶄负绌轰笖褰撳墠璐︽埛鏈夊鍔 for (Account accountNew : accounts) { boolean found = false; for (Account accountOld : mOriAccounts) { if (TextUtils.equals(accountOld.name, accountNew.name)) { - //更新账户 + //鏇存柊璐︽埛 found = true; break; } } if (!found) { setSyncAccount(accountNew.name); - //若是没有找到旧的账户,那么同步账号中就只添加新账户 + //鑻ユ槸娌℃湁鎵惧埌鏃х殑璐︽埛锛岄偅涔堝悓姝ヨ处鍙蜂腑灏卞彧娣诲姞鏂拌处鎴 break; } } @@ -140,52 +140,52 @@ public class NotesPreferenceActivity extends PreferenceActivity { } refreshUI(); - //刷新标签界面 + //鍒锋柊鏍囩鐣岄潰 } @Override /* - * 函数功能:销毁一个activity - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氶攢姣佷竴涓猘ctivity + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ protected void onDestroy() { if (mReceiver != null) { unregisterReceiver(mReceiver); - //注销接收器 + //娉ㄩ攢鎺ユ敹鍣 } super.onDestroy(); - //执行父类的销毁动作 + //鎵ц鐖剁被鐨勯攢姣佸姩浣 } /* - * 函数功能:重新设置账户信息 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氶噸鏂拌缃处鎴蜂俊鎭 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void loadAccountPreference() { mAccountCategory.removeAll(); - //销毁所有的分组 + //閿姣佹墍鏈夌殑鍒嗙粍 Preference accountPref = new Preference(this); - //建立首选项 + //寤虹珛棣栭夐」 final String defaultAccount = getSyncAccountName(this); accountPref.setTitle(getString(R.string.preferences_account_title)); accountPref.setSummary(getString(R.string.preferences_account_summary)); - //设置首选项的大标题和小标题 + //璁剧疆棣栭夐」鐨勫ぇ鏍囬鍜屽皬鏍囬 accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { - //建立监听器 + //寤虹珛鐩戝惉鍣 if (!GTaskSyncService.isSyncing()) { if (TextUtils.isEmpty(defaultAccount)) { // the first time to set account - //若是第一次建立账户显示选择账户提示对话框 + //鑻ユ槸绗竴娆″缓绔嬭处鎴锋樉绀洪夋嫨璐︽埛鎻愮ず瀵硅瘽妗 showSelectAccountAlertDialog(); } else { // if the account has already been set, we need to promp // user about the risk - //若是已经建立则显示修改对话框并进行修改操作 + //鑻ユ槸宸茬粡寤虹珛鍒欐樉绀轰慨鏀瑰璇濇骞惰繘琛屼慨鏀规搷浣 showChangeAccountConfirmAlertDialog(); } } else { - //若在没有同步的情况下,则在toast中显示不能修改 + //鑻ュ湪娌℃湁鍚屾鐨勬儏鍐典笅锛屽垯鍦╰oast涓樉绀轰笉鑳戒慨鏀 Toast.makeText(NotesPreferenceActivity.this, R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) .show(); @@ -194,29 +194,29 @@ public class NotesPreferenceActivity extends PreferenceActivity { } }); - //根据新建首选项编辑新的账户分组 + //鏍规嵁鏂板缓棣栭夐」缂栬緫鏂扮殑璐︽埛鍒嗙粍 mAccountCategory.addPreference(accountPref); } /* - *函数功能:设置按键的状态和最后同步的时间 - *函数实现:如下注释 + *鍑芥暟鍔熻兘锛氳缃寜閿殑鐘舵佸拰鏈鍚庡悓姝ョ殑鏃堕棿 + *鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void loadSyncButton() { Button syncButton = (Button) findViewById(R.id.preference_sync_button); TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - //获取同步按钮控件和最终同步时间的的窗口 + //鑾峰彇鍚屾鎸夐挳鎺т欢鍜屾渶缁堝悓姝ユ椂闂寸殑鐨勭獥鍙 // set button state - //设置按钮的状态 + //璁剧疆鎸夐挳鐨勭姸鎬 if (GTaskSyncService.isSyncing()) { - //若是在同步状态下 + //鑻ユ槸鍦ㄥ悓姝ョ姸鎬佷笅 syncButton.setText(getString(R.string.preferences_button_sync_cancel)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { GTaskSyncService.cancelSync(NotesPreferenceActivity.this); } }); - //设置按钮显示的文本为“取消同步”以及监听器 + //璁剧疆鎸夐挳鏄剧ず鐨勬枃鏈负鈥滃彇娑堝悓姝モ濅互鍙婄洃鍚櫒 } else { syncButton.setText(getString(R.string.preferences_button_sync_immediately)); syncButton.setOnClickListener(new View.OnClickListener() { @@ -224,36 +224,36 @@ public class NotesPreferenceActivity extends PreferenceActivity { GTaskSyncService.startSync(NotesPreferenceActivity.this); } }); - //若是不同步则设置按钮显示的文本为“立即同步”以及对应监听器 + //鑻ユ槸涓嶅悓姝ュ垯璁剧疆鎸夐挳鏄剧ず鐨勬枃鏈负鈥滅珛鍗冲悓姝モ濅互鍙婂搴旂洃鍚櫒 } syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - //设置按键可用还是不可用 + //璁剧疆鎸夐敭鍙敤杩樻槸涓嶅彲鐢 // set last sync time - // 设置最终同步时间 + // 璁剧疆鏈缁堝悓姝ユ椂闂 if (GTaskSyncService.isSyncing()) { - //若是在同步的情况下 + //鑻ユ槸鍦ㄥ悓姝ョ殑鎯呭喌涓 lastSyncTimeView.setText(GTaskSyncService.getProgressString()); lastSyncTimeView.setVisibility(View.VISIBLE); - // 根据当前同步服务器设置时间显示框的文本以及可见性 + // 鏍规嵁褰撳墠鍚屾鏈嶅姟鍣ㄨ缃椂闂存樉绀烘鐨勬枃鏈互鍙婂彲瑙佹 } else { - //若是非同步情况 + //鑻ユ槸闈炲悓姝ユ儏鍐 long lastSyncTime = getLastSyncTime(this); if (lastSyncTime != 0) { lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, DateFormat.format(getString(R.string.preferences_last_sync_time_format), lastSyncTime))); lastSyncTimeView.setVisibility(View.VISIBLE); - //则根据最后同步时间的信息来编辑时间显示框的文本内容和可见性 + //鍒欐牴鎹渶鍚庡悓姝ユ椂闂寸殑淇℃伅鏉ョ紪杈戞椂闂存樉绀烘鐨勬枃鏈唴瀹瑰拰鍙鎬 } else { - //若时间为空直接设置为不可见状态 + //鑻ユ椂闂翠负绌虹洿鎺ヨ缃负涓嶅彲瑙佺姸鎬 lastSyncTimeView.setVisibility(View.GONE); } } } /* - *函数功能:刷新标签界面 - *函数实现:调用上文设置账号和设置按键两个函数来实现 + *鍑芥暟鍔熻兘锛氬埛鏂版爣绛剧晫闈 + *鍑芥暟瀹炵幇锛氳皟鐢ㄤ笂鏂囪缃处鍙峰拰璁剧疆鎸夐敭涓や釜鍑芥暟鏉ュ疄鐜 */ private void refreshUI() { loadAccountPreference(); @@ -261,30 +261,30 @@ public class NotesPreferenceActivity extends PreferenceActivity { } /* - * 函数功能:显示账户选择的对话框并进行账户的设置 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氭樉绀鸿处鎴烽夋嫨鐨勫璇濇骞惰繘琛岃处鎴风殑璁剧疆 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void showSelectAccountAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - //创建一个新的对话框 + //鍒涘缓涓涓柊鐨勫璇濇 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - //设置标题以及子标题的内容 + //璁剧疆鏍囬浠ュ強瀛愭爣棰樼殑鍐呭 dialogBuilder.setCustomTitle(titleView); dialogBuilder.setPositiveButton(null, null); - //设置对话框的自定义标题,建立一个YES的按钮 + //璁剧疆瀵硅瘽妗嗙殑鑷畾涔夋爣棰橈紝寤虹珛涓涓猋ES鐨勬寜閽 Account[] accounts = getGoogleAccounts(); String defAccount = getSyncAccountName(this); - //获取同步账户信息 + //鑾峰彇鍚屾璐︽埛淇℃伅 mOriAccounts = accounts; mHasAddedAccount = false; if (accounts.length > 0) { - //若账户不为空 + //鑻ヨ处鎴蜂笉涓虹┖ CharSequence[] items = new CharSequence[accounts.length]; final CharSequence[] itemMapping = items; int checkedItem = -1; @@ -292,90 +292,90 @@ public class NotesPreferenceActivity extends PreferenceActivity { for (Account account : accounts) { if (TextUtils.equals(account.name, defAccount)) { checkedItem = index; - //在账户列表中查询到所需账户 + //鍦ㄨ处鎴峰垪琛ㄤ腑鏌ヨ鍒版墍闇璐︽埛 } items[index++] = account.name; } dialogBuilder.setSingleChoiceItems(items, checkedItem, - //在对话框建立一个单选的复选框 + //鍦ㄥ璇濇寤虹珛涓涓崟閫夌殑澶嶉夋 new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { setSyncAccount(itemMapping[which].toString()); dialog.dismiss(); - //取消对话框 + //鍙栨秷瀵硅瘽妗 refreshUI(); } - //设置点击后执行的事件,包括检录新同步账户和刷新标签界面 + //璁剧疆鐐瑰嚮鍚庢墽琛岀殑浜嬩欢锛屽寘鎷褰曟柊鍚屾璐︽埛鍜屽埛鏂版爣绛剧晫闈 }); - //建立对话框网络版的监听器 + //寤虹珛瀵硅瘽妗嗙綉缁滅増鐨勭洃鍚櫒 } View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); dialogBuilder.setView(addAccountView); - //给新加账户对话框设置自定义样式 + //缁欐柊鍔犺处鎴峰璇濇璁剧疆鑷畾涔夋牱寮 final AlertDialog dialog = dialogBuilder.show(); - //显示对话框 + //鏄剧ず瀵硅瘽妗 addAccountView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mHasAddedAccount = true; - //将新加账户的hash置true + //灏嗘柊鍔犺处鎴风殑hash缃畉rue Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); - //建立网络建立组件 + //寤虹珛缃戠粶寤虹珛缁勪欢 intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { "gmail-ls" }); startActivityForResult(intent, -1); - //跳回上一个选项 + //璺冲洖涓婁竴涓夐」 dialog.dismiss(); } }); - //建立新加账户对话框的监听器 + //寤虹珛鏂板姞璐︽埛瀵硅瘽妗嗙殑鐩戝惉鍣 } /* - * 函数功能:显示账户选择对话框和相关账户操作 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氭樉绀鸿处鎴烽夋嫨瀵硅瘽妗嗗拰鐩稿叧璐︽埛鎿嶄綔 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ private void showChangeAccountConfirmAlertDialog() { AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - //创建一个新的对话框 + //鍒涘缓涓涓柊鐨勫璇濇 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, getSyncAccountName(this))); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); - //根据同步修改的账户信息设置标题以及子标题的内容 + //鏍规嵁鍚屾淇敼鐨勮处鎴蜂俊鎭缃爣棰樹互鍙婂瓙鏍囬鐨勫唴瀹 dialogBuilder.setCustomTitle(titleView); - //设置对话框的自定义标题 + //璁剧疆瀵硅瘽妗嗙殑鑷畾涔夋爣棰 CharSequence[] menuItemArray = new CharSequence[] { getString(R.string.preferences_menu_change_account), getString(R.string.preferences_menu_remove_account), getString(R.string.preferences_menu_cancel) }; - //定义一些标记字符串 + //瀹氫箟涓浜涙爣璁板瓧绗︿覆 dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { - //设置对话框要显示的一个list,用于显示几个命令时,即change,remove,cancel + //璁剧疆瀵硅瘽妗嗚鏄剧ず鐨勪竴涓猯ist锛岀敤浜庢樉绀哄嚑涓懡浠ゆ椂,鍗砪hange锛宺emove锛宑ancel public void onClick(DialogInterface dialog, int which) { - //按键功能,由which来决定 + //鎸夐敭鍔熻兘锛岀敱which鏉ュ喅瀹 if (which == 0) { - //进入账户选择对话框 + //杩涘叆璐︽埛閫夋嫨瀵硅瘽妗 showSelectAccountAlertDialog(); } else if (which == 1) { - //删除账户并且跟新便签界面 + //鍒犻櫎璐︽埛骞朵笖璺熸柊渚跨鐣岄潰 removeSyncAccount(); refreshUI(); } } }); dialogBuilder.show(); - //显示对话框 + //鏄剧ず瀵硅瘽妗 } /* - *函数功能:获取谷歌账户 - *函数实现:通过账户管理器直接获取 + *鍑芥暟鍔熻兘锛氳幏鍙栬胺姝岃处鎴 + *鍑芥暟瀹炵幇锛氶氳繃璐︽埛绠$悊鍣ㄧ洿鎺ヨ幏鍙 */ private Account[] getGoogleAccounts() { AccountManager accountManager = AccountManager.get(this); @@ -383,28 +383,28 @@ public class NotesPreferenceActivity extends PreferenceActivity { } /* - * 函数功能:设置同步账户 - * 函数实现:如下注释: + * 鍑芥暟鍔熻兘锛氳缃悓姝ヨ处鎴 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲婏細 */ private void setSyncAccount(String account) { if (!getSyncAccountName(this).equals(account)) { - //假如该账号不在同步账号列表中 + //鍋囧璇ヨ处鍙蜂笉鍦ㄥ悓姝ヨ处鍙峰垪琛ㄤ腑 SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); - //编辑共享的首选项 + //缂栬緫鍏变韩鐨勯閫夐」 if (account != null) { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); } else { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } - //将该账号加入到首选项中 + //灏嗚璐﹀彿鍔犲叆鍒伴閫夐」涓 editor.commit(); - //提交修改的数据 + //鎻愪氦淇敼鐨勬暟鎹 setLastSyncTime(this, 0); - //将最后同步时间清零 + //灏嗘渶鍚庡悓姝ユ椂闂存竻闆 // clean up local gtask related info new Thread(new Runnable() { @@ -415,33 +415,33 @@ public class NotesPreferenceActivity extends PreferenceActivity { getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); } }).start(); - //重置当地同步任务的信息 + //閲嶇疆褰撳湴鍚屾浠诲姟鐨勪俊鎭 Toast.makeText(NotesPreferenceActivity.this, getString(R.string.preferences_toast_success_set_accout, account), Toast.LENGTH_SHORT).show(); - //将toast的文本信息置为“设置账户成功”并显示出来 + //灏唗oast鐨勬枃鏈俊鎭疆涓衡滆缃处鎴锋垚鍔熲濆苟鏄剧ず鍑烘潵 } } /* - * 函数功能:删除同步账户 - * 函数实现:如下注释: + * 鍑芥暟鍔熻兘锛氬垹闄ゅ悓姝ヨ处鎴 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲婏細 */ private void removeSyncAccount() { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); - //设置共享首选项 + //璁剧疆鍏变韩棣栭夐」 if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); - //假如当前首选项中有账户就删除 + //鍋囧褰撳墠棣栭夐」涓湁璐︽埛灏卞垹闄 } if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { editor.remove(PREFERENCE_LAST_SYNC_TIME); - //删除当前首选项中有账户时间 + //鍒犻櫎褰撳墠棣栭夐」涓湁璐︽埛鏃堕棿 } editor.commit(); - //提交更新后的数据 + //鎻愪氦鏇存柊鍚庣殑鏁版嵁 // clean up local gtask related info new Thread(new Runnable() { @@ -452,12 +452,12 @@ public class NotesPreferenceActivity extends PreferenceActivity { getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); } }).start(); - //重置当地同步任务的信息 + //閲嶇疆褰撳湴鍚屾浠诲姟鐨勪俊鎭 } /* - * 函数功能:获取同步账户名称 - * 函数实现:通过共享的首选项里的信息直接获取 + * 鍑芥暟鍔熻兘锛氳幏鍙栧悓姝ヨ处鎴峰悕绉 + * 鍑芥暟瀹炵幇锛氶氳繃鍏变韩鐨勯閫夐」閲岀殑淇℃伅鐩存帴鑾峰彇 */ public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, @@ -466,21 +466,21 @@ public class NotesPreferenceActivity extends PreferenceActivity { } /* - * 函数功能:设置最终同步的时间 - * 函数实现:如下注释 + * 鍑芥暟鍔熻兘锛氳缃渶缁堝悓姝ョ殑鏃堕棿 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 */ public static void setLastSyncTime(Context context, long time) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); - // 从共享首选项中找到相关账户并获取其编辑器 + // 浠庡叡浜閫夐」涓壘鍒扮浉鍏宠处鎴峰苟鑾峰彇鍏剁紪杈戝櫒 editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); editor.commit(); - //编辑最终同步时间并提交更新 + //缂栬緫鏈缁堝悓姝ユ椂闂村苟鎻愪氦鏇存柊 } /* - * 函数功能:获取最终同步时间 - * 函数实现:通过共享的首选项里的信息直接获取 + * 鍑芥暟鍔熻兘锛氳幏鍙栨渶缁堝悓姝ユ椂闂 + * 鍑芥暟瀹炵幇锛氶氳繃鍏变韩鐨勯閫夐」閲岀殑淇℃伅鐩存帴鑾峰彇 */ public static long getLastSyncTime(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, @@ -489,8 +489,8 @@ public class NotesPreferenceActivity extends PreferenceActivity { } /* - * 函数功能:接受同步信息 - * 函数实现:继承BroadcastReceiver + * 鍑芥暟鍔熻兘锛氭帴鍙楀悓姝ヤ俊鎭 + * 鍑芥暟瀹炵幇锛氱户鎵緽roadcastReceiver */ private class GTaskReceiver extends BroadcastReceiver { @@ -498,30 +498,30 @@ public class NotesPreferenceActivity extends PreferenceActivity { public void onReceive(Context context, Intent intent) { refreshUI(); if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { - //获取随广播而来的Intent中的同步服务的数据 + //鑾峰彇闅忓箍鎾屾潵鐨処ntent涓殑鍚屾鏈嶅姟鐨勬暟鎹 TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); syncStatus.setText(intent .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); - //通过获取的数据在设置系统的状态 + //閫氳繃鑾峰彇鐨勬暟鎹湪璁剧疆绯荤粺鐨勭姸鎬 } } } /* - * 函数功能:处理菜单的选项 - * 函数实现:如下注释 - * 参数:MenuItem菜单选项 + * 鍑芥暟鍔熻兘锛氬鐞嗚彍鍗曠殑閫夐」 + * 鍑芥暟瀹炵幇锛氬涓嬫敞閲 + * 鍙傛暟:MenuItem鑿滃崟閫夐」 */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { - //根据选项的id选择,这里只有一个主页 + //鏍规嵁閫夐」鐨刬d閫夋嫨锛岃繖閲屽彧鏈変竴涓富椤 case android.R.id.home: Intent intent = new Intent(this, NotesListActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); return true; - //在主页情况下在创建连接组件intent,发出清空的信号并开始一个相应的activity + //鍦ㄤ富椤垫儏鍐典笅鍦ㄥ垱寤鸿繛鎺ョ粍浠秈ntent锛屽彂鍑烘竻绌虹殑淇″彿骞跺紑濮嬩竴涓浉搴旂殑activity default: return false; }