diff --git a/doc/241101_1.png b/doc/241101.png similarity index 100% rename from doc/241101_1.png rename to doc/241101.png diff --git a/doc/小米便签开源代码的泛读报告v2.0.docx b/doc/小米便签开源代码的泛读报告v2.0.docx new file mode 100644 index 0000000..1b0648b Binary files /dev/null and b/doc/小米便签开源代码的泛读报告v2.0.docx differ diff --git a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin index 51c7465..401e26b 100644 Binary files a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin and b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock index f66b6de..0a0d1af 100644 Binary files a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock and b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin index ac4c449..6ed698e 100644 Binary files a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin and b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock index 7c3894c..c76a4aa 100644 Binary files a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock and b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin b/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin index 88a5731..5464751 100644 Binary files a/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin and b/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin differ diff --git a/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 2468f0e..d5b557b 100644 Binary files a/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/src/Notes-master/.gradle/file-system.probe b/src/Notes-master/.gradle/file-system.probe index 7debc76..d9d79c5 100644 Binary files a/src/Notes-master/.gradle/file-system.probe and b/src/Notes-master/.gradle/file-system.probe differ diff --git a/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk b/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk index f914290..f0a0f1c 100644 Binary files a/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk and b/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk differ diff --git a/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex b/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex index cd12252..278deb9 100644 Binary files a/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex and b/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex differ diff --git a/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt index 92ed983..f50029c 100644 --- a/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt +++ b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt @@ -1,4 +1,4 @@ -#Tue Nov 05 22:04:33 CST 2024 +#Thu Nov 07 11:14:00 CST 2024 base.0=D\:\\Android\\Notes-master1\\app\\build\\intermediates\\dex\\debug\\mergeDexDebug\\classes.dex renamed.0=classes.dex path.0=classes.dex diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class index 30318fc..e208b56 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class index bbbea2e..3ff5594 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class index e9f5b68..d8b615d 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class index bfb671c..2ff09d9 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class index ed4ac8e..a005b50 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class index fc1d9a2..f9bdaf3 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class index d4500ff..e4bcbfb 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class index f1053bc..bb46d8b 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class index 34b5c02..a2e8914 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class index 1714fc2..58e43d3 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class index 595f36d..4ba7611 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class index 7ded6f4..b444c91 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class index 79598f6..5b74240 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class index 124eb6a..12b8d5c 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class index e8e0e45..1eca804 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class index c3ee8d8..b185592 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class index 4812c99..c49feba 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class index 0754ffc..599771e 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class index dc60fe0..ab1e92c 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class index ff95cab..13b5208 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class index 75a9a17..0983a52 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class index 81d6513..60edb3e 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class index 66c9e6f..7340ae3 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class index 86cabc1..c6ec511 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class index 5012ef9..75eea96 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class index 354ae8e..ea44e05 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class index 4064ac0..fa58ca9 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class index 19383ea..3b08620 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class index 29d4cf9..3ad99c8 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class index 432dd4e..30ba112 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class index ad7cce4..2278848 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class index 6e0f050..6729024 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class index 93cd34b..bc41f43 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class index fea6568..270779a 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class index 5d8717b..422df08 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class index b58eac3..a7c35e5 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class index 9ec847b..f2ff7aa 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class index 7598ed0..448ec52 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class index 573ba34..53b689d 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class index a1c7178..59ed4bc 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class index c01fcae..76286d5 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class index d7027b9..215d255 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class index eb4eff7..2b4d209 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class index 245633b..495ebe3 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class index bcc1f6d..4fc6e67 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class index 5053337..33d5319 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class index f6e1ed8..d1c5a8e 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class index fabc84f..1c5f988 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class index e33d1c0..3a45c2d 100644 Binary files a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex index 7d8a2cc..b3a3952 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex index f34ea10..24a89cd 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex index 802d1f8..a9d7738 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex index 705f56a..422d467 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex index d9823b2..c7def1d 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex index 7c5f9b2..ceb2d7a 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex index 5888fc6..06eeba4 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex index 86f7f9f..2bdac90 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex index ef2fe6c..dcda433 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex index a49e587..dd23cc9 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex index 296ff56..64ae5cd 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex index 602aad6..4169060 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex index 88ac5a9..728daff 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex index b8af584..ee9ae1e 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex index c6e8fd8..33a02fd 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex index 559c7e5..3bd7e24 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex index b7482d9..e09164b 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex index 2d3dad9..b449eca 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex index 288c6fd..6e66a73 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex index 6d2a0a4..5aba177 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex index ac6117e..ba3b36b 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex index 1fb0182..d835428 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex index 1cbdbb2..3924d65 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex index 6c5293d..d4de43a 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex index f2219ba..23f2838 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex index c64b75d..ea1e0a6 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex index d76f231..ff25577 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex index 0d3d400..a936b38 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex index 33ac2d5..4c8a937 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex index 5c48404..cd99b10 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex index f5b5de2..7e84fc4 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex index 6f0d01c..f521fc7 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex index 5b91144..a84fc12 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex index feb5c80..8f9540f 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex index dd72238..d6bb19c 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex index ab39c99..339b915 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex index f8c2de3..5050cf5 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex index 3884261..d270bf8 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex index b125b7f..3d51994 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex index ea4d3bb..cbb5f45 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex index 303cd9e..a169a62 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex index 55eeca3..1f31e58 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex index 4ff53c2..62af184 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex index 2559347..fbef3ba 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex index 1b88930..fd50fb9 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex index aae067f..bd73d62 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex index b66222f..ab26473 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex index 6c5e3be..9d1fa13 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex index c8c3677..04f1c3e 100644 Binary files a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex differ diff --git a/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin index ea052bc..ddc4c5c 100644 Binary files a/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin and b/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java b/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java index 6706cf6..42a4e41 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java @@ -33,16 +33,22 @@ import net.micode.notes.data.Notes.TextNote; import java.util.ArrayList; - +/** + * 笔记类,用于管理笔记的数据和操作 + */ public class Note { - private ContentValues mNoteDiffValues; - private NoteData mNoteData; - private static final String TAG = "Note"; + private ContentValues mNoteDiffValues; // 存储笔记修改的值 + private NoteData mNoteData; // 笔记数据对象 + private static final String TAG = "Note"; // 日志标签 + /** - * Create a new note id for adding a new note to databases + * 创建新笔记ID + * @param context 上下文 + * @param folderId 文件夹ID + * @return 新创建的笔记ID */ public static synchronized long getNewNoteId(Context context, long folderId) { - // Create a new note in the database + // 在数据库中创建新笔记 ContentValues values = new ContentValues(); long createdTime = System.currentTimeMillis(); values.put(NoteColumns.CREATED_DATE, createdTime); @@ -65,41 +71,81 @@ public class Note { return noteId; } + /** + * 构造函数 + */ public Note() { mNoteDiffValues = new ContentValues(); mNoteData = new NoteData(); } + /** + * 设置笔记值 + * @param key 键 + * @param value 值 + */ public void setNoteValue(String key, String value) { mNoteDiffValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 设置文本数据 + * @param key 键 + * @param value 值 + */ public void setTextData(String key, String value) { mNoteData.setTextData(key, value); } + /** + * 设置文本数据ID + * @param id 文本数据ID + */ public void setTextDataId(long id) { mNoteData.setTextDataId(id); } + /** + * 获取文本数据ID + * @return 文本数据ID + */ public long getTextDataId() { return mNoteData.mTextDataId; } + /** + * 设置通话数据ID + * @param id 通话数据ID + */ public void setCallDataId(long id) { mNoteData.setCallDataId(id); } + /** + * 设置通话数据 + * @param key 键 + * @param value 值 + */ public void setCallData(String key, String value) { mNoteData.setCallData(key, value); } + /** + * 检查笔记是否在本地被修改 + * @return 是否被修改 + */ public boolean isLocalModified() { return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); } + /** + * 同步笔记到数据库 + * @param context 上下文 + * @param noteId 笔记ID + * @return 同步是否成功 + */ public boolean syncNote(Context context, long noteId) { if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); @@ -110,15 +156,15 @@ public class Note { } /** - * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and - * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the - * note data info + * 理论上,一旦数据改变,笔记应该在{@link NoteColumns#LOCAL_MODIFIED}和 + * {@link NoteColumns#MODIFIED_DATE}上更新。为了数据安全,即使更新笔记失败, + * 我们也会更新笔记数据信息 */ if (context.getContentResolver().update( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, null) == 0) { Log.e(TAG, "Update note error, should not happen"); - // Do not return, fall through + // 不返回,继续执行 } mNoteDiffValues.clear(); @@ -130,17 +176,19 @@ public class Note { return true; } + /** + * 笔记数据内部类,用于管理笔记的具体内容 + */ private class NoteData { - private long mTextDataId; - - private ContentValues mTextDataValues; - - private long mCallDataId; - - private ContentValues mCallDataValues; - - private static final String TAG = "NoteData"; + private long mTextDataId; // 文本数据ID + private ContentValues mTextDataValues; // 文本数据值 + private long mCallDataId; // 通话数据ID + private ContentValues mCallDataValues; // 通话数据值 + private static final String TAG = "NoteData"; // 日志标签 + /** + * 构造函数 + */ public NoteData() { mTextDataValues = new ContentValues(); mCallDataValues = new ContentValues(); @@ -148,10 +196,18 @@ public class Note { mCallDataId = 0; } + /** + * 检查数据是否在本地被修改 + * @return 是否被修改 + */ boolean isLocalModified() { return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; } + /** + * 设置文本数据ID + * @param id 文本数据ID + */ void setTextDataId(long id) { if(id <= 0) { throw new IllegalArgumentException("Text data id should larger than 0"); @@ -159,6 +215,10 @@ public class Note { mTextDataId = id; } + /** + * 设置通话数据ID + * @param id 通话数据ID + */ void setCallDataId(long id) { if (id <= 0) { throw new IllegalArgumentException("Call data id should larger than 0"); @@ -166,21 +226,37 @@ public class Note { mCallDataId = id; } + /** + * 设置通话数据 + * @param key 键 + * @param value 值 + */ void setCallData(String key, String value) { mCallDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 设置文本数据 + * @param key 键 + * @param value 值 + */ void setTextData(String key, String value) { mTextDataValues.put(key, value); mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); } + /** + * 将数据推送到ContentResolver + * @param context 上下文 + * @param noteId 笔记ID + * @return 操作结果URI + */ Uri pushIntoContentResolver(Context context, long noteId) { /** - * Check for safety + * 安全检查 */ if (noteId <= 0) { throw new IllegalArgumentException("Wrong note id:" + noteId); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java b/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java index be081e4..3f1c33a 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java @@ -31,37 +31,42 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.data.Notes.TextNote; import net.micode.notes.tool.ResourceParser.NoteBgResources; - +/** + * 工作笔记类,用于管理正在编辑的笔记 + */ public class WorkingNote { - // Note for the working note + // 笔记对象 private Note mNote; - // Note Id + // 笔记ID private long mNoteId; - // Note content + // 笔记内容 private String mContent; - // Note mode + // 笔记模式(普通模式或清单模式) private int mMode; - + // 提醒时间 private long mAlertDate; - + // 修改时间 private long mModifiedDate; - + // 背景颜色ID private int mBgColorId; - + // 小部件ID private int mWidgetId; - + // 小部件类型 private int mWidgetType; - + // 文件夹ID private long mFolderId; - + // 上下文对象 private Context mContext; - + // 日志标签 private static final String TAG = "WorkingNote"; - + // 是否已删除标记 private boolean mIsDeleted; - + // 笔记设置变更监听器 private NoteSettingChangedListener mNoteSettingStatusListener; + /** + * 数据表查询的列定义 + */ public static final String[] DATA_PROJECTION = new String[] { DataColumns.ID, DataColumns.CONTENT, @@ -72,6 +77,9 @@ public class WorkingNote { DataColumns.DATA4, }; + /** + * 笔记表查询的列定义 + */ public static final String[] NOTE_PROJECTION = new String[] { NoteColumns.PARENT_ID, NoteColumns.ALERTED_DATE, @@ -81,27 +89,25 @@ public class WorkingNote { NoteColumns.MODIFIED_DATE }; + // 数据表列索引常量 private static final int DATA_ID_COLUMN = 0; - private static final int DATA_CONTENT_COLUMN = 1; - private static final int DATA_MIME_TYPE_COLUMN = 2; - private static final int DATA_MODE_COLUMN = 3; + // 笔记表列索引常量 private static final int NOTE_PARENT_ID_COLUMN = 0; - private static final int NOTE_ALERTED_DATE_COLUMN = 1; - private static final int NOTE_BG_COLOR_ID_COLUMN = 2; - private static final int NOTE_WIDGET_ID_COLUMN = 3; - private static final int NOTE_WIDGET_TYPE_COLUMN = 4; - private static final int NOTE_MODIFIED_DATE_COLUMN = 5; - // New note construct + /** + * 创建新笔记的构造函数 + * @param context 上下文对象 + * @param folderId 文件夹ID + */ private WorkingNote(Context context, long folderId) { mContext = context; mAlertDate = 0; @@ -114,7 +120,12 @@ public class WorkingNote { mWidgetType = Notes.TYPE_WIDGET_INVALIDE; } - // Existing note construct + /** + * 加载已有笔记的构造函数 + * @param context 上下文对象 + * @param noteId 笔记ID + * @param folderId 文件夹ID + */ private WorkingNote(Context context, long noteId, long folderId) { mContext = context; mNoteId = noteId; @@ -124,6 +135,9 @@ public class WorkingNote { loadNote(); } + /** + * 从数据库加载笔记基本信息 + */ private void loadNote() { Cursor cursor = mContext.getContentResolver().query( ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, @@ -146,6 +160,9 @@ public class WorkingNote { loadNoteData(); } + /** + * 从数据库加载笔记内容数据 + */ private void loadNoteData() { Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { @@ -174,6 +191,15 @@ public class WorkingNote { } } + /** + * 创建空白笔记 + * @param context 上下文对象 + * @param folderId 文件夹ID + * @param widgetId 小部件ID + * @param widgetType 小部件类型 + * @param defaultBgColorId 默认背景色ID + * @return 新创建的工作笔记对象 + */ public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, int widgetType, int defaultBgColorId) { WorkingNote note = new WorkingNote(context, folderId); @@ -183,10 +209,20 @@ public class WorkingNote { return note; } + /** + * 加载已有笔记 + * @param context 上下文对象 + * @param id 笔记ID + * @return 加载的工作笔记对象 + */ public static WorkingNote load(Context context, long id) { return new WorkingNote(context, id, 0); } + /** + * 保存笔记 + * @return 是否保存成功 + */ public synchronized boolean saveNote() { if (isWorthSaving()) { if (!existInDatabase()) { @@ -199,7 +235,7 @@ public class WorkingNote { mNote.syncNote(mContext, mNoteId); /** - * Update widget content if there exist any widget of this note + * 如果笔记有关联的小部件,更新小部件内容 */ if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID && mWidgetType != Notes.TYPE_WIDGET_INVALIDE @@ -212,10 +248,18 @@ public class WorkingNote { } } + /** + * 判断笔记是否已存在于数据库 + * @return 是否存在 + */ public boolean existInDatabase() { return mNoteId > 0; } + /** + * 判断笔记是否值得保存 + * @return 是否值得保存 + */ private boolean isWorthSaving() { if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) || (existInDatabase() && !mNote.isLocalModified())) { @@ -225,10 +269,19 @@ public class WorkingNote { } } + /** + * 设置笔记设置变更监听器 + * @param l 监听器对象 + */ public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { mNoteSettingStatusListener = l; } + /** + * 设置提醒时间 + * @param date 提醒时间 + * @param set 是否设置提醒 + */ public void setAlertDate(long date, boolean set) { if (date != mAlertDate) { mAlertDate = date; @@ -239,6 +292,10 @@ public class WorkingNote { } } + /** + * 标记笔记是否删除 + * @param mark 是否删除 + */ public void markDeleted(boolean mark) { mIsDeleted = mark; if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID @@ -247,6 +304,10 @@ public class WorkingNote { } } + /** + * 设置背景颜色ID + * @param id 颜色ID + */ public void setBgColorId(int id) { if (id != mBgColorId) { mBgColorId = id; @@ -257,6 +318,10 @@ public class WorkingNote { } } + /** + * 设置清单模式 + * @param mode 模式值 + */ public void setCheckListMode(int mode) { if (mMode != mode) { if (mNoteSettingStatusListener != null) { @@ -267,6 +332,10 @@ public class WorkingNote { } } + /** + * 设置小部件类型 + * @param type 小部件类型 + */ public void setWidgetType(int type) { if (type != mWidgetType) { mWidgetType = type; @@ -274,6 +343,10 @@ public class WorkingNote { } } + /** + * 设置小部件ID + * @param id 小部件ID + */ public void setWidgetId(int id) { if (id != mWidgetId) { mWidgetId = id; @@ -281,6 +354,10 @@ public class WorkingNote { } } + /** + * 设置笔记文本内容 + * @param text 文本内容 + */ public void setWorkingText(String text) { if (!TextUtils.equals(mContent, text)) { mContent = text; @@ -288,80 +365,138 @@ public class WorkingNote { } } + /** + * 将笔记转换为通话记录笔记 + * @param phoneNumber 电话号码 + * @param 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)); } + /** + * 判断是否设置了闹钟提醒 + * @return 是否有提醒 + */ public boolean hasClockAlert() { return (mAlertDate > 0 ? true : false); } + /** + * 获取笔记内容 + * @return 笔记内容 + */ public String getContent() { return mContent; } + /** + * 获取提醒时间 + * @return 提醒时间 + */ public long getAlertDate() { return mAlertDate; } + /** + * 获取修改时间 + * @return 修改时间 + */ public long getModifiedDate() { return mModifiedDate; } + /** + * 获取背景颜色资源ID + * @return 背景颜色资源ID + */ public int getBgColorResId() { return NoteBgResources.getNoteBgResource(mBgColorId); } + /** + * 获取背景颜色ID + * @return 背景颜色ID + */ public int getBgColorId() { return mBgColorId; } + /** + * 获取标题背景资源ID + * @return 标题背景资源ID + */ public int getTitleBgResId() { return NoteBgResources.getNoteTitleBgResource(mBgColorId); } + /** + * 获取清单模式 + * @return 清单模式值 + */ public int getCheckListMode() { return mMode; } + /** + * 获取笔记ID + * @return 笔记ID + */ public long getNoteId() { return mNoteId; } + /** + * 获取文件夹ID + * @return 文件夹ID + */ public long getFolderId() { return mFolderId; } + /** + * 获取小部件ID + * @return 小部件ID + */ public int getWidgetId() { return mWidgetId; } + /** + * 获取小部件类型 + * @return 小部件类型 + */ public int getWidgetType() { return mWidgetType; } + /** + * 笔记设置变更监听器接口 + */ public interface NoteSettingChangedListener { /** - * Called when the background color of current note has just changed + * 当笔记背景颜色改变时调用 */ void onBackgroundColorChanged(); /** - * Called when user set clock + * 当设置闹钟提醒时调用 + * @param date 提醒时间 + * @param set 是否设置提醒 */ void onClockAlertChanged(long date, boolean set); /** - * Call when user create note from widget + * 当小部件改变时调用 */ void onWidgetChanged(); /** - * Call when switch between check list mode and normal mode - * @param oldMode is previous mode before change - * @param newMode is new mode + * 当在清单模式和普通模式间切换时调用 + * @param oldMode 切换前的模式 + * @param newMode 切换后的模式 */ void onCheckListModeChanged(int oldMode, int newMode); } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java index 39f6ec4..f70c033 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java @@ -35,12 +35,20 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; - +/** + * 备份工具类,用于将笔记导出为文本文件 + */ public class BackupUtils { private static final String TAG = "BackupUtils"; - // Singleton stuff + + // 单例模式相关变量 private static BackupUtils sInstance; + /** + * 获取BackupUtils单例实例 + * @param context 上下文对象 + * @return BackupUtils实例 + */ public static synchronized BackupUtils getInstance(Context context) { if (sInstance == null) { sInstance = new BackupUtils(context); @@ -49,43 +57,66 @@ public class BackupUtils { } /** - * Following states are signs to represents backup or restore - * status + * 以下状态常量用于表示备份或恢复的状态 */ - // Currently, the sdcard is not mounted + // SD卡未挂载 public static final int STATE_SD_CARD_UNMOUONTED = 0; - // 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 + // 数据已损坏,可能被其他程序修改 public static final int STATE_DATA_DESTROIED = 2; - // Some run-time exception which causes restore or backup fails + // 系统运行时错误导致备份或恢复失败 public static final int STATE_SYSTEM_ERROR = 3; - // Backup or restore success + // 备份或恢复成功 public static final int STATE_SUCCESS = 4; private TextExport mTextExport; + /** + * 私有构造方法 + * @param context 上下文对象 + */ private BackupUtils(Context context) { mTextExport = new TextExport(context); } + /** + * 检查外部存储是否可用 + * @return 外部存储是否可用 + */ private static boolean externalStorageAvailable() { return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); } + /** + * 导出笔记到文本文件 + * @return 导出状态码 + */ public int exportToText() { return mTextExport.exportToText(); } + /** + * 获取导出的文本文件名 + * @return 文件名 + */ public String getExportedTextFileName() { return mTextExport.mFileName; } + /** + * 获取导出的文本文件目录 + * @return 文件目录 + */ public String getExportedTextFileDir() { return mTextExport.mFileDirectory; } + /** + * 文本导出内部类,处理具体的导出逻辑 + */ private static class TextExport { + // 笔记查询的列投影 private static final String[] NOTE_PROJECTION = { NoteColumns.ID, NoteColumns.MODIFIED_DATE, @@ -94,11 +125,10 @@ public class BackupUtils { }; private static final int NOTE_COLUMN_ID = 0; - private static final int NOTE_COLUMN_MODIFIED_DATE = 1; - private static final int NOTE_COLUMN_SNIPPET = 2; + // 数据查询的列投影 private static final String[] DATA_PROJECTION = { DataColumns.CONTENT, DataColumns.MIME_TYPE, @@ -109,13 +139,11 @@ public class BackupUtils { }; private static final int DATA_COLUMN_CONTENT = 0; - private static final int DATA_COLUMN_MIME_TYPE = 1; - private static final int DATA_COLUMN_CALL_DATE = 2; - private static final int DATA_COLUMN_PHONE_NUMBER = 4; + // 文本格式化相关常量 private final String [] TEXT_FORMAT; private static final int FORMAT_FOLDER_NAME = 0; private static final int FORMAT_NOTE_DATE = 1; @@ -125,6 +153,10 @@ public class BackupUtils { private String mFileName; private String mFileDirectory; + /** + * 构造方法 + * @param context 上下文对象 + */ public TextExport(Context context) { TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); mContext = context; @@ -132,15 +164,22 @@ public class BackupUtils { mFileDirectory = ""; } + /** + * 获取格式化字符串 + * @param id 格式ID + * @return 格式化字符串 + */ private String getFormat(int id) { return TEXT_FORMAT[id]; } /** - * Export the folder identified by folder id to text + * 导出指定文件夹下的笔记到文本 + * @param folderId 文件夹ID + * @param ps 输出流 */ private void exportFolderToText(String folderId, PrintStream ps) { - // Query notes belong to this folder + // 查询属于该文件夹的笔记 Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] { folderId @@ -149,11 +188,11 @@ public class BackupUtils { if (notesCursor != null) { if (notesCursor.moveToFirst()) { do { - // Print note's last modified date + // 打印笔记的最后修改日期 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); } while (notesCursor.moveToNext()); @@ -163,7 +202,9 @@ public class BackupUtils { } /** - * Export note identified by id to a print stream + * 导出指定ID的笔记到输出流 + * @param noteId 笔记ID + * @param ps 输出流 */ private void exportNoteToText(String noteId, PrintStream ps) { Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, @@ -176,7 +217,7 @@ public class BackupUtils { do { String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE); if (DataConstants.CALL_NOTE.equals(mimeType)) { - // Print phone number + // 导出通话记录类型的笔记 String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER); long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE); String location = dataCursor.getString(DATA_COLUMN_CONTENT); @@ -185,16 +226,17 @@ public class BackupUtils { ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), phoneNumber)); } - // Print call date + // 打印通话日期 ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat .format(mContext.getString(R.string.format_datetime_mdhm), callDate))); - // Print call attachment location + // 打印通话位置 if (!TextUtils.isEmpty(location)) { ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), location)); } } else if (DataConstants.NOTE.equals(mimeType)) { + // 导出普通文本笔记 String content = dataCursor.getString(DATA_COLUMN_CONTENT); if (!TextUtils.isEmpty(content)) { ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), @@ -205,7 +247,7 @@ public class BackupUtils { } dataCursor.close(); } - // print a line separator between note + // 在笔记之间打印分隔符 try { ps.write(new byte[] { Character.LINE_SEPARATOR, Character.LETTER_NUMBER @@ -216,7 +258,8 @@ public class BackupUtils { } /** - * Note will be exported as text which is user readable + * 将笔记导出为用户可读的文本格式 + * @return 导出状态码 */ public int exportToText() { if (!externalStorageAvailable()) { @@ -229,7 +272,7 @@ public class BackupUtils { Log.e(TAG, "get print stream error"); return STATE_SYSTEM_ERROR; } - // First export folder and its notes + // 首先导出文件夹及其笔记 Cursor folderCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -240,7 +283,7 @@ public class BackupUtils { if (folderCursor != null) { if (folderCursor.moveToFirst()) { do { - // Print folder's name + // 打印文件夹名称 String folderName = ""; if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) { folderName = mContext.getString(R.string.call_record_folder_name); @@ -257,7 +300,7 @@ public class BackupUtils { folderCursor.close(); } - // Export notes in root's folder + // 导出根目录下的笔记 Cursor noteCursor = mContext.getContentResolver().query( Notes.CONTENT_NOTE_URI, NOTE_PROJECTION, @@ -270,7 +313,7 @@ public class BackupUtils { ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( mContext.getString(R.string.format_datetime_mdhm), noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); - // Query data belong to this note + // 查询并导出笔记数据 String noteId = noteCursor.getString(NOTE_COLUMN_ID); exportNoteToText(noteId, ps); } while (noteCursor.moveToNext()); @@ -283,7 +326,8 @@ public class BackupUtils { } /** - * Get a print stream pointed to the file {@generateExportedTextFile} + * 获取指向导出文本文件的打印流 + * @return PrintStream对象 */ private PrintStream getExportToTextPrintStream() { File file = generateFileMountedOnSDcard(mContext, R.string.file_path, @@ -310,7 +354,11 @@ public class BackupUtils { } /** - * Generate the text file to store imported data + * 在SD卡上生成用于存储导出数据的文本文件 + * @param context 上下文对象 + * @param filePathResId 文件路径资源ID + * @param fileNameFormatResId 文件名格式资源ID + * @return 生成的文件对象,失败返回null */ private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { StringBuilder sb = new StringBuilder(); @@ -340,5 +388,3 @@ public class BackupUtils { return null; } } - - diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java index 2a14982..13d257e 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java @@ -34,9 +34,21 @@ import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; import java.util.ArrayList; import java.util.HashSet; - +/** + * 数据工具类,提供对笔记数据的各种操作方法 + */ public class DataUtils { + /** + * 日志标签 + */ public static final String TAG = "DataUtils"; + + /** + * 批量删除笔记 + * @param resolver ContentResolver对象 + * @param ids 要删除的笔记ID集合 + * @return 删除是否成功 + */ public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { if (ids == null) { Log.d(TAG, "the ids is null"); @@ -72,6 +84,13 @@ public class DataUtils { return false; } + /** + * 将笔记移动到指定文件夹 + * @param resolver ContentResolver对象 + * @param id 笔记ID + * @param srcFolderId 源文件夹ID + * @param desFolderId 目标文件夹ID + */ public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { ContentValues values = new ContentValues(); values.put(NoteColumns.PARENT_ID, desFolderId); @@ -80,6 +99,13 @@ public class DataUtils { resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); } + /** + * 批量移动笔记到指定文件夹 + * @param resolver ContentResolver对象 + * @param ids 要移动的笔记ID集合 + * @param folderId 目标文件夹ID + * @return 移动是否成功 + */ public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, long folderId) { if (ids == null) { @@ -112,7 +138,9 @@ public class DataUtils { } /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} + * 获取用户文件夹数量(不包括系统文件夹) + * @param resolver ContentResolver对象 + * @return 用户文件夹数量 */ public static int getUserFolderCount(ContentResolver resolver) { Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, @@ -136,6 +164,13 @@ public class DataUtils { return count; } + /** + * 检查指定ID和类型的笔记是否可见(不在回收站中) + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @param type 笔记类型 + * @return 笔记是否可见 + */ public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, @@ -153,6 +188,12 @@ public class DataUtils { return exist; } + /** + * 检查指定ID的笔记是否存在于数据库中 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 笔记是否存在 + */ public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null, null, null, null); @@ -167,6 +208,12 @@ public class DataUtils { return exist; } + /** + * 检查指定ID的数据是否存在于数据库中 + * @param resolver ContentResolver对象 + * @param dataId 数据ID + * @return 数据是否存在 + */ public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null, null, null, null); @@ -181,6 +228,12 @@ public class DataUtils { return exist; } + /** + * 检查指定名称的可见文件夹是否存在 + * @param resolver ContentResolver对象 + * @param name 文件夹名称 + * @return 文件夹是否存在 + */ public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + @@ -197,6 +250,12 @@ public class DataUtils { return exist; } + /** + * 获取指定文件夹下所有笔记的小部件属性 + * @param resolver ContentResolver对象 + * @param folderId 文件夹ID + * @return 小部件属性集合 + */ public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, @@ -224,6 +283,12 @@ public class DataUtils { return set; } + /** + * 根据笔记ID获取通话号码 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 通话号码 + */ public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, new String [] { CallNote.PHONE_NUMBER }, @@ -243,6 +308,13 @@ public class DataUtils { return ""; } + /** + * 根据电话号码和通话日期获取笔记ID + * @param resolver ContentResolver对象 + * @param phoneNumber 电话号码 + * @param callDate 通话日期 + * @return 笔记ID + */ public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, new String [] { CallNote.NOTE_ID }, @@ -264,6 +336,12 @@ public class DataUtils { return 0; } + /** + * 根据笔记ID获取笔记摘要 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 笔记摘要 + */ public static String getSnippetById(ContentResolver resolver, long noteId) { Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, new String [] { NoteColumns.SNIPPET }, @@ -282,6 +360,11 @@ public class DataUtils { throw new IllegalArgumentException("Note is not found with id: " + noteId); } + /** + * 格式化笔记摘要,去除首尾空格并截取第一行 + * @param snippet 原始摘要 + * @return 格式化后的摘要 + */ public static String getFormattedSnippet(String snippet) { if (snippet != null) { snippet = snippet.trim(); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java index 666b729..cf5ae7b 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java @@ -16,98 +16,152 @@ package net.micode.notes.tool; +/** + * Google Tasks同步功能相关的字符串常量工具类 + * 包含了与Google Tasks API交互时使用的JSON字段名称常量 + */ public class GTaskStringUtils { + // 操作相关的JSON字段 + /** 操作ID */ public final static String GTASK_JSON_ACTION_ID = "action_id"; + /** 操作列表 */ public final static String GTASK_JSON_ACTION_LIST = "action_list"; + /** 操作类型 */ public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + /** 创建操作类型 */ public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; + /** 获取所有数据操作类型 */ public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; + /** 移动操作类型 */ public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; + /** 更新操作类型 */ public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; + // 任务实体相关的JSON字段 + /** 创建者ID */ public final static String GTASK_JSON_CREATOR_ID = "creator_id"; + /** 子实体 */ public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; + /** 客户端版本 */ public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; + /** 是否完成 */ public final static String GTASK_JSON_COMPLETED = "completed"; + /** 当前列表ID */ public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; + /** 默认列表ID */ public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; + /** 是否已删除 */ public final static String GTASK_JSON_DELETED = "deleted"; + /** 目标列表 */ public final static String GTASK_JSON_DEST_LIST = "dest_list"; + /** 目标父节点 */ public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; + /** 目标父节点类型 */ public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; + /** 实体变更 */ public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; + /** 实体类型 */ public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; + /** 是否获取已删除项 */ public final static String GTASK_JSON_GET_DELETED = "get_deleted"; + /** ID字段 */ public final static String GTASK_JSON_ID = "id"; + /** 索引 */ public final static String GTASK_JSON_INDEX = "index"; + /** 最后修改时间 */ public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; + /** 最新同步点 */ public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; + /** 列表ID */ public final static String GTASK_JSON_LIST_ID = "list_id"; + /** 列表集合 */ public final static String GTASK_JSON_LISTS = "lists"; + /** 名称 */ public final static String GTASK_JSON_NAME = "name"; + /** 新ID */ public final static String GTASK_JSON_NEW_ID = "new_id"; + /** 笔记集合 */ public final static String GTASK_JSON_NOTES = "notes"; + /** 父ID */ public final static String GTASK_JSON_PARENT_ID = "parent_id"; + /** 前一个兄弟节点ID */ public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; + /** 结果集 */ public final static String GTASK_JSON_RESULTS = "results"; + /** 源列表 */ public final static String GTASK_JSON_SOURCE_LIST = "source_list"; + /** 任务集合 */ public final static String GTASK_JSON_TASKS = "tasks"; + /** 类型 */ public final static String GTASK_JSON_TYPE = "type"; + /** 组类型 */ public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; + /** 任务类型 */ public final static String GTASK_JSON_TYPE_TASK = "TASK"; + /** 用户 */ public final static String GTASK_JSON_USER = "user"; + // MIUI笔记相关的常量 + /** MIUI笔记文件夹前缀 */ public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + /** 默认文件夹名称 */ public final static String FOLDER_DEFAULT = "Default"; + /** 通话记录文件夹名称 */ public final static String FOLDER_CALL_NOTE = "Call_Note"; + /** 元数据文件夹名称 */ public final static String FOLDER_META = "METADATA"; + // 元数据相关的常量 + /** 元数据Google Task ID标识 */ public final static String META_HEAD_GTASK_ID = "meta_gid"; + /** 元数据笔记标识 */ public final static String META_HEAD_NOTE = "meta_note"; + /** 元数据内容标识 */ public final static String META_HEAD_DATA = "meta_data"; + /** 元数据笔记名称 */ public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java index 1ad3ad6..aa58739 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java @@ -22,49 +22,80 @@ import android.preference.PreferenceManager; import net.micode.notes.R; import net.micode.notes.ui.NotesPreferenceActivity; +/** + * 资源解析工具类 + * 用于管理笔记应用中的各种资源,包括背景颜色、字体大小等 + */ public class ResourceParser { - public static final int YELLOW = 0; - public static final int BLUE = 1; - public static final int WHITE = 2; - public static final int GREEN = 3; - public static final int RED = 4; + // 笔记背景颜色的常量定义 + public static final int YELLOW = 0; // 黄色 + public static final int BLUE = 1; // 蓝色 + public static final int WHITE = 2; // 白色 + public static final int GREEN = 3; // 绿色 + public static final int RED = 4; // 红色 + // 默认背景颜色为黄色 public static final int BG_DEFAULT_COLOR = YELLOW; - public static final int TEXT_SMALL = 0; - public static final int TEXT_MEDIUM = 1; - public static final int TEXT_LARGE = 2; - public static final int TEXT_SUPER = 3; + // 字体大小的常量定义 + public static final int TEXT_SMALL = 0; // 小号字体 + public static final int TEXT_MEDIUM = 1; // 中号字体 + public static final int TEXT_LARGE = 2; // 大号字体 + public static final int TEXT_SUPER = 3; // 特大号字体 + // 默认字体大小为中号 public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM; + /** + * 笔记背景资源管理内部类 + * 管理编辑界面和标题栏的背景资源 + */ public static class NoteBgResources { - private final static int [] BG_EDIT_RESOURCES = new int [] { - R.drawable.edit_yellow, - R.drawable.edit_blue, - R.drawable.edit_white, - R.drawable.edit_green, - R.drawable.edit_red + // 编辑界面的背景资源数组 + private final static int[] BG_EDIT_RESOURCES = new int[]{ + R.drawable.edit_yellow, + R.drawable.edit_blue, + R.drawable.edit_white, + R.drawable.edit_green, + R.drawable.edit_red }; - private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] { - R.drawable.edit_title_yellow, - R.drawable.edit_title_blue, - R.drawable.edit_title_white, - R.drawable.edit_title_green, - R.drawable.edit_title_red + // 标题栏的背景资源数组 + private final static int[] BG_EDIT_TITLE_RESOURCES = new int[]{ + R.drawable.edit_title_yellow, + R.drawable.edit_title_blue, + R.drawable.edit_title_white, + R.drawable.edit_title_green, + R.drawable.edit_title_red }; + /** + * 获取笔记编辑界面的背景资源 + * @param id 背景颜色ID + * @return 对应的背景资源ID + */ public static int getNoteBgResource(int id) { return BG_EDIT_RESOURCES[id]; } + /** + * 获取笔记标题栏的背景资源 + * @param id 背景颜色ID + * @return 对应的标题栏背景资源ID + */ public static int getNoteTitleBgResource(int id) { return BG_EDIT_TITLE_RESOURCES[id]; } } + /** + * 获取默认的背景颜色ID + * 如果用户设置了随机背景色,则随机返回一个颜色ID + * 否则返回默认的黄色 + * @param context 上下文对象 + * @return 背景颜色ID + */ public static int getDefaultBgId(Context context) { if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { @@ -74,99 +105,143 @@ public class ResourceParser { } } + /** + * 笔记列表项背景资源管理内部类 + * 管理列表中笔记项的各种背景资源 + */ public static class NoteItemBgResources { - private final static int [] BG_FIRST_RESOURCES = new int [] { - R.drawable.list_yellow_up, - R.drawable.list_blue_up, - R.drawable.list_white_up, - R.drawable.list_green_up, - R.drawable.list_red_up + // 列表第一项的背景资源 + private final static int[] BG_FIRST_RESOURCES = new int[]{ + R.drawable.list_yellow_up, + R.drawable.list_blue_up, + R.drawable.list_white_up, + R.drawable.list_green_up, + R.drawable.list_red_up }; - private final static int [] BG_NORMAL_RESOURCES = new int [] { - R.drawable.list_yellow_middle, - R.drawable.list_blue_middle, - R.drawable.list_white_middle, - R.drawable.list_green_middle, - R.drawable.list_red_middle + // 列表中间项的背景资源 + private final static int[] BG_NORMAL_RESOURCES = new int[]{ + R.drawable.list_yellow_middle, + R.drawable.list_blue_middle, + R.drawable.list_white_middle, + R.drawable.list_green_middle, + R.drawable.list_red_middle }; - private final static int [] BG_LAST_RESOURCES = new int [] { - R.drawable.list_yellow_down, - R.drawable.list_blue_down, - R.drawable.list_white_down, - R.drawable.list_green_down, - R.drawable.list_red_down, + // 列表最后一项的背景资源 + private final static int[] BG_LAST_RESOURCES = new int[]{ + R.drawable.list_yellow_down, + R.drawable.list_blue_down, + R.drawable.list_white_down, + R.drawable.list_green_down, + R.drawable.list_red_down, }; - private final static int [] BG_SINGLE_RESOURCES = new int [] { - R.drawable.list_yellow_single, - R.drawable.list_blue_single, - R.drawable.list_white_single, - R.drawable.list_green_single, - R.drawable.list_red_single + // 列表单个项的背景资源 + private final static int[] BG_SINGLE_RESOURCES = new int[]{ + R.drawable.list_yellow_single, + R.drawable.list_blue_single, + R.drawable.list_white_single, + R.drawable.list_green_single, + R.drawable.list_red_single }; + /** + * 获取列表第一项的背景资源 + */ public static int getNoteBgFirstRes(int id) { return BG_FIRST_RESOURCES[id]; } + /** + * 获取列表最后一项的背景资源 + */ public static int getNoteBgLastRes(int id) { return BG_LAST_RESOURCES[id]; } + /** + * 获取列表单个项的背景资源 + */ public static int getNoteBgSingleRes(int id) { return BG_SINGLE_RESOURCES[id]; } + /** + * 获取列表中间项的背景资源 + */ public static int getNoteBgNormalRes(int id) { return BG_NORMAL_RESOURCES[id]; } + /** + * 获取文件夹的背景资源 + */ public static int getFolderBgRes() { return R.drawable.list_folder; } } + /** + * Widget小部件背景资源管理内部类 + * 管理2x和4x大小Widget的背景资源 + */ public static class WidgetBgResources { - private final static int [] BG_2X_RESOURCES = new int [] { - R.drawable.widget_2x_yellow, - R.drawable.widget_2x_blue, - R.drawable.widget_2x_white, - R.drawable.widget_2x_green, - R.drawable.widget_2x_red, + // 2x大小Widget的背景资源 + private final static int[] BG_2X_RESOURCES = new int[]{ + R.drawable.widget_2x_yellow, + R.drawable.widget_2x_blue, + R.drawable.widget_2x_white, + R.drawable.widget_2x_green, + R.drawable.widget_2x_red, }; + /** + * 获取2x大小Widget的背景资源 + */ public static int getWidget2xBgResource(int id) { return BG_2X_RESOURCES[id]; } - private final static int [] BG_4X_RESOURCES = new int [] { - R.drawable.widget_4x_yellow, - R.drawable.widget_4x_blue, - R.drawable.widget_4x_white, - R.drawable.widget_4x_green, - R.drawable.widget_4x_red + // 4x大小Widget的背景资源 + private final static int[] BG_4X_RESOURCES = new int[]{ + R.drawable.widget_4x_yellow, + R.drawable.widget_4x_blue, + R.drawable.widget_4x_white, + R.drawable.widget_4x_green, + R.drawable.widget_4x_red }; + /** + * 获取4x大小Widget的背景资源 + */ public static int getWidget4xBgResource(int id) { return BG_4X_RESOURCES[id]; } } + /** + * 文本外观资源管理内部类 + * 管理不同大小的文本样式资源 + */ public static class TextAppearanceResources { - private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] { - R.style.TextAppearanceNormal, - R.style.TextAppearanceMedium, - R.style.TextAppearanceLarge, - R.style.TextAppearanceSuper + // 文本外观资源数组 + private final static int[] TEXTAPPEARANCE_RESOURCES = new int[]{ + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper }; + /** + * 获取文本外观资源 + * @param id 字体大小ID + * @return 对应的文本样式资源ID + */ public static int getTexAppearanceResource(int id) { /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + * HACKME: 修复在SharedPreference中存储资源ID的bug + * 如果ID大于等于资源数组长度,返回默认字体大小 */ if (id >= TEXTAPPEARANCE_RESOURCES.length) { return BG_DEFAULT_FONT_SIZE; @@ -174,6 +249,9 @@ public class ResourceParser { return TEXTAPPEARANCE_RESOURCES[id]; } + /** + * 获取文本外观资源的总数 + */ public static int getResourcesSize() { return TEXTAPPEARANCE_RESOURCES.length; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..68c208f 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -39,21 +39,34 @@ import net.micode.notes.tool.DataUtils; import java.io.IOException; - +/** + * 闹钟提醒活动类 + * 负责处理笔记的闹钟提醒功能,包括显示提醒对话框和播放提醒音乐 + */ public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { + // 笔记ID private long mNoteId; + // 笔记摘要内容 private String mSnippet; + // 摘要预览最大长度 private static final int SNIPPET_PREW_MAX_LEN = 60; + // 媒体播放器 MediaPlayer mPlayer; + /** + * 活动创建时的回调方法 + * 初始化窗口参数、获取笔记信息并显示提醒 + */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); final Window win = getWindow(); + // 设置锁屏时显示 win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + // 如果屏幕关闭,添加额外窗口标志 if (!isScreenOn()) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON @@ -64,8 +77,10 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD Intent intent = getIntent(); try { + // 获取笔记ID和内容摘要 mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + // 如果摘要过长则截取 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; @@ -75,6 +90,7 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } mPlayer = new MediaPlayer(); + // 检查笔记是否可见,如果可见则显示提醒 if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); playAlarmSound(); @@ -83,17 +99,27 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } } + /** + * 检查屏幕是否点亮 + * @return 屏幕是否处于点亮状态 + */ private boolean isScreenOn() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } + /** + * 播放闹钟提醒音乐 + * 获取系统默认闹钟铃声并循环播放 + */ private void playAlarmSound() { Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + // 获取静音模式影响的音频流 int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); + // 设置音频流类型 if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { mPlayer.setAudioStreamType(silentModeStreams); } else { @@ -105,34 +131,41 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD mPlayer.setLooping(true); mPlayer.start(); } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { - // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { - // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { - // TODO Auto-generated catch block e.printStackTrace(); } } + /** + * 显示提醒对话框 + * 包含笔记摘要内容和操作按钮 + */ private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle(R.string.app_name); dialog.setMessage(mSnippet); dialog.setPositiveButton(R.string.notealert_ok, this); + // 屏幕点亮时显示进入按钮 if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); } dialog.show().setOnDismissListener(this); } + /** + * 对话框按钮点击事件处理 + * @param dialog 对话框 + * @param which 按钮类型 + */ public void onClick(DialogInterface dialog, int which) { switch (which) { case DialogInterface.BUTTON_NEGATIVE: + // 点击进入按钮,打开笔记编辑界面 Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(Intent.EXTRA_UID, mNoteId); @@ -143,11 +176,19 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } } + /** + * 对话框关闭事件处理 + * 停止闹钟音乐并结束活动 + */ public void onDismiss(DialogInterface dialog) { stopAlarmSound(); finish(); } + /** + * 停止闹钟提醒音乐 + * 释放媒体播放器资源 + */ private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index f221202..7426f28 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -27,20 +27,38 @@ import android.database.Cursor; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * 闹钟初始化广播接收器 + * 用于在系统启动或应用安装时初始化所有待提醒的笔记闹钟 + */ public class AlarmInitReceiver extends BroadcastReceiver { + /** + * 查询笔记时需要的数据列 + */ private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE + NoteColumns.ID, // 笔记ID + NoteColumns.ALERTED_DATE // 提醒时间 }; - private static final int COLUMN_ID = 0; - private static final int COLUMN_ALERTED_DATE = 1; + /** + * 查询结果列的索引常量 + */ + private static final int COLUMN_ID = 0; // ID列索引 + private static final int COLUMN_ALERTED_DATE = 1; // 提醒时间列索引 + /** + * 接收广播时的回调方法 + * 查询所有未到期的提醒笔记,并设置对应的闹钟 + * @param context 上下文对象 + * @param intent 接收到的Intent + */ @Override public void onReceive(Context context, Intent intent) { + // 获取当前系统时间 long currentDate = System.currentTimeMillis(); + + // 查询所有未到期的提醒笔记 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, @@ -50,15 +68,25 @@ public class AlarmInitReceiver extends BroadcastReceiver { if (c != null) { if (c.moveToFirst()) { do { + // 获取提醒时间 long alertDate = c.getLong(COLUMN_ALERTED_DATE); + + // 创建闹钟广播的Intent Intent sender = new Intent(context, AlarmReceiver.class); sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + + // 创建PendingIntent PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); + + // 获取闹钟管理器服务 AlarmManager alermManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); + + // 设置闹钟 alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); } while (c.moveToNext()); } + // 关闭游标 c.close(); } } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java index 54e503b..dcad7d1 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -20,11 +20,25 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +/** + * 闹钟广播接收器 + * 用于接收闹钟提醒广播,启动闹钟提醒界面 + */ public class AlarmReceiver extends BroadcastReceiver { + + /** + * 接收闹钟广播时的回调方法 + * 启动闹钟提醒活动(AlarmAlertActivity) + * @param context 上下文对象 + * @param intent 接收到的Intent,包含笔记ID等信息 + */ @Override public void onReceive(Context context, Intent intent) { + // 设置要启动的Activity类为AlarmAlertActivity intent.setClass(context, AlarmAlertActivity.class); + // 添加NEW_TASK标志,因为广播接收器运行在非Activity环境 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // 启动闹钟提醒界面 context.startActivity(intent); } } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java index 496b0cd..89791cb 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -28,13 +28,21 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; +/** + * 日期时间选择器组件 + * 提供日期和时间的选择功能,支持12小时制和24小时制 + */ public class DateTimePicker extends FrameLayout { + // 默认启用状态 private static final boolean DEFAULT_ENABLE_STATE = true; - private static final int HOURS_IN_HALF_DAY = 12; - private static final int HOURS_IN_ALL_DAY = 24; - private static final int DAYS_IN_ALL_WEEK = 7; + // 时间常量定义 + private static final int HOURS_IN_HALF_DAY = 12; // 12小时制 + private static final int HOURS_IN_ALL_DAY = 24; // 24小时制 + private static final int DAYS_IN_ALL_WEEK = 7; // 一周7天 + + // 各选择器的最大最小值 private static final int DATE_SPINNER_MIN_VAL = 0; private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; @@ -46,39 +54,52 @@ public class DateTimePicker extends FrameLayout { 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; - private Calendar mDate; + // 各选择器控件 + private final NumberPicker mDateSpinner; // 日期选择器 + private final NumberPicker mHourSpinner; // 小时选择器 + private final NumberPicker mMinuteSpinner; // 分钟选择器 + private final NumberPicker mAmPmSpinner; // 上午/下午选择器 + + private Calendar mDate; // 当前选择的日期时间 + // 日期显示值数组 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - private boolean mIsAm; - - private boolean mIs24HourView; - - private boolean mIsEnabled = DEFAULT_ENABLE_STATE; - - private boolean mInitialising; + private boolean mIsAm; // 是否为上午 + private boolean mIs24HourView; // 是否为24小时制 + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; // 控件是否可用 + private boolean mInitialising; // 是否正在初始化 + // 日期时间改变监听器 private OnDateTimeChangedListener mOnDateTimeChangedListener; + /** + * 日期改变监听器 + * 处理日期选择器值变化 + */ private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + // 根据选择器值的变化调整日期 mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); updateDateControl(); onDateTimeChanged(); } }; + /** + * 小时改变监听器 + * 处理小时选择器值变化 + */ private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); + + // 12小时制时的处理 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); @@ -88,12 +109,14 @@ public class DateTimePicker extends FrameLayout { cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } + // 处理上午/下午切换 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(); } } else { + // 24小时制时的处理 if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); @@ -104,9 +127,13 @@ public class DateTimePicker extends FrameLayout { isDateChanged = true; } } + + // 更新小时值 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); mDate.set(Calendar.HOUR_OF_DAY, newHour); onDateTimeChanged(); + + // 如果日期发生变化,更新年月日 if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); setCurrentMonth(cal.get(Calendar.MONTH)); @@ -115,17 +142,25 @@ public class DateTimePicker extends FrameLayout { } }; + /** + * 分钟改变监听器 + * 处理分钟选择器值变化 + */ private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + + // 处理分钟跨小时的情况 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } + + // 如果小时数变化,更新相关控件 if (offset != 0) { mDate.add(Calendar.HOUR_OF_DAY, offset); mHourSpinner.setValue(getCurrentHour()); @@ -139,11 +174,17 @@ public class DateTimePicker extends FrameLayout { updateAmPmControl(); } } + + // 更新分钟值 mDate.set(Calendar.MINUTE, newVal); onDateTimeChanged(); } }; + /** + * 上午/下午改变监听器 + * 处理AM/PM选择器值变化 + */ private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { @@ -158,19 +199,31 @@ public class DateTimePicker extends FrameLayout { } }; + /** + * 日期时间改变监听器接口 + */ public interface OnDateTimeChangedListener { void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute); } + /** + * 构造函数,使用当前时间初始化 + */ public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); } + /** + * 构造函数,使用指定时间初始化 + */ public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); } + /** + * 构造函数,使用指定时间和时间制式初始化 + */ public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); mDate = Calendar.getInstance(); @@ -178,19 +231,24 @@ public class DateTimePicker extends FrameLayout { mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); + // 初始化日期选择器 mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); + // 初始化小时选择器 mHourSpinner = (NumberPicker) findViewById(R.id.hour); mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); + + // 初始化分钟选择器 mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); mMinuteSpinner.setOnLongPressUpdateInterval(100); mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); + // 初始化AM/PM选择器 String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); @@ -198,22 +256,20 @@ public class DateTimePicker extends FrameLayout { mAmPmSpinner.setDisplayedValues(stringsForAmPm); mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); - // update controls to initial state + // 更新控件初始状态 updateDateControl(); updateHourControl(); updateAmPmControl(); set24HourView(is24HourView); - - // set to current time setCurrentDate(date); - setEnabled(isEnabled()); - - // set the content descriptions mInitialising = false; } + /** + * 设置控件是否可用 + */ @Override public void setEnabled(boolean enabled) { if (mIsEnabled == enabled) { @@ -227,24 +283,23 @@ public class DateTimePicker extends FrameLayout { mIsEnabled = enabled; } + /** + * 获取控件是否可用 + */ @Override public boolean isEnabled() { return mIsEnabled; } /** - * Get the current date in millis - * - * @return the current date in millis + * 获取当前选择的时间戳 */ public long getCurrentDateInTimeMillis() { return mDate.getTimeInMillis(); } /** - * Set the current date - * - * @param date The current date in millis + * 设置当前日期时间 */ public void setCurrentDate(long date) { Calendar cal = Calendar.getInstance(); @@ -254,13 +309,7 @@ public class DateTimePicker extends FrameLayout { } /** - * Set the current date - * - * @param year The current year - * @param month The current month - * @param dayOfMonth The current dayOfMonth - * @param hourOfDay The current hourOfDay - * @param minute The current minute + * 设置当前日期时间 */ public void setCurrentDate(int year, int month, int dayOfMonth, int hourOfDay, int minute) { @@ -272,18 +321,14 @@ public class DateTimePicker extends FrameLayout { } /** - * Get current year - * - * @return The current year + * 获取当前年份 */ public int getCurrentYear() { return mDate.get(Calendar.YEAR); } /** - * Set current year - * - * @param year The current year + * 设置当前年份 */ public void setCurrentYear(int year) { if (!mInitialising && year == getCurrentYear()) { @@ -295,18 +340,14 @@ public class DateTimePicker extends FrameLayout { } /** - * Get current month in the year - * - * @return The current month in the year + * 获取当前月份 */ public int getCurrentMonth() { return mDate.get(Calendar.MONTH); } /** - * Set current month in the year - * - * @param month The month in the year + * 设置当前月份 */ public void setCurrentMonth(int month) { if (!mInitialising && month == getCurrentMonth()) { @@ -318,18 +359,14 @@ public class DateTimePicker extends FrameLayout { } /** - * Get current day of the month - * - * @return The day of the month + * 获取当前日期 */ public int getCurrentDay() { return mDate.get(Calendar.DAY_OF_MONTH); } /** - * Set current day of the month - * - * @param dayOfMonth The day of the month + * 设置当前日期 */ public void setCurrentDay(int dayOfMonth) { if (!mInitialising && dayOfMonth == getCurrentDay()) { @@ -341,13 +378,15 @@ public class DateTimePicker extends FrameLayout { } /** - * Get current hour in 24 hour mode, in the range (0~23) - * @return The current hour in 24 hour mode + * 获取当前小时(24小时制) */ public int getCurrentHourOfDay() { return mDate.get(Calendar.HOUR_OF_DAY); } + /** + * 获取当前小时 + */ private int getCurrentHour() { if (mIs24HourView){ return getCurrentHourOfDay(); @@ -362,9 +401,7 @@ public class DateTimePicker extends FrameLayout { } /** - * Set current hour in 24 hour mode, in the range (0~23) - * - * @param hourOfDay + * 设置当前小时 */ public void setCurrentHour(int hourOfDay) { if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { @@ -390,16 +427,14 @@ public class DateTimePicker extends FrameLayout { } /** - * Get currentMinute - * - * @return The Current Minute + * 获取当前分钟 */ public int getCurrentMinute() { return mDate.get(Calendar.MINUTE); } /** - * Set current minute + * 设置当前分钟 */ public void setCurrentMinute(int minute) { if (!mInitialising && minute == getCurrentMinute()) { @@ -411,16 +446,14 @@ public class DateTimePicker extends FrameLayout { } /** - * @return true if this is in 24 hour view else false. + * 判断是否为24小时制 */ public boolean is24HourView () { return mIs24HourView; } /** - * Set whether in 24 hour or AM/PM mode. - * - * @param is24HourView True for 24 hour mode. False for AM/PM mode. + * 设置时间显示格式(12/24小时制) */ public void set24HourView(boolean is24HourView) { if (mIs24HourView == is24HourView) { @@ -434,6 +467,9 @@ public class DateTimePicker extends FrameLayout { updateAmPmControl(); } + /** + * 更新日期显示 + */ private void updateDateControl() { Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(mDate.getTimeInMillis()); @@ -448,6 +484,9 @@ public class DateTimePicker extends FrameLayout { mDateSpinner.invalidate(); } + /** + * 更新AM/PM显示 + */ private void updateAmPmControl() { if (mIs24HourView) { mAmPmSpinner.setVisibility(View.GONE); @@ -458,6 +497,9 @@ public class DateTimePicker extends FrameLayout { } } + /** + * 更新小时显示 + */ private void updateHourControl() { if (mIs24HourView) { mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); @@ -469,13 +511,15 @@ public class DateTimePicker extends FrameLayout { } /** - * Set the callback that indicates the 'Set' button has been pressed. - * @param callback the callback, if null will do nothing + * 设置日期时间改变监听器 */ public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { mOnDateTimeChangedListener = callback; } + /** + * 触发日期时间改变事件 + */ private void onDateTimeChanged() { if (mOnDateTimeChangedListener != null) { mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..91ab139 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java @@ -29,49 +29,90 @@ import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; +/** + * 日期时间选择对话框 + * 提供日期和时间的选择界面,继承自AlertDialog + */ public class DateTimePickerDialog extends AlertDialog implements OnClickListener { + // 日期时间对象,保存当前选择的日期时间 private Calendar mDate = Calendar.getInstance(); + // 是否使用24小时制 private boolean mIs24HourView; + // 日期时间设置监听器 private OnDateTimeSetListener mOnDateTimeSetListener; + // 日期时间选择器控件 private DateTimePicker mDateTimePicker; + /** + * 日期时间设置监听器接口 + * 用于回调通知日期时间设置完成 + */ public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } + /** + * 构造函数 + * @param context 上下文对象 + * @param 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) { + // 更新日期时间对象 mDate.set(Calendar.YEAR, year); mDate.set(Calendar.MONTH, month); 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); 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()); } + /** + * 设置是否使用24小时制 + * @param is24HourView true表示使用24小时制,false表示使用12小时制 + */ public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } + /** + * 设置日期时间监听器 + * @param callBack 监听器对象 + */ public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; } + /** + * 更新对话框标题 + * 根据当前选择的日期时间更新标题显示 + * @param date 当前选择的日期时间 + */ private void updateTitle(long date) { int flag = DateUtils.FORMAT_SHOW_YEAR | @@ -81,6 +122,10 @@ public class DateTimePickerDialog extends AlertDialog implements OnClickListener setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); } + /** + * 确定按钮点击事件处理 + * 通知监听器日期时间已设置 + */ public void onClick(DialogInterface arg0, int arg1) { if (mOnDateTimeSetListener != null) { mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java index 613dc74..fa329fd 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -27,17 +27,36 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; +/** + * 下拉菜单组件类 + * 封装了一个带下拉菜单的按钮控件 + */ public class DropdownMenu { + // 下拉菜单按钮 private Button mButton; + // 弹出式菜单控件 private PopupMenu mPopupMenu; + // 菜单对象 private Menu mMenu; + /** + * 构造函数 + * @param context 上下文对象 + * @param button 要绑定的按钮控件 + * @param menuId 菜单资源ID + */ public DropdownMenu(Context context, Button button, int menuId) { + // 保存按钮引用 mButton = button; + // 设置下拉图标背景 mButton.setBackgroundResource(R.drawable.dropdown_icon); + // 创建弹出菜单并关联按钮 mPopupMenu = new PopupMenu(context, mButton); + // 获取菜单对象 mMenu = mPopupMenu.getMenu(); + // 加载菜单资源 mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + // 设置按钮点击监听器,显示菜单 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); @@ -45,16 +64,29 @@ public class DropdownMenu { }); } + /** + * 设置菜单项点击监听器 + * @param listener 菜单项点击监听器 + */ public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); } } + /** + * 查找指定ID的菜单项 + * @param id 菜单项ID + * @return 菜单项对象 + */ public MenuItem findItem(int id) { return mMenu.findItem(id); } + /** + * 设置按钮文本 + * @param title 要显示的文本 + */ public void setTitle(CharSequence title) { mButton.setText(title); } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java index 96b77da..a7d9039 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java @@ -28,53 +28,97 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - +/** + * 文件夹列表适配器类 + * 用于显示笔记文件夹列表,继承自CursorAdapter + */ public class FoldersListAdapter extends CursorAdapter { + /** + * 数据库查询的列定义 + */ public static final String [] PROJECTION = { - NoteColumns.ID, - NoteColumns.SNIPPET + NoteColumns.ID, // 文件夹ID + NoteColumns.SNIPPET // 文件夹名称 }; - public static final int ID_COLUMN = 0; - public static final int NAME_COLUMN = 1; + /** + * 查询结果列的索引常量 + */ + public static final int ID_COLUMN = 0; // ID列索引 + public static final int NAME_COLUMN = 1; // 名称列索引 + /** + * 构造函数 + * @param context 上下文对象 + * @param c 数据库游标 + */ public FoldersListAdapter(Context context, Cursor c) { super(context, c); - // TODO Auto-generated constructor stub } + /** + * 创建新的列表项视图 + * @param context 上下文对象 + * @param cursor 数据库游标 + * @param parent 父视图 + * @return 新创建的FolderListItem视图 + */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new FolderListItem(context); } + /** + * 绑定数据到视图 + * @param view 要绑定的视图 + * @param context 上下文对象 + * @param cursor 数据库游标 + */ @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof FolderListItem) { + // 获取文件夹名称,如果是根文件夹则显示"移动到父文件夹" String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); ((FolderListItem) view).bind(folderName); } } + /** + * 获取指定位置的文件夹名称 + * @param context 上下文对象 + * @param position 列表位置 + * @return 文件夹名称 + */ 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); } + /** + * 文件夹列表项视图类 + * 用于显示单个文件夹项 + */ private class FolderListItem extends LinearLayout { - private TextView mName; + private TextView mName; // 文件夹名称文本视图 + /** + * 构造函数 + * @param context 上下文对象 + */ public FolderListItem(Context context) { super(context); inflate(context, R.layout.folder_list_item, this); mName = (TextView) findViewById(R.id.tv_folder_name); } + /** + * 绑定文件夹名称到视图 + * @param name 文件夹名称 + */ public void bind(String name) { mName.setText(name); } } - } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java index 96a9ff8..7ac6c31 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -71,19 +71,26 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; - +/** + * 笔记编辑界面的Activity类 + * 提供笔记的编辑、保存、分享等功能 + */ public class NoteEditActivity extends Activity implements OnClickListener, NoteSettingChangedListener, OnTextViewChangeListener { + + /** + * 头部视图控件的持有者类 + */ private class HeadViewHolder { - public TextView tvModified; - - public ImageView ivAlertIcon; - - public TextView tvAlertDate; - - public ImageView ibSetBgColor; + public TextView tvModified; // 修改时间文本 + public ImageView ivAlertIcon; // 提醒图标 + public TextView tvAlertDate; // 提醒日期文本 + public ImageView ibSetBgColor; // 设置背景颜色按钮 } + /** + * 背景颜色选择器按钮ID与颜色值的映射 + */ private static final Map sBgSelectorBtnsMap = new HashMap(); static { sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); @@ -93,6 +100,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); } + /** + * 背景颜色ID与选择器选中状态的映射 + */ private static final Map sBgSelectorSelectionMap = new HashMap(); static { sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); @@ -102,6 +112,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); } + /** + * 字体大小选择器按钮ID与字体大小值的映射 + */ private static final Map sFontSizeBtnsMap = new HashMap(); static { sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); @@ -110,6 +123,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); } + /** + * 字体大小ID与选择器选中状态的映射 + */ private static final Map sFontSelectorSelectionMap = new HashMap(); static { sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); @@ -120,50 +136,42 @@ public class NoteEditActivity extends Activity implements OnClickListener, private static final String TAG = "NoteEditActivity"; - private HeadViewHolder mNoteHeaderHolder; - - private View mHeadViewPanel; - - private View mNoteBgColorSelector; - - private View mFontSizeSelector; - - private EditText mNoteEditor; - - private View mNoteEditorPanel; - - private WorkingNote mWorkingNote; - - private SharedPreferences mSharedPrefs; - private int mFontSizeId; - - private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; - - private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; + private HeadViewHolder mNoteHeaderHolder; // 头部视图持有者 + private View mHeadViewPanel; // 头部面板 + private View mNoteBgColorSelector; // 背景颜色选择器 + private View mFontSizeSelector; // 字体大小选择器 + private EditText mNoteEditor; // 笔记编辑器 + private View mNoteEditorPanel; // 编辑器面板 + private WorkingNote mWorkingNote; // 工作笔记对象 + private SharedPreferences mSharedPrefs; // 共享首选项 + private int mFontSizeId; // 字体大小ID - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); + private static final String PREFERENCE_FONT_SIZE = "pref_font_size"; // 字体大小配置键 + private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10; // 快捷方式图标标题最大长度 - private LinearLayout mEditTextList; + public static final String TAG_CHECKED = String.valueOf('\u221A'); // 已选中标记 + public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); // 未选中标记 - private String mUserQuery; - private Pattern mPattern; + private LinearLayout mEditTextList; // 编辑文本列表 + private String mUserQuery; // 用户搜索关键词 + private Pattern mPattern; // 搜索模式 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.note_edit); + // 初始化Activity状态,如果失败则结束Activity if (savedInstanceState == null && !initActivityState(getIntent())) { finish(); return; } + // 初始化资源 initResources(); } /** - * Current activity may be killed when the memory is low. Once it is killed, for another time - * user load this activity, we should restore the former state + * 当Activity被系统杀死时恢复状态 */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { @@ -179,10 +187,15 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } + /** + * 初始化Activity状态 + * @param intent Intent对象 + * @return 初始化是否成功 + */ private boolean initActivityState(Intent intent) { /** - * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, - * then jump to the NotesListActivity + * 如果用户指定了ACTION_VIEW但没有提供id, + * 则跳转到笔记列表Activity */ mWorkingNote = null; if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { @@ -190,13 +203,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, mUserQuery = ""; /** - * Starting from the searched result + * 从搜索结果启动 */ if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); } + // 检查笔记是否存在 if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { Intent jump = new Intent(this, NotesListActivity.class); startActivity(jump); @@ -204,6 +218,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, finish(); return false; } else { + // 加载笔记 mWorkingNote = WorkingNote.load(this, noteId); if (mWorkingNote == null) { Log.e(TAG, "load note failed with note id" + noteId); @@ -215,7 +230,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { - // New note + // 新建笔记 long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); @@ -224,7 +239,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, ResourceParser.getDefaultBgId(this)); - // Parse call-record note + // 解析通话记录笔记 String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); if (callDate != 0 && phoneNumber != null) { @@ -268,33 +283,47 @@ public class NoteEditActivity extends Activity implements OnClickListener, initNoteScreen(); } + /** + * 初始化笔记界面 + */ private void initNoteScreen() { + // 设置字体样式 mNoteEditor.setTextAppearance(this, TextAppearanceResources .getTexAppearanceResource(mFontSizeId)); + + // 根据模式切换显示 if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { switchToListMode(mWorkingNote.getContent()); } else { mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); mNoteEditor.setSelection(mNoteEditor.getText().length()); } + + // 隐藏所有背景选择器 for (Integer id : sBgSelectorSelectionMap.keySet()) { findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); } + + // 设置背景颜色 mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + // 设置修改时间 mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_YEAR)); /** - * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker - * is not ready + * TODO: 添加设置提醒的菜单。目前禁用它因为DateTimePicker + * 还没有准备好 */ showAlertHeader(); } + /** + * 显示提醒头部信息 + */ private void showAlertHeader() { if (mWorkingNote.hasClockAlert()) { long time = System.currentTimeMillis(); @@ -322,9 +351,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); /** - * For new note without note id, we should firstly save it to - * generate a id. If the editing note is not worth saving, there - * is no id which is equivalent to create new note + * 对于没有笔记id的新笔记,我们应该首先保存它以 + * 生成一个id。如果正在编辑的笔记不值得保存,就 + * 没有id,这相当于创建新笔记 */ if (!mWorkingNote.existInDatabase()) { saveNote(); @@ -335,12 +364,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, @Override 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); @@ -349,6 +380,12 @@ public class NoteEditActivity extends Activity implements OnClickListener, return super.dispatchTouchEvent(ev); } + /** + * 判断触摸事件是否在视图范围内 + * @param view 视图 + * @param ev 触摸事件 + * @return 是否在范围内 + */ private boolean inRangeOfView(View view, MotionEvent ev) { int []location = new int[2]; view.getLocationOnScreen(location); @@ -363,7 +400,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } + /** + * 初始化资源 + */ private void initResources() { + // 初始化各个视图 mHeadViewPanel = findViewById(R.id.note_title); mNoteHeaderHolder = new HeadViewHolder(); mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); @@ -374,22 +415,27 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteEditor = (EditText) findViewById(R.id.note_edit_view); mNoteEditorPanel = findViewById(R.id.sv_note_edit); mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); + + // 设置背景颜色选择器点击监听 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); /** - * HACKME: Fix bug of store the resource id in shared preference. - * The id may larger than the length of resources, in this case, - * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE} + * HACKME: 修复在共享首选项中存储资源id的bug。 + * id可能大于资源长度,在这种情况下, + * 返回{@link ResourceParser#BG_DEFAULT_FONT_SIZE} */ if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; @@ -406,6 +452,9 @@ 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) { @@ -425,18 +474,24 @@ public class NoteEditActivity extends Activity implements OnClickListener, setResult(RESULT_OK, intent); } + /** + * 处理点击事件 + */ public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_set_bg_color) { + // 显示背景颜色选择器 mNoteBgColorSelector.setVisibility(View.VISIBLE); findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - - View.VISIBLE); + View.VISIBLE); } else if (sBgSelectorBtnsMap.containsKey(id)) { + // 选择背景颜色 findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.GONE); mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id)); mNoteBgColorSelector.setVisibility(View.GONE); } else if (sFontSizeBtnsMap.containsKey(id)) { + // 选择字体大小 findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE); mFontSizeId = sFontSizeBtnsMap.get(id); mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit(); @@ -462,6 +517,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, super.onBackPressed(); } + /** + * 清除设置状态 + * @return 是否清除了状态 + */ private boolean clearSettingState() { if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { mNoteBgColorSelector.setVisibility(View.GONE); @@ -473,6 +532,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, return false; } + /** + * 背景颜色改变时的回调 + */ public void onBackgroundColorChanged() { findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( View.VISIBLE); @@ -509,9 +571,11 @@ public class NoteEditActivity extends Activity implements OnClickListener, public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { 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)); builder.setIcon(android.R.drawable.ic_dialog_alert); @@ -527,24 +591,30 @@ public class NoteEditActivity extends Activity implements OnClickListener, builder.show(); break; case R.id.menu_font_size: + // 显示字体大小选择器 mFontSizeSelector.setVisibility(View.VISIBLE); findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); 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()); 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: @@ -553,6 +623,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, return true; } + /** + * 设置提醒 + */ private void setReminder() { DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); d.setOnDateTimeSetListener(new OnDateTimeSetListener() { @@ -564,8 +637,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, } /** - * Share note to apps that support {@link Intent#ACTION_SEND} action - * and {@text/plain} type + * 分享笔记到支持{@link Intent#ACTION_SEND}动作 + * 和{text/plain}类型的应用 */ private void sendTo(Context context, String info) { Intent intent = new Intent(Intent.ACTION_SEND); @@ -574,11 +647,14 @@ public class NoteEditActivity extends Activity implements OnClickListener, context.startActivity(intent); } + /** + * 创建新笔记 + */ private void createNewNote() { - // Firstly, save current editing notes + // 首先保存当前编辑的笔记 saveNote(); - // For safety, start a new NoteEditActivity + // 为安全起见,启动一个新的NoteEditActivity finish(); Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_INSERT_OR_EDIT); @@ -586,6 +662,9 @@ public class NoteEditActivity extends Activity implements OnClickListener, startActivity(intent); } + /** + * 删除当前笔记 + */ private void deleteCurrentNote() { if (mWorkingNote.existInDatabase()) { HashSet ids = new HashSet(); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java index 2afe2a8..a5c42c1 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -37,15 +37,23 @@ import net.micode.notes.R; import java.util.HashMap; import java.util.Map; +/** + * 笔记编辑文本框类 + * 继承自EditText,实现了笔记编辑的核心功能 + */ public class NoteEditText extends EditText { private static final String TAG = "NoteEditText"; + // 当前编辑框的索引 private int mIndex; + // 删除操作前的光标位置 private int mSelectionStartBeforeDelete; - private static final String SCHEME_TEL = "tel:" ; - private static final String SCHEME_HTTP = "http:" ; - private static final String SCHEME_EMAIL = "mailto:" ; + // 支持的链接类型常量 + private static final String SCHEME_TEL = "tel:" ; // 电话链接 + private static final String SCHEME_HTTP = "http:" ; // 网页链接 + private static final String SCHEME_EMAIL = "mailto:" ; // 邮件链接 + // 链接类型与对应操作文本资源的映射 private static final Map sSchemaActionResMap = new HashMap(); static { sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); @@ -54,38 +62,46 @@ public class NoteEditText extends EditText { } /** - * Call by the {@link NoteEditActivity} to delete or add edit text + * 文本变化监听器接口 + * 由NoteEditActivity实现,用于处理文本编辑事件 */ public interface OnTextViewChangeListener { /** - * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens - * and the text is null + * 当按下删除键且文本为空时删除当前编辑框 */ void onEditTextDelete(int index, String text); /** - * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} - * happen + * 当按下回车键时在当前编辑框后添加新的编辑框 */ void onEditTextEnter(int index, String text); /** - * Hide or show item option when text change + * 根据文本是否为空显示或隐藏选项 */ void onTextChange(int index, boolean hasText); } private OnTextViewChangeListener mOnTextViewChangeListener; + /** + * 构造函数 + */ public NoteEditText(Context context) { super(context, null); mIndex = 0; } + /** + * 设置编辑框索引 + */ public void setIndex(int index) { mIndex = index; } + /** + * 设置文本变化监听器 + */ public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } @@ -96,14 +112,16 @@ public class NoteEditText extends EditText { public NoteEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - // TODO Auto-generated constructor stub } + /** + * 处理触摸事件,实现光标的准确定位 + */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: - + // 计算触摸点相对于文本的坐标 int x = (int) event.getX(); int y = (int) event.getY(); x -= getTotalPaddingLeft(); @@ -111,6 +129,7 @@ public class NoteEditText extends EditText { x += getScrollX(); y += getScrollY(); + // 根据坐标获取对应的文本偏移量并设置光标 Layout layout = getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); @@ -121,6 +140,9 @@ public class NoteEditText extends EditText { return super.onTouchEvent(event); } + /** + * 处理按键按下事件 + */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { @@ -130,6 +152,7 @@ public class NoteEditText extends EditText { } break; case KeyEvent.KEYCODE_DEL: + // 记录删除前光标位置 mSelectionStartBeforeDelete = getSelectionStart(); break; default: @@ -138,11 +161,15 @@ public class NoteEditText extends EditText { return super.onKeyDown(keyCode, event); } + /** + * 处理按键弹起事件 + */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch(keyCode) { case KeyEvent.KEYCODE_DEL: if (mOnTextViewChangeListener != null) { + // 在文本开头删除且不是第一个编辑框时,删除当前编辑框 if (0 == mSelectionStartBeforeDelete && mIndex != 0) { mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString()); return true; @@ -153,6 +180,7 @@ public class NoteEditText extends EditText { break; case KeyEvent.KEYCODE_ENTER: if (mOnTextViewChangeListener != null) { + // 按下回车时分割文本并创建新编辑框 int selectionStart = getSelectionStart(); String text = getText().subSequence(selectionStart, length()).toString(); setText(getText().subSequence(0, selectionStart)); @@ -167,9 +195,13 @@ public class NoteEditText extends EditText { return super.onKeyUp(keyCode, event); } + /** + * 处理焦点变化事件 + */ @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (mOnTextViewChangeListener != null) { + // 根据是否有文本通知监听器更新UI if (!focused && TextUtils.isEmpty(getText())) { mOnTextViewChangeListener.onTextChange(mIndex, false); } else { @@ -179,6 +211,10 @@ public class NoteEditText extends EditText { super.onFocusChanged(focused, direction, previouslyFocusedRect); } + /** + * 创建上下文菜单 + * 为文本中的链接创建点击操作菜单 + */ @Override protected void onCreateContextMenu(ContextMenu menu) { if (getText() instanceof Spanned) { @@ -188,8 +224,10 @@ public class NoteEditText extends EditText { int min = Math.min(selStart, selEnd); int max = Math.max(selStart, selEnd); + // 获取选中文本中的URL final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); if (urls.length == 1) { + // 根据URL类型设置对应的操作文本 int defaultResId = 0; for(String schema: sSchemaActionResMap.keySet()) { if(urls[0].getURL().indexOf(schema) >= 0) { @@ -202,10 +240,11 @@ public class NoteEditText extends EditText { defaultResId = R.string.note_link_other; } + // 添加菜单项并设置点击监听 menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { - // goto a new intent + // 处理URL点击 urls[0].onClick(NoteEditText.this); return true; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java index 0f5a878..cf79a21 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -25,73 +25,88 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.DataUtils; - +/** + * 笔记项数据类 + * 用于存储和管理单个笔记项的所有相关数据 + */ public class NoteItemData { + // 数据库查询的列定义 static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, - NoteColumns.HAS_ATTACHMENT, - NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, - NoteColumns.PARENT_ID, - NoteColumns.SNIPPET, - NoteColumns.TYPE, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, + NoteColumns.ID, // 笔记ID + NoteColumns.ALERTED_DATE, // 提醒日期 + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.CREATED_DATE, // 创建日期 + NoteColumns.HAS_ATTACHMENT, // 是否有附件 + NoteColumns.MODIFIED_DATE, // 修改日期 + NoteColumns.NOTES_COUNT, // 笔记数量 + NoteColumns.PARENT_ID, // 父文件夹ID + NoteColumns.SNIPPET, // 笔记摘要 + NoteColumns.TYPE, // 笔记类型 + NoteColumns.WIDGET_ID, // 小部件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; - private static final int CREATED_DATE_COLUMN = 3; - private static final int HAS_ATTACHMENT_COLUMN = 4; - private static final int MODIFIED_DATE_COLUMN = 5; - private static final int NOTES_COUNT_COLUMN = 6; - private static final int PARENT_ID_COLUMN = 7; - private static final int SNIPPET_COLUMN = 8; - private static final int TYPE_COLUMN = 9; - private static final int WIDGET_ID_COLUMN = 10; - private static final int WIDGET_TYPE_COLUMN = 11; - - private long mId; - private long mAlertDate; - private int mBgColorId; - private long mCreatedDate; - private boolean mHasAttachment; - private long mModifiedDate; - private int mNotesCount; - private long mParentId; - private String mSnippet; - private int mType; - private int mWidgetId; - private int mWidgetType; - private String mName; - private String mPhoneNumber; - - private boolean mIsLastItem; - private boolean mIsFirstItem; - private boolean mIsOnlyOneItem; - private boolean mIsOneNoteFollowingFolder; - private boolean mIsMultiNotesFollowingFolder; - + // 查询结果列的索引常量 + private static final int ID_COLUMN = 0; + private static final int ALERTED_DATE_COLUMN = 1; + private static final int BG_COLOR_ID_COLUMN = 2; + private static final int CREATED_DATE_COLUMN = 3; + private static final int HAS_ATTACHMENT_COLUMN = 4; + private static final int MODIFIED_DATE_COLUMN = 5; + private static final int NOTES_COUNT_COLUMN = 6; + private static final int PARENT_ID_COLUMN = 7; + private static final int SNIPPET_COLUMN = 8; + private static final int TYPE_COLUMN = 9; + private static final int WIDGET_ID_COLUMN = 10; + private static final int WIDGET_TYPE_COLUMN = 11; + + // 笔记基本属性 + private long mId; // 笔记ID + private long mAlertDate; // 提醒时间 + private int mBgColorId; // 背景颜色 + private long mCreatedDate; // 创建时间 + private boolean mHasAttachment; // 是否有附件 + private long mModifiedDate; // 修改时间 + private int mNotesCount; // 笔记数量 + private long mParentId; // 父文件夹ID + private String mSnippet; // 笔记摘要 + private int mType; // 笔记类型 + private int mWidgetId; // 小部件ID + private int mWidgetType; // 小部件类型 + private String mName; // 联系人姓名(通话记录用) + private String mPhoneNumber; // 电话号码(通话记录用) + + // 笔记在列表中的位置状态 + private boolean mIsLastItem; // 是否为最后一项 + private boolean mIsFirstItem; // 是否为第一项 + private boolean mIsOnlyOneItem; // 是否为唯一项 + private boolean mIsOneNoteFollowingFolder; // 是否为文件夹后的单个笔记 + private boolean mIsMultiNotesFollowingFolder; // 是否为文件夹后的多个笔记之一 + + /** + * 构造函数 + * @param context 上下文对象 + * @param cursor 数据库游标 + */ public NoteItemData(Context context, Cursor cursor) { + // 从游标中读取笔记数据 mId = cursor.getLong(ID_COLUMN); mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); - mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false; + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0); mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN); mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN); mParentId = cursor.getLong(PARENT_ID_COLUMN); mSnippet = cursor.getString(SNIPPET_COLUMN); + // 移除笔记内容中的复选框标记 mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace( NoteEditActivity.TAG_UNCHECKED, ""); mType = cursor.getInt(TYPE_COLUMN); 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); @@ -106,16 +121,22 @@ public class NoteItemData { if (mName == null) { mName = ""; } + // 检查笔记在列表中的位置 checkPostion(cursor); } + /** + * 检查笔记在列表中的位置状态 + * @param cursor 数据库游标 + */ private void checkPostion(Cursor cursor) { - mIsLastItem = cursor.isLast() ? true : false; - mIsFirstItem = cursor.isFirst() ? true : false; + mIsLastItem = cursor.isLast(); + mIsFirstItem = cursor.isFirst(); mIsOnlyOneItem = (cursor.getCount() == 1); mIsMultiNotesFollowingFolder = false; mIsOneNoteFollowingFolder = false; + // 检查是否为文件夹后的笔记 if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { int position = cursor.getPosition(); if (cursor.moveToPrevious()) { @@ -134,90 +155,160 @@ public class NoteItemData { } } + // 以下是各种getter方法 + + /** + * 判断是否为文件夹后的单个笔记 + */ public boolean isOneFollowingFolder() { return mIsOneNoteFollowingFolder; } + /** + * 判断是否为文件夹后的多个笔记之一 + */ public boolean isMultiFollowingFolder() { return mIsMultiNotesFollowingFolder; } + /** + * 判断是否为最后一项 + */ public boolean isLast() { return mIsLastItem; } + /** + * 获取通话记录联系人名称 + */ public String getCallName() { return mName; } + /** + * 判断是否为第一项 + */ public boolean isFirst() { return mIsFirstItem; } + /** + * 判断是否为唯一项 + */ public boolean isSingle() { return mIsOnlyOneItem; } + /** + * 获取笔记ID + */ public long getId() { return mId; } + /** + * 获取提醒时间 + */ public long getAlertDate() { return mAlertDate; } + /** + * 获取创建时间 + */ public long getCreatedDate() { return mCreatedDate; } + /** + * 判断是否有附件 + */ public boolean hasAttachment() { return mHasAttachment; } + /** + * 获取修改时间 + */ public long getModifiedDate() { return mModifiedDate; } + /** + * 获取背景颜色ID + */ public int getBgColorId() { return mBgColorId; } + /** + * 获取父文件夹ID + */ public long getParentId() { return mParentId; } + /** + * 获取笔记数量 + */ public int getNotesCount() { return mNotesCount; } + /** + * 获取文件夹ID + */ public long getFolderId () { return mParentId; } + /** + * 获取笔记类型 + */ public int getType() { return mType; } + /** + * 获取小部件类型 + */ public int getWidgetType() { return mWidgetType; } + /** + * 获取小部件ID + */ public int getWidgetId() { return mWidgetId; } + /** + * 获取笔记摘要 + */ public String getSnippet() { return mSnippet; } + /** + * 判断是否设置了提醒 + */ public boolean hasAlert() { return (mAlertDate > 0); } + /** + * 判断是否为通话记录 + */ public boolean isCallRecord() { return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); } + /** + * 获取笔记类型的静态方法 + * @param cursor 数据库游标 + * @return 笔记类型 + */ public static int getNoteType(Cursor cursor) { return cursor.getInt(TYPE_COLUMN); } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java index 51c9cb9..a0d2d5a 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -30,19 +30,30 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; - +/** + * 笔记列表适配器类 + * 用于管理笔记列表的数据显示和选择状态 + */ public class NotesListAdapter extends CursorAdapter { private static final String TAG = "NotesListAdapter"; - private Context mContext; - private HashMap mSelectedIndex; - private int mNotesCount; - private boolean mChoiceMode; - + private Context mContext; // 上下文对象 + private HashMap mSelectedIndex; // 记录列表项选择状态的Map + private int mNotesCount; // 笔记总数 + private boolean mChoiceMode; // 是否处于多选模式 + + /** + * 小部件属性内部类 + * 用于存储小部件的ID和类型信息 + */ public static class AppWidgetAttribute { - public int widgetId; - public int widgetType; + public int widgetId; // 小部件ID + public int widgetType; // 小部件类型 }; + /** + * 构造函数 + * @param context 上下文对象 + */ public NotesListAdapter(Context context) { super(context, null); mSelectedIndex = new HashMap(); @@ -50,11 +61,17 @@ public class NotesListAdapter extends CursorAdapter { mNotesCount = 0; } + /** + * 创建新的列表项视图 + */ @Override 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) { @@ -64,20 +81,36 @@ public class NotesListAdapter extends CursorAdapter { } } + /** + * 设置列表项的选中状态 + * @param position 位置 + * @param checked 是否选中 + */ public void setCheckedItem(final int position, final boolean checked) { mSelectedIndex.put(position, checked); notifyDataSetChanged(); } + /** + * 判断是否处于多选模式 + */ public boolean isInChoiceMode() { return mChoiceMode; } + /** + * 设置多选模式 + * @param mode 是否开启多选 + */ public void setChoiceMode(boolean mode) { mSelectedIndex.clear(); mChoiceMode = mode; } + /** + * 全选/取消全选 + * @param checked 是否选中 + */ public void selectAll(boolean checked) { Cursor cursor = getCursor(); for (int i = 0; i < getCount(); i++) { @@ -89,6 +122,10 @@ public class NotesListAdapter extends CursorAdapter { } } + /** + * 获取所有选中项的ID集合 + * @return 选中项ID的HashSet + */ public HashSet getSelectedItemIds() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { @@ -101,10 +138,13 @@ public class NotesListAdapter extends CursorAdapter { } } } - return itemSet; } + /** + * 获取所有选中的小部件属性 + * @return 小部件属性的HashSet + */ public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { @@ -128,6 +168,10 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + /** + * 获取选中项的数量 + * @return 选中的数量 + */ public int getSelectedCount() { Collection values = mSelectedIndex.values(); if (null == values) { @@ -143,11 +187,20 @@ public class NotesListAdapter extends CursorAdapter { return count; } + /** + * 判断是否全部选中 + * @return 是否全选 + */ public boolean isAllSelected() { int checkedCount = getSelectedCount(); return (checkedCount != 0 && checkedCount == mNotesCount); } + /** + * 判断指定位置的项是否被选中 + * @param position 位置 + * @return 是否选中 + */ public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { return false; @@ -155,18 +208,28 @@ public class NotesListAdapter extends CursorAdapter { return mSelectedIndex.get(position); } + /** + * 内容改变时的回调 + */ @Override protected void onContentChanged() { super.onContentChanged(); calcNotesCount(); } + /** + * 更换数据源时的回调 + */ @Override public void changeCursor(Cursor cursor) { super.changeCursor(cursor); calcNotesCount(); } + /** + * 计算笔记总数 + * 仅计算类型为NOTE的项目 + */ private void calcNotesCount() { mNotesCount = 0; for (int i = 0; i < getCount(); i++) { diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java index 1221e80..1d75c7f 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -29,18 +29,27 @@ import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; - +/** + * 笔记列表项视图类 + * 用于显示单个笔记项的自定义视图 + */ public class NotesListItem extends LinearLayout { - private ImageView mAlert; - private TextView mTitle; - private TextView mTime; - private TextView mCallName; - private NoteItemData mItemData; - private CheckBox mCheckBox; + private ImageView mAlert; // 提醒图标 + private TextView mTitle; // 标题文本 + private TextView mTime; // 时间文本 + private TextView mCallName; // 通话名称文本 + private NoteItemData mItemData;// 笔记项数据 + private CheckBox mCheckBox; // 选择框 + /** + * 构造函数 + * @param context 上下文对象 + */ public NotesListItem(Context context) { super(context); + // 加载note_item布局 inflate(context, R.layout.note_item, this); + // 初始化各个视图组件 mAlert = (ImageView) findViewById(R.id.iv_alert_icon); mTitle = (TextView) findViewById(R.id.tv_title); mTime = (TextView) findViewById(R.id.tv_time); @@ -48,7 +57,15 @@ public class NotesListItem extends LinearLayout { mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); } + /** + * 绑定数据到视图 + * @param context 上下文对象 + * @param data 笔记项数据 + * @param choiceMode 是否处于选择模式 + * @param checked 是否被选中 + */ 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); @@ -57,7 +74,10 @@ public class NotesListItem extends LinearLayout { } mItemData = data; + + // 根据不同类型的笔记显示不同的界面 if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + // 通话记录文件夹的显示 mCallName.setVisibility(View.GONE); mAlert.setVisibility(View.VISIBLE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); @@ -65,6 +85,7 @@ public class NotesListItem extends LinearLayout { + context.getString(R.string.format_folder_files_count, data.getNotesCount())); mAlert.setImageResource(R.drawable.call_record); } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { + // 通话记录子项的显示 mCallName.setVisibility(View.VISIBLE); mCallName.setText(data.getCallName()); mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); @@ -76,15 +97,18 @@ public class NotesListItem extends LinearLayout { mAlert.setVisibility(View.GONE); } } else { + // 普通笔记项的显示 mCallName.setVisibility(View.GONE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); if (data.getType() == Notes.TYPE_FOLDER) { + // 文件夹类型 mTitle.setText(data.getSnippet() + context.getString(R.string.format_folder_files_count, data.getNotesCount())); mAlert.setVisibility(View.GONE); } else { + // 笔记类型 mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); @@ -94,28 +118,44 @@ public class NotesListItem extends LinearLayout { } } } + // 设置修改时间 mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + // 设置背景 setBackground(data); } + /** + * 设置列表项背景 + * @param data 笔记项数据 + */ private void setBackground(NoteItemData data) { int id = data.getBgColorId(); if (data.getType() == Notes.TYPE_NOTE) { + // 根据笔记在列表中的位置设置不同的背景 if (data.isSingle() || data.isOneFollowingFolder()) { + // 单个笔记或紧跟文件夹的笔记 setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); } else if (data.isLast()) { + // 最后一个笔记 setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); } else if (data.isFirst() || data.isMultiFollowingFolder()) { + // 第一个笔记或多个紧跟文件夹的笔记 setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); } else { + // 普通笔记 setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } } else { + // 文件夹背景 setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } + /** + * 获取笔记项数据 + * @return 笔记项数据对象 + */ public NoteItemData getItemData() { return mItemData; } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java index 07c5f7e..402ff11 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -47,56 +47,85 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; - +/** + * 笔记应用的设置界面Activity + * 主要功能包括: + * 1. 账户同步设置 + * 2. 同步状态显示 + * 3. 背景颜色设置等 + */ 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; + /** + * Activity创建时的回调 + */ @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); - /* using the app icon for navigation */ + /* 设置应用图标可以用于导航 */ getActionBar().setDisplayHomeAsUpEnabled(true); + // 加载偏好设置的XML布局 addPreferencesFromResource(R.xml.preferences); 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); getListView().addHeaderView(header, null, true); } + /** + * Activity恢复时的回调 + * 主要处理账户添加后的自动设置 + */ @Override protected void onResume() { super.onResume(); - // need to set sync account automatically if user has added a new - // account + // 如果添加了新账户,需要自动设置为同步账户 if (mHasAddedAccount) { Account[] accounts = getGoogleAccounts(); if (mOriAccounts != null && accounts.length > mOriAccounts.length) { + // 遍历查找新添加的账户 for (Account accountNew : accounts) { boolean found = false; for (Account accountOld : mOriAccounts) { @@ -105,6 +134,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { break; } } + // 找到新账户后设置为同步账户 if (!found) { setSyncAccount(accountNew.name); break; @@ -113,9 +143,14 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } + // 刷新界面 refreshUI(); } + /** + * Activity销毁时的回调 + * 注销广播接收器 + */ @Override protected void onDestroy() { if (mReceiver != null) { @@ -124,6 +159,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { super.onDestroy(); } + /** + * 加载账户偏好设置 + * 设置账户选项的标题、摘要和点击事件 + */ private void loadAccountPreference() { mAccountCategory.removeAll(); @@ -135,14 +174,14 @@ public class NotesPreferenceActivity extends PreferenceActivity { 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.makeText(NotesPreferenceActivity.this, R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) .show(); @@ -154,12 +193,17 @@ 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) { @@ -167,6 +211,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { } }); } else { + // 非同步状态显示立即同步按钮 syncButton.setText(getString(R.string.preferences_button_sync_immediately)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { @@ -174,13 +219,16 @@ public class NotesPreferenceActivity extends PreferenceActivity { } }); } + // 未设置账户时禁用同步按钮 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, @@ -193,14 +241,22 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } + /** + * 刷新界面 + * 重新加载账户设置和同步按钮 + */ private void refreshUI() { loadAccountPreference(); loadSyncButton(); } + /** + * 显示选择账户的对话框 + */ 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)); @@ -210,12 +266,14 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.setCustomTitle(titleView); dialogBuilder.setPositiveButton(null, null); + // 获取Google账户列表 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; @@ -237,6 +295,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { }); } + // 添加"添加账户"选项 View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); dialogBuilder.setView(addAccountView); @@ -254,9 +313,13 @@ public class NotesPreferenceActivity extends PreferenceActivity { }); } + /** + * 显示更改账户的确认对话框 + */ 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, @@ -265,6 +328,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { 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), @@ -283,13 +347,21 @@ public class NotesPreferenceActivity extends PreferenceActivity { dialogBuilder.show(); } + /** + * 获取设备上的Google账户列表 + */ private Account[] getGoogleAccounts() { AccountManager accountManager = AccountManager.get(this); return accountManager.getAccountsByType("com.google"); } + /** + * 设置同步账户 + * @param account 账户名称 + */ 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) { @@ -299,10 +371,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { } editor.commit(); - // clean up last sync time + // 清除上次同步时间 setLastSyncTime(this, 0); - // clean up local gtask related info + // 清除本地Google任务相关信息 new Thread(new Runnable() { public void run() { ContentValues values = new ContentValues(); @@ -318,6 +390,10 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } + /** + * 移除同步账户 + * 清除账户设置和同步信息 + */ private void removeSyncAccount() { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); @@ -329,7 +405,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { } editor.commit(); - // clean up local gtask related info + // 清除本地Google任务相关信息 new Thread(new Runnable() { public void run() { ContentValues values = new ContentValues(); @@ -340,12 +416,22 @@ public class NotesPreferenceActivity extends PreferenceActivity { }).start(); } + /** + * 获取同步账户名称 + * @param context 上下文 + * @return 账户名称 + */ public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } + /** + * 设置最后同步时间 + * @param context 上下文 + * @param time 同步时间 + */ public static void setLastSyncTime(Context context, long time) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -354,12 +440,21 @@ public class NotesPreferenceActivity extends PreferenceActivity { editor.commit(); } + /** + * 获取最后同步时间 + * @param context 上下文 + * @return 同步时间 + */ public static long getLastSyncTime(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); } + /** + * Google任务同步服务的广播接收器 + * 用于接收同步状态更新并刷新UI + */ private class GTaskReceiver extends BroadcastReceiver { @Override @@ -370,13 +465,18 @@ public class NotesPreferenceActivity extends PreferenceActivity { syncStatus.setText(intent .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); } - } } + /** + * 处理菜单项选择事件 + * @param item 选中的菜单项 + * @return 是否处理了选择事件 + */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: + // 返回笔记列表界面 Intent intent = new Intent(this, NotesListActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java index ec6f819..0c853e5 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java @@ -32,19 +32,33 @@ import net.micode.notes.tool.ResourceParser; import net.micode.notes.ui.NoteEditActivity; import net.micode.notes.ui.NotesListActivity; +/** + * 笔记小部件的抽象基类 + * 提供了小部件的基本功能实现,具体的布局和样式由子类实现 + */ public abstract class NoteWidgetProvider extends AppWidgetProvider { + /** + * 查询笔记信息时使用的数据库列 + */ public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_ID, - NoteColumns.SNIPPET + NoteColumns.ID, // 笔记ID + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.SNIPPET // 笔记摘要 }; - public static final int COLUMN_ID = 0; - public static final int COLUMN_BG_COLOR_ID = 1; - public static final int COLUMN_SNIPPET = 2; + /** + * 查询结果列的索引常量 + */ + public static final int COLUMN_ID = 0; // ID列索引 + public static final int COLUMN_BG_COLOR_ID = 1; // 背景色ID列索引 + public static final int COLUMN_SNIPPET = 2; // 摘要列索引 private static final String TAG = "NoteWidgetProvider"; + /** + * 当小部件被删除时调用 + * 将对应笔记的widget_id设置为无效值 + */ @Override public void onDeleted(Context context, int[] appWidgetIds) { ContentValues values = new ContentValues(); @@ -57,6 +71,12 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { } } + /** + * 获取指定widget_id对应的笔记信息 + * @param context 上下文 + * @param widgetId 小部件ID + * @return 包含笔记信息的Cursor对象 + */ private Cursor getNoteWidgetInfo(Context context, int widgetId) { return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, @@ -65,14 +85,26 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { null); } + /** + * 更新小部件 + * 调用私有update方法,默认非隐私模式 + */ protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { update(context, appWidgetManager, appWidgetIds, false); } + /** + * 更新小部件的具体实现 + * @param context 上下文 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 要更新的小部件ID数组 + * @param privacyMode 是否为隐私模式 + */ private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, boolean privacyMode) { for (int i = 0; i < appWidgetIds.length; i++) { if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + // 初始化默认值 int bgId = ResourceParser.getDefaultBgId(context); String snippet = ""; Intent intent = new Intent(context, NoteEditActivity.class); @@ -80,6 +112,7 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]); intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType()); + // 查询笔记信息 Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]); if (c != null && c.moveToFirst()) { if (c.getCount() > 1) { @@ -100,19 +133,21 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { c.close(); } + // 创建和更新RemoteViews RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); - /** - * Generate the pending intent to start host for the widget - */ + + // 创建PendingIntent PendingIntent pendingIntent = null; if (privacyMode) { + // 隐私模式下显示提示文本,点击打开笔记列表 rv.setTextViewText(R.id.widget_text, context.getString(R.string.widget_under_visit_mode)); pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); } else { + // 正常模式下显示笔记内容,点击打开笔记编辑 rv.setTextViewText(R.id.widget_text, snippet); pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, PendingIntent.FLAG_UPDATE_CURRENT); @@ -124,9 +159,22 @@ public abstract class NoteWidgetProvider extends AppWidgetProvider { } } + /** + * 获取小部件背景资源ID + * @param bgId 背景ID + * @return 对应的背景资源ID + */ protected abstract int getBgResourceId(int bgId); + /** + * 获取小部件布局资源ID + * @return 布局资源ID + */ protected abstract int getLayoutId(); + /** + * 获取小部件类型 + * @return 小部件类型 + */ protected abstract int getWidgetType(); } diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java index adcb2f7..ba173df 100644 --- a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java +++ b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java @@ -23,23 +23,45 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * 2x大小的笔记桌面小部件提供者类 + * 继承自NoteWidgetProvider基类,实现2x大小小部件的具体功能 + */ public class NoteWidgetProvider_2x extends NoteWidgetProvider { + /** + * 当小部件更新时调用 + * 调用父类的update方法执行实际的更新操作 + * @param context 上下文对象 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 需要更新的小部件ID数组 + */ @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.update(context, appWidgetManager, appWidgetIds); } + /** + * 获取小部件布局资源ID + * @return 返回2x大小小部件的布局资源ID + */ @Override protected int getLayoutId() { return R.layout.widget_2x; } - @Override + /** + * 获取小部件背景资源ID + * @param bgId 背景ID + * @return 返回对应的2x大小小部件背景资源ID + */ protected int getBgResourceId(int bgId) { return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); } + /** + * 获取小部件类型 + * @return 返回2x大小小部件的类型标识 + */ @Override protected int getWidgetType() { return Notes.TYPE_WIDGET_2X;