From b6be20a35076a8d81902e7f1734d454a40ba071b Mon Sep 17 00:00:00 2001 From: eazzy <1044745821@qq.com> Date: Sun, 24 Dec 2023 00:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AlarmAlertActivity.class.uniqueId27 | Bin 6231 -> 0 bytes ...34 => AlarmAlertActivity.class.uniqueId49} | Bin ...d26 => AlarmInitReceiver.class.uniqueId42} | Bin ...queId12 => AlarmReceiver.class.uniqueId34} | Bin 876 -> 876 bytes .../stash-dir/Contact.class.uniqueId14 | Bin 2970 -> 0 bytes .../DateTimePicker$1.class.uniqueId41 | Bin 0 -> 1077 bytes .../DateTimePicker$2.class.uniqueId31 | Bin 0 -> 2197 bytes .../DateTimePicker$3.class.uniqueId10 | Bin 0 -> 1805 bytes .../DateTimePicker$4.class.uniqueId51 | Bin 0 -> 1318 bytes ...OnDateTimeChangedListener.class.uniqueId56 | Bin 0 -> 329 bytes .../stash-dir/DateTimePicker.class.uniqueId12 | Bin 0 -> 9044 bytes .../DateTimePickerDialog$1.class.uniqueId29 | Bin 0 -> 1383 bytes ...log$OnDateTimeSetListener.class.uniqueId43 | Bin 0 -> 320 bytes .../DateTimePickerDialog.class.uniqueId14 | Bin 0 -> 3477 bytes .../stash-dir/DropdownMenu$1.class.uniqueId20 | Bin 0 -> 948 bytes .../stash-dir/DropdownMenu.class.uniqueId22 | Bin 0 -> 2303 bytes ...istAdapter$FolderListItem.class.uniqueId23 | Bin 0 -> 1298 bytes .../FoldersListAdapter.class.uniqueId16 | Bin 0 -> 2171 bytes ...ueId2 => GTaskASyncTask$1.class.uniqueId0} | Bin ...ncTask$OnCompleteListener.class.uniqueId31 | Bin 287 -> 0 bytes ...cTask$OnCompleteListener.class.uniqueId47} | Bin ...ueId17 => GTaskASyncTask.class.uniqueId13} | Bin .../stash-dir/GTaskASyncTask.class.uniqueId23 | Bin 5674 -> 0 bytes .../stash-dir/Note$NoteData.class.uniqueId8 | Bin 6048 -> 0 bytes .../stash-dir/Note.class.uniqueId19 | Bin 4471 -> 0 bytes ...d10 => NoteEditActivity$1.class.uniqueId5} | Bin .../NoteEditActivity$1.class.uniqueId8 | Bin 969 -> 0 bytes .../NoteEditActivity$2.class.uniqueId20 | Bin 1038 -> 0 bytes ...27 => NoteEditActivity$2.class.uniqueId44} | Bin ...43 => NoteEditActivity$3.class.uniqueId25} | Bin .../NoteEditActivity$3.class.uniqueId36 | Bin 1262 -> 0 bytes ...itActivity$HeadViewHolder.class.uniqueId22 | Bin 976 -> 0 bytes ...tActivity$HeadViewHolder.class.uniqueId46} | Bin ...eId0 => NoteEditActivity.class.uniqueId26} | Bin 28194 -> 28194 bytes .../stash-dir/NoteEditText$1.class.uniqueId18 | Bin 0 -> 1051 bytes ...$OnTextViewChangeListener.class.uniqueId32 | Bin 0 -> 355 bytes .../stash-dir/NoteEditText.class.uniqueId1 | Bin 0 -> 6344 bytes .../stash-dir/NoteItemData.class.uniqueId42 | Bin 5763 -> 0 bytes ...iqueId35 => NoteItemData.class.uniqueId55} | Bin ...34 => NoteWidgetProvider.class.uniqueId24} | Bin .../NoteWidgetProvider.class.uniqueId41 | Bin 5560 -> 0 bytes .../NotesListActivity$1.class.uniqueId12 | Bin 2410 -> 0 bytes ...6 => NotesListActivity$1.class.uniqueId37} | Bin 2410 -> 2410 bytes .../NotesListActivity$2.class.uniqueId11 | Bin 3408 -> 0 bytes ...d9 => NotesListActivity$2.class.uniqueId6} | Bin 3408 -> 3408 bytes ...6 => NotesListActivity$3.class.uniqueId17} | Bin 1110 -> 1110 bytes .../NotesListActivity$3.class.uniqueId33 | Bin 1110 -> 0 bytes ...3 => NotesListActivity$4.class.uniqueId28} | Bin 3297 -> 3297 bytes .../NotesListActivity$5.class.uniqueId24 | Bin 1571 -> 0 bytes ...8 => NotesListActivity$5.class.uniqueId39} | Bin 1571 -> 1571 bytes ...d6 => NotesListActivity$6.class.uniqueId3} | Bin 1687 -> 1687 bytes .../NotesListActivity$7.class.uniqueId10 | Bin 1165 -> 0 bytes ...3 => NotesListActivity$7.class.uniqueId35} | Bin 1165 -> 1165 bytes .../NotesListActivity$8.class.uniqueId38 | Bin 2941 -> 0 bytes ...1 => NotesListActivity$8.class.uniqueId52} | Bin 2941 -> 2941 bytes .../NotesListActivity$9.class.uniqueId15 | Bin 903 -> 0 bytes ...21 => NotesListActivity$9.class.uniqueId9} | Bin 903 -> 903 bytes ...ty$BackgroundQueryHandler.class.uniqueId21 | Bin 1588 -> 0 bytes ...y$BackgroundQueryHandler.class.uniqueId45} | Bin 1588 -> 1588 bytes ...istActivity$ListEditState.class.uniqueId19 | Bin 1346 -> 0 bytes ...stActivity$ListEditState.class.uniqueId40} | Bin ...stActivity$ModeCallback$1.class.uniqueId35 | Bin 1439 -> 0 bytes ...tActivity$ModeCallback$1.class.uniqueId50} | Bin 1439 -> 1439 bytes ...stActivity$ModeCallback$2.class.uniqueId4} | Bin 1179 -> 1179 bytes ...istActivity$ModeCallback.class.uniqueId27} | Bin 7422 -> 7422 bytes ...y$NewNoteOnTouchListener.class.uniqueId11} | Bin 3435 -> 3435 bytes ...ty$NewNoteOnTouchListener.class.uniqueId16 | Bin 3435 -> 0 bytes ...$OnListItemClickListener.class.uniqueId15} | Bin 3354 -> 3354 bytes ...y$OnListItemClickListener.class.uniqueId30 | Bin 3354 -> 0 bytes .../NotesListActivity.class.uniqueId13 | Bin 25048 -> 0 bytes ...d18 => NotesListActivity.class.uniqueId38} | Bin 24940 -> 24940 bytes ...NotesPreferenceActivity$1.class.uniqueId15 | Bin 1627 -> 0 bytes ...otesPreferenceActivity$1.class.uniqueId36} | Bin ...NotesPreferenceActivity$2.class.uniqueId39 | Bin 944 -> 0 bytes ...otesPreferenceActivity$2.class.uniqueId53} | Bin ...otesPreferenceActivity$3.class.uniqueId19} | Bin ...NotesPreferenceActivity$3.class.uniqueId36 | Bin 940 -> 0 bytes ...otesPreferenceActivity$4.class.uniqueId30} | Bin ...NotesPreferenceActivity$5.class.uniqueId44 | Bin 1502 -> 0 bytes ...otesPreferenceActivity$5.class.uniqueId57} | Bin ...NotesPreferenceActivity$6.class.uniqueId20 | Bin 1080 -> 0 bytes ...NotesPreferenceActivity$6.class.uniqueId8} | Bin ...otesPreferenceActivity$7.class.uniqueId21} | Bin ...NotesPreferenceActivity$7.class.uniqueId37 | Bin 1451 -> 0 bytes ...NotesPreferenceActivity$8.class.uniqueId40 | Bin 1430 -> 0 bytes ...otesPreferenceActivity$8.class.uniqueId54} | Bin ...nceActivity$GTaskReceiver.class.uniqueId32 | Bin 1772 -> 0 bytes ...ceActivity$GTaskReceiver.class.uniqueId48} | Bin ...> NotesPreferenceActivity.class.uniqueId2} | Bin ...oteSettingChangedListener.class.uniqueId7} | Bin ...uniqueId9 => WorkingNote.class.uniqueId33} | Bin 9147 -> 9147 bytes src/data/Contact.java | 90 -- src/data/Notes.java | 290 ----- src/data/NotesDatabaseHelper.java | 362 ------- src/data/NotesProvider.java | 320 ------ src/gtask/data/MetaData.java | 82 -- src/gtask/data/Node.java | 101 -- src/gtask/data/SqlData.java | 189 ---- src/gtask/data/SqlNote.java | 505 --------- src/gtask/data/Task.java | 351 ------- src/gtask/data/TaskList.java | 343 ------ .../exception/ActionFailureException.java | 33 - .../exception/NetworkFailureException.java | 33 - src/gtask/remote/GTaskASyncTask.java | 129 --- src/gtask/remote/GTaskClient.java | 585 ----------- src/gtask/remote/GTaskManager.java | 800 -------------- src/gtask/remote/GTaskSyncService.java | 128 --- src/main/AndroidManifest.xml | 69 +- .../micode/notes/ui/AlarmAlertActivity.java | 138 +-- .../micode/notes/ui/AlarmInitReceiver.java | 11 +- .../net/micode/notes/ui/AlarmReceiver.java | 11 +- .../net/micode/notes/ui/DateTimePicker.java | 20 +- .../micode/notes/ui/NotesListActivity.java | 2 - .../net/micode/notes/ui/NotesListAdapter.java | 193 +++- .../net/micode/notes/ui/NotesListItem.java | 80 +- .../notes/ui/NotesPreferenceActivity.java | 326 +++--- .../notes/widget/NoteWidgetProvider.java | 9 +- .../notes/widget/NoteWidgetProvider_2x.java | 11 +- .../notes/widget/NoteWidgetProvider_4x.java | 11 +- src/model/Note.java | 322 ------ src/model/WorkingNote.java | 417 -------- src/tool/BackupUtils.java | 344 ------ src/tool/DataUtils.java | 295 ------ src/tool/GTaskStringUtils.java | 113 -- src/tool/ResourceParser.java | 181 ---- src/ui/AlarmAlertActivity.java | 195 ---- src/ui/AlarmInitReceiver.java | 62 -- src/ui/AlarmReceiver.java | 30 - src/ui/DateTimePicker.java | 520 --------- src/ui/DateTimePickerDialog.java | 122 --- src/ui/DropdownMenu.java | 62 -- src/ui/FoldersListAdapter.java | 83 -- src/ui/NoteEditActivity.java | 860 --------------- src/ui/NoteEditText.java | 285 ----- src/ui/NoteItemData.java | 224 ---- src/ui/NotesListActivity.java | 990 ------------------ src/ui/NotesListAdapter.java | 257 ----- src/ui/NotesListItem.java | 116 -- src/ui/NotesPreferenceActivity.java | 514 --------- src/widget/NoteWidgetProvider.java | 132 --- src/widget/NoteWidgetProvider_2x.java | 47 - src/widget/NoteWidgetProvider_4x.java | 46 - 142 files changed, 502 insertions(+), 10937 deletions(-) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AlarmAlertActivity.class.uniqueId27 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{AlarmAlertActivity.class.uniqueId34 => AlarmAlertActivity.class.uniqueId49} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{AlarmInitReceiver.class.uniqueId26 => AlarmInitReceiver.class.uniqueId42} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{AlarmReceiver.class.uniqueId12 => AlarmReceiver.class.uniqueId34} (81%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Contact.class.uniqueId14 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$1.class.uniqueId41 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$2.class.uniqueId31 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$3.class.uniqueId10 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$4.class.uniqueId51 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$OnDateTimeChangedListener.class.uniqueId56 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker.class.uniqueId12 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$1.class.uniqueId29 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$OnDateTimeSetListener.class.uniqueId43 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog.class.uniqueId14 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DropdownMenu$1.class.uniqueId20 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DropdownMenu.class.uniqueId22 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/FoldersListAdapter$FolderListItem.class.uniqueId23 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/FoldersListAdapter.class.uniqueId16 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{GTaskASyncTask$1.class.uniqueId2 => GTaskASyncTask$1.class.uniqueId0} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask$OnCompleteListener.class.uniqueId31 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{GTaskASyncTask$OnCompleteListener.class.uniqueId24 => GTaskASyncTask$OnCompleteListener.class.uniqueId47} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{GTaskASyncTask.class.uniqueId17 => GTaskASyncTask.class.uniqueId13} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId23 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note$NoteData.class.uniqueId8 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note.class.uniqueId19 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteEditActivity$1.class.uniqueId10 => NoteEditActivity$1.class.uniqueId5} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId8 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$2.class.uniqueId20 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteEditActivity$2.class.uniqueId27 => NoteEditActivity$2.class.uniqueId44} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteEditActivity$3.class.uniqueId43 => NoteEditActivity$3.class.uniqueId25} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$3.class.uniqueId36 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId22 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteEditActivity$HeadViewHolder.class.uniqueId29 => NoteEditActivity$HeadViewHolder.class.uniqueId46} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteEditActivity.class.uniqueId0 => NoteEditActivity.class.uniqueId26} (98%) create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$1.class.uniqueId18 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$OnTextViewChangeListener.class.uniqueId32 create mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText.class.uniqueId1 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId42 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteItemData.class.uniqueId35 => NoteItemData.class.uniqueId55} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NoteWidgetProvider.class.uniqueId34 => NoteWidgetProvider.class.uniqueId24} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId41 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$1.class.uniqueId12 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$1.class.uniqueId16 => NotesListActivity$1.class.uniqueId37} (89%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$2.class.uniqueId11 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$2.class.uniqueId9 => NotesListActivity$2.class.uniqueId6} (88%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$3.class.uniqueId26 => NotesListActivity$3.class.uniqueId17} (85%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId33 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$4.class.uniqueId3 => NotesListActivity$4.class.uniqueId28} (92%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$5.class.uniqueId24 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$5.class.uniqueId18 => NotesListActivity$5.class.uniqueId39} (83%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$6.class.uniqueId6 => NotesListActivity$6.class.uniqueId3} (90%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$7.class.uniqueId10 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$7.class.uniqueId13 => NotesListActivity$7.class.uniqueId35} (88%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$8.class.uniqueId38 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$8.class.uniqueId31 => NotesListActivity$8.class.uniqueId52} (82%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$9.class.uniqueId15 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$9.class.uniqueId21 => NotesListActivity$9.class.uniqueId9} (88%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$BackgroundQueryHandler.class.uniqueId21 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$BackgroundQueryHandler.class.uniqueId28 => NotesListActivity$BackgroundQueryHandler.class.uniqueId45} (86%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ListEditState.class.uniqueId19 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$ListEditState.class.uniqueId25 => NotesListActivity$ListEditState.class.uniqueId40} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback$1.class.uniqueId35 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$ModeCallback$1.class.uniqueId28 => NotesListActivity$ModeCallback$1.class.uniqueId50} (92%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$ModeCallback$2.class.uniqueId7 => NotesListActivity$ModeCallback$2.class.uniqueId4} (88%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$ModeCallback.class.uniqueId1 => NotesListActivity$ModeCallback.class.uniqueId27} (84%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$NewNoteOnTouchListener.class.uniqueId22 => NotesListActivity$NewNoteOnTouchListener.class.uniqueId11} (89%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$NewNoteOnTouchListener.class.uniqueId16 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity$OnListItemClickListener.class.uniqueId23 => NotesListActivity$OnListItemClickListener.class.uniqueId15} (92%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$OnListItemClickListener.class.uniqueId30 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId13 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesListActivity.class.uniqueId18 => NotesListActivity.class.uniqueId38} (88%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId15 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$1.class.uniqueId11 => NotesPreferenceActivity$1.class.uniqueId36} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$2.class.uniqueId39 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$2.class.uniqueId32 => NotesPreferenceActivity$2.class.uniqueId53} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$3.class.uniqueId29 => NotesPreferenceActivity$3.class.uniqueId19} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$3.class.uniqueId36 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$4.class.uniqueId4 => NotesPreferenceActivity$4.class.uniqueId30} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$5.class.uniqueId44 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$5.class.uniqueId37 => NotesPreferenceActivity$5.class.uniqueId57} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$6.class.uniqueId20 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$6.class.uniqueId14 => NotesPreferenceActivity$6.class.uniqueId8} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$7.class.uniqueId30 => NotesPreferenceActivity$7.class.uniqueId21} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId37 delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$8.class.uniqueId40 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$8.class.uniqueId33 => NotesPreferenceActivity$8.class.uniqueId54} (100%) delete mode 100644 src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$GTaskReceiver.class.uniqueId32 rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity$GTaskReceiver.class.uniqueId25 => NotesPreferenceActivity$GTaskReceiver.class.uniqueId48} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{NotesPreferenceActivity.class.uniqueId5 => NotesPreferenceActivity.class.uniqueId2} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{WorkingNote$NoteSettingChangedListener.class.uniqueId17 => WorkingNote$NoteSettingChangedListener.class.uniqueId7} (100%) rename src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/{WorkingNote.class.uniqueId9 => WorkingNote.class.uniqueId33} (72%) delete mode 100644 src/data/Contact.java delete mode 100644 src/data/Notes.java delete mode 100644 src/data/NotesDatabaseHelper.java delete mode 100644 src/data/NotesProvider.java delete mode 100644 src/gtask/data/MetaData.java delete mode 100644 src/gtask/data/Node.java delete mode 100644 src/gtask/data/SqlData.java delete mode 100644 src/gtask/data/SqlNote.java delete mode 100644 src/gtask/data/Task.java delete mode 100644 src/gtask/data/TaskList.java delete mode 100644 src/gtask/exception/ActionFailureException.java delete mode 100644 src/gtask/exception/NetworkFailureException.java delete mode 100644 src/gtask/remote/GTaskASyncTask.java delete mode 100644 src/gtask/remote/GTaskClient.java delete mode 100644 src/gtask/remote/GTaskManager.java delete mode 100644 src/gtask/remote/GTaskSyncService.java delete mode 100644 src/model/Note.java delete mode 100644 src/model/WorkingNote.java delete mode 100644 src/tool/BackupUtils.java delete mode 100644 src/tool/DataUtils.java delete mode 100644 src/tool/GTaskStringUtils.java delete mode 100644 src/tool/ResourceParser.java delete mode 100644 src/ui/AlarmAlertActivity.java delete mode 100644 src/ui/AlarmInitReceiver.java delete mode 100644 src/ui/AlarmReceiver.java delete mode 100644 src/ui/DateTimePicker.java delete mode 100644 src/ui/DateTimePickerDialog.java delete mode 100644 src/ui/DropdownMenu.java delete mode 100644 src/ui/FoldersListAdapter.java delete mode 100644 src/ui/NoteEditActivity.java delete mode 100644 src/ui/NoteEditText.java delete mode 100644 src/ui/NoteItemData.java delete mode 100644 src/ui/NotesListActivity.java delete mode 100644 src/ui/NotesListAdapter.java delete mode 100644 src/ui/NotesListItem.java delete mode 100644 src/ui/NotesPreferenceActivity.java delete mode 100644 src/widget/NoteWidgetProvider.java delete mode 100644 src/widget/NoteWidgetProvider_2x.java delete mode 100644 src/widget/NoteWidgetProvider_4x.java diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AlarmAlertActivity.class.uniqueId27 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/AlarmAlertActivity.class.uniqueId27 deleted file mode 100644 index c1d88a57db65d0d8d3d8d1db3c7fcb7534d485bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6231 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 delta 31 lcmaFE_J(c4BPK@n$&Z2nih82`OA?WSQ-h$vR8T@+|TX=CwjI4o&^NSZ*?L-2^(*RuCOARrBJ=Zr@W(jmb z(-7CujfB9~v*x0iuABCJx-@rIR(*l41D0+1hXgtXQZwDqu|>lTI&Q>PfjeyJryEw) zsmZkM_|i+)=yTx*!E^Dg^#pzEw{jH@$@kvzgJ56xg;-p1?L}>gQ%1 zw_u0B=Bi5Gvb_^>N#N#z&{gE9nbaAj-=pI;+|J|9OP+quMtbW_HQaGc@@3z(?D;tQ z1U@}^yj09piqjKEa+Bps?$q>HVL+uhvhQ%p7%Pq&4XYvjrKUXCzi8Kn+jSqVwp`C~ zhb><=(oNNt%Hsb1K;JdbSAt}!e#NR8`JypU&J}XmDPzqW_NZ4T`MEt%equvmeRp|6kCls=}xl= zo&x&n6(qzW5a ztSV)?(Sdt)F5CT_t!$|{l`BqFrYG|p#(!+pcu%`lCXNRM^qS={#ifdEHe>=1V^l*% z#{nD^=(|odflk)I<=`$3tn>bOq%Q5su9y5TrPZv}fXO=wfxdEN1PV%FL$9To4)1PaZGX~ z)m#vKG)yt$RjV+8BQ2{=OiiE+Esj}%9wV%k!5j@Q002X}uHza?=d_M9c${!(Hk;C} z2@FNkYPT(##5GYe36$`pj;Bx&i2F|XQeZm=b?w2ZTgHo3=k=)?4a=$c_~Xxyed?yb?lUzEl*5 zWqH8}+*q(|8G_f8IajA7S#YXmea3Vx#kYkqf59TK^%ef}a^krXZRp^L2pnGBOI4!? z#zcqpU;9jVF@*~PyCZr2>wHpO3&JP}>-h%})<)(!2IwCq&5n3P@~Rqe4q|x0M9tSM zGlOg?a{5~HT<3gP$wb*{xm9`8Qf1ZI6}33SN|kKhwxye`o1P~< z4Q~sKtW4wo{xZ?loPP(owz z3*yiy`{OD$|B5Z&W83Mkano1WOnz_~+b`jU@afi{(R(F%XVMt_26ruEU}Enw_FcvP z*bnGE-I08tyf1tjEQ@74R2=#Rb3@;PA6u7jdZ^=DjBmndOu6cbE#vrXPi(Z4?+a{t z=atb|^3?YzGxBtDW*Ltul_yA-@$@$^XGK)Ct8LZw)2hupb$QrO-HuA=+iJ zM0$~+{vsa1M;N2;EIuQ>O!@`Jag~?M?>H6|{}8=P##y3uj20c$4%t Wn!Sa0@E&^D=eO`aX$Sca(DOIg!8bAh diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$1.class.uniqueId41 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$1.class.uniqueId41 new file mode 100644 index 0000000000000000000000000000000000000000..6409b67c9faf48f0fcf5018f9627ad6f05381dbb GIT binary patch literal 1077 zcma)5+iuf95IviuapStgq_kX`gwlpKNuf?kL87Vp5-!G?2Y6aQ23ZX`0}IGA)Rc&TK)yc0pK&5(~qGOV=-Z(sjIN5>)x8gv6oFc{2p{()N_S3~P$a4wvP z;vGpPqhp3_z0uck14Rv{ftx5XY+j#%LFbMmLZZ|nQit_P5M07{gM`6n_5=sONxh_e^P_(5IDgKNPJo1!m-{D@L z2Qs#&&Rnb`!}c8gsKHvm?dW(=2vJR6U-LPdBOnCP@{P*Md2Z~$s&9b zjY`E1>eE;Oax{Qy^Ap%NESvdC+5Ljm)V!N6mCN|01pORE98&xaDmY4VHPa}6a#hhl rGvQLjE*>RJs(4JhER8+Nn1O{BtvR}SK%3qY`Qp0bX9N2<$QOPC<9z__ literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$2.class.uniqueId31 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$2.class.uniqueId31 new file mode 100644 index 0000000000000000000000000000000000000000..16704b52e918cc2cf60256b839aeb93fbdb89935 GIT binary patch literal 2197 zcmb7ET~ixX7=BK&$wD|OD=n>9P%IG=TGpi6lt_#yAzN?mF`I8LMbY?jL4X>!^;5dm> z3>^Wy=3BO&Gi>3MjVeRin(*_E=NpbG7*3}%h5w@HUAp2pgI5_6hG`1VOO0g7>w)xf z+|HCF!D}364-<@Lvr^r|@jBi(;LS?j@#FCx?W=}2InJSvp`C)070NqB%eE~qNXx8D z%Uc}%7$AiAZ-kPb4KtVF7{qxpG0J6zSUR7VdWN?-hM*rfJes9CrjO-tDa^!0j$w=( zFkJc{sSI4W#4(1;2Lxl1Aa^VmG6lmaS6!>DKeft~9(}I1xhkq*4^yG9U|hun$5p(` zaJC7Sp@qzs4ZB8tL*15_X}!jAJ;)iQRp#mjNA7T>!?NZYra5ln7MT$PgObimYlb|> zEN(NLAnRPMS{07}K*%PQh#>GH$DBmSvNaGz*YPXTdV%APyh|S3O&K4nSY)`^B#zX) z69kc~&>V?^<@v%9^35C#JH1q}91-Sd$yl{X(@}6u!(KM3mXsSxMb0rp|1riPH9SF1 zx`$t-1(R-C7ukC>+*`q>p_yq4CZKDVDJTY(C&3X<10iX7a%F{qQcJTERe(ZaICaz@ zF{orYrr*;c3ioiIB*F)56gM8A6mmsAMU=E)E737!AMN9@!7mZrN9PWng{Q6^T|vx~vW-l)1o!nw!=58dBB4n@+)BjH&>mRS z0t;92{PVm@%nJE*;a;f9?qRN5JF|;a&rWlH2D*2o4+L%ELr6MW$2%I|YCO6PHM)nG z#vhNxLlt@28Lwk9l-}!9wlOHrT``J&s*agZhy_9+6j}mdUKS?`S)5O3(*si^O;cHK zp#w8WBah28_SbNmv_-7YfUjd7RV<)}MSMn< cBQ_=RRY~K;$2Ry`&_z*wg5q`#F z`~m~NqRhJRgbkp=hG4M~th4LbU`5!h1Se>SnXuGrSM+N(nlyMb`iYtssJtCxK$^O0) p-O(Vvc*odp$k7Di3E4%kh6?>F(j8dz?I4{(|MGK}*7AD1^)E~M0bl?C literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$3.class.uniqueId10 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$3.class.uniqueId10 new file mode 100644 index 0000000000000000000000000000000000000000..e3d9c96a26349c0c881cdf4002aa114658c80b44 GIT binary patch literal 1805 zcmb7ETW=dh6#gb&?{^KtC^eS6b7tmTzVppF=l6TR{sv$M zZ)oUYIOd2zuUn>D6T0ID!q*#?zF-7m*{X|6mU&%xeNYhBpmJ#FWysv$A~VgP2Ah_j z$&-Hh{syxNB+##ca}3}RL-Lw&!_aNR+0d(N*Mu36zd6gXf_a8mc6=oP(&2ajDTah$ zn!@)pr}Gr7nC&Loc-e4jo@>?gZL79H1YB&?*Mt|POIRL6TEj5MLpaQEke9&^GOaJWYg=5 zpiPI8ZO5GAn8wV$^U43=Jbdf|$7xCE5Yb(1c%E>A3vR=!t}hrjCHk`*=PiDYk@HEGKC&W{dmZNx<PEuvpH0%|_v*f;gsK|z5INn8pXQqjY0k<X3kF*lDkyvM!-aUPppK;DcQH7cR_>y2M`gQ6jYye~ z%5!x`{VT10jjNH-NU}ezws0)k9gmjr7A7KTQZ6l=Drjjf$-l+0+*8~$SEBp5T?|P{ z={SmRMv{EAg=eD8^D^NWWWtwed;tw`+`wUM(;T~rF}#Bbyo zLu_CNTlk1HKc<^ca0j>X1%1E4r`W}3_#U5!vUc)6yzqml zw_Ka}6)*e&Uio9ZR^QVS!DwJEYxllSpFZ#B+1DSRzW^v9~Yp zDxcdnLtCy|joL7(<1&n+9A^Hb4PhV0bc`Ptm@XDISWJc~Q4ydjl;2qx5uFpRY@ zGNV*xNPEYl((dMJC*)XG9iqM24VRc<@I*2ZJ;$b^7+94YSL}sOdO6_M_9EX6bJlQ^ zVc>+IG>2uc*|5ZYsmkvD^CV5G(NcTvxt8Pk(%o1T!KO#!)T=J_ui|ju7u1p7f3_FH zbP(0z=D;!;br|U!$LLDKAhbZ%0{IF_6(-&zUigUiw;^YO?n&YRPjQv*eGv=SFi9Tq zLp3TLCW?nz-w>yGK)vver0DvD&V6W!10=}oetZbML{DV(XF4+9KVa|xT}OaUK;(@? zKUY*jaj1lbC@Am@{dkTMyudW}aR;yP0I#uxH({cMD23mN)-gpqRY)Dz=}$}*TgMDp yaoiw#0EtH$*iSMOn)=Q%h8Q7iC{2`GgvT(4vU(oM%#)QROjW8rIn3gAvi%nZPCm*2 literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$OnDateTimeChangedListener.class.uniqueId56 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePicker$OnDateTimeChangedListener.class.uniqueId56 new file mode 100644 index 0000000000000000000000000000000000000000..255a4e6ac9590c831bb8092c97611795ae8f4df2 GIT binary patch literal 329 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 literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$1.class.uniqueId29 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$1.class.uniqueId29 new file mode 100644 index 0000000000000000000000000000000000000000..219143065a3f77a700fc7d72a20fbcdf14bd0dcc GIT binary patch literal 1383 zcmb7^ZBG+H5Xb)u*B&jWlwuJS5U^-lphv~$5+W%YONup?^!;*O+QsW$(z~L3EE7fI z3qOGG{6farqgbLbl)K#B%t?a&K*bigttb3FEWD@W-B36H;}Gf z;;v8)-YJ^6!I1oSAdU%4TDXZR;`IgLM>6HI=AOVU3%4=DFxC`-E?-&gO4pTsnAwib zY|g?R%=cLfnl*m~)}3tK#3IAS<#kC{)p;LFEvmO@RHPpWB{~eNR|uJ{GZ-b>ACy={ zD)FY<-WQ!czVDJHS@9h1)_F&2y=OG^Hepy9xCQA#kzw5Xo0patgtJ)ISBQBe#RrD; z0D&o>aV$91f|aRPv$kR}Xg2lvvB_cB%*4{FwG=TdHnA3CC+>bi^yEv!6aM z@Wq3Y*PDiF^-?*m=S$Vx6+z2u=>7kMVK!6Ys?qUe!*(c)P=Q_2-;Y6&ddpyy6?LfO za^DxeiRTQ9m$#Zo{@ZNK(}5oW!va_$p$|R%2Zrbw#a*(dN!lb`TjIIpFJQT^Fh7Mp zOZ1MC4{(oeVDiih_mLru{KM6#g2*D*Tk9u=VbWMF_ZjRI*NmAHqwl9yQjJ}c> zO+_wfRw~-ldJ|7DeTvyW)La-M3yZ=|VHrzU!8%s41sm_M7Q((h!}tSRBfpg}nHqWK z!&GYIpC@3#rCE6xp;RC#5=sw9iqiNxX+!k$d_-S^j`3qWB`HZZT{e9!;2Db1*l%o# BSONe5 literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$OnDateTimeSetListener.class.uniqueId43 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog$OnDateTimeSetListener.class.uniqueId43 new file mode 100644 index 0000000000000000000000000000000000000000..70481dd769b5b77b67374450b22b6b6e3d483723 GIT binary patch literal 320 zcma)&KWhR(5XIkUyz~46X;N6Evp5^KNf!`;B18lQCH;Cg$eMLmc2_@KihO{4sNhC9 zh@H*MFg)h>-u(Q2eFJzwH${ywG91KS6}DtyY+x^rN=#(nwc7Ji6`$-TN@~09FHE&w zahNL~*sx3SKzQ8AlN4H-typY!Tm(Y*MooCm=hBqUs#3_qLA+^p;d=LVHuxa4R`%!$ zo+{0RUIqHkAO1lIop%$lV=cXBpQ263?@d5>x^Y!yNC<>_{0TrYO#?}sYDh1&i7fV3 KR78{LB-t6Pwp)7u literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog.class.uniqueId14 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/DateTimePickerDialog.class.uniqueId14 new file mode 100644 index 0000000000000000000000000000000000000000..7ef0abc1578939a56e4d7765833d753318e94aaf GIT binary patch literal 3477 zcmb7HTU!%X6kR8TjKo2Z%1uNBqYa@Nq*hx)sTj0|1}}iLVp}?d0Y<|FCljT2?fu@` zyS+a4we44;t>4$LPkrd0=|8AlXC^~JfI@l5xy;`C?7jBd`yBrI=eOSh9K`oQ_)ww1 zuc8tGfv~CD(K#cPnbMGOS&~+Xz9$1z~jM7p zVCPsBjcrm6} z=I5jRY2C8DLjt{qY1n-NJHkm%D3vj7-L#`|IWE|-&aoisaF2p*D(cZ7P`C0#x;vxW z2{UVJW{O@lggaOBOF@%B$NCrq(THjpZHtN>Xcee&qAh|X5K69ZhB)}preYV`1(d9A zj~V(^>D*GRSGW(?=~u(UB!~%f$VjJ+tW0cFMK=xzRPY;V z6;34Fgx{}{zYkD{i7nNkWVmxsX6Uer2c^|5)QsmWi=>fpRN)9>3VKyM3^J>E1){^D ztZf-4IbJ6jZquQODTnnFnM(p95yVmSD>$Yij)4;TmN8SHioT5$Y}JPo1(hK%r0tT3B`E zM|f2n#26k|@Pvx<7#G;-$;lFrPG_t+&2}2m31`Zr8rhzMCo?(A+xV{zF)m$tQpHnv zTA-Sqx~guu`NQLG>v~3ohDi#{B?`7(0WmI1eM*InX#zM`Wb=q_doT+e-EfJO)I*5{ za&lInb*;e9v4gT8W^hr(C8UXfi;7p8Okc5Yc--*N9bAihriu*a1vU|sQNwBFEo)M* zb8Is#WEI#da=0SUx1x5|xGq+Ym{2dnlF=7KD7y<{ykC}mUlF4G?vL~4VoyjKrhY0n zH>q2r+N8Xn>XMn1mLAhAL#_*(etXu)vZro1aWS@O=iCLhqUJTZOh06mu~iHTs2)*W zGBpwCWkDAS6yHcMbxU$}JXz|@B;!mU(^BkI{^_*FE>=Bab2+5V7s6IDZif)qQ-s@t zv#jJ}?6x$dSu@=N?JFWKmv%+jt%F)BrDwCD?r!QG-FRTJRqtg1-vaG;Mh{4%`~Qbg zhdaIn>DLHbMoK?nNK!O=wNv`C*)LxYOk2X_1s6|i*{n{+e=g9wKG{psvf`#}E@r*# zn}VAp=nCt@0s;3TQt*vHo7WiD$P`&$*7*hMi)WTJ8nm;Wso*68KWBWd@h#|+z0Voh z<(!cZ8;%O)YH*dm3tat84L`^0k*-_V9J!6Hi%=qW(0HEf=0$9eM1H~cJa)?A4m!?9 zZXuM%y<950^5~LdZFNN+`=x+f<)WM5^4@0Bs##!`5p|59>j`*9*38a4wS)s;%#9B}5Z9QMDD< zen5b~*ZLd)+gfkK$YV~PQ~`-wouhM-t0X-hB66onFbOSrA99f3tBM%Ejy{fWP`eer zyVxrKb@2HanYc@j3Jaf*p}vW?3hvGFAPI9bT}%CmZF2B3`718_QS@nxBY2ji8)hCy zOZ;hG@~0VZ;~ko&LA*$+&G4&DTH!uT3kp{z^&9bqdZ_hs+3YBP~IJTm27c$BYU0jTS(l* z10TRgAYN6&}4Rwa*GJXa-j3SsaB$s--S`)fp_Gl()WQvhtzV#t;8U+pgL^E4L_}|UBGX**lws$8Wc7(PAm15Q zdqVP;`RRbCZ^A)Bk$O)>VbTv%VfOQ2$&`V?U3z7A-)FGYnJR`xYvI5`v)`ulY{Ibq zmoqZ?waU|ozYs>u+Qoi&Yzj(}pUWswnUKRHu16|1Tb6CP%K}~L`I02kuVMg$0!nSA>AH?Ba5;?M+Q`K* zj1dKwR3tGfFma0Z`b?#+AL`|*DbPoTUI5P-7(qoLffU9RjH{Ty2Lj1Z5N+?thUu>8 z#{N#-Y1)-_v*9%B1_8U%h53?#4+T=8lR@|iOyY_ReM&$}2T{@D!8uV20j%SYsc(ymM+_tq-(V>nYnb~3>s3ln*!6P@)atx znd=Ew=jT$uF9c@O#rGZXWJ}>I6*=4z7-r_y?0nTS_KQ}7lFKOPI(Z1>o(Wm`@-M5n zgS!Ib9*!5IYt}+|H#>OY>L=`(hX~(`733A%SMfC-2n?N4Qy{i&*_8qvk^oEXw2pF* zX-VOciUJ-}ckiAruIf2Maq9iuFHuS)f6oyVpuqZPxpcZV_d%mhS8fHTQIS-$@KI;sm z-60k12u!_Ghq4oeuZ99ET&~iLWf8hV3aSFxHr_?`X3IF|(qM{BF2?^=7f1deIE%>N zl{d2UaqNL$tN4cRB3G}t?&i3fc?~6V?FfCDKhgIGhK_ML^A?j^3v&G$A00ttI2Fg3 zKEhmUmYL)@cZ@}8^A<~61o`Y3U%v9(t@1tXk-0<{NyIUV5njZr7{emQahrX%NQ)=5 z%d|*f4Ntiu9ej&*Qk1g|h7s{*n?&g1*Jrrv(|^Vtxi=^Y{exaPEF9yuWYER4KtD%d z77FGlNZRu@+By?>8$=1;5%GKPlo;TY4aawJ$9EyI=O*6ZUIf3>F5;m_X#^~sKPdYNR{wNX%sAb0xllF#qlG4f*6e9XZ+&BX&yXtD&r2b t>i1w&n#iO-_mqv`SC6}nGRJAEJ`4jUGqS|Be73QRy=WZ!%uX#D{~wl;MD73p literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/FoldersListAdapter$FolderListItem.class.uniqueId23 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/FoldersListAdapter$FolderListItem.class.uniqueId23 new file mode 100644 index 0000000000000000000000000000000000000000..47a468c04bb2efbb45335eafc1889f2ff1b3e18a GIT binary patch literal 1298 zcma)6T~8B16g{&P*47m&2v|UcTCpt1;s>IXPfH+88Xkb)BU!pr7_*(l-6_b=k_Z|f zjL-fkq?nK_*%!cr0j+Ds%Yw4;MzT5{#oL?!UJBLl@F zr!Jh;!1s6|7;M7b%3eEDV(3Mt$|(nQL_ZCDJ0uJpn{ zc+QdV_6S2+NbZJZ_c*943O^^LPzwx0`SSU}N+1=N$|>sglPZjDC((&66KM-~(an%) zL9&ta8v)bRxTYPSD%cTm39OW&Ufi?Li#`TZ$g1xu&an3Xl%*z^L&1-nZ8B?NP(LV) zwQdxWxQ~p90Ski~UGFvMgvZdS4tE;hq+8<}(*p|+@rc2y3hC)2?~Y4!vM*n{E{};3 zhW_&|HQKpF9nv>7-H$Eg@PwhgwoVDCPff5_4iiVicxoY!F=|M}m5xGG<;x%3L)Y_^ym^fvSr!=;|)IaTOMU+9d*ry2}mNRH2Z2ap?(7m_~Tfp2jXiYBQ*Z z6}~ET4gIZ(n$&lQ;*yj+Ec$K~@yNt1!)VK#T&qYLoPRZGVxFM1T;3otor}N_9uaJi z5JA?^QvsyY`Xz`xjHGFUVVu6IXrmvHwZ~7v?1`^1Cr)t3{)V3Swta&BGYtL2@F}vN z}R;yr_G7L#yj)&HjOoG>uFz{^I?@ZVJ5?9Mmm>0-+sIM?a^QV{PqWc4SXRX06|1B zf++gxk~FMn{!(!&WVMpvk*Nx1*X?S+i`<*^0ZwS4y_plORIk zBxe}5)8+GF47rSx?m&TeqGkvazq$t)BZlS2%CRDM75zwdmkT`9C7$e+2;M-F0%>V_har}pw9Pam zM39akgRC1nuN1d^3Ax&OthVifh*gG*;|@ivGo&Ws9;Rr8C#q<42R+>iA2c_+1v08q(PZqNzTFX{+yP6-z$Air@sMc-+RFs}mh;d~R$sl(@I`CnJ zE~)l)TWNp2uk^jD%~Ef;caDp=K4dyxikIZ=H4a7DH!RK844sCX?XGuI3TcOH-58i{ zbywq}iMwt_Z@YEQo*`1wb=53(70XgdK^I)ZvpZ14BU0Q%uhggrXSc-6NVniRHAa90 zEFi(VgGLFwjRlhUJ2Vd9U7Ft>nHT7KW&A%t?@h8O(MjF_Vm7z>6zpf`(0laeKMi1s z43}|-M$4`l-p2{~wBDTqzVF$Y&Yz;wr2<3N(huPdygny!0034aS23N|jfBQXVSAW5!Q!M@n zX)X8+uLW>Bn0o;+5j@4~JU+o;amhKKCH6VYV--oPL8gbZ+MvB8!YE_k;g|RMJgb*eUHf=b5|=+YvM{EcfO<~TPZd4Pu=HMamjbm}>BheA}Y w9|ogu)_=uKo+>s{uo$5>Xf1$`@dV~XP+rZz19&Le43vya_FikZ zT7CQexZVH^P!EwK3=Mmg#*y8!GS;(GJFneAWt@sr)0LRf@?xTwXfMpzrpJUm&tvD= za2BFKXzcY_t3;cfT5R?lc|yg0qJ(^>yOz_^p0bE1al(YwcXR*MK&Z`(bdD449J>%z kLhm0wLi3j}AP9lH43MxE5s1nme9scfvMZ7hKGcHp6CG_&e*gdg diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask$OnCompleteListener.class.uniqueId24 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask$OnCompleteListener.class.uniqueId47 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask$OnCompleteListener.class.uniqueId24 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask$OnCompleteListener.class.uniqueId47 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId17 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId13 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId17 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId13 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId23 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/GTaskASyncTask.class.uniqueId23 deleted file mode 100644 index 1a6aedc706e96cbec145a0361990e78de1d70c97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5674 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 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note$NoteData.class.uniqueId8 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note$NoteData.class.uniqueId8 deleted file mode 100644 index c40e94504a3d74c6afa4a9f0ce1076e783a77b6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6048 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 CL9?C! diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note.class.uniqueId19 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/Note.class.uniqueId19 deleted file mode 100644 index d2041ccfbb5521b74a5e341da3e355f31fb4d1ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4471 zcma)9`Fj)B6+L6g9!VZHg*auG!)6KCf0&Pe^IH3*cnl|0{{kQ%dP0yVfEnYC;`|v!!ci+9|-goYK&u{uZ9M{Myn3pc(^9I^QJx6Ry89|+nNtVaJzz8EVnse20$WMp&;yzjTkCc zO?NnzjACd)vx*kMyoQyjfJ*UP293OehNe_C*kInn+bVe1DQKD*X=#gqUC+W;xwLNe zmmo*5Q9*P>mlNqXGcnTZP8D})*o^loxNTYzjIuoOLBkDLv(IpH)(HW-ys7y{)G8UZ zMX?fFG_+wW+0ow9-Ph6G*WcaK*U`U!Uy3y-I}j%9&znqj8}3zcpN8$YpX8kulI@lP zkdLPA7HqR@Sx@TOP6 zifIT?O&X7@vSGi51JadIi|qB9UBw}mw8FdYLiU)E-IEFM&NFNz7?2Lle zn;@UypG-IiL&E^r&Jj1~FDjT{s<-9IjNhsfj+!ux<0>o-S=cOM>G1r@=jcYEK(3w! zL{+B;z2BUweJA**f?TgETFSDFLEY+gDMM97kr^D~IwF>p4-Z=ihb3ndB*aM8ijAPrYNfea5I;!u@d#pTH+6 zzE$%nQYy^4dK*8j;WId+Af~6&hU2VQzn<#XJY$v>w9TCo`?DH8SBlZDTb9I5Q6o>` zMGa?5s7fnxhkQ}PIedvI9P=?!i}zYe%wN**6?~OqVLDwRzq^AA!?Sou#n%+vUg@fU zPuuf@1(B38rDAv)V=*4XOEG*C-%{~y4d1~9-Z3R&Pf|6?C-rFdNz)zL?sc4zkrMH0 zD{Uyr9B;(QQ=+@y)$l#M!iFu3@YZ5Nho){VZ=4i7cuY(s?~$of&8Y}pC29A2Vf=pa zbYpG88Ojx`j7%klJlT*kU)FF%o*uPn%g`x2r*KunI9{VTjTD?AUU|7GmlL(7l;Q-W zqi)+Y+4E%jw(p{tPX$ZP(YfR5w(I4{hY01n+c+r-DfL}4Q>0Fkqn*z)lA+7A4PS8k z^kWuh;vP8;=y_9q4<;L{5KJr2ZG7B#8Ogo8;D$+3GY4{_(*jW;j5_Z{M1s@@?wdD*PtH0%E;rGwK?1xzqKJej@yb@(i(5943~$-vAT%0t??w6{n3VH zzF|udcf5+bTZ_17OI>ucx}dIz_V8;+)!>(a-R6#*W|u-eRpojCCHr;9QvA2k=XJt7D8b-sYT& zUvbYugx+DeIu)D3Dpda85r(4TVB-pU;@>g;d0-!XD70VPautua1c!133Wui-bMEOY zc;*tPbaJFlR^mZ4po@>_-Cm@G?=6T#zxbWUHW~e%qZ-EL{TW2>qP0YiG0rm* z{lk?Aam%NS^z@e%#N6Ka9WqkuUFHDB>FyTCM6F9u#19wyE z_W8;FjZU_!a2;6l#BTCi)86}ghLm&>UWo)dZsG%g+c1V zaQ4Cc(0$_VPxv!`QeE(0s*5mmI1xQ_4ok1$uNrju!va&7uVbs=*0% ze1Tm)iWD9vyb<1{o*$ u6}wsi`U(fttXWxAx?23rYt9<{-Lv`!{>g8g_P4OP{#6$xq#FDiHU9@N?SY2? diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId10 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId5 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId10 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId5 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId8 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$1.class.uniqueId8 deleted file mode 100644 index aecdf92c369f64169ff59c9f8f365a1873fbefdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcma)5TW=CU6#mXa*+N%9w5avcR<{+Xx+U=q)5Ks+NN9Oz<-xaQcM4ON8M8ak__IvB z#Rq?YKdSL8G&boAY_dD&^36Hlx$NJ|-+utS#>+e`WNc&|tRP3&Rl;~<8R$@WN*j@Q z6X_kZa2QJSHZXE3%@?;x$eEE$+;!cEn-5p&5a|Jx>AYb$#@{*Q-2V# zrP9@bANBoMruvmJoA!{f98b5|BG`JKk+4(iE@0Q{)cagdIO9y%UWg~GT#RHeB2b5W zd7>wAAl}QA{`$=oc$LnN3q4dpq!X!zN5YJB=-@eO4A-jn*+{LDjuGP%5%GXUNZ7b0 zJ(c3ZI}&P=B3kv21gE38hwaEu5|P;0BWy0Hkn`V|0JeCYS3#(P%H?#WdCM(+*HB^W zeU=VbPc4PU-gi*rC+x2?%me=B7z4V*2Fuks3J>v!HO9}Pac}S#Pp)Ep;4{O%QsW!w z7jC7;58Sy9SWMlV&9(?d%bEq=nqT=JxP(on&52RMHl8v(gJ-N+aIwQ@mVbp^)LE*q OEv245RW$G-m;VRR?d(hd diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$2.class.uniqueId20 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$2.class.uniqueId20 deleted file mode 100644 index be3692ff69c8f07ee03569e82fd5766135f93ea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1038 zcma)5VNcUg6g{siE9*L$Q&7ao#ERQcN{HWPmJq;1GMN!F6Tfxs%XrYflJGX3kweJ z;4Z_;M5GB9ij#4*74cN<_&Ux^bMJj?VBsD^cfy_Or%{I@=5IuB!qXk$N6E5*_9>V|xttK{8GQ{!(bo z^MBv6b$vxByImPXNk&b5&DBv7I#|;es7x(*%VQx!T{Y*Gr0Q))ewOjf!aAinZ6hf1 zwKT64t9=8!~Bd}zv*mEVbtLm%QlYA~^~$?V*FGxwai=id4Lv))ihM11HfeT15Ec#s9 zZQ%wUxBWo!$nFSxhm1{6$S1B8T_ImuYYYk56p^(`8I|*-6cx{ifh1B4BVDIuaROvm z7@EDuU&vw#2F7$;G%ya6!8~xfj@@$nhP_)q;4XnA9tmH_#|*JtzLr87mvme{8G^3Oc^`v?FEUTf2U#$=yTlm6}uvuZT!;pN9<3aziB<^q@HO zR8P2kjUis5PBM&FgwJ<6?K%(loO+8Q=}O=_t(p@G<@bYe)l`P_-N0HaG9;^_;XASu z5~LZNt;u7^<|;#FDDJCErs_RSYJwj#%>O5YI7QUgj)Cn{5315}54WA8eif-|& zB~+c0e-H19njcbR(|21zB>cuUm(9S_afiVgHY@|>4Xk0EVU(Jxx>lCFO_Jp*f9A3( zL&7bV^S?{!QfaoTk0dk7J~g`3a-xVwI_@*f4b_NY`X9rB3_U6X1OUx6)!PDSr-w{$ zTcb6OdD=5%m1vKtNMY#&tgw6nz3?8RZz-hV2K^HR1ML$Q$e!vaXJL`2U=$?7O|mtZ zWG&(r{WIhr6RZNx&c4QU;T^%!I>m%(zBYKwoJV+#e E0)XyBVgLXD diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId22 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId22 deleted file mode 100644 index 770d3551e6a4ffdf5d74efe924d0dd7e349b5d03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 976 zcma)5U2oGc6g^J6hGk(Z`v5k+24rLHBtpe_8bTT!XqCDlw5jiIY&uV=EhTPOeijdC z5)b?UeiY(5Ee}*YB#~_2t85GLDn68rN-O)0p|RI3LvYyWEz-TWLM$SnaC@op z=oQ0mx#$2PZu?kvIj=C(ulSh9Dc6JeQ~ydPmZ7rO=rII#d}@UHqNHHh>~bwKqeOhI z#DJ>2kQ3{QIAmB-fgyq?0nCQ48B7 zvXFGX08$C=(1}KYwPIhN*&EKT*PRl{@6k^WfpB-pIw)))XzqW9-@L)nw*qsIR)+yP zxKC?XoC9oPi@4l<4`vL<#87eQ=Kc-X|D(63h-q}e{E%{S>@_^X<06MAWO-E2Q`%Px M&oe}{?~qO3AOE`basU7T diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId29 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId46 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId29 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity$HeadViewHolder.class.uniqueId46 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity.class.uniqueId0 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity.class.uniqueId26 similarity index 98% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity.class.uniqueId0 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditActivity.class.uniqueId26 index 332e26636e8b57efe4d76b660bc9da411fb88978..f6a782622a3a9ed7e725d5655dcd0ff04be4e61a 100644 GIT binary patch delta 107 zcmV-x0F?it+ySE80k8r`8IS-40FeL;0FwY40F(e90F?kB0G9wH0GN{-M~NYz00jV{ z01^PA02~0L04V^Z05Jfi05t%n05$-q06qY!v&BdB0S&SM1pu=E5dgFR8347j#z}=E N1%?5K0Ed%MZPLb-9V`F< delta 107 zcmV-x0F?it+ySE80k8r`8IJ%30FVF-0FnS30FwY80F(eA0G0qG0GE>+M~NYy00jV` z01^P902~0K04V^Y05Jfh05t%m05$-p06qYzv&BdB0S&PL1pu-D5dgCQ8344i#z}=E N1%&~J0EUxLZPLOK9Torp diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$1.class.uniqueId18 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$1.class.uniqueId18 new file mode 100644 index 0000000000000000000000000000000000000000..fbeff49cf6282fc0c6354f5a68e696f665a6d214 GIT binary patch literal 1051 zcmah|U2hUW6g?M^Ep%HbwW!r9)>VOiY-@bO_#mmK$+k_T@}N%(Oz6~Q*6a?b|H&5< ztBDW(0DqM6&IX#c5qa2q&)&In?&tje^Ya&gr`X9Mg|vl?jcdpf)|JriKz75Pa8;;9 z><*=S$Y8H0^|AP*on1m!pUBwRVQ+7id&BV0*~lSJm>cgR-Xwbss~gk=lY zZLFY7Se?#HutL=gWcNLxTs===B*jO!&7x6jTewNsnouMs2SN?^wHP=@Y624uPsUm( z5fNTgXLsVi71!E?Oq07#D0otd!{MMKqGP`ku%+aMT|a31ku?8fW5x`D;LHr{>^2Cw zmh3BE4`E&pRW@pGIW5Vh6K-7Y*0~EI-wKCOSG<%a*QJZgvTX*(0ryll z2xF=G2ST5OJquMrW!CE0sAGe$%ma&ruSGLdW>rjJ-k&QOUpV9$66}4&gJ}kS9E;e( zHeuzTBjviL3>6jLTpR3wRIz9l7+}q>gda|dzXEQtUS-r|oi>*G#u=!-c?PTg1M^=K z$J;EkOaq$79meJH47!Pgv4-EM>kVu7)^o nj%g7KRG31(jt5MZhLhZRh)1k5c#Il08I{HX7;>FkaI?9;<(mY+ literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$OnTextViewChangeListener.class.uniqueId32 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText$OnTextViewChangeListener.class.uniqueId32 new file mode 100644 index 0000000000000000000000000000000000000000..9874f47b1f972fc8aa48bd52755f3d366bec25f2 GIT binary patch literal 355 zcmah_u}%U(5Pbu32PXgqV7&XGJa4@encXKx40(-NvW~|9@Zo?yggv*IkFthwVc*$hJ zBkKbTmobhA-DUQcnL_Jk^1S3cXvxW+_MQt4OgQVOqaAS?N-K-Is~MrQ;|?WoNoc$6 zx}Q~qMn8S3h{@Eg%A6l;q2qf0@4K!Bt1cD2X;5U|vyX8~xH#mDaK6u5L?G1lO+Z~; cHV~n58~^eOKmY&$ literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText.class.uniqueId1 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteEditText.class.uniqueId1 new file mode 100644 index 0000000000000000000000000000000000000000..e0eea604bfe5799973f00ced2abcbf14dd5f76cf GIT binary patch literal 6344 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 P!g>Cw7QCv?aC!a*#tth{ literal 0 HcmV?d00001 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId42 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId42 deleted file mode 100644 index 771aa91232642c9a840f45f4327590db516947ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5763 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 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId35 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId55 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId35 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteItemData.class.uniqueId55 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId34 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId24 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId34 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId24 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId41 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NoteWidgetProvider.class.uniqueId41 deleted file mode 100644 index a00281f22b252c70f91205ed22ee7b545acc37ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5560 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 L2q*YlfzbZ|n8F7G diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$1.class.uniqueId12 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$1.class.uniqueId12 deleted file mode 100644 index ec9d37a1839c777a87e39f2e6c5b5d70b0d2df7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2410 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 K&(Z7$sQV8K{Kgdk diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$2.class.uniqueId9 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$2.class.uniqueId6 similarity index 88% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$2.class.uniqueId9 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$2.class.uniqueId6 index 8e4f47ca9853dc761f32ed4cdfbd936396f468ae..fb92d6c66d2f0efe38da10fa503f68160cfa478f 100644 GIT binary patch delta 106 zcmca0bwO&w0xl-TCzBU(&C_Ch#=y<^oI#ZFC4(~KD+VQHF#cuGX8g}!#l*;9%f!s!&crg=fu|m1=s_NP5XHpn F2LSVC9~l4u delta 106 zcmca0bwO&w0xl*d-N}o%=4mnMGjKB*GKex6F(@+`GpGS+eI`=|D<&%j4<>5{KOh~# zWWx}{WIs8Jdyf>83j+(2D}xM^8-q5J2T++8gDsN}gFBP&WCxylkf8^8>_HS0uO9#@ CtrIB# diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId26 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId17 similarity index 85% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId26 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId17 index 3ed1d3dab58fbffc406cc54c41cc5239fa32b81d..659c454acbd2c29e7da9524129da83e4bf34969c 100644 GIT binary patch delta 23 fcmcb{agAfcN@m7{$*Y({S(6yJnUW{7umk}BVi^Y0 delta 23 fcmcb{agAfcN@m9GlUFf^vhHNyX4*BGg(V08YxD=$ diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId33 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$3.class.uniqueId33 deleted file mode 100644 index 4b38b8ce32e06ed9f47a6f0e149683487ce5a957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110 zcmb7DT~8B16g{()t}Uyrs73rh&_&vUY$Lu^O-zNPNhuGICVspOyF)v;%p|+hR(_TV zMB{@$z#nD2Qwk;+L)~QO-uXKBoO|#5{Pq0@fETFc;9$x{#=|tS3@b{Q;7Eo#5`of2 zq(NT>ZR@mTYTkrK4x~BuHyE;}CsV&hS6UO@soO}`JmipP$Pakz3)ALDf?>YJRg`EM z1w$EiDgI_8&7Syd>Uns$?&5}r0*Va9Lq6a^%vCqo**_GaAr>#ClIAtTRJqd0V-~ku z-1cw>C5GjRcrncIFcfL(Kd;qD&a3i-dM;QGq!rfBa{i=N*?QO zlP1Xl4~4&@8nFyN*^~+;5{AZq2fduCN{1oSpt3O(T2hI2|7c$%dwf5pmD!dKdEDWN zwDa*|#ukvFGMQX|qt1}qm0iV6KOsz4pNXJ6moHNB55e`OrI(FHX<%5o@;t-zuqVSF z18Y*Z?CO3JiY;lil>X|*b=wvsdsBt6PNnK@3)9n)hbmSX7Sf&`HWI;&*h#i^BoB_a zbR3D~tSFSV@_Wn9Ybq*5Bj#x;QWxtCkFF>qg}hWqEK-kqV3>nbEZSBF$kNNA$L7#q zz&zP|<{9 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$4.class.uniqueId3 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$4.class.uniqueId28 similarity index 92% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$4.class.uniqueId3 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$4.class.uniqueId28 index bda52662e5027546b2329ee6744299b7c15d6773..324b3498c0d3535e19908b3ad7c6735f5892fd87 100644 GIT binary patch delta 112 zcmWN?s}4Z{0D$5D{1MrvOCG}J4QK=tnag3WXXZ}OC0VdZOwweHrtv0x<@=_-sq-@y z)UK~sCMeg5+aPI^v@NoRIG%f~g2QZg}7EHMrM_6*ggF`CiZL&MDhi+!m-Ekm) z0I8Lz5HA(KpwE>Epg!;e_)!&SHqJs4MaoLEb9QFV`M&ebIs4`R|2_kl!Q2omWE|Ko z1~ABQNeNwDlV0eHstUD;t36p=Fh)zp`k|-ghSZzIS%yK~m2vSJxwH=DQ!_|MTnr)0 zklo-xQRoG}CKyh&xbmY=`qdZG?+|{&mwHjW)QOAhVi?C5T;sAH#*!$I)5*O~k9t~% zs+L6#BMwGgjA5K1_ndF=YQR;e`gG;F@H7#>E0xsu7&4{uQWg_9=^*do6i!pr1DG&4 zM9gp^x}|c8t!X8p%U1$H*k^Ih!K8~HFvT#j6D&DpoS$hK#1u=$jkR^X$#ACB`bMzc z4!*IMMm00Mlt%zvRaAO#4g&q%g(V7kj-%5;yxiRr;)1-5bk0S62} delta 39 vcmbQvJDqn!8!O|*$?dEyqL&%Cn65BLGhJoSV7kU&%57PZg0j1OcT>;LZ$6P8)E9yusg!kWj0|4sz1xb zOXGt-z#nBi189>P0@=*&IcLxL&UY^J>-UeJ0JiZgi5M&!aR)Os(YrLlfBEjoK#bE1C} z3pR2NZs9gVejJ~_0Sq%Op=VVtqm_)taG{@COw#EKl^OuAjH1*JfZf zT887W*Y(6}Y53>i1&udqISYpSV3~}$mvmKQbkbNN zYo4SX(v2lmu6zY6e~0~2A@ogg1rZ}E`i+|Ub;P#}%`2WZqBtl;qo>jV}(K(_pa zpy*uS+Be*|z@1CXl)k#a;O2)B|8TQdMbYF%7A2I)+d_r37@puMedDzLYuFh4 OA2KJA>f6M2BKZfq-!2aT diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$7.class.uniqueId13 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$7.class.uniqueId35 similarity index 88% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$7.class.uniqueId13 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$7.class.uniqueId35 index b1605a3b92c895d31905b6363e562df8e79351e1..93cbf9483a693a7ab5c2f701c0d3499ef3dc9084 100644 GIT binary patch delta 24 fcmeC>?B(3>h?(*K?B(3>h?()nKA6#kkNz3+=5$M>YVY7}cXk^%C zI2q5iG6~mD^!RribJXzXDW=nwW65p?9_tv7pb5?5rR=67{8LIa$ixtYO(AGv#MY!^=z+C^Imk+Jz$;j_OE& zbUjpoQLPjh>a#+oi`Xrz6Hu5Y{%v?k$ICcQ{Cy!uEolpeWUMS#eRGDF7PkW7m?GIx zV!BRVsF>REs*cwb*;e6st{3tNoCPI>C)q*!`m?Apt^x2jueAtm6_cGi)bu&*cw=$f!ecp4^9w1yXMt#rVv# zq;wO~I!2XiYZcdii%Pl+ z8w{IVhlHc3g&9Z+w6(mliZdi2KD-faSNq=`y#xqW|+8M%qmoh@{=X zGleQ}s+o!_@2ILtQsA6p+SC@D?4XcyZbru)bsser%20WQmxrEm==}HDhVKhs!@G2r z!ltt(pOo}syVvkONm|i&M<~&S?ycb?%0Y-TqTwDxB7A(#mZag+vWsUOCt|v$lTnwd zp-UL3X>3%NI6#)Z8E9q${cV8&!z_*ZXdPEG@y>@}@veu^;*Zeq15MQ+OaJR=A^3UB z(YTf7l(U7KWYtJPGTc)qun2gTtXkC&{|Q_Qn>LkX+_^Oz>*TGbc| zV2mL0(XDjmu;*)>`2}s0gv%b`z+jge{D?z2(92^J#m86jk0&O&n$EBsx+l7F=$-fu z-zWg>KE|pboL`NQ+VCp|CV3(Jq4Z>JVKkD?VJwFV9(Pgl2vjyZ8w9l0CrFi1Se#A$yFE;UphNH=jU?U%?ok#C3iZ(_}OJ8kYEV z+#~x1zkx6L6u#oq_?8=Zz-RD?n|Mt23D4knF7OB0zxXWv=2`s1t-L75NzrC>!o~tg zHb&)97(FP>0V^fRR^Y%TsTPStJ@`}fJjG;pV?QZ)tDqo#M%2(Ry^eSOh8;Ovt6o_; zEms)%$|3+0UNwNJ9E`QqR4C0=08~Rh!PP(_$lE2{CR_E&5}GY6yZKg+Y`WZE8 HF4_JA=sGg^ diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$9.class.uniqueId15 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$9.class.uniqueId15 deleted file mode 100644 index 50c87fb5156dca63dd4b93e27a9ce0ebd56d5a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 903 zcmbVKZEMp|6n<{oHEm5@SLasi+th4pRV=7OMH$X6g<{%5Q|E_$D7Wcly)#QBxvBUE z{40J|K}2Lfz~3a|xpg?i4~~W0d(Ly-^5mTJ{pZ(10QYgbfE3aOGA8DbWw;jz)i{t| zI2Mf{R3dI9veDIwBV)DYDLIwut)+oImdaIJ35M*H`-zAd9@gr+&M8Vf&LfAsfr5!M zFd5cQR^t)Frscko%A0ifYm1Vs-`uSkcPo+Bf4Qf2+j;82SrhXpF%;Yv&xWm@vu*bo zHcs^~x}{|k=dj3Ngwa?A+-FGF>TLr{4Ap%;Dr@g^-P{IMNHVWf#vOkB`J z%FQju8TRdFufKgnNV_kZxTM|rZf{@@owhqLaD}0CT(mdZ7oK9sJ@I@QNVPfp_6|d) zNmFH*cVr;C$-ziO13vP}Qg%X*`#U_68Xp;pG+XZ#we<)W+%Sne(ULl2>7TaV(FCZt z9e92i%V4h~)Fd1ms57jdXqpUWI|xM7^m!cXWh(x)Wu+Bbk;}BStW?oUqBXKy#R|!5 zgx(=d8t~u?*x|RrCm0{~Tl|cLOz%B1&u4I%;M_5+63ouv2TIRl5z9D_3T|MHL|3#*U;EpVW=zqU)6G!o8Ak*Kg}~!4fW^ zS}vMie2CDOJCdP{0tIzZs4D8wKn_1E{bf)^&IA}b1$TVF71(=XF+19HY|oiKh#g_NJ#0k0;*?#hsM z>XskEF5?HGWi7`J_{};itCo-qQcFzzK~jExNfX7mI+d3osw&ao1Az;YekU^`hNHkOxd<@vzG38g6VAi zdw0PQw_czP1bi diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$BackgroundQueryHandler.class.uniqueId28 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$BackgroundQueryHandler.class.uniqueId45 similarity index 86% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$BackgroundQueryHandler.class.uniqueId28 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$BackgroundQueryHandler.class.uniqueId45 index 872c330f55330df99f33f11e8d410de57eb5c99c..de48358b434202b53b496eddc67d5e18a16d5ec5 100644 GIT binary patch delta 59 zcmV-B0L1^a473ceBLxYt00jZD015%JlPm?0A+`V<0k{As0l5Gw0lNS<0lWZ00lolA R0l)xF0m1-I0mPHt1y|O*5Ig_? delta 59 zcmV-B0L1^a473ceBLxYm00jZ6015%ClPm?0A+G=&0kHrl0kQxp0ki-&0kr@^0k;53 R0l5H80lNTB0lkym1y{|s59j~@ diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ListEditState.class.uniqueId19 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ListEditState.class.uniqueId19 deleted file mode 100644 index f797073f2cf27d134ef392706df8e2c751ed0e28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmbVMZBNrs6n-x2)~yzp6G0~Uf>Sn73i2X4LclT1Ov92DhQtq~l!}*hU9#Pg_^)&% zLNppa`=gBKb~BXV2eU5e?K$^3Z_hbrzkYxF319)QRP-^-`>rr*+^HYBhF=$M(`a#H zOMaNVDb^jqPq_G$kwWp13rpC-O@Kks5k-t4u~ptK?wciRn_q#hbUmPB5J?6#Q(ZTAiWbAt`<_zJkisn$NgYGD z%@B3Gy6-X!Wpn1SePSD)?H?KCgJahbc?~1DqheG?8h056E&)ZqRik81Y_H{(KM)<+ zkafYco6USkVTlI!kMiLN(m~*VT*p1!XNawEpNmz7;jpW&WhqyUBdQTi<8dV7(B+Dfa2RVij%rd9F3s($f>}D#gBYjv>JqqWOG%TrWMEQ689!#DCu44DY@0W9L;*G z;kcVz);)Y}LuTY0Fz6-UcN;;o-KL6V>d1fX1VjIo6h&@J~sjcTjkSnc$x0lTb3^93u1s)T!yQGmL!+uEXIj%~cpOb<75sxuhnCwVQ|m zg|xs(><8Fhq>YHRr?jD3d(k$Lf4z!0o>S~j)o;7TGvCQJ^&oPFho^`H!h{kCY9Ks{ r27-2u%qjY1svTxDss(sQ$?Q@so%H7EKTnS$k_MU*s}khEZe=>rcY)0q=EFw8VFQ;6?= zg+JhnFD8h@2S31%QuisX+@&V%oPG9Lv-jF-_C7yi57 zH1tAaNNt)srs0_Gy0KE<r>zlxNGs~BLI`u~g_!Ucwh-4P~^ z*D)ATN-ZT4nyYOoDN@N z=o7)BoXNU)_Bf>B!*)_eEAiXmh#xQv`a~^ zsmL-EOxN~3VH>-`UZS@L!rGFJ$6f9dn=-W>Lw`lMe7U(@ z=l)x>?vQ7o;#sCsGkqcVZKoo8l40f&EzfW15~cA@@?c13D;?51g6|p~nk9XW$O$6M zFnj@obYBf=TB>HF#ZN_%Ves5=r1GlQ^ez5c$l`|1jNgPD5F+@>wHz-H?s}Dn8=kG< zDV~uSo?G_08FD$TR6|QM;}rFyv(j0@t$MU2mqaf+W)N_aQ9C~JDrgi(I^<7(Koa4C zPl!>vZF)dc2bN078;35T2>p98PF|g?1=>qbBA5RPmiq?vOAC{uXN)jl3FOHhIz-_S z9@CESt!Ru86ENDbKD1-yb9-QW=sUo*BWoWwK0;MKL5c3;uJj+^f%2I`MInvE~8*YBvU8 delta 27 jcmbQwJ)e8S9u`K8$$MFHIJFp*7_}KR8FeNbvE~8*ZdnGr diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback$2.class.uniqueId7 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback$2.class.uniqueId4 similarity index 88% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback$2.class.uniqueId7 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback$2.class.uniqueId4 index b30291e1837f978f30357bc3c68671f91d9147a4..2cdacee1f69a71ab50fc1da020b8368b81326fce 100644 GIT binary patch delta 23 fcmbQuIh%9CduGP)$sd?~Sfd!Y7^5dUvP1y@U-1VF delta 23 fcmbQuIh%9CduGOf$sd?~Sc4h37(*sIvP1y@UnU0k diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback.class.uniqueId1 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback.class.uniqueId27 similarity index 84% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback.class.uniqueId1 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$ModeCallback.class.uniqueId27 index 090d8985b2bfe1b99df9bc606608e19f38d34646..bde970e3b696db34a48283a44094a6fdf4dbef24 100644 GIT binary patch delta 283 zcmWNLze+-J0EN#-f5oohV%`!%0EM3u{g;6a>ZhhCHHZ;qMM-2)34W#JQWoJNL?A@e)Z)_A8gDc;1VKbJ z2+|#N1$7f`PW@8WyF7<8Je<=?x6<`-pPG#cU%#?%4De2b50ZSc$QLf(l=z{-F9-Z_ zET~DGsf`P@bE8h~)WxH^c~UPg8Z@W==Y*d=ISebvs6xyr%$$bEDMC?E%8Ie4IENZB zwLnz~^BO2<%ra(5PTrHU_9Q+{5!1A(J8s7;T}qplvhB7tpp+|V^*VBVv~jebR8EXAlPL0u^tO4C%9mP)i$rK27Ltr_afNSFT(V?CMZ#Z+%* u`Y_j*1!9Sp6@JzP*$~Gj$(9T|a_lK{z~V@klcti2^2o6Z-Up@~@a2D(5GDoy delta 152 zcmWN?s}4Z{0LS6~FFIp_L=p)UohC?vU`9CGncLi|xnIWS5;zo3pfOJH0=gHFh4TO^ zU-{gS8@fge%zM;L(K8Az|V>xYvOE3vL(Zw95xmQnjGnJ(o#}U9yxZw`@pmVzWfhTFC``b diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$NewNoteOnTouchListener.class.uniqueId16 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$NewNoteOnTouchListener.class.uniqueId16 deleted file mode 100644 index 0f41962068add6cbb1d15741536b6ed603fab21c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3435 zcmbtXS$7mw5dLa1nNB8+B#=o6Vhj)@3uLkplwb&1<`B#RBqW%yb!M8RVbUFEIva7p z1zcEUQvneb*%Vw)7@|kvMLkEK_yPLjix2z&A3R5_+cOh0L+}jR=VbccTUB4zt@>`& z&Ch>*a}z)%E;?aDk_5YqWH<<`b=7naXkNpox^=@;gYF^C-6{snTF_kUHML>Q9LsN2 zN5o>A-eC-R`-Mo=)d0b2zD}5p~xdnyIG2e}m zSEu0-Mmu-Z#HPbLBBG_dy0pTNUEJ!jC=`8WIQJJo*4r? zWiIx;PSyJQO|jzw8HFe!I2Er~4F>a9mU2pJ6He*WK1VbkQt=6 z;}V{bu?p3MivNJYA#C4Vx5Lxc+|am*up%*5$N3=w@T80yteF;oauI;K!~+l)@eXy= z>}2+HQr3#3)Dg1pqaxDMAfqvwmMxB3HzzmV*`GVi;L4jG$;&0Lmv46auJff$^UcgffS zW|=c;xt1$HRzXwTL5;Z4gRK&_$=EI+Gory779~Vzglk8g!Bih`q6a%=C_>Z0;2p-G z2$5HY59+ieR+N?#iW5y@Q=wIk`egLSpj4KY3-sMG_P{?4y;5W#@j}et8PH`I7-W#3 zYBn2QMU+NDa)HMqs%SO>GJ@bJO&!D)5445u!fuh6VHqPBCCu@0`BF@8ztu(}CHRqo zsrq3BcUpa}7UtR5D`Onb#yIgnJGDTbm+?YOxGG9Z1^A0HUWyHGS-FH)2n+8?dHy~9 z&tA`slQ6qk)793YfnGJxq4fHBWsV4@zf%clVjfwvi*84#Nw6x++;q7zNk+I26H4P^ zXHoax!pW6Z1ewoBtd?cS$Ra^jf60oKN4pC_4tfKss)w5gftvVm=;7;u0Ew1`2)0qCkZqJ(PhrA# zqPiPH0k7)OM2@rWxhIu~>j;OaN$1;9y91&gyrKgMQ6&LCxUgLWnukPnrCC_Z4d>0j8hg5U}Xz<)fZw4w<}A!L1x1%%e+AuOu0 zi={~{4WYOy*=2Vn`>Gr+2ji3++*u`sh2>wN>Jk>ZBGc6&)cUFm#oaTJ656al0>s&Q&QnDL`P0fEd~*@r5R)Jq|6vtr48r;Tl9wozrpKyXl z4s5_JoaB)tXcVEC7`??Pf`a3C8}BfQPVqk7aOB-ZH&P_nB=ktgkg%Be0sh3%yR60k z%0wi-0ac9v2Lp}(5Ce|@9RrX6B?FNFG6RwTK?9QjPy>$?a)dQ*k Q*aNSV-V4(Kij%SoXi9S+#Q*>R delta 110 zcmV-!0FnQi8k!ogcnSgHvv~>-0afJy2Lt8+5Ci7`9Ruh9B?IXIG6U)WK?CamPy^}! zQv>Y)R0Hq;d;{_ThXeBfjsx@nngjI!q678-t^@c0wgdVAxdZ(G!2|vP%>)1d)dT_n Q*aQcY-V4(K;*+urXwyn22mk;8 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$OnListItemClickListener.class.uniqueId30 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity$OnListItemClickListener.class.uniqueId30 deleted file mode 100644 index 09d53746a9f65fa484699b8dc87e50986667ec3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3354 zcmb_fTXR!Y6#jNj$Z699gjS0bDglB`0yJ&8NdtwF7D){RNolnRczSY7H%-r}$w^BU zuPFCn#_=}bjCgsdaYN{cTKYsJ&9!myp&NRJ!L^$k-0EQn`eQYz3I~Sj$pyE91}Jpi8sk}C2SZzp z$K6j+0<1*GN z@M0Y~_t3z43x^n%@odzHjG0{14^dLs$c(tL0X`WU6+D4925&W0^FcDm1kB*fWZ`^N z#2io%#HNLqcZitx*B-NKBr_&YhNgLvbcaMX4RL*%!rX#(86gE7!nc)GKSn^8!>Z+B^>Kguoc^g%OV+_JB4Q_YWJ)f8f7Kq6KF=%bb3_P#%*qPDAq&;S{@6TH zQv^pyl)7mMC&ST!5m9gZ&?{rVf(ZJk(rUB6i=oGtnC6x?c1WERDd#IR7oXi+d^zr` zXf8fMWq*=ewu20g<95CrQ1BEE-bYKPpylNMO-q?^;$;9&%ZMpBB$8=sZBdu$pxiez zNp7fV8F7Zy6)KX{1qv-zWZyFijv}!TW>=R8GgfPuRa?P)DN^ecW{xQsDl@aSqoWSb zGOVcJqYfhsYlbtXk@5=GycX55mmA*0@xlI6v1nq@jpuPf#z_UI@B+2d`9#WDJRORe zDF#M`-{y}k^x1@!;YKQ4xe|!hVU(eD5qpVa`%fK+$NKt@%AkyGpEpzN0L7LiikYq& zJJHLp8E3?9V9R6N&=2P(M)k~~I+`ZW8e^uWriauF7vIH2r?^xY_Etr-yqv3CZee1w zSare~hHVRVR_S-Ryaw%l799u-Q4ipDD_CFEn-aft9Zsql-JnZsO-bD%rbwqKbn1g8 zDZB7(qYQPEW|oT-!HkwP@mu_L$z`lVs7Wd&=ginPL&i;I}?B={&Pi@^WRB@MKGPAVs)J9 zr0cCJQxBe_D==Z^GMavXi)3uBD8P16HVjJCpx06)t!A@2CFaU18ApQmUo8at1MR43 zk>ZeXrRJXAN$&?IJ)jsgFpoz(!RP@g!66=lw5r?BNe6uc?%<~HP#?UFrMKwIffwn& zi)0|3LyG2#n8S@Ra2gp-W1OT&1N)P-$+R}N`7Ro-vdKSbqbZt%X&89-EUrg?T4yZFUxgTl3g{1F~}#PAQLFx4yyN!cKo4(e|&%45n=R zA`W1<_}5~qcix0zPnLX&<>J^X*Bu<0MQ_n~X>D*8TN;NOpSy$O!?Rew$o4YYRtwvb z0K{nnGD2@hNarC-7vPaDqE)(tjnZXwNmtM-UBwX^6Vf#dO7G&V^d2rq@8g>E0d7bi z;&bUEd@Wr^Uiui{OP}DbbQ8ZypW%1u3;ZE{X@lHDkbCem(wLwbL0W`c%nX<|1#_6h zOEzV5$RKOOFb4}c@=-ujAWFzjll&Q4=|jUk#Nm?RlrbaY6-MI*@zK46Iq#9ggIn~A zL2NMx+Ez3)xtsnX;$I~>2VV1l$bOwPi{$B}6+we5xal@*oGKH?TaYM4;=&t6A69D6PH# diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId13 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId13 deleted file mode 100644 index 39b6a2f774582a570d6545eb3e4c77b42a04bd73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25048 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 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId18 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId38 similarity index 88% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId18 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesListActivity.class.uniqueId38 index 7c17727946be238e966eb9b5b0b87de9ba7cf88c..79e06a70739f8d568adeb3fc64db1e835c72d014 100644 GIT binary patch delta 1148 zcmWNQd2o$q6o;Sh99b?&BqR+kDkF<5XyitvWoWasi7O$CXlcbLjj6#fV_Kyx)x`{% zF|X-#(FLPoNiDa88ja=>Ya79|Xp1UJs|%*nmG=Dgp7(do`<&l7-+VV(y&J9Gw!A{` zj0+S76P6Rf3Swv=9!Dap+{(gfv2T;WYI^e?{aF*zqIKSj>#guZlQ+&ZPANMWPl&1PWIDT;#XjcJ!hFI!$9|rtm6vE{vFWdvzRdLHrZ<@GEPjJM zyvZlLYxy;nUvFBY| za5^-(WS-|cLnqD>%{lk=BX>&ATXcaQT%-@*lg(wD;3^gTKrPqI{dIHxBMbS7rQBc@ zKl2v9*gAe?9lzO}H`&cCYkS+Jl+H}rKv%Dk?%qbSyv^j=8St9i+R_)24&(EVkl-D~ z?;W%3Sq6LOTz=W2gl~!Q&Xed}pr3b<4DUM^F01riCPpHNmq^!l^j8HwBBe9^qzfq$ zN2YXTh{Q8ox=|>JR7f%tr6+aLi$&t6LHe*-?&W<+af5>U6H<+pMxvw}A%hGV;Qk9X zW@ZyDIhGknvJ9fH3?@r*$(20g1}K%GRLd|XNr5{tW|D6>on-`ZGScOj*Tp_e7b&Ex z6p+v3CnLkSZIEw8==D3CI>kNE4%EE5)*n zplmnl4kLz`A|LaV?4n+pc}DiS(708ZVY7I^OdrHAZMKR-0SJn2=O;c~#XSq!``Q04+Ve|aSNco#b- zwXePG=Q3)p7N-%V>BMOU_virnXr{f&B3rW=qB#`nK!Q4$DjmY(8eod%Q?Emrt@kru zhp|WtSfUTQ%JKCPMMP_{YZ+f28ze%<&`swWbDrx}TkS1yvumfvE;eUN=&di)UzfT| zwZ~JM>7=`@au0>Nmsc4Kv5?^R&&iPY9>Ao5vGY)j_(RB%r4lrKio;mrT$z QOx3f@(r-e|kL`^5A2bmhlmGw# delta 1148 zcmWNQdra0<7{@>7IVilzi|@^rqk)v>E=qIq^Zr# z+}yE?T~t5~Z-HWF-cT^h+YDTxmYI}R%37`4`a|g1?~iky@ArAW=X1{X>u53^O{RWS z(6qQfu+YDOZfqoyH}J8USl)D7gA2S4KX1{WcSz>F20OmSytYFdcdERLzEly<9@5xL z1|Jcima*(3pZ$b5z)TJ@pO0Bc9m_bzN{+LdQ@p}wtmP!@sHal(4XSTaeY5IYRCl_6 zn&38QqE7T=N{X* z&vt%h2ft9muN>xqB0SWiI$Tm{Y1}S)nkr&UH5q0%nYsqdURND@HSQc9(}dqN6K~F| z+sX)Y-DMY4_`f02v=M7=kZ5j_Zf?2ef@05YRXg#SE|)N=ZH&-eEQu0El7ur@BFGXC zInslmc$p$To|kCKB!&u!WsCIU1L?y~>F0(Qp7jqPQWA)jftrv=x+J--!rH+pL`bSS zY4nzK5@Zk=l0l{n)!bo(WCSIW$sEaYUrnCl$>uQ`O_V(0vWv>RPtiki=qb6x$yiri zw7~PMDnYHrH~6N+n`sm9$V4qe3S2;{Oj77VM#^LjFJh8R)$nP|kP=>y87!7rtd!ZT zm$?dG#``jlL$Z$JQpp+F$TivS%BOaY*+q&}Yf_CS?Is|5$d$c}lUnj*ABD1CQx9n3 zLFUOJUXnT%Nj*#CsB4(EZSW~YJgv}Yh?hovin9!rCbFfO(Q-i(E>R$tnJQP@isCii z?+KSX+I?3au3i6y-Y#nTg=Ze9`VgOV5G}tc!S8yXKNu^2GEx50)Bn~7`$tdxmzU)c zmD0&Z>0*;LY_Y;t8}8yt?hT8iyY=F;QN&vxDb~*@U2|+S`8I|U8_SC}j-|G@PWE-_ zGw$al5N-z&WfSRTlNewh*QsQN*c7sCDtR`ILOY1*b_mbeVa&6`S!74B+>T_m&7{I+ z@wyGT;+c!Om+(a$RGVZDGD` OWtsiD;nUflg#Qn)Z5lfO diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId15 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId15 deleted file mode 100644 index 4d5c2885ff0c11c5e7f8c5e1fde20e0cba7ec0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1627 zcmb7EU2hvj6g^|R-r8)46WTzMHvL+t?W9>JOei!vn7&AMs9L7KI2q+R$e0G2h{Sz;)BFn@H(qISUs<4&HPzj2uI*e_(a< zu@vN#zOA$}cNmiS!g>~?c+0^V7iTfXFnc7urs46HAIUb|&VR5*i~6n>bs6m_AsI3% zwrh&KkM~s;?_k`)go{a>V;JMQ5rwMZ8~N1uYczamR1h;bDqd=Dn_Y&<{Jxj<-BxZvQTi%Yo7FnuJu<7sEeav@|KdvhfszLY-^^Ol$?crMqjh@Z$YKFkIa})Iz*rLLQq9!8OTcL$s)1a)a_aC?l&nxW;g%N7fV7 zXp+FztWOp*@LiNZGCJMnThfxqa6Mn^ofe@sQX9Ww=clGztriad4I+^=W^mmlIg>6@ zaVvb{;3mVZ9!@`9zpr9%RreQ_K#8rIiYc6o819~o(}6N~wOUxGL@Lxo48t|0CwKw=~v z^nWp2I3&5hJ3t)89I6{GwwC#JH~DNm>_kG|SN3}6j(IL-ZNm~DOIieBOntR1O)G4; zcwozRHVAp6+y4E!Ft}AsC8-2Fj%DoNQ=;#vGO6_swCP}(;r##Bouqwi<#CbTB^L}g zkjUli^90aLFC#sc3HpX{i{|&qs?eOYJH_c&V8xkNaEgE6jhFieKcF#9Fu=F?kjAmD za~Zd3WnnBN!$)K%kR$63KBmzEKOUl@}PX z)~|Rkxrf=`F`xR0{F1QIr{K`|9Yy(`@PEJreuRgg;o}#~ diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId11 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId36 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId11 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$1.class.uniqueId36 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$2.class.uniqueId39 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$2.class.uniqueId39 deleted file mode 100644 index 47c78ef38f5dd1bce197d5ebe1117e67936de3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 944 zcmb7C-)|B@5dH>`1A4ZUD*i%i6%}agHjQtXMkQ)Yur;CK{a9AI?Xj2KEolEN6OG0P zAC3A)8E0t)Bk2Q|-0se|GvCh4H@|*={RZF>8hNCU_K@*$0a?OBqpTQe8TFMgkyVKp zX|d-HZ({XU#mY$aR9ZdO_N2N)$l61lRJS>>y+CBMfE@B33O<(L6N*Q{I1piA24cT= zq@-oy$J%JSOGwx1-2#@e;-Tnc6(z#f+*1P^B*!9FL(WvZJYb`9Vq{0fV=Wb-AOp@j zbQqyhYX_zuN4hU$WUMk)wA}vQHtSsvmk1kw@5frb6J1`a`=%9YdEC|s2dJ2^U0bN& zdY6!CaaRc|ZEe)vXxLNnLC^~sDYYXRgxw(4&OQS(uCoNO$TQWQCc%qNb0w5#l};<+ z8VNKetWCQxyW>uEqERf>3+?i%oFn{}lZy*^Ze$oG+6-PRdl>aS+$C(zX>`gDbX_Dq5{Ss;EF?w@H1&G%8VJf~^S+@5`~$ZI8X?Zo%}=GSO&! z@DK38=s#qfr7ajqAGqXpcV=h4oo~MR@#ouj08dcQBZahwOaYgWB|J9Dih&NIo)RXq zDiK31cHQA!tlq0wnLs@ctR885QrRYC?SW1zTb$UMBeUTnhr9>BfCUr?#X~ugB9x{t z_PU2EunhcE8*O(8>1wUxV-ZUpiUlmAMA)2ps&8d-Bw{t-O2zAaHrgj9XsdXn14YOu zR>s!32&>hWG`%>|Jt2>e#W|Tqt>fVeVg3Aaq}2z};ia-?nxPJkS~{`HsF<)-or`R( zL&!9_qlBfFHfnb`=&E>Mc0=}*T2Uawj*PXl&zu?8Rf3r3naXy9;6n8-^Lgi)eR|E;nIQP0DD!p4j)7Y|PX51jIg zVI+G_m={B9BSR>>G2G*3D3e4b9;$@p8AbT{|1`l}9^)LC8K_uvqs-Ht;(q~G*<0q* z4%^P-*Ec?c>R;e}9LHSaHOn!;Ph97VyS++d62$7tL)+{D@$)-&E6R<8aD^c9z< wNdDOW3m$&|gO;112(@hfFBWp{jsO4v diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$4.class.uniqueId4 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$4.class.uniqueId30 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$4.class.uniqueId4 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$4.class.uniqueId30 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$5.class.uniqueId44 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$5.class.uniqueId44 deleted file mode 100644 index 320d7227b49f82931142e1707595b4c7cad036ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1502 zcmb7E|5FoJ5dUnFa!I@jgbHf0g*Mg@0tbb(*7&6{fXz&Vj-fc(ADqYKH9ULVG520# z`w#U0=}g6rj{X7uQBL$xPnv-M-!Z?Cxjp^_%Cf0IZ_vAVruDrSbNaA9bV` zMn-C{r@T$8{2a^QWGq8p)_tS;%KVu_2A?<>ap53KSQx^!SS5^@J*A6F?ARK@vu3mA zU7UeS$oEB1>?jdLUBZQy2s?44I-WQ<@aln#&01or<#86H4#r%Jqd*vYEc(I=MA-GV zb{|XMFqZ2oROTijU7Fj;gYcP)bC~1|!uO@t#p=?xgyqsuNFUBUba0+9d5p`CLL)=t zH4~A=MZ)E`wnZ(CQDIjv*4Ne^)fF(qnlZLO~`ilg$fn|ZNpx6@eQu<%Y&X-|HH(BaO(pZ ze*HkwLBHRxi`z|@b5X`T*RG9-%`sy(qWGTFy?{GDUHX`N(@tOkiw-;&OLkyW#|=C+ zSc210dS7X-md7)De66qK6K{u);#SxQl>d86X>PoX3C-a~IKX%+Gk2VjY4Da1Mq4VB zo4x&A8E=c-fZr5akuQQB5i9%r_GQM>o!|{ap<=a0$hB2B6s8w*WG6Z*h#Py-zd^YP zD(Vv^2DndbOmda*j&OcpJ~cV!dpqjIzT8l@j_Hpq{-Pxy7rq|)L8O_0cO~<#<6_ND zYg+F`Pueoz#j5*$)C589x0xxme|Mgu{S5e8>7^;yjA)ah0Fg zDG5pVf%Oy$eDfM=eA>W&v8N5ZTK)&=%)gkp{{mAF3KyQ?^ShP87nzrsd5|uA)jmY= zzP(aO9iqfa?huue>=!u-Xc;+L!30%#A+MrB*RVph1kubM>4VYecDvApW6#`OA-?#B z_~e_uYb%8c!m1s3K*g+Lehu)5)9a79pSXbX@iM$JP*kZWl0$F$V<~<8TS3 zV{slErdrWYfhFjVQL>#Nw z!3JUel1iEIp98@HUy4x>WB~GW?FC%+VWc?XYhnh5FiOQ2h&>j{{7Fzj?-h z+PKN~Op3xS%(KV%K{oCYb1YuuddrwB?=4l{VWR#C^c52yFjL9B$5iT0r^}4x$ii~W zSxxi|IeLyFy}&fRc$ct*Wvh$VDpr{BHrqL5ie*OLVLO8wRtK>n T>bT2RnPav_`^;h;UViKsXi5rV diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$6.class.uniqueId14 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$6.class.uniqueId8 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$6.class.uniqueId14 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$6.class.uniqueId8 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId30 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId21 similarity index 100% rename from src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId30 rename to src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId21 diff --git a/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId37 b/src/Notes/app/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/NotesPreferenceActivity$7.class.uniqueId37 deleted file mode 100644 index 4691731589b455b8797dfe4d4c7f463531f19bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1451 zcmb7E>rN9<5dH>`EoH${r79OusnSwlQBl+)iWRh`7Q>}#{6UuOp)8iOWG^JVg7Nk$ z8U>??58y)?=Rl!N3KBMHcXl%KeczeO`SbVZZvbO>)`A8!YG~4N3eALJDSTtyww$6c zq~iN^<2)`f@kYQp1`@fdxOv~TWhq_n zNfturCTQN4v=}UmUR>1Br{fYX6FRC0S(aWBE{AR^*|RHzSR$LOL99e@iQ3Swq{In{ z|BKj9NfyGmh5-!;9Z3ulQgx*`x|@V(N%)nT&I!*cZz`SriDd4G!tV#ATQG!S4I?@X z@F;ZGu~r+vz0S<$7pC(IOZnM_>7~WFEZ66NL1iwwHXr^5ZfY3QaSOKzea9%^aS1k< zL=avj>c9>hhYrpm-F#Eij!MguSq*o%MAc5t1yY*JWu_cWoM`rw1wvDX7mRQ^XG@U} z)|Z95u!j}RIhI*2n69n9E6yghWCY_RH1Y8?kFXm^uFdYKF+krjl^}%YoxrukjIGYq zbHv_{s3NfVX=#-mj~C*(@K>Fpju|{5w0pvz=QWtJEGLk>L7j&Tud0Ebl~TBwvgvt( z#kJO~Ca+Bc-w=dxP$Z&mCcdm1_}7ZN?7hd1m^bQkj z$M&LdpEJ}G-bEvhcmTbEwZT4xHS`N@uXngBsc1BMb{nx&w5#z4dbV+8@Ed3wSHB{a zA~vqStg^*88}uF_`hW<1L>GNRiayt{4^`Mhh~puqn6(j)n6CjDJmz;3Z|yXmvK3{Y NQlg#+Z&kLr>qYV)S?HVp1$}l2$V65AgTj7Rq z1MVB4ZIq<(!Q(636N;7ME9!3%~+S}!ZO$k1yllG;VJ_p$~6twaf1qPgv4VgU2Kq>4?J5`bFCh| z978XI;%^Fzz*O|(rh)+tw{V-GtAS7;>Q(MhXid_dU18`>7xX5?dIYto6N8dUiXr`f z5=SX|S;ajJDM)M3kzvTTwBqz>G9;@!sP}Y^`>s=yJO|Ty@s!3N1?A!x#)yJZ4F+fx zdRwYC20*jU&z2UZOAAY-*@fw)#km6Y=eUB*T=Z-@`~y5xFs|Vd9y1J_!GP8!+@K>|h4fG!ep)rqs(()RH2+($%qG)ne@j z(Gh-2giXJ$V+JeV_3jQ~3a4#+>f#IvgpYfoyHijN!qk@OY{tpMc~8b`;$Dj-qqQgyt#uJAbI*hWhMRY zn9kLZ$zN%SB$3?Q;WxILjT&>IcXBu~)v$4k*Hq8rdp71GkEF$$3ZRh@v+wwnV+rqG z5WYxPvc-46Da|~AU3!W`zwph%m;7&ZK!4*aKD*}3_Fv;Xe+l29oFV+ghyyGul^(BUre`Hw)KM7nfafAq+#5g)MVWmo0myWve z(uJR61Uasw6BKijm7JoQ)6{W>dd||oIlZz+)$7@(KC>Kf!WLyT~rFASUE?C#8mq?2SekI3e+hIwK( z_*&$ddG31&F==HZk1#AJba9o#C5^)Z#Q)C9wp>C7vX5(hn1ROX|t delta 604 zcmW-eTS$~q6otPNO{3Z9SpDfZ&ObVij*d`~QCVgwl%-H;;zI;N1fi8RYPYG#=w?L} zZIGz2dqi|)(jMj^yFf*OL=Zhx^pbQZ=n7@D`PnaPoxNFm?RAnh$(rl4tdbT+(n>0; zNM|(`YsjIELe>&x9g~PLm3GSMkQG*EV1rI?)agw+y_xaE@v((4TPbE+;)mrnv%9pl zgDkr6vx^|RwY7&b_EJeV3)x2_`)THYu02QxhqMlJg(KWR66IMl%)A~|J&H{aA&yhT z3H8y-bWSptQ`B*qCeE;uv+D4iF1x@nE-JgkWvz!QHpDgQ&+g7lkj72M(nmJ^YUY+K z_H~-1-1qer-p0*PgHqOm7nU}&!jhJiFqMKdA4}{^`4jN>=h-v zrj$3*=3n4?i;E#i`rEDdn#%{(`>4)8Yl2^x%vY(-jeEZ7%y*6BrzZ7V9_6l|z#mfh zi-%zi@gD&LrDlXQ2DV!+Qp_kaj9Xt*37OH9nKAM%(CW$1ju(%~#5Uuk*=~^rJ1n2< z26uooW8;-UJ0Q!0%RFJyO(8y0M6rp;(a(FBhF%1s7s;Ehxhk9I9`pb0^E2#Ys)~}Nz diff --git a/src/data/Contact.java b/src/data/Contact.java deleted file mode 100644 index d65c239..0000000 --- a/src/data/Contact.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data;//属于data这个包 - -import android.content.Context; -import android.database.Cursor; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.provider.ContactsContract.Data; -import android.telephony.PhoneNumberUtils; -import android.util.Log; - -import java.util.HashMap; -/** - * @Package: net.micode.notes.data - * @ClassName: Contact - * @Description: - * Contact类用于查询联系人信息并进行缓存。 - * 该类包含一个静态的HashMap作为缓存,存储电话号码和对应的联系人名字。 - * 通过调用getContact方法可以根据给定的电话号码查询联系人名字。 - * 如果缓存中已经存在该电话号码对应的联系人名字,则直接返回缓存中的结果,否则通过查询数据库获取联系人名字并更新缓存。 - * 该类还定义了一个私有的SQL筛选语句用于查询联系人信息。 - * 注意:该类是线程不安全的,如果需要在多线程环境下使用,请做好同步控制 - * @Author: YangYizhe - * @CreateDate: 12/17/2023 10:10 AM - * @Version: 1.0 - */ -public class Contact { - /** - * 作为缓存,存储电话号码和对应的联系人名字 - */ - private static HashMap sContactCache; - private static final String TAG = "Contact";//设置日志TAG标签 - - //查询联系人的SQL筛选语句 - private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER - + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Data.RAW_CONTACT_ID + " IN " - + "(SELECT raw_contact_id " - + " FROM phone_lookup" - + " WHERE min_match = '+')"; - //获取联系人 - public static String getContact(Context context, String phoneNumber) { - if(sContactCache == null) {/*如果缓存为空,就新建一个*/ - sContactCache = new HashMap(); - } - - if(sContactCache.containsKey(phoneNumber)) {/*如果缓存中已经有该电话号码对应的联系人名字,就直接返回*/ - return sContactCache.get(phoneNumber); - } - - String selection = CALLER_ID_SELECTION.replace("+", - PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));//将电话号码转换为最小匹配模式,用于筛选 - Cursor cursor = context.getContentResolver().query( - Data.CONTENT_URI, - new String [] { Phone.DISPLAY_NAME }, - selection,//使用筛选条件 - new String[] { phoneNumber }, - null); - - if (cursor != null && cursor.moveToFirst()) {//如果找到了符合条件的联系人 - try { - String name = cursor.getString(0);//获取联系人名字 - sContactCache.put(phoneNumber, name);//将电话号码和联系人名字添加到缓存中 - return name;//返回联系人名字 - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, " Cursor get string error " + e.toString()); - return null; - } finally { - cursor.close();//关闭游标 - } - } else {/*没找到*/ - Log.d(TAG, "No contact matched with number:" + phoneNumber); - return null; - } - } -} diff --git a/src/data/Notes.java b/src/data/Notes.java deleted file mode 100644 index aba2dbb..0000000 --- a/src/data/Notes.java +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - -import android.net.Uri; -//Notes类就定义了很多常量,是小米便签的数据库 -public class Notes { - public static final String AUTHORITY = "micode_notes"; - public static final String TAG = "Notes"; - //三个type - public static final int TYPE_NOTE = 0; - public static final int TYPE_FOLDER = 1; - public static final int TYPE_SYSTEM = 2; - - /** - * Following IDs are system folders' identifiers - * {@link Notes#ID_ROOT_FOLDER } is default folder - * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder - * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records - */ - //不同种类的文件夹 - public static final int ID_ROOT_FOLDER = 0; - public static final int ID_TEMPARAY_FOLDER = -1; - public static final int ID_CALL_RECORD_FOLDER = -2; - public static final int ID_TRASH_FOLER = -3; - - public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date"; - public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id"; - public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id"; - public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type"; - public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id"; - public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date"; - - public static final int TYPE_WIDGET_INVALIDE = -1; - public static final int TYPE_WIDGET_2X = 0; - public static final int TYPE_WIDGET_4X = 1; - //数据常量 包括普通note和call_note - public static class DataConstants { - public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; - public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; - } - //两个指针,一个找便签和文件夹,一个用来找数据 - /** - * Uri to query all notes and folders - */ - public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); - - /** - * Uri to query data - */ - - public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); - //Notecolumns类,用于创建数据库的表头 - public interface NoteColumns { - //具体每一项都给了英文注释 - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ - public static final String ID = "_id"; - - /** - * The parent's id for note or folder - *

Type: INTEGER (long)

- */ - public static final String PARENT_ID = "parent_id"; - - /** - * Created data for note or folder - *

Type: INTEGER (long)

- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date - *

Type: INTEGER (long)

- */ - public static final String MODIFIED_DATE = "modified_date"; - - - /** - * Alert date - *

Type: INTEGER (long)

- */ - public static final String ALERTED_DATE = "alert_date"; - - /** - * Folder's name or text content of note - *

Type: TEXT

- */ - public static final String SNIPPET = "snippet"; - - /** - * Note's widget id - *

Type: INTEGER (long)

- */ - public static final String WIDGET_ID = "widget_id"; - - /** - * Note's widget type - *

Type: INTEGER (long)

- */ - public static final String WIDGET_TYPE = "widget_type"; - - /** - * Note's background color's id - *

Type: INTEGER (long)

- */ - public static final String BG_COLOR_ID = "bg_color_id"; - - /** - * For text note, it doesn't has attachment, for multi-media - * note, it has at least one attachment - *

Type: INTEGER

- */ - public static final String HAS_ATTACHMENT = "has_attachment"; - - /** - * Folder's count of notes - *

Type: INTEGER (long)

- */ - public static final String NOTES_COUNT = "notes_count"; - - /** - * The file type: folder or note - *

Type: INTEGER

- */ - public static final String TYPE = "type"; - - /** - * The last sync id - *

Type: INTEGER (long)

- */ - public static final String SYNC_ID = "sync_id"; - - /** - * Sign to indicate local modified or not - *

Type: INTEGER

- */ - public static final String LOCAL_MODIFIED = "local_modified"; - - /** - * Original parent id before moving into temporary folder - *

Type : INTEGER

- */ - public static final String ORIGIN_PARENT_ID = "origin_parent_id"; - - /** - * The gtask id - *

Type : TEXT

- */ - public static final String GTASK_ID = "gtask_id"; - - /** - * The version code - *

Type : INTEGER (long)

- */ - public static final String VERSION = "version"; - - public static final String PASSWORD = "password"; - - public static final String IMPORTANCE = "importance"; - }//便签的各种属性 - /* - * 便签数据在数据库中的表头 - */ - public interface DataColumns { - /** - * The unique ID for a row - *

Type: INTEGER (long)

- */ - public static final String ID = "_id"; - - /** - * The MIME type of the item represented by this row. - *

Type: Text

- */ - public static final String MIME_TYPE = "mime_type"; - - /** - * The reference id to note that this data belongs to - *

Type: INTEGER (long)

- */ - public static final String NOTE_ID = "note_id"; - - /** - * Created data for note or folder - *

Type: INTEGER (long)

- */ - public static final String CREATED_DATE = "created_date"; - - /** - * Latest modified date - *

Type: INTEGER (long)

- */ - public static final String MODIFIED_DATE = "modified_date"; - - /** - * Data's content - *

Type: TEXT

- */ - public static final String CONTENT = "content"; - - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA1 = "data1"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * integer data type - *

Type: INTEGER

- */ - public static final String DATA2 = "data2"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA3 = "data3"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA4 = "data4"; - - /** - * Generic data column, the meaning is {@link #MIMETYPE} specific, used for - * TEXT data type - *

Type: TEXT

- */ - public static final String DATA5 = "data5"; - }//一个便签内部各种数据类型 - - public static final class TextNote implements DataColumns { - /** - * Mode to indicate the text in check list mode or not - *

Type: Integer 1:check list mode 0: normal mode

- */ - public static final String MODE = DATA1; - - public static final int MODE_CHECK_LIST = 1; - - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note"; - - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note"; - - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note"); - }//一种是文本textnote - - public static final class CallNote implements DataColumns { - /** - * Call date for this record - *

Type: INTEGER (long)

- */ - public static final String CALL_DATE = DATA1; - - /** - * Phone number for this record - *

Type: TEXT

- */ - public static final String PHONE_NUMBER = DATA3; - - public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note"; - - public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note"; - - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note"); - }//另一种是通话类型的callnote -} diff --git a/src/data/NotesDatabaseHelper.java b/src/data/NotesDatabaseHelper.java deleted file mode 100644 index bedbf65..0000000 --- a/src/data/NotesDatabaseHelper.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.data; - -import android.content.ContentValues; -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; -//引用了同一个包中的另一个子包Notes中一些接口 -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -//数据库操作 -public class NotesDatabaseHelper extends SQLiteOpenHelper { - private static final String DB_NAME = "note.db"; - - private static final int DB_VERSION = 4; - //接口两部分一个Note一个DATA - public interface TABLE { - public static final String NOTE = "note"; - - public static final String DATA = "data"; - } - - private static final String TAG = "NotesDatabaseHelper"; - - private static NotesDatabaseHelper mInstance; - //基于NoteColumn创建一个NOTE_TABLE表格,并附上初始数据 - private static final String CREATE_NOTE_TABLE_SQL = - "CREATE TABLE " + TABLE.NOTE + "(" + - NoteColumns.ID + " INTEGER PRIMARY KEY," + - NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," + - NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + - NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + - NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" + - ")"; - //主要基于datacolumn来创建DATA_TABLE - private static final String CREATE_DATA_TABLE_SQL = - "CREATE TABLE " + TABLE.DATA + "(" + - DataColumns.ID + " INTEGER PRIMARY KEY," + - DataColumns.MIME_TYPE + " TEXT NOT NULL," + - DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + - NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + - DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA1 + " INTEGER," + - DataColumns.DATA2 + " INTEGER," + - DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + - DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + - ")"; - //这个数据是关于INDEX编号的 - private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = - "CREATE INDEX IF NOT EXISTS note_id_index ON " + - TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; - - /** - * Increase folder's note count when move note to the folder - */ - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER increase_folder_count_on_update "+ - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - //移入note时触发,修改一系列数据,从哪来之类的 - /** - * Decrease folder's note count when move note from folder - */ - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER decrease_folder_count_on_update " + - " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" + - " END"; - //移除Note时触发,与上面移入对应 - /** - * Increase folder's note count when insert new note to the folder - */ - private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER = - "CREATE TRIGGER increase_folder_count_on_insert " + - " AFTER INSERT ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" + - " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" + - " END"; - //插入Note - /** - * Decrease folder's note count when delete note from the folder - */ - private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = - "CREATE TRIGGER decrease_folder_count_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN " + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + - " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + - " AND " + NoteColumns.NOTES_COUNT + ">0;" + - " END"; - //删除note - /** - * Update note's content when insert data with type {@link DataConstants#NOTE} - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = - "CREATE TRIGGER update_note_content_on_insert " + - " AFTER INSERT ON " + TABLE.DATA + - " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END"; - //当给note插入新数据时触发 - /** - * Update note's content when data with {@link DataConstants#NOTE} type has changed - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = - "CREATE TRIGGER update_note_content_on_update " + - " AFTER UPDATE ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + - " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + - " END";//note数据被修改update - - /** - * Update note's content when data with {@link DataConstants#NOTE} type has deleted - */ - private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER = - "CREATE TRIGGER update_note_content_on_delete " + - " AFTER delete ON " + TABLE.DATA + - " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.SNIPPET + "=''" + - " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" + - " END";//更新已经删除的便签的数据 - - /** - * Delete datas belong to note which has been deleted - */ - private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER = - "CREATE TRIGGER delete_data_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.DATA + - " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" + - " END";//删除 已经被删除的便签的数据 - - /** - * Delete notes belong to folder which has been deleted - */ - private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER = - "CREATE TRIGGER folder_delete_notes_on_delete " + - " AFTER DELETE ON " + TABLE.NOTE + - " BEGIN" + - " DELETE FROM " + TABLE.NOTE + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//删除 已删除folder文件夹 中的便签要修改的数据 - - /** - * Move notes belong to folder which has been moved to trash folder - */ - private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER = - "CREATE TRIGGER folder_move_notes_on_trash " + - " AFTER UPDATE ON " + TABLE.NOTE + - " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " BEGIN" + - " UPDATE " + TABLE.NOTE + - " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER + - " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" + - " END";//移动trash_folder中的便签 - - public NotesDatabaseHelper(Context context) { - super(context, DB_NAME, null, DB_VERSION); - } - //构造函数 - public void createNoteTable(SQLiteDatabase db) { - db.execSQL(CREATE_NOTE_TABLE_SQL); - reCreateNoteTableTriggers(db); - createSystemFolder(db); - Log.d(TAG, "note table has been created"); - } - - private void reCreateNoteTableTriggers(SQLiteDatabase db) { - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash"); - - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER); - db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER); - db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER); - db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER); - db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER); - db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER); - }//数据库操作的API,重新创建 - - private void createSystemFolder(SQLiteDatabase db) { - ContentValues values = new ContentValues(); - - /** - * call record foler for call notes - */ - values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * root folder which is default folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * temporary folder which is used for moving note - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - - /** - * create trash folder - */ - values.clear(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - }//创建系统文件夹 - - public void createDataTable(SQLiteDatabase db) { - db.execSQL(CREATE_DATA_TABLE_SQL); - reCreateDataTableTriggers(db); - db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL); - Log.d(TAG, "data table has been created"); - }//创建数据表格 - - private void reCreateDataTableTriggers(SQLiteDatabase db) { - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete"); - - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER); - db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER); - }//类似于recreatenotetable,重新创建触发器 - - static synchronized NotesDatabaseHelper getInstance(Context context) { - if (mInstance == null) { - mInstance = new NotesDatabaseHelper(context); - } - return mInstance; - }//sync同步,同一时刻只有一个线程执行 - - @Override - public void onCreate(SQLiteDatabase db) { - createNoteTable(db); - createDataTable(db); - }//创建Note Data两个表格 - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - boolean reCreateTriggers = false; - boolean skipV2 = false; - - if (oldVersion == 1) { - upgradeToV2(db); - skipV2 = true; // this upgrade including the upgrade from v2 to v3 - oldVersion++; - } - - if (oldVersion == 2 && !skipV2) { - upgradeToV3(db); - reCreateTriggers = true; - oldVersion++; - } - - if (oldVersion == 3) { - upgradeToV4(db); - oldVersion++; - } - - if (reCreateTriggers) { - reCreateNoteTableTriggers(db); - reCreateDataTableTriggers(db); - } - - if (oldVersion != newVersion) { - throw new IllegalStateException("Upgrade notes database to version " + newVersion - + "fails"); - } - }//数据库版本更新 - - private void upgradeToV2(SQLiteDatabase db) { - db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE); - db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA); - createNoteTable(db); - createDataTable(db); - }//更新到V2 - - private void upgradeToV3(SQLiteDatabase db) { - // drop unused triggers - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete"); - db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update"); - // add a column for gtask id - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID - + " TEXT NOT NULL DEFAULT ''"); - // add a trash system folder - ContentValues values = new ContentValues(); - values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); - values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - db.insert(TABLE.NOTE, null, values); - }//更新到V3 - - private void upgradeToV4(SQLiteDatabase db) { - db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION - + " INTEGER NOT NULL DEFAULT 0"); - }//更新到V4 -} diff --git a/src/data/NotesProvider.java b/src/data/NotesProvider.java deleted file mode 100644 index 6897999..0000000 --- a/src/data/NotesProvider.java +++ /dev/null @@ -1,320 +0,0 @@ -package net.micode.notes.data; - -import android.app.SearchManager; -import android.content.ContentProvider; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.net.Uri; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; -//为存储和获取数据提供接口。可以在不同的应用程序之间共享数据 -//ContentProvider提供的方法 -//query:查询 -//insert:插入 -//update:更新 -//delete:删除 -//getType:得到数据类型 -public class NotesProvider extends ContentProvider { - // UriMatcher用于匹配Uri - private static final UriMatcher mMatcher; - - private NotesDatabaseHelper mHelper; - - private static final String TAG = "NotesProvider"; - - private static final int URI_NOTE = 1; - private static final int URI_NOTE_ITEM = 2; - private static final int URI_DATA = 3; - private static final int URI_DATA_ITEM = 4; - - private static final int URI_SEARCH = 5; - private static final int URI_SEARCH_SUGGEST = 6; - - static { - // 创建UriMatcher时,调用UriMatcher(UriMatcher.NO_MATCH)表示不匹配任何路径的返回码 - mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - // 把需要匹配Uri路径全部给注册上 - mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); - mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); - mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); - mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); - mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); - } - - /** - * x'0A' represents the '\n' character in sqlite. For title and content in the search result, - * we will trim '\n' and white space in order to show more information. - */ - // 声明 NOTES_SEARCH_PROJECTION - private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + "," - + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + "," - + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + "," - + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + "," - + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + "," - + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA; - // 声明NOTES_SNIPPET_SEARCH_QUERY - private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION - + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.SNIPPET + " LIKE ?" - + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER - + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE; - - @Override - // Context只有在onCreate()中才被初始化 - // 对mHelper进行实例化 - public boolean onCreate() { - mHelper = NotesDatabaseHelper.getInstance(getContext()); - return true; - } - - @Override - // 查询uri在数据库中对应的位置 - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - Cursor c = null; - // 获取可读数据库 - SQLiteDatabase db = mHelper.getReadableDatabase(); - String id = null; - // 匹配查找uri - switch (mMatcher.match(uri)) { - // 对于不同的匹配值,在数据库中查找相应的条目 - case URI_NOTE: - c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_DATA: - c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, - sortOrder); - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs, null, null, sortOrder); - break; - case URI_SEARCH: - case URI_SEARCH_SUGGEST: - if (sortOrder != null || projection != null) { - // 不合法的参数异常 - throw new IllegalArgumentException( - "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); - } - - String searchString = null; - if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { - if (uri.getPathSegments().size() > 1) { - // getPathSegments()方法得到一个String的List, - // 在uri.getPathSegments().get(1)为第2个元素 - searchString = uri.getPathSegments().get(1); - } - } else { - searchString = uri.getQueryParameter("pattern"); - } - - if (TextUtils.isEmpty(searchString)) { - return null; - } - - try { - searchString = String.format("%%%s%%", searchString); - c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY, - new String[] { searchString }); - } catch (IllegalStateException ex) { - Log.e(TAG, "got exception: " + ex.toString()); - } - break; - default: - // 抛出异常 - throw new IllegalArgumentException("Unknown URI " + uri); - } - if (c != null) { - c.setNotificationUri(getContext().getContentResolver(), uri); - } - return c; - } - - @Override - // 插入一个uri - public Uri insert(Uri uri, ContentValues values) { - // 获得可写的数据库 - SQLiteDatabase db = mHelper.getWritableDatabase(); - long dataId = 0, noteId = 0, insertedId = 0; - switch (mMatcher.match(uri)) { - // 新增一个条目 - case URI_NOTE: - insertedId = noteId = db.insert(TABLE.NOTE, null, values); - break; - // 如果存在,查找NOTE_ID - case URI_DATA: - if (values.containsKey(DataColumns.NOTE_ID)) { - noteId = values.getAsLong(DataColumns.NOTE_ID); - } else { - Log.d(TAG, "Wrong data format without note id:" + values.toString()); - } - insertedId = dataId = db.insert(TABLE.DATA, null, values); - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - // Notify the note uri - // notifyChange获得一个ContextResolver对象并且更新里面的内容 - if (noteId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); - } - - // Notify the data uri - if (dataId > 0) { - getContext().getContentResolver().notifyChange( - ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null); - } - - // 返回插入的uri的路径 - return ContentUris.withAppendedId(uri, insertedId); - } - - @Override - // 删除一个uri - public int delete(Uri uri, String selection, String[] selectionArgs) { - //Uri代表要操作的数据,Android上可用的每种资源 -包括 图像、视频片段、音频资源等都可以用Uri来表示。 - int count = 0; - String id = null; - // 获得可写的数据库 - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean deleteData = false; - switch (mMatcher.match(uri)) { - case URI_NOTE: - selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; - count = db.delete(TABLE.NOTE, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - /** - * ID that smaller than 0 is system folder which is not allowed to - * trash - */ - long noteId = Long.valueOf(id); - if (noteId <= 0) { - break; - } - count = db.delete(TABLE.NOTE, - NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.delete(TABLE.DATA, selection, selectionArgs); - deleteData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.delete(TABLE.DATA, - DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs); - deleteData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - if (count > 0) { - if (deleteData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - - @Override - // 更新一个uri - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int count = 0; - String id = null; - SQLiteDatabase db = mHelper.getWritableDatabase(); - boolean updateData = false; - switch (mMatcher.match(uri)) { - case URI_NOTE: - increaseNoteVersion(-1, selection, selectionArgs); - count = db.update(TABLE.NOTE, values, selection, selectionArgs); - break; - case URI_NOTE_ITEM: - id = uri.getPathSegments().get(1); - increaseNoteVersion(Long.valueOf(id), selection, selectionArgs); - count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - break; - case URI_DATA: - count = db.update(TABLE.DATA, values, selection, selectionArgs); - updateData = true; - break; - case URI_DATA_ITEM: - id = uri.getPathSegments().get(1); - count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id - + parseSelection(selection), selectionArgs); - updateData = true; - break; - default: - throw new IllegalArgumentException("Unknown URI " + uri); - } - - if (count > 0) { - if (updateData) { - getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null); - } - getContext().getContentResolver().notifyChange(uri, null); - } - return count; - } - - // 将字符串解析成规定格式 - private String parseSelection(String selection) { - return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""); - } - - //增加一个noteVersion - private void increaseNoteVersion(long id, String selection, String[] selectionArgs) { - StringBuilder sql = new StringBuilder(120); - sql.append("UPDATE "); - sql.append(TABLE.NOTE); - sql.append(" SET "); - sql.append(NoteColumns.VERSION); - sql.append("=" + NoteColumns.VERSION + "+1 "); - - if (id > 0 || !TextUtils.isEmpty(selection)) { - sql.append(" WHERE "); - } - if (id > 0) { - sql.append(NoteColumns.ID + "=" + String.valueOf(id)); - } - if (!TextUtils.isEmpty(selection)) { - String selectString = id > 0 ? parseSelection(selection) : selection; - for (String args : selectionArgs) { - selectString = selectString.replaceFirst("\\?", args); - } - sql.append(selectString); - } - - // execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句 - mHelper.getWritableDatabase().execSQL(sql.toString()); - } - - @Override - public String getType(Uri uri) { - // TODO Auto-generated method stub - return null; - } - -} \ No newline at end of file diff --git a/src/gtask/data/MetaData.java b/src/gtask/data/MetaData.java deleted file mode 100644 index 3a2050b..0000000 --- a/src/gtask/data/MetaData.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - - -public class MetaData extends Task { - private final static String TAG = MetaData.class.getSimpleName(); - - private String mRelatedGid = null; - - public void setMeta(String gid, JSONObject metaInfo) { - try { - metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid); - } catch (JSONException e) { - Log.e(TAG, "failed to put related gid"); - } - setNotes(metaInfo.toString()); - setName(GTaskStringUtils.META_NOTE_NAME); - } - - public String getRelatedGid() { - return mRelatedGid; - } - - @Override - public boolean isWorthSaving() { - return getNotes() != null; - } - - @Override - public void setContentByRemoteJSON(JSONObject js) { - super.setContentByRemoteJSON(js); - if (getNotes() != null) { - try { - JSONObject metaInfo = new JSONObject(getNotes().trim()); - mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID); - } catch (JSONException e) { - Log.w(TAG, "failed to get related gid"); - mRelatedGid = null; - } - } - } - - @Override - public void setContentByLocalJSON(JSONObject js) { - // this function should not be called - throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); - } - - @Override - public JSONObject getLocalJSONFromContent() { - throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); - } - - @Override - public int getSyncAction(Cursor c) { - throw new IllegalAccessError("MetaData:getSyncAction should not be called"); - } - -} diff --git a/src/gtask/data/Node.java b/src/gtask/data/Node.java deleted file mode 100644 index 63950e0..0000000 --- a/src/gtask/data/Node.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; - -import org.json.JSONObject; - -public abstract class Node { - public static final int SYNC_ACTION_NONE = 0; - - public static final int SYNC_ACTION_ADD_REMOTE = 1; - - public static final int SYNC_ACTION_ADD_LOCAL = 2; - - public static final int SYNC_ACTION_DEL_REMOTE = 3; - - public static final int SYNC_ACTION_DEL_LOCAL = 4; - - public static final int SYNC_ACTION_UPDATE_REMOTE = 5; - - public static final int SYNC_ACTION_UPDATE_LOCAL = 6; - - public static final int SYNC_ACTION_UPDATE_CONFLICT = 7; - - public static final int SYNC_ACTION_ERROR = 8; - - private String mGid; - - private String mName; - - private long mLastModified; - - private boolean mDeleted; - - public Node() { - mGid = null; - mName = ""; - mLastModified = 0; - mDeleted = false; - } - - public abstract JSONObject getCreateAction(int actionId); - - public abstract JSONObject getUpdateAction(int actionId); - - public abstract void setContentByRemoteJSON(JSONObject js); - - public abstract void setContentByLocalJSON(JSONObject js); - - public abstract JSONObject getLocalJSONFromContent(); - - public abstract int getSyncAction(Cursor c); - - public void setGid(String gid) { - this.mGid = gid; - } - - public void setName(String name) { - this.mName = name; - } - - public void setLastModified(long lastModified) { - this.mLastModified = lastModified; - } - - public void setDeleted(boolean deleted) { - this.mDeleted = deleted; - } - - public String getGid() { - return this.mGid; - } - - public String getName() { - return this.mName; - } - - public long getLastModified() { - return this.mLastModified; - } - - public boolean getDeleted() { - return this.mDeleted; - } - -} diff --git a/src/gtask/data/SqlData.java b/src/gtask/data/SqlData.java deleted file mode 100644 index d3ec3be..0000000 --- a/src/gtask/data/SqlData.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.NotesDatabaseHelper.TABLE; -import net.micode.notes.gtask.exception.ActionFailureException; - -import org.json.JSONException; -import org.json.JSONObject; - - -public class SqlData { - private static final String TAG = SqlData.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_DATA = new String[] { - DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1, - DataColumns.DATA3 - }; - - public static final int DATA_ID_COLUMN = 0; - - public static final int DATA_MIME_TYPE_COLUMN = 1; - - public static final int DATA_CONTENT_COLUMN = 2; - - public static final int DATA_CONTENT_DATA_1_COLUMN = 3; - - public static final int DATA_CONTENT_DATA_3_COLUMN = 4; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mDataId; - - private String mDataMimeType; - - private String mDataContent; - - private long mDataContentData1; - - private String mDataContentData3; - - private ContentValues mDiffDataValues; - - public SqlData(Context context) { - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mDataId = INVALID_ID; - mDataMimeType = DataConstants.NOTE; - mDataContent = ""; - mDataContentData1 = 0; - mDataContentData3 = ""; - mDiffDataValues = new ContentValues(); - } - - public SqlData(Context context, Cursor c) { - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDiffDataValues = new ContentValues(); - } - - private void loadFromCursor(Cursor c) { - mDataId = c.getLong(DATA_ID_COLUMN); - mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); - mDataContent = c.getString(DATA_CONTENT_COLUMN); - mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); - mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); - } - - public void setContent(JSONObject js) throws JSONException { - long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; - if (mIsCreate || mDataId != dataId) { - mDiffDataValues.put(DataColumns.ID, dataId); - } - mDataId = dataId; - - String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) - : DataConstants.NOTE; - if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { - mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); - } - mDataMimeType = dataMimeType; - - String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; - if (mIsCreate || !mDataContent.equals(dataContent)) { - mDiffDataValues.put(DataColumns.CONTENT, dataContent); - } - mDataContent = dataContent; - - long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; - if (mIsCreate || mDataContentData1 != dataContentData1) { - mDiffDataValues.put(DataColumns.DATA1, dataContentData1); - } - mDataContentData1 = dataContentData1; - - String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; - if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { - mDiffDataValues.put(DataColumns.DATA3, dataContentData3); - } - mDataContentData3 = dataContentData3; - } - - public JSONObject getContent() throws JSONException { - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - JSONObject js = new JSONObject(); - js.put(DataColumns.ID, mDataId); - js.put(DataColumns.MIME_TYPE, mDataMimeType); - js.put(DataColumns.CONTENT, mDataContent); - js.put(DataColumns.DATA1, mDataContentData1); - js.put(DataColumns.DATA3, mDataContentData3); - return js; - } - - public void commit(long noteId, boolean validateVersion, long version) { - - if (mIsCreate) { - if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { - mDiffDataValues.remove(DataColumns.ID); - } - - mDiffDataValues.put(DataColumns.NOTE_ID, noteId); - Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); - try { - mDataId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - } else { - if (mDiffDataValues.size() > 0) { - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null); - } else { - result = mContentResolver.update(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, - " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE - + " WHERE " + NoteColumns.VERSION + "=?)", new String[] { - String.valueOf(noteId), String.valueOf(version) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - } - - mDiffDataValues.clear(); - mIsCreate = false; - } - - public long getId() { - return mDataId; - } -} diff --git a/src/gtask/data/SqlNote.java b/src/gtask/data/SqlNote.java deleted file mode 100644 index 79a4095..0000000 --- a/src/gtask/data/SqlNote.java +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.appwidget.AppWidgetManager; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.tool.ResourceParser; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class SqlNote { - private static final String TAG = SqlNote.class.getSimpleName(); - - private static final int INVALID_ID = -99999; - - public static final String[] PROJECTION_NOTE = new String[] { - NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID, - NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE, - NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE, - NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID, - NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID, - NoteColumns.VERSION - }; - - public static final int ID_COLUMN = 0; - - public static final int ALERTED_DATE_COLUMN = 1; - - public static final int BG_COLOR_ID_COLUMN = 2; - - public static final int CREATED_DATE_COLUMN = 3; - - public static final int HAS_ATTACHMENT_COLUMN = 4; - - public static final int MODIFIED_DATE_COLUMN = 5; - - public static final int NOTES_COUNT_COLUMN = 6; - - public static final int PARENT_ID_COLUMN = 7; - - public static final int SNIPPET_COLUMN = 8; - - public static final int TYPE_COLUMN = 9; - - public static final int WIDGET_ID_COLUMN = 10; - - public static final int WIDGET_TYPE_COLUMN = 11; - - public static final int SYNC_ID_COLUMN = 12; - - public static final int LOCAL_MODIFIED_COLUMN = 13; - - public static final int ORIGIN_PARENT_ID_COLUMN = 14; - - public static final int GTASK_ID_COLUMN = 15; - - public static final int VERSION_COLUMN = 16; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mIsCreate; - - private long mId; - - private long mAlertDate; - - private int mBgColorId; - - private long mCreatedDate; - - private int mHasAttachment; - - private long mModifiedDate; - - private long mParentId; - - private String mSnippet; - - private int mType; - - private int mWidgetId; - - private int mWidgetType; - - private long mOriginParent; - - private long mVersion; - - private ContentValues mDiffNoteValues; - - private ArrayList mDataList; - - public SqlNote(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = true; - mId = INVALID_ID; - mAlertDate = 0; - mBgColorId = ResourceParser.getDefaultBgId(context); - mCreatedDate = System.currentTimeMillis(); - mHasAttachment = 0; - mModifiedDate = System.currentTimeMillis(); - mParentId = 0; - mSnippet = ""; - mType = Notes.TYPE_NOTE; - mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - mOriginParent = 0; - mVersion = 0; - mDiffNoteValues = new ContentValues(); - mDataList = new ArrayList(); - } - - public SqlNote(Context context, Cursor c) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(c); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - } - - public SqlNote(Context context, long id) { - mContext = context; - mContentResolver = context.getContentResolver(); - mIsCreate = false; - loadFromCursor(id); - mDataList = new ArrayList(); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - mDiffNoteValues = new ContentValues(); - - } - - private void loadFromCursor(long id) { - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(id) - }, null); - if (c != null) { - c.moveToNext(); - loadFromCursor(c); - } else { - Log.w(TAG, "loadFromCursor: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - private void loadFromCursor(Cursor c) { - mId = c.getLong(ID_COLUMN); - mAlertDate = c.getLong(ALERTED_DATE_COLUMN); - mBgColorId = c.getInt(BG_COLOR_ID_COLUMN); - mCreatedDate = c.getLong(CREATED_DATE_COLUMN); - mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN); - mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN); - mParentId = c.getLong(PARENT_ID_COLUMN); - mSnippet = c.getString(SNIPPET_COLUMN); - mType = c.getInt(TYPE_COLUMN); - mWidgetId = c.getInt(WIDGET_ID_COLUMN); - mWidgetType = c.getInt(WIDGET_TYPE_COLUMN); - mVersion = c.getLong(VERSION_COLUMN); - } - - private void loadDataContent() { - Cursor c = null; - mDataList.clear(); - try { - c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA, - "(note_id=?)", new String[] { - String.valueOf(mId) - }, null); - if (c != null) { - if (c.getCount() == 0) { - Log.w(TAG, "it seems that the note has not data"); - return; - } - while (c.moveToNext()) { - SqlData data = new SqlData(mContext, c); - mDataList.add(data); - } - } else { - Log.w(TAG, "loadDataContent: cursor = null"); - } - } finally { - if (c != null) - c.close(); - } - } - - public boolean setContent(JSONObject js) { - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - Log.w(TAG, "cannot set system folder"); - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - // for folder we can only update the snnipet and type - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID; - if (mIsCreate || mId != id) { - mDiffNoteValues.put(NoteColumns.ID, id); - } - mId = id; - - long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note - .getLong(NoteColumns.ALERTED_DATE) : 0; - if (mIsCreate || mAlertDate != alertDate) { - mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate); - } - mAlertDate = alertDate; - - int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note - .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext); - if (mIsCreate || mBgColorId != bgColorId) { - mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId); - } - mBgColorId = bgColorId; - - long createDate = note.has(NoteColumns.CREATED_DATE) ? note - .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mCreatedDate != createDate) { - mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate); - } - mCreatedDate = createDate; - - int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note - .getInt(NoteColumns.HAS_ATTACHMENT) : 0; - if (mIsCreate || mHasAttachment != hasAttachment) { - mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment); - } - mHasAttachment = hasAttachment; - - long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note - .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis(); - if (mIsCreate || mModifiedDate != modifiedDate) { - mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate); - } - mModifiedDate = modifiedDate; - - long parentId = note.has(NoteColumns.PARENT_ID) ? note - .getLong(NoteColumns.PARENT_ID) : 0; - if (mIsCreate || mParentId != parentId) { - mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId); - } - mParentId = parentId; - - String snippet = note.has(NoteColumns.SNIPPET) ? note - .getString(NoteColumns.SNIPPET) : ""; - if (mIsCreate || !mSnippet.equals(snippet)) { - mDiffNoteValues.put(NoteColumns.SNIPPET, snippet); - } - mSnippet = snippet; - - int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE) - : Notes.TYPE_NOTE; - if (mIsCreate || mType != type) { - mDiffNoteValues.put(NoteColumns.TYPE, type); - } - mType = type; - - int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID) - : AppWidgetManager.INVALID_APPWIDGET_ID; - if (mIsCreate || mWidgetId != widgetId) { - mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId); - } - mWidgetId = widgetId; - - int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note - .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE; - if (mIsCreate || mWidgetType != widgetType) { - mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType); - } - mWidgetType = widgetType; - - long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note - .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0; - if (mIsCreate || mOriginParent != originParent) { - mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent); - } - mOriginParent = originParent; - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - SqlData sqlData = null; - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - for (SqlData temp : mDataList) { - if (dataId == temp.getId()) { - sqlData = temp; - } - } - } - - if (sqlData == null) { - sqlData = new SqlData(mContext); - mDataList.add(sqlData); - } - - sqlData.setContent(data); - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } - return true; - } - - public JSONObject getContent() { - try { - JSONObject js = new JSONObject(); - - if (mIsCreate) { - Log.e(TAG, "it seems that we haven't created this in database yet"); - return null; - } - - JSONObject note = new JSONObject(); - if (mType == Notes.TYPE_NOTE) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.ALERTED_DATE, mAlertDate); - note.put(NoteColumns.BG_COLOR_ID, mBgColorId); - note.put(NoteColumns.CREATED_DATE, mCreatedDate); - note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment); - note.put(NoteColumns.MODIFIED_DATE, mModifiedDate); - note.put(NoteColumns.PARENT_ID, mParentId); - note.put(NoteColumns.SNIPPET, mSnippet); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.WIDGET_ID, mWidgetId); - note.put(NoteColumns.WIDGET_TYPE, mWidgetType); - note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - - JSONArray dataArray = new JSONArray(); - for (SqlData sqlData : mDataList) { - JSONObject data = sqlData.getContent(); - if (data != null) { - dataArray.put(data); - } - } - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) { - note.put(NoteColumns.ID, mId); - note.put(NoteColumns.TYPE, mType); - note.put(NoteColumns.SNIPPET, mSnippet); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - } - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - return null; - } - - public void setParentId(long id) { - mParentId = id; - mDiffNoteValues.put(NoteColumns.PARENT_ID, id); - } - - public void setGtaskId(String gid) { - mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); - } - - public void setSyncId(long syncId) { - mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); - } - - public void resetLocalModified() { - mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); - } - - public long getId() { - return mId; - } - - public long getParentId() { - return mParentId; - } - - public String getSnippet() { - return mSnippet; - } - - public boolean isNoteType() { - return mType == Notes.TYPE_NOTE; - } - - public void commit(boolean validateVersion) { - if (mIsCreate) { - if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) { - mDiffNoteValues.remove(NoteColumns.ID); - } - - Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues); - try { - mId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - throw new ActionFailureException("create note failed"); - } - if (mId == 0) { - throw new IllegalStateException("Create thread id failed"); - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, false, -1); - } - } - } else { - if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) { - Log.e(TAG, "No such note"); - throw new IllegalStateException("Try to update note with invalid id"); - } - if (mDiffNoteValues.size() > 0) { - mVersion ++; - int result = 0; - if (!validateVersion) { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?)", new String[] { - String.valueOf(mId) - }); - } else { - result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "(" - + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)", - new String[] { - String.valueOf(mId), String.valueOf(mVersion) - }); - } - if (result == 0) { - Log.w(TAG, "there is no update. maybe user updates note when syncing"); - } - } - - if (mType == Notes.TYPE_NOTE) { - for (SqlData sqlData : mDataList) { - sqlData.commit(mId, validateVersion, mVersion); - } - } - } - - // refresh local info - loadFromCursor(mId); - if (mType == Notes.TYPE_NOTE) - loadDataContent(); - - mDiffNoteValues.clear(); - mIsCreate = false; - } -} diff --git a/src/gtask/data/Task.java b/src/gtask/data/Task.java deleted file mode 100644 index 6a19454..0000000 --- a/src/gtask/data/Task.java +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - - -public class Task extends Node { - private static final String TAG = Task.class.getSimpleName(); - - private boolean mCompleted; - - private String mNotes; - - private JSONObject mMetaInfo; - - private Task mPriorSibling; - - private TaskList mParent; - - public Task() { - super(); - mCompleted = false; - mNotes = null; - mPriorSibling = null; - mParent = null; - mMetaInfo = null; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this)); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_TASK); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - // parent_id - js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid()); - - // dest_parent_type - js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - - // list_id - js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid()); - - // prior_sibling_id - if (mPriorSibling != null) { - js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid()); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - if (getNotes() != null) { - entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes()); - } - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate task-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - // notes - if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) { - setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES)); - } - - // deleted - if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) { - setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED)); - } - - // completed - if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) { - setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED)); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get task content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE) - || !js.has(GTaskStringUtils.META_HEAD_DATA)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) { - Log.e(TAG, "invalid type"); - return; - } - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - setName(data.getString(DataColumns.CONTENT)); - break; - } - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - String name = getName(); - try { - if (mMetaInfo == null) { - // new task created from web - if (name == null) { - Log.w(TAG, "the note seems to be an empty one"); - return null; - } - - JSONObject js = new JSONObject(); - JSONObject note = new JSONObject(); - JSONArray dataArray = new JSONArray(); - JSONObject data = new JSONObject(); - data.put(DataColumns.CONTENT, name); - dataArray.put(data); - js.put(GTaskStringUtils.META_HEAD_DATA, dataArray); - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - js.put(GTaskStringUtils.META_HEAD_NOTE, note); - return js; - } else { - // synced task - JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) { - data.put(DataColumns.CONTENT, getName()); - break; - } - } - - note.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - return mMetaInfo; - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public void setMetaInfo(MetaData metaData) { - if (metaData != null && metaData.getNotes() != null) { - try { - mMetaInfo = new JSONObject(metaData.getNotes()); - } catch (JSONException e) { - Log.w(TAG, e.toString()); - mMetaInfo = null; - } - } - } - - public int getSyncAction(Cursor c) { - try { - JSONObject noteInfo = null; - if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) { - noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - } - - if (noteInfo == null) { - Log.w(TAG, "it seems that note meta has been deleted"); - return SYNC_ACTION_UPDATE_REMOTE; - } - - if (!noteInfo.has(NoteColumns.ID)) { - Log.w(TAG, "remote note id seems to be deleted"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - // validate the note id now - if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) { - Log.w(TAG, "note id doesn't match"); - return SYNC_ACTION_UPDATE_LOCAL; - } - - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - return SYNC_ACTION_UPDATE_CONFLICT; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public boolean isWorthSaving() { - return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) - || (getNotes() != null && getNotes().trim().length() > 0); - } - - public void setCompleted(boolean completed) { - this.mCompleted = completed; - } - - public void setNotes(String notes) { - this.mNotes = notes; - } - - public void setPriorSibling(Task priorSibling) { - this.mPriorSibling = priorSibling; - } - - public void setParent(TaskList parent) { - this.mParent = parent; - } - - public boolean getCompleted() { - return this.mCompleted; - } - - public String getNotes() { - return this.mNotes; - } - - public Task getPriorSibling() { - return this.mPriorSibling; - } - - public TaskList getParent() { - return this.mParent; - } - -} diff --git a/src/gtask/data/TaskList.java b/src/gtask/data/TaskList.java deleted file mode 100644 index 4ea21c5..0000000 --- a/src/gtask/data/TaskList.java +++ /dev/null @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.data; - -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - - -public class TaskList extends Node { - private static final String TAG = TaskList.class.getSimpleName(); - - private int mIndex; - - private ArrayList mChildren; - - public TaskList() { - super(); - mChildren = new ArrayList(); - mIndex = 1; - } - - public JSONObject getCreateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // index - js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null"); - entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE, - GTaskStringUtils.GTASK_JSON_TYPE_GROUP); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-create jsonobject"); - } - - return js; - } - - public JSONObject getUpdateAction(int actionId) { - JSONObject js = new JSONObject(); - - try { - // action_type - js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); - - // action_id - js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); - - // id - js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); - - // entity_delta - JSONObject entity = new JSONObject(); - entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName()); - entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted()); - js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to generate tasklist-update jsonobject"); - } - - return js; - } - - public void setContentByRemoteJSON(JSONObject js) { - if (js != null) { - try { - // id - if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { - setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); - } - - // last_modified - if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { - setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); - } - - // name - if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) { - setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME)); - } - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("fail to get tasklist content from jsonobject"); - } - } - } - - public void setContentByLocalJSON(JSONObject js) { - if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) { - Log.w(TAG, "setContentByLocalJSON: nothing is avaiable"); - } - - try { - JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - - if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) { - String name = folder.getString(NoteColumns.SNIPPET); - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name); - } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) { - if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT); - else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER) - setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE); - else - Log.e(TAG, "invalid system folder"); - } else { - Log.e(TAG, "error type"); - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - } - - public JSONObject getLocalJSONFromContent() { - try { - JSONObject js = new JSONObject(); - JSONObject folder = new JSONObject(); - - String folderName = getName(); - if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)) - folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(), - folderName.length()); - folder.put(NoteColumns.SNIPPET, folderName); - if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT) - || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE)) - folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); - else - folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - - js.put(GTaskStringUtils.META_HEAD_NOTE, folder); - - return js; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return null; - } - } - - public int getSyncAction(Cursor c) { - try { - if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { - // there is no local update - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // no update both side - return SYNC_ACTION_NONE; - } else { - // apply remote to local - return SYNC_ACTION_UPDATE_LOCAL; - } - } else { - // validate gtask id - if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) { - Log.e(TAG, "gtask id doesn't match"); - return SYNC_ACTION_ERROR; - } - if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { - // local modification only - return SYNC_ACTION_UPDATE_REMOTE; - } else { - // for folder conflicts, just apply local modification - return SYNC_ACTION_UPDATE_REMOTE; - } - } - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - } - - return SYNC_ACTION_ERROR; - } - - public int getChildTaskCount() { - return mChildren.size(); - } - - public boolean addChildTask(Task task) { - boolean ret = false; - if (task != null && !mChildren.contains(task)) { - ret = mChildren.add(task); - if (ret) { - // need to set prior sibling and parent - task.setPriorSibling(mChildren.isEmpty() ? null : mChildren - .get(mChildren.size() - 1)); - task.setParent(this); - } - } - return ret; - } - - public boolean addChildTask(Task task, int index) { - if (index < 0 || index > mChildren.size()) { - Log.e(TAG, "add child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (task != null && pos == -1) { - mChildren.add(index, task); - - // update the task list - Task preTask = null; - Task afterTask = null; - if (index != 0) - preTask = mChildren.get(index - 1); - if (index != mChildren.size() - 1) - afterTask = mChildren.get(index + 1); - - task.setPriorSibling(preTask); - if (afterTask != null) - afterTask.setPriorSibling(task); - } - - return true; - } - - public boolean removeChildTask(Task task) { - boolean ret = false; - int index = mChildren.indexOf(task); - if (index != -1) { - ret = mChildren.remove(task); - - if (ret) { - // reset prior sibling and parent - task.setPriorSibling(null); - task.setParent(null); - - // update the task list - if (index != mChildren.size()) { - mChildren.get(index).setPriorSibling( - index == 0 ? null : mChildren.get(index - 1)); - } - } - } - return ret; - } - - public boolean moveChildTask(Task task, int index) { - - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "move child task: invalid index"); - return false; - } - - int pos = mChildren.indexOf(task); - if (pos == -1) { - Log.e(TAG, "move child task: the task should in the list"); - return false; - } - - if (pos == index) - return true; - return (removeChildTask(task) && addChildTask(task, index)); - } - - public Task findChildTaskByGid(String gid) { - for (int i = 0; i < mChildren.size(); i++) { - Task t = mChildren.get(i); - if (t.getGid().equals(gid)) { - return t; - } - } - return null; - } - - public int getChildTaskIndex(Task task) { - return mChildren.indexOf(task); - } - - public Task getChildTaskByIndex(int index) { - if (index < 0 || index >= mChildren.size()) { - Log.e(TAG, "getTaskByIndex: invalid index"); - return null; - } - return mChildren.get(index); - } - - public Task getChilTaskByGid(String gid) { - for (Task task : mChildren) { - if (task.getGid().equals(gid)) - return task; - } - return null; - } - - public ArrayList getChildTaskList() { - return this.mChildren; - } - - public void setIndex(int index) { - this.mIndex = index; - } - - public int getIndex() { - return this.mIndex; - } -} diff --git a/src/gtask/exception/ActionFailureException.java b/src/gtask/exception/ActionFailureException.java deleted file mode 100644 index 15504be..0000000 --- a/src/gtask/exception/ActionFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.exception; - -public class ActionFailureException extends RuntimeException { - private static final long serialVersionUID = 4425249765923293627L; - - public ActionFailureException() { - super(); - } - - public ActionFailureException(String paramString) { - super(paramString); - } - - public ActionFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/src/gtask/exception/NetworkFailureException.java b/src/gtask/exception/NetworkFailureException.java deleted file mode 100644 index b08cfb1..0000000 --- a/src/gtask/exception/NetworkFailureException.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.exception; - -public class NetworkFailureException extends Exception { - private static final long serialVersionUID = 2107610287180234136L; - - public NetworkFailureException() { - super(); - } - - public NetworkFailureException(String paramString) { - super(paramString); - } - - public NetworkFailureException(String paramString, Throwable paramThrowable) { - super(paramString, paramThrowable); - } -} diff --git a/src/gtask/remote/GTaskASyncTask.java b/src/gtask/remote/GTaskASyncTask.java deleted file mode 100644 index 0e332f3..0000000 --- a/src/gtask/remote/GTaskASyncTask.java +++ /dev/null @@ -1,129 +0,0 @@ - -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; - -import net.micode.notes.R; -import net.micode.notes.ui.NotesListActivity; -import net.micode.notes.ui.NotesPreferenceActivity; - - -public class GTaskASyncTask extends AsyncTask { - - private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; - - public interface OnCompleteListener { - void onComplete(); - } - - private Context mContext; - - private NotificationManager mNotifiManager; - - private GTaskManager mTaskManager; - - private OnCompleteListener mOnCompleteListener; - - public GTaskASyncTask(Context context, OnCompleteListener listener) { - mContext = context; - mOnCompleteListener = listener; - mNotifiManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - mTaskManager = GTaskManager.getInstance(); - } - - public void cancelSync() { - mTaskManager.cancelSync(); - } - - public void publishProgess(String message) { - publishProgress(new String[] { - message - }); - } - - private void showNotification(int tickerId, String content) { - PendingIntent pendingIntent; - if (tickerId != R.string.ticker_success) { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesPreferenceActivity.class), 0); - - } else { - pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, - NotesListActivity.class), 0); - } - - - Notification.Builder builder = new Notification.Builder(mContext) - .setAutoCancel(true) - .setContentTitle(mContext.getString(R.string.app_name)) - .setContentText(content) - .setContentIntent(pendingIntent) - .setWhen(System.currentTimeMillis()) - .setOngoing(true); - Notification notification=builder.getNotification(); - mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); - } - - - - @Override - protected Integer doInBackground(Void... unused) { - publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity - .getSyncAccountName(mContext))); - return mTaskManager.sync(mContext, this); - } - - @Override - protected void onProgressUpdate(String... progress) { - showNotification(R.string.ticker_syncing, progress[0]); - if (mContext instanceof GTaskSyncService) { - ((GTaskSyncService) mContext).sendBroadcast(progress[0]); - } - } - - @Override - protected void onPostExecute(Integer result) { - if (result == GTaskManager.STATE_SUCCESS) { - showNotification(R.string.ticker_success, mContext.getString( - R.string.success_sync_account, mTaskManager.getSyncAccount())); - NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); - } else if (result == GTaskManager.STATE_NETWORK_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); - } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { - showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); - } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { - showNotification(R.string.ticker_cancel, mContext - .getString(R.string.error_sync_cancelled)); - } - if (mOnCompleteListener != null) { - new Thread(new Runnable() { - - public void run() { - mOnCompleteListener.onComplete(); - } - }).start(); - } - } -} diff --git a/src/gtask/remote/GTaskClient.java b/src/gtask/remote/GTaskClient.java deleted file mode 100644 index c67dfdf..0000000 --- a/src/gtask/remote/GTaskClient.java +++ /dev/null @@ -1,585 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AccountManagerFuture; -import android.app.Activity; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.gtask.data.Node; -import net.micode.notes.gtask.data.Task; -import net.micode.notes.gtask.data.TaskList; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.gtask.exception.NetworkFailureException; -import net.micode.notes.tool.GTaskStringUtils; -import net.micode.notes.ui.NotesPreferenceActivity; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.cookie.Cookie; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpParams; -import org.apache.http.params.HttpProtocolParams; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.LinkedList; -import java.util.List; -import java.util.zip.GZIPInputStream; -import java.util.zip.Inflater; -import java.util.zip.InflaterInputStream; - - -public class GTaskClient { - private static final String TAG = GTaskClient.class.getSimpleName(); - - private static final String GTASK_URL = "https://mail.google.com/tasks/"; - - private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig"; - - private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig"; - - private static GTaskClient mInstance = null; - - private DefaultHttpClient mHttpClient; - - private String mGetUrl; - - private String mPostUrl; - - private long mClientVersion; - - private boolean mLoggedin; - - private long mLastLoginTime; - - private int mActionId; - - private Account mAccount; - - private JSONArray mUpdateArray; - - private GTaskClient() { - mHttpClient = null; - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - mClientVersion = -1; - mLoggedin = false; - mLastLoginTime = 0; - mActionId = 1; - mAccount = null; - mUpdateArray = null; - } - - public static synchronized GTaskClient getInstance() { - if (mInstance == null) { - mInstance = new GTaskClient(); - } - return mInstance; - } - - public boolean login(Activity activity) { - // we suppose that the cookie would expire after 5 minutes - // then we need to re-login - final long interval = 1000 * 60 * 5; - if (mLastLoginTime + interval < System.currentTimeMillis()) { - mLoggedin = false; - } - - // need to re-login after account switch - if (mLoggedin - && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity - .getSyncAccountName(activity))) { - mLoggedin = false; - } - - if (mLoggedin) { - Log.d(TAG, "already logged in"); - return true; - } - - mLastLoginTime = System.currentTimeMillis(); - String authToken = loginGoogleAccount(activity, false); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - // login with custom domain if necessary - if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase() - .endsWith("googlemail.com"))) { - StringBuilder url = new StringBuilder(GTASK_URL).append("a/"); - int index = mAccount.name.indexOf('@') + 1; - String suffix = mAccount.name.substring(index); - url.append(suffix + "/"); - mGetUrl = url.toString() + "ig"; - mPostUrl = url.toString() + "r/ig"; - - if (tryToLoginGtask(activity, authToken)) { - mLoggedin = true; - } - } - - // try to login with google official url - if (!mLoggedin) { - mGetUrl = GTASK_GET_URL; - mPostUrl = GTASK_POST_URL; - if (!tryToLoginGtask(activity, authToken)) { - return false; - } - } - - mLoggedin = true; - return true; - } - - private String loginGoogleAccount(Activity activity, boolean invalidateToken) { - String authToken; - AccountManager accountManager = AccountManager.get(activity); - Account[] accounts = accountManager.getAccountsByType("com.google"); - - if (accounts.length == 0) { - Log.e(TAG, "there is no available google account"); - return null; - } - - String accountName = NotesPreferenceActivity.getSyncAccountName(activity); - Account account = null; - for (Account a : accounts) { - if (a.name.equals(accountName)) { - account = a; - break; - } - } - if (account != null) { - mAccount = account; - } else { - Log.e(TAG, "unable to get an account with the same name in the settings"); - return null; - } - - // get the token now - AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account, - "goanna_mobile", null, activity, null, null); - try { - Bundle authTokenBundle = accountManagerFuture.getResult(); - authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); - if (invalidateToken) { - accountManager.invalidateAuthToken("com.google", authToken); - loginGoogleAccount(activity, false); - } - } catch (Exception e) { - Log.e(TAG, "get auth token failed"); - authToken = null; - } - - return authToken; - } - - private boolean tryToLoginGtask(Activity activity, String authToken) { - if (!loginGtask(authToken)) { - // maybe the auth token is out of date, now let's invalidate the - // token and try again - authToken = loginGoogleAccount(activity, true); - if (authToken == null) { - Log.e(TAG, "login google account failed"); - return false; - } - - if (!loginGtask(authToken)) { - Log.e(TAG, "login gtask failed"); - return false; - } - } - return true; - } - - private boolean loginGtask(String authToken) { - int timeoutConnection = 10000; - int timeoutSocket = 15000; - HttpParams httpParameters = new BasicHttpParams(); - HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); - HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); - mHttpClient = new DefaultHttpClient(httpParameters); - BasicCookieStore localBasicCookieStore = new BasicCookieStore(); - mHttpClient.setCookieStore(localBasicCookieStore); - HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false); - - // login gtask - try { - String loginUrl = mGetUrl + "?auth=" + authToken; - HttpGet httpGet = new HttpGet(loginUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the cookie now - List cookies = mHttpClient.getCookieStore().getCookies(); - boolean hasAuthCookie = false; - for (Cookie cookie : cookies) { - if (cookie.getName().contains("GTL")) { - hasAuthCookie = true; - } - } - if (!hasAuthCookie) { - Log.w(TAG, "it seems that there is no auth cookie"); - } - - // get the client version - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - mClientVersion = js.getLong("v"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return false; - } catch (Exception e) { - // simply catch all exceptions - Log.e(TAG, "httpget gtask_url failed"); - return false; - } - - return true; - } - - private int getActionId() { - return mActionId++; - } - - private HttpPost createHttpPost() { - HttpPost httpPost = new HttpPost(mPostUrl); - httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); - httpPost.setHeader("AT", "1"); - return httpPost; - } - - private String getResponseContent(HttpEntity entity) throws IOException { - String contentEncoding = null; - if (entity.getContentEncoding() != null) { - contentEncoding = entity.getContentEncoding().getValue(); - Log.d(TAG, "encoding: " + contentEncoding); - } - - InputStream input = entity.getContent(); - if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { - input = new GZIPInputStream(entity.getContent()); - } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { - Inflater inflater = new Inflater(true); - input = new InflaterInputStream(entity.getContent(), inflater); - } - - try { - InputStreamReader isr = new InputStreamReader(input); - BufferedReader br = new BufferedReader(isr); - StringBuilder sb = new StringBuilder(); - - while (true) { - String buff = br.readLine(); - if (buff == null) { - return sb.toString(); - } - sb = sb.append(buff); - } - } finally { - input.close(); - } - } - - private JSONObject postRequest(JSONObject js) throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - HttpPost httpPost = createHttpPost(); - try { - LinkedList list = new LinkedList(); - list.add(new BasicNameValuePair("r", js.toString())); - UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8"); - httpPost.setEntity(entity); - - // execute the post - HttpResponse response = mHttpClient.execute(httpPost); - String jsString = getResponseContent(response.getEntity()); - return new JSONObject(jsString); - - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("postRequest failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("unable to convert response content to jsonobject"); - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("error occurs when posting request"); - } - } - - public void createTask(Task task) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(task.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create task: handing jsonobject failed"); - } - } - - public void createTaskList(TaskList tasklist) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - actionList.put(tasklist.getCreateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - // post - JSONObject jsResponse = postRequest(jsPost); - JSONObject jsResult = (JSONObject) jsResponse.getJSONArray( - GTaskStringUtils.GTASK_JSON_RESULTS).get(0); - tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID)); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("create tasklist: handing jsonobject failed"); - } - } - - public void commitUpdate() throws NetworkFailureException { - if (mUpdateArray != null) { - try { - JSONObject jsPost = new JSONObject(); - - // action_list - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("commit update: handing jsonobject failed"); - } - } - } - - public void addUpdateNode(Node node) throws NetworkFailureException { - if (node != null) { - // too many update items may result in an error - // set max to 10 items - if (mUpdateArray != null && mUpdateArray.length() > 10) { - commitUpdate(); - } - - if (mUpdateArray == null) - mUpdateArray = new JSONArray(); - mUpdateArray.put(node.getUpdateAction(getActionId())); - } - } - - public void moveTask(Task task, TaskList preParent, TaskList curParent) - throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid()); - if (preParent == curParent && task.getPriorSibling() != null) { - // put prioring_sibing_id only if moving within the tasklist and - // it is not the first one - action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling()); - } - action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid()); - action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid()); - if (preParent != curParent) { - // put the dest_list only if moving between tasklists - action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid()); - } - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("move task: handing jsonobject failed"); - } - } - - public void deleteNode(Node node) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - - // action_list - node.setDeleted(true); - actionList.put(node.getUpdateAction(getActionId())); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - postRequest(jsPost); - mUpdateArray = null; - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("delete node: handing jsonobject failed"); - } - } - - public JSONArray getTaskLists() throws NetworkFailureException { - if (!mLoggedin) { - Log.e(TAG, "please login first"); - throw new ActionFailureException("not logged in"); - } - - try { - HttpGet httpGet = new HttpGet(mGetUrl); - HttpResponse response = null; - response = mHttpClient.execute(httpGet); - - // get the task list - String resString = getResponseContent(response.getEntity()); - String jsBegin = "_setup("; - String jsEnd = ")}"; - int begin = resString.indexOf(jsBegin); - int end = resString.lastIndexOf(jsEnd); - String jsString = null; - if (begin != -1 && end != -1 && begin < end) { - jsString = resString.substring(begin + jsBegin.length(), end); - } - JSONObject js = new JSONObject(jsString); - return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS); - } catch (ClientProtocolException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (IOException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new NetworkFailureException("gettasklists: httpget failed"); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task lists: handing jasonobject failed"); - } - } - - public JSONArray getTaskList(String listGid) throws NetworkFailureException { - commitUpdate(); - try { - JSONObject jsPost = new JSONObject(); - JSONArray actionList = new JSONArray(); - JSONObject action = new JSONObject(); - - // action_list - action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, - GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL); - action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId()); - action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid); - action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false); - actionList.put(action); - jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList); - - // client_version - jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion); - - JSONObject jsResponse = postRequest(jsPost); - return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS); - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("get task list: handing jsonobject failed"); - } - } - - public Account getSyncAccount() { - return mAccount; - } - - public void resetUpdateArray() { - mUpdateArray = null; - } -} diff --git a/src/gtask/remote/GTaskManager.java b/src/gtask/remote/GTaskManager.java deleted file mode 100644 index d2b4082..0000000 --- a/src/gtask/remote/GTaskManager.java +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Activity; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.data.MetaData; -import net.micode.notes.gtask.data.Node; -import net.micode.notes.gtask.data.SqlNote; -import net.micode.notes.gtask.data.Task; -import net.micode.notes.gtask.data.TaskList; -import net.micode.notes.gtask.exception.ActionFailureException; -import net.micode.notes.gtask.exception.NetworkFailureException; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.GTaskStringUtils; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; - - -public class GTaskManager { - private static final String TAG = GTaskManager.class.getSimpleName(); - - public static final int STATE_SUCCESS = 0; - - public static final int STATE_NETWORK_ERROR = 1; - - public static final int STATE_INTERNAL_ERROR = 2; - - public static final int STATE_SYNC_IN_PROGRESS = 3; - - public static final int STATE_SYNC_CANCELLED = 4; - - private static GTaskManager mInstance = null; - - private Activity mActivity; - - private Context mContext; - - private ContentResolver mContentResolver; - - private boolean mSyncing; - - private boolean mCancelled; - - private HashMap mGTaskListHashMap; - - private HashMap mGTaskHashMap; - - private HashMap mMetaHashMap; - - private TaskList mMetaList; - - private HashSet mLocalDeleteIdMap; - - private HashMap mGidToNid; - - private HashMap mNidToGid; - - private GTaskManager() { - mSyncing = false; - mCancelled = false; - mGTaskListHashMap = new HashMap(); - mGTaskHashMap = new HashMap(); - mMetaHashMap = new HashMap(); - mMetaList = null; - mLocalDeleteIdMap = new HashSet(); - mGidToNid = new HashMap(); - mNidToGid = new HashMap(); - } - - public static synchronized GTaskManager getInstance() { - if (mInstance == null) { - mInstance = new GTaskManager(); - } - return mInstance; - } - - public synchronized void setActivityContext(Activity activity) { - // used for getting authtoken - mActivity = activity; - } - - public int sync(Context context, GTaskASyncTask asyncTask) { - if (mSyncing) { - Log.d(TAG, "Sync is in progress"); - return STATE_SYNC_IN_PROGRESS; - } - mContext = context; - mContentResolver = mContext.getContentResolver(); - mSyncing = true; - mCancelled = false; - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - - try { - GTaskClient client = GTaskClient.getInstance(); - client.resetUpdateArray(); - - // login google task - if (!mCancelled) { - if (!client.login(mActivity)) { - throw new NetworkFailureException("login google task failed"); - } - } - - // get the task list from google - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); - initGTaskList(); - - // do content sync work - asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing)); - syncContent(); - } catch (NetworkFailureException e) { - Log.e(TAG, e.toString()); - return STATE_NETWORK_ERROR; - } catch (ActionFailureException e) { - Log.e(TAG, e.toString()); - return STATE_INTERNAL_ERROR; - } catch (Exception e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - return STATE_INTERNAL_ERROR; - } finally { - mGTaskListHashMap.clear(); - mGTaskHashMap.clear(); - mMetaHashMap.clear(); - mLocalDeleteIdMap.clear(); - mGidToNid.clear(); - mNidToGid.clear(); - mSyncing = false; - } - - return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS; - } - - private void initGTaskList() throws NetworkFailureException { - if (mCancelled) - return; - GTaskClient client = GTaskClient.getInstance(); - try { - JSONArray jsTaskLists = client.getTaskLists(); - - // init meta list first - mMetaList = null; - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name - .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) { - mMetaList = new TaskList(); - mMetaList.setContentByRemoteJSON(object); - - // load meta data - JSONArray jsMetas = client.getTaskList(gid); - for (int j = 0; j < jsMetas.length(); j++) { - object = (JSONObject) jsMetas.getJSONObject(j); - MetaData metaData = new MetaData(); - metaData.setContentByRemoteJSON(object); - if (metaData.isWorthSaving()) { - mMetaList.addChildTask(metaData); - if (metaData.getGid() != null) { - mMetaHashMap.put(metaData.getRelatedGid(), metaData); - } - } - } - } - } - - // create meta list if not existed - if (mMetaList == null) { - mMetaList = new TaskList(); - mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META); - GTaskClient.getInstance().createTaskList(mMetaList); - } - - // init task list - for (int i = 0; i < jsTaskLists.length(); i++) { - JSONObject object = jsTaskLists.getJSONObject(i); - String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME); - - if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX) - && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_META)) { - TaskList tasklist = new TaskList(); - tasklist.setContentByRemoteJSON(object); - mGTaskListHashMap.put(gid, tasklist); - mGTaskHashMap.put(gid, tasklist); - - // load tasks - JSONArray jsTasks = client.getTaskList(gid); - for (int j = 0; j < jsTasks.length(); j++) { - object = (JSONObject) jsTasks.getJSONObject(j); - gid = object.getString(GTaskStringUtils.GTASK_JSON_ID); - Task task = new Task(); - task.setContentByRemoteJSON(object); - if (task.isWorthSaving()) { - task.setMetaInfo(mMetaHashMap.get(gid)); - tasklist.addChildTask(task); - mGTaskHashMap.put(gid, task); - } - } - } - } - } catch (JSONException e) { - Log.e(TAG, e.toString()); - e.printStackTrace(); - throw new ActionFailureException("initGTaskList: handing JSONObject failed"); - } - } - - private void syncContent() throws NetworkFailureException { - int syncType; - Cursor c = null; - String gid; - Node node; - - mLocalDeleteIdMap.clear(); - - if (mCancelled) { - return; - } - - // for local deleted note - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id=?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, null); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c); - } - - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - } - } else { - Log.w(TAG, "failed to query trash folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // sync folder first - syncFolder(); - - // for note existing in database - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing note in database"); - } - - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // go through remaining items - Iterator> iter = mGTaskHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - node = entry.getValue(); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - - // mCancelled can be set by another thread, so we neet to check one by - // one - // clear local delete table - if (!mCancelled) { - if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { - throw new ActionFailureException("failed to batch-delete local deleted notes"); - } - } - - // refresh local sync id - if (!mCancelled) { - GTaskClient.getInstance().commitUpdate(); - refreshLocalSyncId(); - } - - } - - private void syncFolder() throws NetworkFailureException { - Cursor c = null; - String gid; - Node node; - int syncType; - - if (mCancelled) { - return; - } - - // for root folder - try { - c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null); - if (c != null) { - c.moveToNext(); - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER); - mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid); - // for system folder, only update remote name if necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } else { - Log.w(TAG, "failed to query root folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for call-note folder - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)", - new String[] { - String.valueOf(Notes.ID_CALL_RECORD_FOLDER) - }, null); - if (c != null) { - if (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER); - mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid); - // for system folder, only update remote name if - // necessary - if (!node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX - + GTaskStringUtils.FOLDER_CALL_NOTE)) - doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c); - } else { - doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c); - } - } - } else { - Log.w(TAG, "failed to query call note folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for local existing folders - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type=? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - gid = c.getString(SqlNote.GTASK_ID_COLUMN); - node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN)); - mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid); - syncType = node.getSyncAction(c); - } else { - if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) { - // local add - syncType = Node.SYNC_ACTION_ADD_REMOTE; - } else { - // remote delete - syncType = Node.SYNC_ACTION_DEL_LOCAL; - } - } - doContentSync(syncType, node, c); - } - } else { - Log.w(TAG, "failed to query existing folder"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - - // for remote add folders - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - gid = entry.getKey(); - node = entry.getValue(); - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null); - } - } - - if (!mCancelled) - GTaskClient.getInstance().commitUpdate(); - } - - private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - MetaData meta; - switch (syncType) { - case Node.SYNC_ACTION_ADD_LOCAL: - addLocalNode(node); - break; - case Node.SYNC_ACTION_ADD_REMOTE: - addRemoteNode(node, c); - break; - case Node.SYNC_ACTION_DEL_LOCAL: - meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN)); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN)); - break; - case Node.SYNC_ACTION_DEL_REMOTE: - meta = mMetaHashMap.get(node.getGid()); - if (meta != null) { - GTaskClient.getInstance().deleteNode(meta); - } - GTaskClient.getInstance().deleteNode(node); - break; - case Node.SYNC_ACTION_UPDATE_LOCAL: - updateLocalNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_REMOTE: - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_UPDATE_CONFLICT: - // merging both modifications maybe a good idea - // right now just use local update simply - updateRemoteNode(node, c); - break; - case Node.SYNC_ACTION_NONE: - break; - case Node.SYNC_ACTION_ERROR: - default: - throw new ActionFailureException("unkown sync action type"); - } - } - - private void addLocalNode(Node node) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - if (node instanceof TaskList) { - if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) { - sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER); - } else if (node.getName().equals( - GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) { - sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER); - } else { - sqlNote = new SqlNote(mContext); - sqlNote.setContent(node.getLocalJSONFromContent()); - sqlNote.setParentId(Notes.ID_ROOT_FOLDER); - } - } else { - sqlNote = new SqlNote(mContext); - JSONObject js = node.getLocalJSONFromContent(); - try { - if (js.has(GTaskStringUtils.META_HEAD_NOTE)) { - JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE); - if (note.has(NoteColumns.ID)) { - long id = note.getLong(NoteColumns.ID); - if (DataUtils.existInNoteDatabase(mContentResolver, id)) { - // the id is not available, have to create a new one - note.remove(NoteColumns.ID); - } - } - } - - if (js.has(GTaskStringUtils.META_HEAD_DATA)) { - JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA); - for (int i = 0; i < dataArray.length(); i++) { - JSONObject data = dataArray.getJSONObject(i); - if (data.has(DataColumns.ID)) { - long dataId = data.getLong(DataColumns.ID); - if (DataUtils.existInDataDatabase(mContentResolver, dataId)) { - // the data id is not available, have to create - // a new one - data.remove(DataColumns.ID); - } - } - } - - } - } catch (JSONException e) { - Log.w(TAG, e.toString()); - e.printStackTrace(); - } - sqlNote.setContent(js); - - Long parentId = mGidToNid.get(((Task) node).getParent().getGid()); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot add local node"); - } - sqlNote.setParentId(parentId.longValue()); - } - - // create the local node - sqlNote.setGtaskId(node.getGid()); - sqlNote.commit(false); - - // update gid-nid mapping - mGidToNid.put(node.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), node.getGid()); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - } - - private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote; - // update the note locally - sqlNote = new SqlNote(mContext, c); - sqlNote.setContent(node.getLocalJSONFromContent()); - - Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid()) - : new Long(Notes.ID_ROOT_FOLDER); - if (parentId == null) { - Log.e(TAG, "cannot find task's parent id locally"); - throw new ActionFailureException("cannot update local node"); - } - sqlNote.setParentId(parentId.longValue()); - sqlNote.commit(true); - - // update meta info - updateRemoteMeta(node.getGid(), sqlNote); - } - - private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - Node n; - - // update remotely - if (sqlNote.isNoteType()) { - Task task = new Task(); - task.setContentByLocalJSON(sqlNote.getContent()); - - String parentGid = mNidToGid.get(sqlNote.getParentId()); - if (parentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot add remote task"); - } - mGTaskListHashMap.get(parentGid).addChildTask(task); - - GTaskClient.getInstance().createTask(task); - n = (Node) task; - - // add meta - updateRemoteMeta(task.getGid(), sqlNote); - } else { - TaskList tasklist = null; - - // we need to skip folder if it has already existed - String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX; - if (sqlNote.getId() == Notes.ID_ROOT_FOLDER) - folderName += GTaskStringUtils.FOLDER_DEFAULT; - else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER) - folderName += GTaskStringUtils.FOLDER_CALL_NOTE; - else - folderName += sqlNote.getSnippet(); - - Iterator> iter = mGTaskListHashMap.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry entry = iter.next(); - String gid = entry.getKey(); - TaskList list = entry.getValue(); - - if (list.getName().equals(folderName)) { - tasklist = list; - if (mGTaskHashMap.containsKey(gid)) { - mGTaskHashMap.remove(gid); - } - break; - } - } - - // no match we can add now - if (tasklist == null) { - tasklist = new TaskList(); - tasklist.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().createTaskList(tasklist); - mGTaskListHashMap.put(tasklist.getGid(), tasklist); - } - n = (Node) tasklist; - } - - // update local note - sqlNote.setGtaskId(n.getGid()); - sqlNote.commit(false); - sqlNote.resetLocalModified(); - sqlNote.commit(true); - - // gid-id mapping - mGidToNid.put(n.getGid(), sqlNote.getId()); - mNidToGid.put(sqlNote.getId(), n.getGid()); - } - - private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { - if (mCancelled) { - return; - } - - SqlNote sqlNote = new SqlNote(mContext, c); - - // update remotely - node.setContentByLocalJSON(sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(node); - - // update meta - updateRemoteMeta(node.getGid(), sqlNote); - - // move task if necessary - if (sqlNote.isNoteType()) { - Task task = (Task) node; - TaskList preParentList = task.getParent(); - - String curParentGid = mNidToGid.get(sqlNote.getParentId()); - if (curParentGid == null) { - Log.e(TAG, "cannot find task's parent tasklist"); - throw new ActionFailureException("cannot update remote task"); - } - TaskList curParentList = mGTaskListHashMap.get(curParentGid); - - if (preParentList != curParentList) { - preParentList.removeChildTask(task); - curParentList.addChildTask(task); - GTaskClient.getInstance().moveTask(task, preParentList, curParentList); - } - } - - // clear local modified flag - sqlNote.resetLocalModified(); - sqlNote.commit(true); - } - - private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { - if (sqlNote != null && sqlNote.isNoteType()) { - MetaData metaData = mMetaHashMap.get(gid); - if (metaData != null) { - metaData.setMeta(gid, sqlNote.getContent()); - GTaskClient.getInstance().addUpdateNode(metaData); - } else { - metaData = new MetaData(); - metaData.setMeta(gid, sqlNote.getContent()); - mMetaList.addChildTask(metaData); - mMetaHashMap.put(gid, metaData); - GTaskClient.getInstance().createTask(metaData); - } - } - } - - private void refreshLocalSyncId() throws NetworkFailureException { - if (mCancelled) { - return; - } - - // get the latest gtask list - mGTaskHashMap.clear(); - mGTaskListHashMap.clear(); - mMetaHashMap.clear(); - initGTaskList(); - - Cursor c = null; - try { - c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, - "(type<>? AND parent_id<>?)", new String[] { - String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) - }, NoteColumns.TYPE + " DESC"); - if (c != null) { - while (c.moveToNext()) { - String gid = c.getString(SqlNote.GTASK_ID_COLUMN); - Node node = mGTaskHashMap.get(gid); - if (node != null) { - mGTaskHashMap.remove(gid); - ContentValues values = new ContentValues(); - values.put(NoteColumns.SYNC_ID, node.getLastModified()); - mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, - c.getLong(SqlNote.ID_COLUMN)), values, null, null); - } else { - Log.e(TAG, "something is missed"); - throw new ActionFailureException( - "some local items don't have gid after sync"); - } - } - } else { - Log.w(TAG, "failed to query local note to refresh sync id"); - } - } finally { - if (c != null) { - c.close(); - c = null; - } - } - } - - public String getSyncAccount() { - return GTaskClient.getInstance().getSyncAccount().name; - } - - public void cancelSync() { - mCancelled = true; - } -} diff --git a/src/gtask/remote/GTaskSyncService.java b/src/gtask/remote/GTaskSyncService.java deleted file mode 100644 index cca36f7..0000000 --- a/src/gtask/remote/GTaskSyncService.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.gtask.remote; - -import android.app.Activity; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.IBinder; - -public class GTaskSyncService extends Service { - public final static String ACTION_STRING_NAME = "sync_action_type"; - - public final static int ACTION_START_SYNC = 0; - - public final static int ACTION_CANCEL_SYNC = 1; - - public final static int ACTION_INVALID = 2; - - public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; - - public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; - - public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg"; - - private static GTaskASyncTask mSyncTask = null; - - private static String mSyncProgress = ""; - - private void startSync() { - if (mSyncTask == null) { - mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() { - public void onComplete() { - mSyncTask = null; - sendBroadcast(""); - stopSelf(); - } - }); - sendBroadcast(""); - mSyncTask.execute(); - } - } - - private void cancelSync() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - @Override - public void onCreate() { - mSyncTask = null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Bundle bundle = intent.getExtras(); - if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) { - switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) { - case ACTION_START_SYNC: - startSync(); - break; - case ACTION_CANCEL_SYNC: - cancelSync(); - break; - default: - break; - } - return START_STICKY; - } - return super.onStartCommand(intent, flags, startId); - } - - @Override - public void onLowMemory() { - if (mSyncTask != null) { - mSyncTask.cancelSync(); - } - } - - public IBinder onBind(Intent intent) { - return null; - } - - public void sendBroadcast(String msg) { - mSyncProgress = msg; - Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME); - intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null); - intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg); - sendBroadcast(intent); - } - - public static void startSync(Activity activity) { - GTaskManager.getInstance().setActivityContext(activity); - Intent intent = new Intent(activity, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC); - activity.startService(intent); - } - - public static void cancelSync(Context context) { - Intent intent = new Intent(context, GTaskSyncService.class); - intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC); - context.startService(intent); - } - - public static boolean isSyncing() { - return mSyncTask != null; - } - - public static String getProgressString() { - return mSyncProgress; - } -} diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index d97f46e..c71be5b 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -15,128 +15,155 @@ limitations under the License. --> + + + + + + + + + + + + + android:label="@string/app_name" > + + + android:windowSoftInputMode="adjustPan" > + + + android:theme="@style/NoteTheme" > - + + - - + + + + + + + + + android:multiprocess="true" /> + + android:label="@string/app_widget2x2" > + + + + android:label="@string/app_widget4x4" > + + - + + + + + + + diff --git a/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java index e6a9d73..96f28bf 100644 --- a/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -46,23 +46,21 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - // 设置界面显示——无标题 - requestWindowFeature(Window.FEATURE_NO_TITLE); + + requestWindowFeature(Window.FEATURE_NO_TITLE);//设置界面显示——无标题 final Window win = getWindow(); - // 设置窗体属性——在锁屏时显示 - win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + + win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);//设置窗体属性——在锁屏时显示 if (!isScreenOn()) { - // 设置窗体属性——保持点亮、点亮屏幕、允许点亮时解锁 - win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON//保持点亮、点亮屏幕、允许点亮时解锁 | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); } - // 获取传递的 Intent - Intent intent = getIntent(); + Intent intent = getIntent();//获取传递的 Intent try { // 从 Intent 中获取数据并处理——获取标签 ID @@ -80,24 +78,33 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - // 显示对话框 - showActionDialog(); - // 播放闹钟提示音 - playAlarmSound(); + showActionDialog();// 显示对话框 + playAlarmSound();// 播放闹钟提示音 } else { - // 结束当前 Activity - finish(); + finish();// 结束当前 Activity } } - + /** + * @method isScreenOn + * @description + * 判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 + * @date: 12/23/2023 11:21 PM + * @author: YangYizhe + * @param + * @return + */ private boolean isScreenOn() { - //判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } - + /** + * @method playAlarmSound + * @description + * 播放闹钟提示音 + * @date: 12/23/2023 11:21 PM + * @author: YangYizhe + */ private void playAlarmSound() { - //闹钟提示音激发 Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); //调用系统的铃声管理URI,得到闹钟提示音 int silentModeStreams = Settings.System.getInt(getContentResolver(), @@ -110,19 +117,12 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); - //方法:setDataSource(Context context, Uri uri) - //解释:无返回值,设置多媒体数据来源【根据 Uri】 mPlayer.prepare(); - //准备同步 - mPlayer.setLooping(true); - //设置是否循环播放 - mPlayer.start(); - //开始播放 + mPlayer.setLooping(true);//设置是否循环播放 + mPlayer.start();//开始播放 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); - //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 - //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -134,61 +134,67 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD e.printStackTrace(); } } - + /** + * @method showActionDialog + * @description + * AlertDialog的构造方法全部是Protected的 + * 所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 + * 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 + * 如这里的dialog就是新建了一个AlertDialog + * @date: 12/23/2023 11:28 PM + * @author: YangYizhe + */ private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); - /* AlertDialog的构造方法全部是Protected的 - * 所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 - * 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 - * 如这里的dialog就是新建了一个AlertDialog - */ - dialog.setTitle(R.string.app_name); - //为对话框设置标题 - dialog.setMessage(mSnippet); - //为对话框设置内容 - dialog.setPositiveButton(R.string.notealert_ok, this); - //给对话框添加"Yes"按钮 + dialog.setTitle(R.string.app_name);//为对话框设置标题 + dialog.setMessage(mSnippet);//为对话框设置内容 + dialog.setPositiveButton(R.string.notealert_ok, this);//给对话框添加"Yes"按钮 if (isScreenOn()) { - dialog.setNegativeButton(R.string.notealert_enter, this); - }//对话框添加"No"按钮 + dialog.setNegativeButton(R.string.notealert_enter, this);//对话框添加"No"按钮 + } dialog.show().setOnDismissListener(this); } - + /** + * @method onClick + * @description 处理点击事件 + * @date: 12/23/2023 11:27 PM + * @author: YangYizhe + * @param dialog + * @param which + */ public void onClick(DialogInterface dialog, int which) { - switch (which) { - //用which来选择click后下一步的操作 - case DialogInterface.BUTTON_NEGATIVE: - //这是取消操作 - Intent intent = new Intent(this, NoteEditActivity.class); - //实现两个类间的数据传输 - intent.setAction(Intent.ACTION_VIEW); - //设置动作属性 - intent.putExtra(Intent.EXTRA_UID, mNoteId); - //实现key-value对 - //EXTRA_UID为key;mNoteId为键 - startActivity(intent); - //开始动作 + switch (which) {//用which来选择click后下一步的操作 + case DialogInterface.BUTTON_NEGATIVE://这是取消操作 + Intent intent = new Intent(this, NoteEditActivity.class);//实现两个类间的数据传输 + intent.setAction(Intent.ACTION_VIEW);//设置动作属性 + intent.putExtra(Intent.EXTRA_UID, mNoteId);//实现key-value对 EXTRA_UID为key;mNoteId为键 + startActivity(intent);//开始动作 break; default: - //这是确定操作 break; } } - + /** + * @method onDismiss + * @description 忽略 + * @date: 12/23/2023 11:25 PM + * @author: YangYizhe + * @param dialog + */ public void onDismiss(DialogInterface dialog) { - //忽略 - stopAlarmSound(); - //停止闹钟声音 + stopAlarmSound();//停止闹钟声音 finish(); - //完成该动作 } - + /** + * @method stopAlarmSound + * @description 停止闹钟的声音 + * @date: 12/23/2023 11:26 PM + * @author: YangYizhe + */ private void stopAlarmSound() { if (mPlayer != null) { - mPlayer.stop(); - //停止播放 - mPlayer.release(); - //释放MediaPlayer对象 + mPlayer.stop();//停止播放 + mPlayer.release();//释放MediaPlayer对象 mPlayer = null; } } diff --git a/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java index 7be84dc..1982fda 100644 --- a/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -22,26 +22,21 @@ import net.micode.notes.data.Notes.NoteColumns; * @Version: 1.0 */ public class AlarmInitReceiver extends BroadcastReceiver { - private static final String [] PROJECTION = new String [] { NoteColumns.ID, NoteColumns.ALERTED_DATE - }; - //对数据库的操作,调用标签ID和闹钟时间 + };//对数据库的操作,调用标签ID和闹钟时间 private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; @Override public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); - //System.currentTimeMillis()产生一个当前的毫秒 - //这个毫秒其实就是自1970年1月1日0时起的毫秒数 + long currentDate = System.currentTimeMillis();//System.currentTimeMillis()产生一个当前的毫秒 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, - //将long变量currentDate转化为字符串 - null); + null);//将long变量currentDate转化为字符串 //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 if (c != null) { diff --git a/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/main/java/net/micode/notes/ui/AlarmReceiver.java index a4c7120..646f69f 100644 --- a/src/main/java/net/micode/notes/ui/AlarmReceiver.java +++ b/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -6,7 +6,7 @@ import android.content.Intent; /** * @Package: net.micode.notes.ui * @ClassName: AlarmReceiver - * @Description: + * @Description: 闹钟接收器,接收到闹钟触发的广播后启动AlarmAlertActivity进行闹钟提醒 * @Author: YangYizhe * @CreateDate: 12/17/2023 10:02 AM * @UpdateUser: none @@ -17,14 +17,9 @@ import android.content.Intent; public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); - //启动AlarmAlertActivity + intent.setClass(context, AlarmAlertActivity.class);//启动AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 - //所以要新起一个栈装入启动的activity - context.startActivity(intent); + context.startActivity(intent);//启动闹钟提醒界面 } } -//这是实现alarm这个功能最接近用户层的包,基于上面的两个包, -//作用还需要深究但是对于setClass和addFlags的 \ No newline at end of file diff --git a/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/main/java/net/micode/notes/ui/DateTimePicker.java index bc0485b..9cf4ba6 100644 --- a/src/main/java/net/micode/notes/ui/DateTimePicker.java +++ b/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -51,8 +51,7 @@ public class DateTimePicker extends FrameLayout { private final NumberPicker mHourSpinner; private final NumberPicker mMinuteSpinner; private final NumberPicker mAmPmSpinner; - //定义了Calendar类型的变量mDate,用于操作时间 - private Calendar mDate; + private Calendar mDate;//定义了Calendar类型的变量mDate,用于操作时间 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; private boolean mIsAm; @@ -180,25 +179,24 @@ public class DateTimePicker extends FrameLayout { * 构造方法 */ public DateTimePicker(Context context) { - //通过对数据库的访问,获取当前的系统时间 - this(context, System.currentTimeMillis()); + this(context, System.currentTimeMillis());//通过对数据库的访问,获取当前的系统时间 } public DateTimePicker(Context context, long date) { - //上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 - this(context, date, DateFormat.is24HourFormat(context)); + this(context, date, DateFormat.is24HourFormat(context));//上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 } public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); - //获取系统时间 - mDate = Calendar.getInstance(); + mDate = Calendar.getInstance();//获取系统时间 mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - //如果当前Activity里用到别的layout,比如对话框layout - //还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 - //然后再用findViewById()找到它上面的其它组件 + /* + * 如果当前Activity里用到别的layout,比如对话框layout + * 还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 + * 然后再用findViewById()找到它上面的其它组件 + */ mDateSpinner = (NumberPicker) findViewById(R.id.date); mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); diff --git a/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/main/java/net/micode/notes/ui/NotesListActivity.java index 273c303..2b0e901 100644 --- a/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -832,8 +832,6 @@ public class NotesListActivity extends Activity implements OnClickListener, OnIt * @description: 生成便签初始界面 * @date: 2023/12/21 1:16 * @author: WUSHUXIAN - * @param - * @return */ private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { diff --git a/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/main/java/net/micode/notes/ui/NotesListAdapter.java index ba80e67..4492ca9 100644 --- a/src/main/java/net/micode/notes/ui/NotesListAdapter.java +++ b/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -1,19 +1,3 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; import android.content.Context; @@ -23,6 +7,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; + import net.micode.notes.data.Notes; import java.util.Collection; @@ -31,62 +16,119 @@ import java.util.HashSet; import java.util.Iterator; /** - * @Package: net.micode.notes.ui - * @ClassName: NotesListAdapter - * @Description: java类作用描述 - * @Author: WUSHUXIAN - * @CreateDate: 2023/12/20 23:04 - * @Version: 1.0 + * @Package: net.micode.notes.ui + * @ClassName: NotesListAdapter + * @Description: + * 直译为便签表连接器,继承了CursorAdapter,它为cursor和ListView提供了连接的桥梁。 + * 所以NotesListAdapter实现的是鼠标和编辑便签链接的桥梁 + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:35 PM + * @Version: 1.0 */ public class NotesListAdapter extends CursorAdapter { private static final String TAG = "NotesListAdapter"; private Context mContext; private HashMap mSelectedIndex; - private int mNotesCount; - private boolean mChoiceMode; + private int mNotesCount; //便签数 + private boolean mChoiceMode; //选择模式标记 + /* + * 桌面widget的属性,包括编号和类型 + */ public static class AppWidgetAttribute { public int widgetId; public int widgetType; }; - + /** + * @method NotesListAdapter + * @description + * 初始化便签链接器 + * 函数实现:根据传进来的内容设置相关变量 + * @date: 12/23/2023 11:35 PM + * @author: YangYizhe + * @param context + */ public NotesListAdapter(Context context) { - super(context, null); - mSelectedIndex = new HashMap(); + super(context, null); //父类对象置空 + mSelectedIndex = new HashMap(); //新建选项下标的hash表 mContext = context; mNotesCount = 0; } @Override + /** + * @method newView + * @description + * 新建一个视图来存储光标所指向的数据 + * 通过使用兄弟类NotesListItem新建一个项目选项 + * @date: 12/23/2023 11:35 PM + * @author: YangYizhe + * @param [context, cursor, parent] + * @return android.view.View + */ public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); } - @Override + /** + * @method bindView + * @description 将已经存在的视图和鼠标指向的数据进行捆绑 + * @date: 12/23/2023 11:41 PM + * @author: YangYizhe + * @param [view, context, cursor] + * @return void + */ public void bindView(View view, Context context, Cursor cursor) { if (view instanceof NotesListItem) { + //若view是NotesListItem的一个实例 + //则新建一个项目选项并且用bind跟将view和鼠标,内容,便签数据捆绑在一起 NoteItemData itemData = new NoteItemData(context, cursor); ((NotesListItem) view).bind(context, itemData, mChoiceMode, isSelectedItem(cursor.getPosition())); } } - + /** + * @method setCheckedItem + * @description 设置勾选框 + * @date: 12/23/2023 11:41 PM + * @author: YangYizhe + * @param checked + * @param position + * @return void + */ public void setCheckedItem(final int position, final boolean checked) { mSelectedIndex.put(position, checked); + //根据定位和是否勾选设置下标 notifyDataSetChanged(); + //在修改后刷新activity } public boolean isInChoiceMode() { return mChoiceMode; - } + }//判断单选按钮是否勾选 + /** + * @method setChoiceMode + * @description 设置单项选项框 + * @date: 12/23/2023 11:40 PM + * @author: YangYizhe + * @param + * @return + */ public void setChoiceMode(boolean mode) { mSelectedIndex.clear(); mChoiceMode = mode; } + /** + * @method selectAll + * @description 选择全部选项 + * @date: 12/23/2023 11:40 PM + * @author: YangYizhe + * @param checked + */ public void selectAll(boolean checked) { - Cursor cursor = getCursor(); + Cursor cursor = getCursor();//获取光标位置 for (int i = 0; i < getCount(); i++) { if (cursor.moveToPosition(i)) { if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { @@ -94,14 +136,25 @@ public class NotesListAdapter extends CursorAdapter { } } } + //遍历所有光标可用的位置在判断为便签类型之后勾选单项框 } - + /** + * @method getSelectedItemIds + * @description 建立选择项的下标列表 + * @date: 12/23/2023 11:39 PM + * @author: YangYizhe + * @param + * @return + */ public HashSet getSelectedItemIds() { - HashSet itemSet = new HashSet(); + HashSet itemSet = new HashSet();//建立hash表 for (Integer position : mSelectedIndex.keySet()) { + //遍历所有的关键 if (mSelectedIndex.get(position) == true) { + //若光标位置可用 Long id = getItemId(position); if (id == Notes.ID_ROOT_FOLDER) { + //原文件不需要添加 Log.d(TAG, "Wrong item id, should not happen"); } else { itemSet.add(id); @@ -111,13 +164,22 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } - + /** + * @method getSelectedWidget + * @description 建立桌面Widget的选项表 + * @date: 12/23/2023 11:39 PM + * @author: YangYizhe + * @param + * @return + */ public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { if (mSelectedIndex.get(position) == true) { Cursor c = (Cursor) getItem(position); + //以上4句和getSelectedItemIds一样,不再重复 if (c != null) { + //光标位置可用的话就建立新的Widget属性并编辑下标和类型,最后添加到选项集中 AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); @@ -135,26 +197,45 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } + /** + * @method getSelectedCount + * @description 获取选项个数 + * @date: 12/23/2023 11:39 PM + * @author: YangYizhe + */ public int getSelectedCount() { - Collection values = mSelectedIndex.values(); + Collection values = mSelectedIndex.values();//首先获取选项下标的值 if (null == values) { return 0; } - Iterator iter = values.iterator(); + Iterator iter = values.iterator();//初始化叠加器 int count = 0; while (iter.hasNext()) { if (true == iter.next()) { - count++; + count++;//若value值为真计数+1 } } return count; } + /** + * @method isAllSelected + * @description 判断是否全部选中 + * @date: 12/23/2023 11:38 PM + * @author: YangYizhe + */ public boolean isAllSelected() { int checkedCount = getSelectedCount(); - return (checkedCount != 0 && checkedCount == mNotesCount); + return (checkedCount != 0 && checkedCount == mNotesCount);//获取选项数看是否等于便签的个数 } - + /** + * @method isSelectedItem + * @description 判断是否为选项表,通过传递的下标来确定 + * @date: 12/23/2023 11:38 PM + * @author: YangYizhe + * @param + * @return + */ public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { return false; @@ -163,24 +244,48 @@ public class NotesListAdapter extends CursorAdapter { } @Override + /** + * @method onContentChanged + * @description 在activity内容发生局部变动的时候回调该函数计算便签的数量 + * @date: 12/23/2023 11:38 PM + * @author: YangYizhe + * @param [] + * @return void + */ protected void onContentChanged() { super.onContentChanged(); - calcNotesCount(); + calcNotesCount();//执行基类函数 } @Override + /** + * @method changeCursor + * @description 在activity光标发生局部变动的时候回调该函数计算便签的数量 + * @date: 12/23/2023 11:37 PM + * @author: YangYizhe + * @param [cursor] + * @return void + */ public void changeCursor(Cursor cursor) { super.changeCursor(cursor); - calcNotesCount(); + calcNotesCount();//执行基类函数 } - + /** + * @method calcNotesCount + * @description 计算便签数量 + * @date: 12/23/2023 11:37 PM + * @author: YangYizhe + * @param + * @return + */ private void calcNotesCount() { mNotesCount = 0; for (int i = 0; i < getCount(); i++) { + //获取总数同时遍历 Cursor c = (Cursor) getItem(i); if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; + mNotesCount++;//若该位置不为空并且文本类型为便签就+1 } } else { Log.e(TAG, "Invalid cursor"); @@ -188,4 +293,4 @@ public class NotesListAdapter extends CursorAdapter { } } } -} +} \ No newline at end of file diff --git a/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/main/java/net/micode/notes/ui/NotesListItem.java index 25dc2e4..d32a37b 100644 --- a/src/main/java/net/micode/notes/ui/NotesListItem.java +++ b/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -1,19 +1,3 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package net.micode.notes.ui; import android.content.Context; @@ -29,45 +13,51 @@ import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser.NoteItemBgResources; + /** - * @Package: net.micode.notes.ui - * @ClassName: NotesListItem - * @Description: java类作用描述 - * @Author: WUSHUXIAN - * @CreateDate: 2023/12/20 23:09 - * @Version: 1.0 + * @Package: net.micode.notes.ui + * @ClassName: NotesListItem + * @Description: + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:35 PM + * @Version: 1.0 */ 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; //打钩框 + /*初始化基本信息*/ public NotesListItem(Context context) { - super(context); - inflate(context, R.layout.note_item, this); + super(context); //super()它的主要作用是调整调用父类构造函数的顺序 + inflate(context, R.layout.note_item, this);//Inflate可用于将一个xml中定义的布局控件找出来,这里的xml是r。layout + //findViewById用于从contentView中查找指定ID的View,转换出来的形式根据需要而定; mAlert = (ImageView) findViewById(R.id.iv_alert_icon); mTitle = (TextView) findViewById(R.id.tv_title); mTime = (TextView) findViewById(R.id.tv_time); mCallName = (TextView) findViewById(R.id.tv_name); mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); } - + ///根据data的属性对各个控件的属性的控制,主要是可见性Visibility,内容setText,格式setTextAppearance public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { if (choiceMode && data.getType() == Notes.TYPE_NOTE) { - mCheckBox.setVisibility(View.VISIBLE); - mCheckBox.setChecked(checked); + mCheckBox.setVisibility(View.VISIBLE); ///设置可见行为可见 + mCheckBox.setChecked(checked); ///格子打钩 } else { mCheckBox.setVisibility(View.GONE); } mItemData = data; + ///设置控件属性,一共三种情况,由data的id和父id是否与保存到文件夹的id一致来决定 if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { mCallName.setVisibility(View.GONE); mAlert.setVisibility(View.VISIBLE); + //设置该textview的style mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); + //settext为设置内容 mTitle.setText(context.getString(R.string.call_record_folder_name) + context.getString(R.string.format_folder_files_count, data.getNotesCount())); mAlert.setImageResource(R.drawable.call_record); @@ -76,8 +66,9 @@ public class NotesListItem extends LinearLayout { mCallName.setText(data.getCallName()); mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + ///关于闹钟的设置 if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); + mAlert.setImageResource(R.drawable.clock);//图片来源的设置 mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); @@ -85,45 +76,48 @@ public class NotesListItem extends LinearLayout { } else { mCallName.setVisibility(View.GONE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - + ///设置title格式 if (data.getType() == Notes.TYPE_FOLDER) { mTitle.setText(data.getSnippet() + context.getString(R.string.format_folder_files_count, - data.getNotesCount())); + data.getNotesCount())); mAlert.setVisibility(View.GONE); } else { mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock); + mAlert.setImageResource(R.drawable.clock);///设置图片来源 mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); } } } - mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + ///设置内容,获取相关时间,从data里编辑的日期中获取 + mTime. setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); setBackground(data); } - + //根据data的文件属性来设置背景 private void setBackground(NoteItemData data) { int id = data.getBgColorId(); + //,若是note型文件,则4种情况,对于4种不同情况的背景来源 if (data.getType() == Notes.TYPE_NOTE) { + //单个数据并且只有一个子文件夹 if (data.isSingle() || data.isOneFollowingFolder()) { setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); - } else if (data.isLast()) { + } else if (data.isLast()) {//是最后一个数据 setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); - } else if (data.isFirst() || data.isMultiFollowingFolder()) { + } else if (data.isFirst() || data.isMultiFollowingFolder()) {//是一个数据并有多个子文件夹 setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); } else { setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); } } else { + //若不是note直接调用文件夹的背景来源 setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } - public NoteItemData getItemData() { return mItemData; } -} +} \ No newline at end of file diff --git a/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java index 6f8a89f..e4109c6 100644 --- a/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java +++ b/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -31,78 +31,68 @@ import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.gtask.remote.GTaskSyncService; -/* - *该类功能:NotesPreferenceActivity,在小米便签中主要实现的是对背景颜色和字体大小的数据储存。 - * 继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity +/** + * @Package: net.micode.notes.ui + * @ClassName: NotesPreferenceActivity + * @Description: + * NotesPreferenceActivity,在小米便签中主要实现的是对背景颜色和字体大小的数据储存。 + * 继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:42 PM + * @Version: 1.0 */ 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_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 PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key";//同步密码 private static final String AUTHORITIES_FILTER_KEY = "authorities"; - //本地密码 - private PreferenceCategory mAccountCategory; - //账户分组 - private GTaskReceiver mReceiver; - //同步任务接收器 - private Account[] mOriAccounts; - //账户 - private boolean mHasAddedAccount; - //账户的hash标记 + private PreferenceCategory mAccountCategory;//账户分组 + private GTaskReceiver mReceiver;//同步任务接收器 + private Account[] mOriAccounts;//账户 + private boolean mHasAddedAccount;//账户的hash标记 @Override - /* - *函数功能:创建一个activity,在函数里要完成所有的正常静态设置 - *参数:Bundle icicle:存放了 activity 当前的状态 - *函数实现:如下注释 + /** + * @method onCreate + * @description 创建一个activity,在函数里要完成所有的正常静态设置 + * @date: 12/23/2023 11:43 PM + * @author: YangYizhe + * @param [icicle] + * @return void */ protected void onCreate(Bundle icicle) { - //先执行父类的创建函数 super.onCreate(icicle); - /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); - //给左上角图标的左边加上一个返回的图标 - - addPreferencesFromResource(R.xml.preferences); - //添加xml来源并显示 xml - mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); - //根据同步账户关键码来初始化分组 + getActionBar().setDisplayHomeAsUpEnabled(true);//给左上角图标的左边加上一个返回的图标 + addPreferencesFromResource(R.xml.preferences);//添加xml来源并显示 xml + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);//根据同步账户关键码来初始化分组 mReceiver = new GTaskReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); - //初始化同步组件 - + registerReceiver(mReceiver, filter);//初始化同步组件 mOriAccounts = null; - View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - //获取listvivew,ListView的作用:用于列出所有选择 - getListView().addHeaderView(header, null, true); - //在listview组件上方添加其他组件 + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);//获取listvivew,ListView的作用:用于列出所有选择 + getListView().addHeaderView(header, null, true);//在listview组件上方添加其他组件 } @Override - /* - * 函数功能:activity交互功能的实现,用于接受用户的输入 - * 函数实现:如下注释 + /** + * @method onResume + * @description activity交互功能的实现,用于接受用户的输入 + * @date: 12/23/2023 11:44 PM + * @author: YangYizhe + * @return void */ protected void onResume() { - //先执行父类 的交互实现 super.onResume(); // need to set sync account automatically if user has added a new // account if (mHasAddedAccount) { //若用户新加了账户则自动设置同步账户 - Account[] accounts = getGoogleAccounts(); - //获取google同步账户 + Account[] accounts = getGoogleAccounts();//获取google同步账户 if (mOriAccounts != null && accounts.length > mOriAccounts.length) { //若原账户不为空且当前账户有增加 for (Account accountNew : accounts) { @@ -123,37 +113,31 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } - refreshUI(); - //刷新标签界面 + refreshUI();//刷新标签界面 } @Override - /* - * 函数功能:销毁一个activity - * 函数实现:如下注释 - */ protected void onDestroy() { if (mReceiver != null) { - unregisterReceiver(mReceiver); - //注销接收器 + unregisterReceiver(mReceiver);//注销接收器 } - super.onDestroy(); - //执行父类的销毁动作 + super.onDestroy();//执行父类的销毁动作 } - /* - * 函数功能:重新设置账户信息 - * 函数实现:如下注释 + /** + * @method loadAccountPreference + * @description 重新设置账户信息 + * @date: 12/23/2023 11:45 PM + * @author: YangYizhe + * @param + * @return */ private void loadAccountPreference() { - mAccountCategory.removeAll(); - //销毁所有的分组 - Preference accountPref = new Preference(this); - //建立首选项 + mAccountCategory.removeAll();//销毁所有的分组 + Preference accountPref = new Preference(this);//建立首选项 final String defaultAccount = getSyncAccountName(this); accountPref.setTitle(getString(R.string.preferences_account_title)); - accountPref.setSummary(getString(R.string.preferences_account_summary)); - //设置首选项的大标题和小标题 + accountPref.setSummary(getString(R.string.preferences_account_summary));//设置首选项的大标题和小标题 accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { //建立监听器 @@ -177,14 +161,15 @@ public class NotesPreferenceActivity extends PreferenceActivity { return true; } }); - - //根据新建首选项编辑新的账户分组 - mAccountCategory.addPreference(accountPref); + mAccountCategory.addPreference(accountPref);//根据新建首选项编辑新的账户分组 } - - /* - *函数功能:设置按键的状态和最后同步的时间 - *函数实现:如下注释 + /** + * @method loadSyncButton + * @description 设置按键的状态和最后同步的时间 + * @date: 12/23/2023 11:46 PM + * @author: YangYizhe + * @param + * @return */ private void loadSyncButton() { Button syncButton = (Button) findViewById(R.id.preference_sync_button); @@ -199,20 +184,16 @@ public class NotesPreferenceActivity extends PreferenceActivity { public void onClick(View v) { GTaskSyncService.cancelSync(NotesPreferenceActivity.this); } - }); - //设置按钮显示的文本为“取消同步”以及监听器 + });//设置按钮显示的文本为“取消同步”以及监听器 } else { syncButton.setText(getString(R.string.preferences_button_sync_immediately)); syncButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { GTaskSyncService.startSync(NotesPreferenceActivity.this); } - }); - //若是不同步则设置按钮显示的文本为“立即同步”以及对应监听器 + });//若是不同步则设置按钮显示的文本为“立即同步”以及对应监听器 } - syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - //设置按键可用还是不可用 - + syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this)));//设置按键可用还是不可用 // set last sync time // 设置最终同步时间 if (GTaskSyncService.isSyncing()) { @@ -235,35 +216,38 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } } - /* - *函数功能:刷新标签界面 - *函数实现:调用上文设置账号和设置按键两个函数来实现 + /** + * @method refreshUI + * @description + * 刷新标签界面 + * 调用上文设置账号和设置按键两个函数来实现 + * @date: 12/23/2023 11:46 PM + * @author: YangYizhe */ private void refreshUI() { loadAccountPreference(); loadSyncButton(); } - - /* - * 函数功能:显示账户选择的对话框并进行账户的设置 - * 函数实现:如下注释 + /** + * @method showSelectAccountAlertDialog + * @description 显示账户选择的对话框并进行账户的设置 + * @date: 12/23/2023 11:47 PM + * @author: YangYizhe + * @param + * @return */ private void showSelectAccountAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - //创建一个新的对话框 + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);//创建一个新的对话框 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_select_account_title)); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - //设置标题以及子标题的内容 + subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips));//设置标题以及子标题的内容 dialogBuilder.setCustomTitle(titleView); - dialogBuilder.setPositiveButton(null, null); - //设置对话框的自定义标题,建立一个YES的按钮 + dialogBuilder.setPositiveButton(null, null);//设置对话框的自定义标题,建立一个YES的按钮 Account[] accounts = getGoogleAccounts(); - String defAccount = getSyncAccountName(this); - //获取同步账户信息 + String defAccount = getSyncAccountName(this);//获取同步账户信息 mOriAccounts = accounts; mHasAddedAccount = false; @@ -275,8 +259,7 @@ public class NotesPreferenceActivity extends PreferenceActivity { int index = 0; for (Account account : accounts) { if (TextUtils.equals(account.name, defAccount)) { - checkedItem = index; - //在账户列表中查询到所需账户 + checkedItem = index;//在账户列表中查询到所需账户 } items[index++] = account.name; } @@ -285,21 +268,16 @@ public class NotesPreferenceActivity extends PreferenceActivity { new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { setSyncAccount(itemMapping[which].toString()); - dialog.dismiss(); - //取消对话框 + dialog.dismiss();//取消对话框 refreshUI(); } - //设置点击后执行的事件,包括检录新同步账户和刷新标签界面 - }); - //建立对话框网络版的监听器 + });//建立对话框网络版的监听器 } View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); - dialogBuilder.setView(addAccountView); - //给新加账户对话框设置自定义样式 + dialogBuilder.setView(addAccountView);//给新加账户对话框设置自定义样式 - final AlertDialog dialog = dialogBuilder.show(); - //显示对话框 + final AlertDialog dialog = dialogBuilder.show();//显示对话框 addAccountView.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mHasAddedAccount = true; @@ -313,32 +291,28 @@ public class NotesPreferenceActivity extends PreferenceActivity { //跳回上一个选项 dialog.dismiss(); } - }); - //建立新加账户对话框的监听器 + });//建立新加账户对话框的监听器 } - - /* - * 函数功能:显示账户选择对话框和相关账户操作 - * 函数实现:如下注释 + /** + * @method showChangeAccountConfirmAlertDialog + * @description 显示账户选择对话框和相关账户操作 + * @date: 12/23/2023 11:48 PM + * @author: YangYizhe */ private void showChangeAccountConfirmAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - //创建一个新的对话框 + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);//创建一个新的对话框 View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, getSyncAccountName(this))); TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); - //根据同步修改的账户信息设置标题以及子标题的内容 - dialogBuilder.setCustomTitle(titleView); - //设置对话框的自定义标题 + subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg));//根据同步修改的账户信息设置标题以及子标题的内容 + dialogBuilder.setCustomTitle(titleView);//设置对话框的自定义标题 CharSequence[] menuItemArray = new CharSequence[] { getString(R.string.preferences_menu_change_account), getString(R.string.preferences_menu_remove_account), getString(R.string.preferences_menu_cancel) }; - //定义一些标记字符串 dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { //设置对话框要显示的一个list,用于显示几个命令时,即change,remove,cancel public void onClick(DialogInterface dialog, int which) { @@ -353,42 +327,42 @@ public class NotesPreferenceActivity extends PreferenceActivity { } } }); - dialogBuilder.show(); - //显示对话框 + dialogBuilder.show();//显示对话框 } - /* - *函数功能:获取谷歌账户 - *函数实现:通过账户管理器直接获取 + /** + * @method getGoogleAccounts + * @description + * 获取谷歌账户 + * 通过账户管理器直接获取 + * @date: 12/23/2023 11:49 PM + * @author: YangYizhe */ private Account[] getGoogleAccounts() { AccountManager accountManager = AccountManager.get(this); return accountManager.getAccountsByType("com.google"); } - /* - * 函数功能:设置同步账户 - * 函数实现:如下注释: + /** + * @method setSyncAccount + * @description 设置同步账户 + * @date: 12/23/2023 11:49 PM + * @author: YangYizhe + * @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(); - //编辑共享的首选项 + SharedPreferences.Editor editor = settings.edit();//编辑共享的首选项 if (account != null) { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); } else { editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - //将该账号加入到首选项中 - - editor.commit(); - //提交修改的数据 - + }//将该账号加入到首选项中 - setLastSyncTime(this, 0); - //将最后同步时间清零 + editor.commit();//提交修改的数据 + setLastSyncTime(this, 0);//将最后同步时间清零 // clean up local gtask related info new Thread(new Runnable() { @@ -407,25 +381,23 @@ public class NotesPreferenceActivity extends PreferenceActivity { //将toast的文本信息置为“设置账户成功”并显示出来 } } - /* - * 函数功能:删除同步账户 - * 函数实现:如下注释: + /** + * @method removeSyncAccount + * @description 删除同步账户 + * @date: 12/23/2023 11:49 PM + * @author: YangYizhe */ private void removeSyncAccount() { SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - //设置共享首选项 + SharedPreferences.Editor editor = settings.edit();//设置共享首选项 if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { - editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); - //假如当前首选项中有账户就删除 + editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME);//假如当前首选项中有账户就删除 } if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { - editor.remove(PREFERENCE_LAST_SYNC_TIME); - //删除当前首选项中有账户时间 + editor.remove(PREFERENCE_LAST_SYNC_TIME);//删除当前首选项中有账户时间 } - editor.commit(); - //提交更新后的数据 + editor.commit();//提交更新后的数据 // clean up local gtask related info new Thread(new Runnable() { @@ -438,33 +410,43 @@ public class NotesPreferenceActivity extends PreferenceActivity { }).start(); //重置当地同步任务的信息 } - - /* - * 函数功能:获取同步账户名称 - * 函数实现:通过共享的首选项里的信息直接获取 + /** + * @method getSyncAccountName + * @description + * 获取同步账户名称 + * 通过共享的首选项里的信息直接获取 + * @date: 12/23/2023 11:50 PM + * @author: YangYizhe + * @param context */ public static String getSyncAccountName(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); } - - /* - * 函数功能:设置最终同步的时间 - * 函数实现:如下注释 + /** + * @method setLastSyncTime + * @description 设置最终同步的时间 + * @date: 12/23/2023 11:50 PM + * @author: YangYizhe + * @param + * @return */ public static void setLastSyncTime(Context context, long time) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - // 从共享首选项中找到相关账户并获取其编辑器 + SharedPreferences.Editor editor = settings.edit();// 从共享首选项中找到相关账户并获取其编辑器 editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); - editor.commit(); - //编辑最终同步时间并提交更新 + editor.commit();//编辑最终同步时间并提交更新 } - /* - * 函数功能:获取最终同步时间 - * 函数实现:通过共享的首选项里的信息直接获取 + /** + * @method getLastSyncTime + * @description + * 获取最终同步时间 + * 通过共享的首选项里的信息直接获取 + * @date: 12/23/2023 11:51 PM + * @author: YangYizhe + * @param context */ public static long getLastSyncTime(Context context) { SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, @@ -472,10 +454,6 @@ public class NotesPreferenceActivity extends PreferenceActivity { return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); } - /* - * 函数功能:接受同步信息 - * 函数实现:继承BroadcastReceiver - */ private class GTaskReceiver extends BroadcastReceiver { @Override @@ -485,17 +463,17 @@ public class NotesPreferenceActivity extends PreferenceActivity { //获取随广播而来的Intent中的同步服务的数据 TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); syncStatus.setText(intent - .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); - //通过获取的数据在设置系统的状态 + .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG));//通过获取的数据在设置系统的状态 } } } - - /* - * 函数功能:处理菜单的选项 - * 函数实现:如下注释 - * 参数:MenuItem菜单选项 + /** + * @method onOptionsItemSelected + * @description 处理菜单的选项 + * @date: 12/23/2023 11:52 PM + * @author: YangYizhe + * @param item */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java index 5072e81..d1eff49 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java @@ -31,7 +31,14 @@ import net.micode.notes.data.Notes.NoteColumns; import net.micode.notes.tool.ResourceParser; import net.micode.notes.ui.NoteEditActivity; import net.micode.notes.ui.NotesListActivity; -//定义了一个抽象类,提供便签挂件 +/** + * @Package: net.micode.notes.widget + * @ClassName: NoteWidgetProvider + * @Description: 这个抽象类用作MiNote应用程序中笔记小部件的基础。它提供了在主屏幕上更新和管理笔记小部件的功能。 + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:53 PM + * @Version: 1.0 + */ public abstract class NoteWidgetProvider extends AppWidgetProvider { public static final String [] PROJECTION = new String [] { NoteColumns.ID, diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java index adcb2f7..f3d5f1e 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java @@ -23,7 +23,16 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * @Package: net.micode.notes.widget + * @ClassName: NoteWidgetProvider_2x + * @Description: + * 这个类是NoteWidgetProvider的一个具体实现,用于实现2x大小的笔记小部件。 + * 它继承自NoteWidgetProvider,并提供特定于2x小部件的布局ID、背景资源和小部件类型。 + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:55 PM + * @Version: 1.0 + */ public class NoteWidgetProvider_2x extends NoteWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { diff --git a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java index c12a02e..0c3ae50 100644 --- a/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java +++ b/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java @@ -23,7 +23,16 @@ import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.ResourceParser; - +/** + * @Package: net.micode.notes.widget + * @ClassName: NoteWidgetProvider_4x + * @Description: + * 这个类是NoteWidgetProvider的一个具体实现,用于实现4x大小的笔记小部件。 + * 它继承自NoteWidgetProvider,并提供特定于4x小部件的布局ID、背景资源和小部件类型。 + * @Author: YangYizhe + * @CreateDate: 12/23/2023 11:56 PM + * @Version: 1.0 + */ public class NoteWidgetProvider_4x extends NoteWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { diff --git a/src/model/Note.java b/src/model/Note.java deleted file mode 100644 index 864da2c..0000000 --- a/src/model/Note.java +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.model; -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.content.OperationApplicationException; -import android.net.Uri; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; - -import java.util.ArrayList; - -/** - * @Package: net.micode.notes.model - * @ClassName: Note - * @Description: 笔记类,用于操作和管理笔记数据 - * @Author: YangYizhe - * @CreateDate: 12/17/2023 10:06 AM - * @UpdateUser: none - * @UpdateDate: 12/17/2023 10:06 AM - * @UpdateRemark: none - * @Version: 1.0 - */ -public class Note { - private ContentValues mNoteDiffValues; - private NoteData mNoteData; - private static final String TAG = "Note"; - /** - * @method getNewNoteId - * @description 获取新的笔记ID,用于向数据库中添加新的笔记 - * @date: 12/20/2023 11:23 PM - * @author: YangYizhe - * @param folderId 文件夹Id - * @return noteId 新的笔记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); - values.put(NoteColumns.MODIFIED_DATE, createdTime); - values.put(NoteColumns.TYPE, Notes.TYPE_NOTE); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - values.put(NoteColumns.PARENT_ID, folderId); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values); - - long noteId = 0; - try { - noteId = Long.valueOf(uri.getPathSegments().get(1)); - } catch (NumberFormatException e) { - Log.e(TAG, "Get note id error :" + e.toString()); - noteId = 0; - } - if (noteId == -1) { - throw new IllegalStateException("Wrong note id:" + noteId); - } - return noteId; - } - - public Note() { - mNoteDiffValues = new ContentValues(); - mNoteData = new NoteData(); - } - /** - * @method setNoteValue - * @description 设置笔记的值 - * @date: 12/20/2023 11:31 PM - * @author: YangYizhe - * @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()); - } - /** - * @method setTextData - * @description 设置文本数据 - * @date: 12/20/2023 11:31 PM - * @author: YangYizhe - * @param key - * @param value - */ - public void setTextData(String key, String value) { - mNoteData.setTextData(key, value); - } - /** - * @method setTextDataId - * @description 设置文本数据ID - * @date: 12/20/2023 11:33 PM - * @author: YangYizhe - * @param id - */ - public void setTextDataId(long id) { - mNoteData.setTextDataId(id); - } - /** - * @method getTextDataId - * @description 获取文本数据Id - * @date: 12/20/2023 11:34 PM - * @author: YangYizhe - * @return mTextDataId 文本数据Id - */ - public long getTextDataId() { - return mNoteData.mTextDataId; - } - /** - * @method setCallDataId - * @description 设置通话记录数据ID - * @date: 12/20/2023 11:35 PM - * @author: YangYizhe - * @param id 通话记录数据id - */ - public void setCallDataId(long id) { - mNoteData.setCallDataId(id); - } - /** - * @method setCallData - * @description 设置通话记录数据 - * @date: 12/20/2023 11:36 PM - * @author: YangYizhe - * @param key - * @param value - */ - public void setCallData(String key, String value) { - mNoteData.setCallData(key, value); - } - /** - * @method isLocalModified - * @description 判断笔记是否有本地修改 - * @date: 12/20/2023 11:38 PM - * @author: YangYizhe - * @return bool 是否有本地修改 - */ - public boolean isLocalModified() { - return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); - } - /** - * @method syncNote - * @description 同步笔记,将本地修改的数据同步到服务器 - * @date: 12/20/2023 11:42 PM - * @author: YangYizhe - * @param context 上下文对象 - * @param noteId 笔记ID - * @return bool 是否同步成功 - */ - public boolean syncNote(Context context, long noteId) { - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - if (!isLocalModified()) { - return true; - } - - /** - * 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 - */ - 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(); - - if (mNoteData.isLocalModified() - && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { - return false; - } - - return true; - } - - private class NoteData { - private long mTextDataId; - - private ContentValues mTextDataValues; - - private long mCallDataId; - - private ContentValues mCallDataValues; - - private static final String TAG = "NoteData"; - - public NoteData() { - mTextDataValues = new ContentValues(); - mCallDataValues = new ContentValues(); - mTextDataId = 0; - mCallDataId = 0; - } - - boolean isLocalModified() { - return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; - } - - void setTextDataId(long id) { - if(id <= 0) { - throw new IllegalArgumentException("Text data id should larger than 0"); - } - mTextDataId = id; - } - - void setCallDataId(long id) { - if (id <= 0) { - throw new IllegalArgumentException("Call data id should larger than 0"); - } - mCallDataId = id; - } - - void setCallData(String key, String value) { - mCallDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - void setTextData(String key, String value) { - mTextDataValues.put(key, value); - mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); - mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); - } - - Uri pushIntoContentResolver(Context context, long noteId) { - /** - * Check for safety - */ - if (noteId <= 0) { - throw new IllegalArgumentException("Wrong note id:" + noteId); - } - - ArrayList operationList = new ArrayList(); - ContentProviderOperation.Builder builder = null; - - if(mTextDataValues.size() > 0) { - mTextDataValues.put(DataColumns.NOTE_ID, noteId); - if (mTextDataId == 0) { - mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mTextDataValues); - try { - setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new text data fail with noteId" + noteId); - mTextDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mTextDataId)); - builder.withValues(mTextDataValues); - operationList.add(builder.build()); - } - mTextDataValues.clear(); - } - - if(mCallDataValues.size() > 0) { - mCallDataValues.put(DataColumns.NOTE_ID, noteId); - if (mCallDataId == 0) { - mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); - Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, - mCallDataValues); - try { - setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); - } catch (NumberFormatException e) { - Log.e(TAG, "Insert new call data fail with noteId" + noteId); - mCallDataValues.clear(); - return null; - } - } else { - builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( - Notes.CONTENT_DATA_URI, mCallDataId)); - builder.withValues(mCallDataValues); - operationList.add(builder.build()); - } - mCallDataValues.clear(); - } - - if (operationList.size() > 0) { - try { - ContentProviderResult[] results = context.getContentResolver().applyBatch( - Notes.AUTHORITY, operationList); - return (results == null || results.length == 0 || results[0] == null) ? null - : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - return null; - } - } - return null; - } - } -} diff --git a/src/model/WorkingNote.java b/src/model/WorkingNote.java deleted file mode 100644 index 31061f9..0000000 --- a/src/model/WorkingNote.java +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.model; - -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.tool.ResourceParser.NoteBgResources; - -/** - * @Package: net.micode.notes.model - * @ClassName: WorkingNote - * @Description: - * 工作笔记类,用于表示一条工作笔记的信息 - * Note 类是一个基本的笔记类,包含了笔记的基本信息,如标题、内容等 - * WorkingNote 类则是在 Note 类的基础上进行扩展,增加了一些与工作笔记相关的属性和方法,例如提醒日期、背景颜色、小部件等。 - * @Author: YangYizhe - * @CreateDate: 12/20/2023 11:48 PM - * @Version: 1.0 - */ -public class WorkingNote { - // Note for the working note - private Note mNote; - // Note Id - private long mNoteId; - // Note content - private String mContent; - // Note mode - private int mMode; - - private long mAlertDate; - - private long mModifiedDate; - - private int mBgColorId; - - private int mWidgetId; - - private int mWidgetType; - - 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, - DataColumns.MIME_TYPE, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - public static final String[] NOTE_PROJECTION = new String[] { - NoteColumns.PARENT_ID, - NoteColumns.ALERTED_DATE, - NoteColumns.BG_COLOR_ID, - NoteColumns.WIDGET_ID, - NoteColumns.WIDGET_TYPE, - 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 - /** - * @method WorkingNote - * @description 构造方法,创建一个新的工作笔记 - * @date: 12/20/2023 11:54 PM - * @author: YangYizhe - * @param context 上下文环境 - * @param folderId 笔记所属的文件夹ID - */ - private WorkingNote(Context context, long folderId) { - mContext = context; - mAlertDate = 0; - mModifiedDate = System.currentTimeMillis(); - mFolderId = folderId; - mNote = new Note(); - mNoteId = 0; - mIsDeleted = false; - mMode = 0; - mWidgetType = Notes.TYPE_WIDGET_INVALIDE; - } - /** - * @method WorkingNote - * @description 构造方法,加载一个已存在的工作笔记 - * @date: 12/20/2023 11:54 PM - * @author: YangYizhe - * @param context 上下文环境 - * @param noteId 笔记的ID - * @param folderId 笔记所属的文件夹ID - */ - // Existing note construct - private WorkingNote(Context context, long noteId, long folderId) { - mContext = context; - mNoteId = noteId; - mFolderId = folderId; - mIsDeleted = false; - mNote = new Note(); - loadNote(); - } - /** - * @method loadNote - * @description 加载笔记的详细信息 - * @date: 12/20/2023 11:55 PM - * @author: YangYizhe - */ - private void loadNote() { - Cursor cursor = mContext.getContentResolver().query( - ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null, - null, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN); - mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN); - mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN); - mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN); - mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN); - mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN); - } - cursor.close(); - } else { - Log.e(TAG, "No note with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note with id " + mNoteId); - } - loadNoteData(); - } - /** - * @method loadNoteData - * @description 加载笔记的Data - * @date: 12/20/2023 11:55 PM - * @author: YangYizhe - */ - private void loadNoteData() { - Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION, - DataColumns.NOTE_ID + "=?", new String[] { - String.valueOf(mNoteId) - }, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - do { - String type = cursor.getString(DATA_MIME_TYPE_COLUMN); - if (DataConstants.NOTE.equals(type)) { - mContent = cursor.getString(DATA_CONTENT_COLUMN); - mMode = cursor.getInt(DATA_MODE_COLUMN); - mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN)); - } else if (DataConstants.CALL_NOTE.equals(type)) { - mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN)); - } else { - Log.d(TAG, "Wrong note type with type:" + type); - } - } while (cursor.moveToNext()); - } - cursor.close(); - } else { - Log.e(TAG, "No data with id:" + mNoteId); - throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId); - } - } - /** - * @method createEmptyNote - * @description 创建一个空的工作笔记 - * @date: 12/20/2023 11:56 PM - * @author: YangYizhe - * @param context 上下文环境 - * @param folderId 笔记所属的文件夹ID - * @param widgetId 笔记的小部件ID - * @param widgetType 笔记的小部件类型 - * @param defaultBgColorId 笔记的默认背景颜色ID - * @return note 创建的空的工作笔记对象 - */ - public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, - int widgetType, int defaultBgColorId) { - WorkingNote note = new WorkingNote(context, folderId); - note.setBgColorId(defaultBgColorId); - note.setWidgetId(widgetId); - note.setWidgetType(widgetType); - return note; - } - - public static WorkingNote load(Context context, long id) { - return new WorkingNote(context, id, 0); - } - - public synchronized boolean saveNote() { - if (isWorthSaving()) { - if (!existInDatabase()) { - if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { - Log.e(TAG, "Create new note fail with id:" + mNoteId); - return false; - } - } - - 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 - && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - return true; - } else { - return false; - } - } - - public boolean existInDatabase() { - return mNoteId > 0; - } - - private boolean isWorthSaving() { - if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) - || (existInDatabase() && !mNote.isLocalModified())) { - return false; - } else { - return true; - } - } - - public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { - mNoteSettingStatusListener = l; - } - - public void setAlertDate(long date, boolean set) { - if (date != mAlertDate) { - mAlertDate = date; - mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); - } - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onClockAlertChanged(date, set); - } - } - - public void markDeleted(boolean mark) { - mIsDeleted = mark; - if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onWidgetChanged(); - } - } - - public void setBgColorId(int id) { - if (id != mBgColorId) { - mBgColorId = id; - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onBackgroundColorChanged(); - } - mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); - } - } - - public void setCheckListMode(int mode) { - if (mMode != mode) { - if (mNoteSettingStatusListener != null) { - mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); - } - mMode = mode; - mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); - } - } - - public void setWidgetType(int type) { - if (type != mWidgetType) { - mWidgetType = type; - mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); - } - } - - public void setWidgetId(int id) { - if (id != mWidgetId) { - mWidgetId = id; - mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); - } - } - - public void setWorkingText(String text) { - if (!TextUtils.equals(mContent, text)) { - mContent = text; - mNote.setTextData(DataColumns.CONTENT, mContent); - } - } - - public void convertToCallNote(String phoneNumber, long callDate) { - mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); - mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); - mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); - } - - public boolean hasClockAlert() { - return (mAlertDate > 0 ? true : false); - } - - public String getContent() { - return mContent; - } - - public long getAlertDate() { - return mAlertDate; - } - - public long getModifiedDate() { - return mModifiedDate; - } - - public int getBgColorResId() { - return NoteBgResources.getNoteBgResource(mBgColorId); - } - - public int getBgColorId() { - return mBgColorId; - } - - public int getTitleBgResId() { - return NoteBgResources.getNoteTitleBgResource(mBgColorId); - } - - public int getCheckListMode() { - return mMode; - } - - public long getNoteId() { - return mNoteId; - } - - public long getFolderId() { - return mFolderId; - } - - public int getWidgetId() { - return mWidgetId; - } - - 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 - */ - 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 - */ - void onCheckListModeChanged(int oldMode, int newMode); - } -} diff --git a/src/tool/BackupUtils.java b/src/tool/BackupUtils.java deleted file mode 100644 index 39f6ec4..0000000 --- a/src/tool/BackupUtils.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.Context; -import android.database.Cursor; -import android.os.Environment; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.util.Log; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.DataColumns; -import net.micode.notes.data.Notes.DataConstants; -import net.micode.notes.data.Notes.NoteColumns; - -import java.io.File; -import java.io.FileNotFoundException; -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; - - public static synchronized BackupUtils getInstance(Context context) { - if (sInstance == null) { - sInstance = new BackupUtils(context); - } - return sInstance; - } - - /** - * Following states are signs to represents backup or restore - * status - */ - // Currently, the sdcard is not mounted - 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; - - private BackupUtils(Context context) { - mTextExport = new TextExport(context); - } - - private static boolean externalStorageAvailable() { - return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); - } - - public int exportToText() { - return mTextExport.exportToText(); - } - - public String getExportedTextFileName() { - return mTextExport.mFileName; - } - - public String getExportedTextFileDir() { - return mTextExport.mFileDirectory; - } - - private static class TextExport { - private static final String[] NOTE_PROJECTION = { - NoteColumns.ID, - NoteColumns.MODIFIED_DATE, - NoteColumns.SNIPPET, - NoteColumns.TYPE - }; - - 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, - DataColumns.DATA1, - DataColumns.DATA2, - DataColumns.DATA3, - DataColumns.DATA4, - }; - - 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; - private static final int FORMAT_NOTE_CONTENT = 2; - - private Context mContext; - private String mFileName; - private String mFileDirectory; - - public TextExport(Context context) { - TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); - mContext = context; - mFileName = ""; - mFileDirectory = ""; - } - - private String getFormat(int id) { - return TEXT_FORMAT[id]; - } - - /** - * Export the folder identified by folder id to text - */ - 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 - }, null); - - 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()); - } - notesCursor.close(); - } - } - - /** - * Export note identified by id to a print stream - */ - private void exportNoteToText(String noteId, PrintStream ps) { - Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, - DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] { - noteId - }, null); - - if (dataCursor != null) { - if (dataCursor.moveToFirst()) { - 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); - - if (!TextUtils.isEmpty(phoneNumber)) { - 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), - content)); - } - } - } while (dataCursor.moveToNext()); - } - dataCursor.close(); - } - // print a line separator between note - try { - ps.write(new byte[] { - Character.LINE_SEPARATOR, Character.LETTER_NUMBER - }); - } catch (IOException e) { - Log.e(TAG, e.toString()); - } - } - - /** - * Note will be exported as text which is user readable - */ - public int exportToText() { - if (!externalStorageAvailable()) { - Log.d(TAG, "Media was not mounted"); - return STATE_SD_CARD_UNMOUONTED; - } - - PrintStream ps = getExportToTextPrintStream(); - if (ps == null) { - 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, - "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND " - + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR " - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null); - - 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); - } else { - folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET); - } - if (!TextUtils.isEmpty(folderName)) { - ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName)); - } - String folderId = folderCursor.getString(NOTE_COLUMN_ID); - exportFolderToText(folderId, ps); - } while (folderCursor.moveToNext()); - } - folderCursor.close(); - } - - // Export notes in root's folder - Cursor noteCursor = mContext.getContentResolver().query( - Notes.CONTENT_NOTE_URI, - NOTE_PROJECTION, - NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID - + "=0", null, null); - - if (noteCursor != null) { - if (noteCursor.moveToFirst()) { - do { - 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()); - } - noteCursor.close(); - } - ps.close(); - - return STATE_SUCCESS; - } - - /** - * Get a print stream pointed to the file {@generateExportedTextFile} - */ - private PrintStream getExportToTextPrintStream() { - File file = generateFileMountedOnSDcard(mContext, R.string.file_path, - R.string.file_name_txt_format); - if (file == null) { - Log.e(TAG, "create file to exported failed"); - return null; - } - mFileName = file.getName(); - mFileDirectory = mContext.getString(R.string.file_path); - PrintStream ps = null; - try { - FileOutputStream fos = new FileOutputStream(file); - ps = new PrintStream(fos); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return null; - } catch (NullPointerException e) { - e.printStackTrace(); - return null; - } - return ps; - } - } - - /** - * Generate the text file to store imported data - */ - private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { - StringBuilder sb = new StringBuilder(); - sb.append(Environment.getExternalStorageDirectory()); - sb.append(context.getString(filePathResId)); - File filedir = new File(sb.toString()); - sb.append(context.getString( - fileNameFormatResId, - DateFormat.format(context.getString(R.string.format_date_ymd), - System.currentTimeMillis()))); - File file = new File(sb.toString()); - - try { - if (!filedir.exists()) { - filedir.mkdir(); - } - if (!file.exists()) { - file.createNewFile(); - } - return file; - } catch (SecurityException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } -} - - diff --git a/src/tool/DataUtils.java b/src/tool/DataUtils.java deleted file mode 100644 index 2a14982..0000000 --- a/src/tool/DataUtils.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.ContentProviderOperation; -import android.content.ContentProviderResult; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.OperationApplicationException; -import android.database.Cursor; -import android.os.RemoteException; -import android.util.Log; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.CallNote; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; - -import java.util.ArrayList; -import java.util.HashSet; - - -public class DataUtils { - public static final String TAG = "DataUtils"; - public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - if (ids.size() == 0) { - Log.d(TAG, "no id is in the hashset"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - if(id == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Don't delete system folder root"); - continue; - } - ContentProviderOperation.Builder builder = ContentProviderOperation - .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - operationList.add(builder.build()); - } - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.PARENT_ID, desFolderId); - values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null); - } - - public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids, - long folderId) { - if (ids == null) { - Log.d(TAG, "the ids is null"); - return true; - } - - ArrayList operationList = new ArrayList(); - for (long id : ids) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id)); - builder.withValue(NoteColumns.PARENT_ID, folderId); - builder.withValue(NoteColumns.LOCAL_MODIFIED, 1); - operationList.add(builder.build()); - } - - try { - ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList); - if (results == null || results.length == 0 || results[0] == null) { - Log.d(TAG, "delete notes failed, ids:" + ids.toString()); - return false; - } - return true; - } catch (RemoteException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } catch (OperationApplicationException e) { - Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); - } - return false; - } - - /** - * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}} - */ - public static int getUserFolderCount(ContentResolver resolver) { - Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { "COUNT(*)" }, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)}, - null); - - int count = 0; - if(cursor != null) { - if(cursor.moveToFirst()) { - try { - count = cursor.getInt(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "get folder count failed:" + e.toString()); - } finally { - cursor.close(); - } - } - } - return count; - } - - public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, - NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER, - new String [] {String.valueOf(type)}, - null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { - Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), - null, null, null, null); - - boolean exist = false; - if (cursor != null) { - if (cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, - NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + - " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + - " AND " + NoteColumns.SNIPPET + "=?", - new String[] { name }, null); - boolean exist = false; - if(cursor != null) { - if(cursor.getCount() > 0) { - exist = true; - } - cursor.close(); - } - return exist; - } - - public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { - Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, - new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, - NoteColumns.PARENT_ID + "=?", - new String[] { String.valueOf(folderId) }, - null); - - HashSet set = null; - if (c != null) { - if (c.moveToFirst()) { - set = new HashSet(); - do { - try { - AppWidgetAttribute widget = new AppWidgetAttribute(); - widget.widgetId = c.getInt(0); - widget.widgetType = c.getInt(1); - set.add(widget); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, e.toString()); - } - } while (c.moveToNext()); - } - c.close(); - } - return set; - } - - public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.PHONE_NUMBER }, - CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?", - new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE }, - null); - - if (cursor != null && cursor.moveToFirst()) { - try { - return cursor.getString(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call number fails " + e.toString()); - } finally { - cursor.close(); - } - } - return ""; - } - - public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { - Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, - new String [] { CallNote.NOTE_ID }, - CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL(" - + CallNote.PHONE_NUMBER + ",?)", - new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber }, - null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - try { - return cursor.getLong(0); - } catch (IndexOutOfBoundsException e) { - Log.e(TAG, "Get call note id fails " + e.toString()); - } - } - cursor.close(); - } - return 0; - } - - public static String getSnippetById(ContentResolver resolver, long noteId) { - Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, - new String [] { NoteColumns.SNIPPET }, - NoteColumns.ID + "=?", - new String [] { String.valueOf(noteId)}, - null); - - if (cursor != null) { - String snippet = ""; - if (cursor.moveToFirst()) { - snippet = cursor.getString(0); - } - cursor.close(); - return snippet; - } - throw new IllegalArgumentException("Note is not found with id: " + noteId); - } - - public static String getFormattedSnippet(String snippet) { - if (snippet != null) { - snippet = snippet.trim(); - int index = snippet.indexOf('\n'); - if (index != -1) { - snippet = snippet.substring(0, index); - } - } - return snippet; - } -} diff --git a/src/tool/GTaskStringUtils.java b/src/tool/GTaskStringUtils.java deleted file mode 100644 index 666b729..0000000 --- a/src/tool/GTaskStringUtils.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -public class GTaskStringUtils { - - 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"; - - 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"; - - public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_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"; - - 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"; - - 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"; - - public final static String GTASK_JSON_NEW_ID = "new_id"; - - public final static String GTASK_JSON_NOTES = "notes"; - - public final static String GTASK_JSON_PARENT_ID = "parent_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"; - - 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"; - - 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/tool/ResourceParser.java b/src/tool/ResourceParser.java deleted file mode 100644 index 1ad3ad6..0000000 --- a/src/tool/ResourceParser.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.tool; - -import android.content.Context; -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 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 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_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 - }; - - public static int getNoteBgResource(int id) { - return BG_EDIT_RESOURCES[id]; - } - - public static int getNoteTitleBgResource(int id) { - return BG_EDIT_TITLE_RESOURCES[id]; - } - } - - public static int getDefaultBgId(Context context) { - if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { - return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length); - } else { - return BG_DEFAULT_COLOR; - } - } - - 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_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_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; - } - } - - 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, - }; - - 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 - }; - - 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 - }; - - 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} - */ - if (id >= TEXTAPPEARANCE_RESOURCES.length) { - return BG_DEFAULT_FONT_SIZE; - } - return TEXTAPPEARANCE_RESOURCES[id]; - } - - public static int getResourcesSize() { - return TEXTAPPEARANCE_RESOURCES.length; - } - } -} diff --git a/src/ui/AlarmAlertActivity.java b/src/ui/AlarmAlertActivity.java deleted file mode 100644 index e6a9d73..0000000 --- a/src/ui/AlarmAlertActivity.java +++ /dev/null @@ -1,195 +0,0 @@ -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.content.DialogInterface.OnDismissListener; -import android.content.Intent; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.RingtoneManager; -import android.net.Uri; -import android.os.Bundle; -import android.os.PowerManager; -import android.provider.Settings; -import android.view.Window; -import android.view.WindowManager; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.DataUtils; - -import java.io.IOException; -/** - * @Package: net.micode.notes.ui - * @ClassName: AlarmAlertActivity - * @Description: 闹钟提醒界面 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:02 AM - * @Version: 1.0 - */ -public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; //文本在数据库存储中的ID号 - private String mSnippet; //闹钟提示时出现的文本片段 - private static final int SNIPPET_PREW_MAX_LEN = 60; - MediaPlayer mPlayer; - /** - * @method onCreate - * @description 当 Activity 创建时调用的生命周期方法 - * @date: 12/21/2023 12:05 AM - * @author: YangYizhe - * @param savedInstanceState 保存 Activity 状态的 Bundle 对象 - * @return null - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // 设置界面显示——无标题 - requestWindowFeature(Window.FEATURE_NO_TITLE); - - final Window win = getWindow(); - // 设置窗体属性——在锁屏时显示 - win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - - if (!isScreenOn()) { - // 设置窗体属性——保持点亮、点亮屏幕、允许点亮时解锁 - win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON - | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON - | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON - | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - - // 获取传递的 Intent - Intent intent = getIntent(); - - try { - // 从 Intent 中获取数据并处理——获取标签 ID - mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); - // 根据 ID 从数据库中获取标签内容 - 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; - } catch (IllegalArgumentException e) { - e.printStackTrace(); - return; - } - - mPlayer = new MediaPlayer(); - if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { - // 显示对话框 - showActionDialog(); - // 播放闹钟提示音 - playAlarmSound(); - } else { - // 结束当前 Activity - finish(); - } - } - - private boolean isScreenOn() { - //判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); - return pm.isScreenOn(); - } - - private void playAlarmSound() { - //闹钟提示音激发 - Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - //调用系统的铃声管理URI,得到闹钟提示音 - int silentModeStreams = Settings.System.getInt(getContentResolver(), - Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - - if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { - mPlayer.setAudioStreamType(silentModeStreams); - } else { - mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); - } - try { - mPlayer.setDataSource(this, url); - //方法:setDataSource(Context context, Uri uri) - //解释:无返回值,设置多媒体数据来源【根据 Uri】 - mPlayer.prepare(); - //准备同步 - mPlayer.setLooping(true); - //设置是否循环播放 - mPlayer.start(); - //开始播放 - } catch (IllegalArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 - //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 - } 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); - /* AlertDialog的构造方法全部是Protected的 - * 所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 - * 要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 - * 如这里的dialog就是新建了一个AlertDialog - */ - dialog.setTitle(R.string.app_name); - //为对话框设置标题 - dialog.setMessage(mSnippet); - //为对话框设置内容 - dialog.setPositiveButton(R.string.notealert_ok, this); - //给对话框添加"Yes"按钮 - if (isScreenOn()) { - dialog.setNegativeButton(R.string.notealert_enter, this); - }//对话框添加"No"按钮 - dialog.show().setOnDismissListener(this); - } - - public void onClick(DialogInterface dialog, int which) { - switch (which) { - //用which来选择click后下一步的操作 - case DialogInterface.BUTTON_NEGATIVE: - //这是取消操作 - Intent intent = new Intent(this, NoteEditActivity.class); - //实现两个类间的数据传输 - intent.setAction(Intent.ACTION_VIEW); - //设置动作属性 - intent.putExtra(Intent.EXTRA_UID, mNoteId); - //实现key-value对 - //EXTRA_UID为key;mNoteId为键 - startActivity(intent); - //开始动作 - break; - default: - //这是确定操作 - break; - } - } - - public void onDismiss(DialogInterface dialog) { - //忽略 - stopAlarmSound(); - //停止闹钟声音 - finish(); - //完成该动作 - } - - private void stopAlarmSound() { - if (mPlayer != null) { - mPlayer.stop(); - //停止播放 - mPlayer.release(); - //释放MediaPlayer对象 - mPlayer = null; - } - } -} \ No newline at end of file diff --git a/src/ui/AlarmInitReceiver.java b/src/ui/AlarmInitReceiver.java deleted file mode 100644 index 7be84dc..0000000 --- a/src/ui/AlarmInitReceiver.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.micode.notes.ui; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ContentUris; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; - -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - -/** - * @Package: net.micode.notes.ui - * @ClassName: AlarmInitReceiver - * @Description: - * AlarmInitReceiver 是一个广播接收器(BroadcastReceiver)的类 - * 广播接收器是 Android 中常用的一种组件,用于接收并处理系统或应用发送的广播消息 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:09 AM - * @Version: 1.0 - */ -public class AlarmInitReceiver extends BroadcastReceiver { - - private static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.ALERTED_DATE - }; - //对数据库的操作,调用标签ID和闹钟时间 - private static final int COLUMN_ID = 0; - private static final int COLUMN_ALERTED_DATE = 1; - - @Override - public void onReceive(Context context, Intent intent) { - long currentDate = System.currentTimeMillis(); - //System.currentTimeMillis()产生一个当前的毫秒 - //这个毫秒其实就是自1970年1月1日0时起的毫秒数 - Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, - new String[] { String.valueOf(currentDate) }, - //将long变量currentDate转化为字符串 - null); - //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 - - if (c != null) { - if (c.moveToFirst()) { - do { - long alertDate = c.getLong(COLUMN_ALERTED_DATE); - Intent sender = new Intent(context, AlarmReceiver.class); - sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); - 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(); - } - } -} \ No newline at end of file diff --git a/src/ui/AlarmReceiver.java b/src/ui/AlarmReceiver.java deleted file mode 100644 index a4c7120..0000000 --- a/src/ui/AlarmReceiver.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.micode.notes.ui; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -/** - * @Package: net.micode.notes.ui - * @ClassName: AlarmReceiver - * @Description: - * @Author: YangYizhe - * @CreateDate: 12/17/2023 10:02 AM - * @UpdateUser: none - * @UpdateDate: 12/17/2023 10:02 AM - * @UpdateRemark: none - * @Version: 1.0 - */ -public class AlarmReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); - //启动AlarmAlertActivity - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 - //所以要新起一个栈装入启动的activity - context.startActivity(intent); - } -} -//这是实现alarm这个功能最接近用户层的包,基于上面的两个包, -//作用还需要深究但是对于setClass和addFlags的 - \ No newline at end of file diff --git a/src/ui/DateTimePicker.java b/src/ui/DateTimePicker.java deleted file mode 100644 index bc0485b..0000000 --- a/src/ui/DateTimePicker.java +++ /dev/null @@ -1,520 +0,0 @@ -package net.micode.notes.ui; - -import java.text.DateFormatSymbols; -import java.util.Calendar; - -import net.micode.notes.R; - - -import android.content.Context; -import android.text.format.DateFormat; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.NumberPicker; -/** - * @Package: net.micode.notes.ui - * @ClassName: DateTimePicker - * @Description: 继承自FrameLayout,实现了日期和时间的选择功能 - * 提供一个用户界面,让用户可以方便地选择日期和时间,并且能够监听用户对日期和时间的改变 - * 构造方法,包括默认构造方法和带参数的构造方法,用于初始化日期选择器的界面和属性; - * 一系列的回调方法,用于监听日期和时间的改变,包括日期选择、小时选择、分钟选择、上午/下午选择等; - * 一些公开的接口方法,用于设置当前日期、时间,设置24小时模式或12小时模式的切换等; - * 辅助方法,用于更新日期、小时、上午/下午选择器的界面显示和属性; - * 回调接口OnDateTimeChangedListener,用于监听日期和时间的改变事件。 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:18 AM - * @Version: 1.0 - */ -public class DateTimePicker extends FrameLayout { - //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 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; - private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23; - private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1; - private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12; - private static final int MINUT_SPINNER_MIN_VAL = 0; - private static final int MINUT_SPINNER_MAX_VAL = 59; - private static final int AMPM_SPINNER_MIN_VAL = 0; - private static final int AMPM_SPINNER_MAX_VAL = 1; - /** - * 初始化控件 - * NumberPicker是数字选择器 - * 这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午) - */ - private final NumberPicker mDateSpinner; - private final NumberPicker mHourSpinner; - private final NumberPicker mMinuteSpinner; - private final NumberPicker mAmPmSpinner; - //定义了Calendar类型的变量mDate,用于操作时间 - 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 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(); - } - };//OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 - - - private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - //这里是对 小时(Hour) 的监听 - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - boolean isDateChanged = false; - Calendar cal = Calendar.getInstance(); - //声明一个Calendar的变量cal,便于后续的操作 - if (!mIs24HourView) { - if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - //这里是对于12小时制时,晚上11点和12点交替时对日期的更改 - } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 - if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || - oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { - mIsAm = !mIsAm; - updateAmPmControl(); - }//这里是对于12小时制时,中午11点和12点交替时对AM和PM的更改 - } else { - if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, 1); - isDateChanged = true; - //这里是对于24小时制时,晚上11点和12点交替时对日期的更改 - } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -1); - isDateChanged = true; - } - } //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 - int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); - //通过数字选择器对newHour的赋值 - mDate.set(Calendar.HOUR_OF_DAY, newHour); - //通过set函数将新的Hour值传给mDate - onDateTimeChanged(); - if (isDateChanged) { - setCurrentYear(cal.get(Calendar.YEAR)); - setCurrentMonth(cal.get(Calendar.MONTH)); - setCurrentDay(cal.get(Calendar.DAY_OF_MONTH)); - } - } - }; - - private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { - @Override - //这里是对 分钟(Minute)改变的监听 - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - int minValue = mMinuteSpinner.getMinValue(); - int maxValue = mMinuteSpinner.getMaxValue(); - int offset = 0; - //设置offset,作为小时改变的一个记录数据 - if (oldVal == maxValue && newVal == minValue) { - offset += 1; - } else if (oldVal == minValue && newVal == maxValue) { - offset -= 1; - } - //如果原值为59,新值为0,则offset加1 - //如果原值为0,新值为59,则offset减1 - if (offset != 0) { - mDate.add(Calendar.HOUR_OF_DAY, offset); - mHourSpinner.setValue(getCurrentHour()); - updateDateControl(); - int newHour = getCurrentHourOfDay(); - if (newHour >= HOURS_IN_HALF_DAY) { - mIsAm = false; - updateAmPmControl(); - } else { - mIsAm = true; - updateAmPmControl(); - } - } - mDate.set(Calendar.MINUTE, newVal); - onDateTimeChanged(); - } - }; - - private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { - //对AM和PM的监听 - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) { - mIsAm = !mIsAm; - if (mIsAm) { - mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); - } else { - mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); - } - updateAmPmControl(); - onDateTimeChanged(); - } - }; - - 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) { - //上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 - this(context, date, DateFormat.is24HourFormat(context)); - } - - public DateTimePicker(Context context, long date, boolean is24HourView) { - super(context); - //获取系统时间 - mDate = Calendar.getInstance(); - mInitialising = true; - mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; - inflate(context, R.layout.datetime_picker, this); - //如果当前Activity里用到别的layout,比如对话框layout - //还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 - //然后再用findViewById()找到它上面的其它组件 - 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); - - String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); - mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); - mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); - mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); - 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; - } - - /** - * @method setEnabled - * @description - * 用于设置是否启用日期选择器控件的功能 - * 先通过传入的参数enabled判断是否需要改变控件的启用状态。 - * 如果传入的参数和当前的启用状态相同,则直接返回,不进行任何操作 - * 如果传入的参数和当前的启用状态不同,则调用父类的setEnabled方法,来设置整个日期选择器控件的启用状态 - * 分别设置日期选择、分钟选择、小时选择、上午/下午选择这几个子控件的启用状态,即调用对应的setEnabled方法,并将enabled参数传入 - * @date: 12/21/2023 12:27 AM - * @author: YangYizhe - * @param enabled - */ - @Override - public void setEnabled(boolean enabled) { - if (mIsEnabled == enabled) { - return; - } - super.setEnabled(enabled); - mDateSpinner.setEnabled(enabled); - mMinuteSpinner.setEnabled(enabled); - mHourSpinner.setEnabled(enabled); - mAmPmSpinner.setEnabled(enabled); - 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(); - cal.setTimeInMillis(date); - setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), - cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } - - /** - * 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) { - setCurrentYear(year); - setCurrentMonth(month); - setCurrentDay(dayOfMonth); - setCurrentHour(hourOfDay); - setCurrentMinute(minute); - } - - /** - * 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()) { - return; - } - mDate.set(Calendar.YEAR, year); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * 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()) { - return; - } - mDate.set(Calendar.MONTH, month); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * 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()) { - return; - } - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - updateDateControl(); - onDateTimeChanged(); - } - - /** - * Get current hour in 24 hour mode, in the range (0~23) - * @return The current hour in 24 hour mode - */ - public int getCurrentHourOfDay() { - return mDate.get(Calendar.HOUR_OF_DAY); - } - - private int getCurrentHour() { - if (mIs24HourView){ - return getCurrentHourOfDay(); - } else { - int hour = getCurrentHourOfDay(); - if (hour > HOURS_IN_HALF_DAY) { - return hour - HOURS_IN_HALF_DAY; - } else { - return hour == 0 ? HOURS_IN_HALF_DAY : hour; - } - } - } - - /** - * Set current hour in 24 hour mode, in the range (0~23) - * - * @param hourOfDay - */ - public void setCurrentHour(int hourOfDay) { - if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { - return; - } - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - if (!mIs24HourView) { - if (hourOfDay >= HOURS_IN_HALF_DAY) { - mIsAm = false; - if (hourOfDay > HOURS_IN_HALF_DAY) { - hourOfDay -= HOURS_IN_HALF_DAY; - } - } else { - mIsAm = true; - if (hourOfDay == 0) { - hourOfDay = HOURS_IN_HALF_DAY; - } - } - updateAmPmControl(); - } - mHourSpinner.setValue(hourOfDay); - onDateTimeChanged(); - } - - /** - * 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()) { - return; - } - mMinuteSpinner.setValue(minute); - mDate.set(Calendar.MINUTE, minute); - onDateTimeChanged(); - } - - /** - * @return true if this is in 24 hour view else false. - */ - 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. - */ - public void set24HourView(boolean is24HourView) { - if (mIs24HourView == is24HourView) { - return; - } - mIs24HourView = is24HourView; - mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); - int hour = getCurrentHourOfDay(); - updateHourControl(); - setCurrentHour(hour); - updateAmPmControl(); - } - /** - * 几个辅助方法,用于更新日期、上午/下午选择和小时选择控件的显示和属性 - * 这些方法的作用是在选择器控件显示之前或用户改变了日期、时间模式时,更新相应控件的显示和属性,以保持界面的正确性和一致性 - */ - private void updateDateControl() { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); - mDateSpinner.setDisplayedValues(null); - for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { - cal.add(Calendar.DAY_OF_YEAR, 1); - mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); - } - mDateSpinner.setDisplayedValues(mDateDisplayValues); - mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); - mDateSpinner.invalidate(); - } - - private void updateAmPmControl() { - if (mIs24HourView) { - mAmPmSpinner.setVisibility(View.GONE); - } else { - int index = mIsAm ? Calendar.AM : Calendar.PM; - mAmPmSpinner.setValue(index); - mAmPmSpinner.setVisibility(View.VISIBLE); - } - } - - private void updateHourControl() { - if (mIs24HourView) { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); - } else { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } - } - - /** - * 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(), - getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); - } - } -} \ No newline at end of file diff --git a/src/ui/DateTimePickerDialog.java b/src/ui/DateTimePickerDialog.java deleted file mode 100644 index c979aec..0000000 --- a/src/ui/DateTimePickerDialog.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.micode.notes.ui; - -import java.util.Calendar; - -import net.micode.notes.R; -import net.micode.notes.ui.DateTimePicker; -import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnClickListener; -import android.text.format.DateFormat; -import android.text.format.DateUtils; -/** - * @Package: net.micode.notes.ui - * @ClassName: DateTimePickerDialog - * @Description: - * DateTimePickerDialog是一个自定义对话框,允许用户选择日期和时间。 - * 它继承自AlertDialog类,并实现OnClickListener接口。 - * 对话框包含一个DateTimePicker控件,用于选择日期和时间。 - * 通过OnDateTimeSetListener接口将选择的日期和时间传递给监听器。 - * 对话框还提供了设置24小时制和使用选择的日期更新对话框标题的方法。 - * onClick方法处理按钮点击事件,并在日期和时间设置完成时通知监听器。 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:32 AM - * @Version: 1.0 - */ -public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - - private Calendar mDate = Calendar.getInstance(); - private boolean mIs24HourView; - private OnDateTimeSetListener mOnDateTimeSetListener; - private DateTimePicker mDateTimePicker; - - /** - * 用于接收用户设置的日期和时间的接口。 - */ - public interface OnDateTimeSetListener { - void OnDateTimeSet(AlertDialog dialog, long date); - } - - /** - * 构造一个新的DateTimePickerDialog。 - * - * @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 如果对话框为24小时制,则为true;否则为false。 - */ - 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 | - DateUtils.FORMAT_SHOW_DATE | - DateUtils.FORMAT_SHOW_TIME; - flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; - - setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); - } - - /** - * 处理按钮点击事件。 - * - * @param arg0 接收到点击事件的对话框。 - * @param arg1 被点击的按钮。 - */ - public void onClick(DialogInterface arg0, int arg1) { - if (mOnDateTimeSetListener != null) { - mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); - } - } - -} \ No newline at end of file diff --git a/src/ui/DropdownMenu.java b/src/ui/DropdownMenu.java deleted file mode 100644 index b437d41..0000000 --- a/src/ui/DropdownMenu.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.micode.notes.ui; - -import android.content.Context; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.PopupMenu; -import android.widget.PopupMenu.OnMenuItemClickListener; - -import net.micode.notes.R; -/** - * @Package: net.micode.notes.ui - * @ClassName: DropdownMenu - * @Description: - * DropdownMenu是一个自定义下拉菜单控件。 - * 它使用Button作为触发器,通过PopupMenu显示菜单选项。 - * 构造函数接收一个上下文环境、一个Button和菜单资源的ID。 - * 通过setOnDropdownMenuItemClickListener方法设置菜单选项的点击监听器。 - * 可以通过findItem方法查找特定的菜单选项。 - * 通过setTitle方法设置下拉菜单的标题 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:36 AM - * @Version: 1.0 - */ -public class DropdownMenu { - private Button mButton; - private PopupMenu mPopupMenu; - //声明一个下拉菜单 - private Menu mMenu; - - public DropdownMenu(Context context, Button button, int menuId) { - mButton = button; - mButton.setBackgroundResource(R.drawable.dropdown_icon); - //设置这个view的背景 - mPopupMenu = new PopupMenu(context, mButton); - mMenu = mPopupMenu.getMenu(); - mPopupMenu.getMenuInflater().inflate(menuId, mMenu); - //MenuInflater是用来实例化Menu目录下的Menu布局文件 - //根据ID来确认menu的内容选项 - mButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - mPopupMenu.show(); - } - }); - } - - public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { - if (mPopupMenu != null) { - mPopupMenu.setOnMenuItemClickListener(listener); - } - } - - public MenuItem findItem(int id) { - return mMenu.findItem(id); - }//对于菜单选项的初始化,根据索引搜索菜单需要的选项 - - public void setTitle(CharSequence title) { - mButton.setText(title); - }//布局文件,设置标题 -} \ No newline at end of file diff --git a/src/ui/FoldersListAdapter.java b/src/ui/FoldersListAdapter.java deleted file mode 100644 index 8c3a217..0000000 --- a/src/ui/FoldersListAdapter.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; - -/** - * @Package: net.micode.notes.ui - * @ClassName: FoldersListAdapter - * @Description: - * FoldersListAdapter是一个用于展示便签文件夹的列表适配器。 - * 它继承了CursorAdapter类,主要负责便签数据库和用户界面的交互。 - * 通过PROJECTION数组定义了需要从数据库中获取的数据列。 - * 它通过newView方法创建文件夹视图,并通过bindView方法将布局文件和数据绑定在一起。 - * getFolderName方法可以根据位置获取对应便签文件夹的名称 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:37 AM - * @Version: 1.0 - */ -public class FoldersListAdapter extends CursorAdapter { - //CursorAdapter是Cursor和ListView的接口 - //FoldersListAdapter继承了CursorAdapter的类 - //主要作用是便签数据库和用户的交互 - //这里就是用folder(文件夹)的形式展现给用户 - public static final String [] PROJECTION = { - NoteColumns.ID, - NoteColumns.SNIPPET - };//调用数据库中便签的ID和片段 - - public static final int ID_COLUMN = 0; - public static final int NAME_COLUMN = 1; - - public FoldersListAdapter(Context context, Cursor c) { - super(context, c); - // TODO Auto-generated constructor stub - }//数据库操作 - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - //ViewGroup是容器 - return new FolderListItem(context); - }//创建一个文件夹,对于各文件夹中子标签的初始化 - - @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); - } - }//将各个布局文件绑定起来 - - public String getFolderName(Context context, int position) { - Cursor cursor = (Cursor) getItem(position); - return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - }//根据数据库中标签的ID得到标签的各项内容 - - private class FolderListItem extends LinearLayout { - private TextView mName; - - public FolderListItem(Context context) { - super(context); - //操作数据库 - inflate(context, R.layout.folder_list_item, this); - //根据布局文件的名字等信息将其找出来 - mName = (TextView) findViewById(R.id.tv_folder_name); - } - - public void bind(String name) { - mName.setText(name); - } - } - -} \ No newline at end of file diff --git a/src/ui/NoteEditActivity.java b/src/ui/NoteEditActivity.java deleted file mode 100644 index eea7cbd..0000000 --- a/src/ui/NoteEditActivity.java +++ /dev/null @@ -1,860 +0,0 @@ -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlarmManager; -import android.app.AlertDialog; -import android.app.PendingIntent; -import android.app.SearchManager; -import android.appwidget.AppWidgetManager; -import android.content.ContentUris; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Paint; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Spannable; -import android.text.SpannableString; -import android.text.TextUtils; -import android.text.format.DateUtils; -import android.text.style.BackgroundColorSpan; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.TextNote; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.model.WorkingNote.NoteSettingChangedListener; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.tool.ResourceParser.TextAppearanceResources; -import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; -import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @Package: net.micode.notes.ui - * @ClassName: NoteEditActivity - * @Description: - * 该类主要是针对标签的编辑 - * 继承了系统内部许多和监听有关的类 - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:47 AM - * @Version: 1.0 - */ -public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener { - /** - * 类属性的定义 - */ - private class HeadViewHolder { - public TextView tvModified; - - public ImageView ivAlertIcon; - - public TextView tvAlertDate; - - public ImageView ibSetBgColor; - } - private static final Map sBgSelectorBtnsMap = new HashMap(); - static { - sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW); - sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED); - sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE); - sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN); - sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE); - } - - private static final Map sBgSelectorSelectionMap = new HashMap(); - static { - sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select); - sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select); - sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select); - sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select); - sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select); - } - - private static final Map sFontSizeBtnsMap = new HashMap(); - static { - sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE); - sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL); - sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM); - sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER); - } - - private static final Map sFontSelectorSelectionMap = new HashMap(); - static { - sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select); - sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select); - } - - private static final String TAG = "NoteEditActivity"; - private HeadViewHolder mNoteHeaderHolder; - private View mHeadViewPanel; - private View mNoteBgColorSelector; - private View mFontSizeSelector; - private EditText mNoteEditor; - private View mNoteEditorPanel; - public 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; - - public static final String TAG_CHECKED = String.valueOf('\u221A'); - public static final String TAG_UNCHECKED = String.valueOf('\u25A1'); - - private LinearLayout mEditTextList; - - private String mUserQuery; - private Pattern mPattern; - /** - *在 Activity 创建时进行一些初始化工作,包括设置布局、初始化状态和资源等操作 - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - this.setContentView(R.layout.note_edit); - 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 - */ - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) { - Intent intent = new Intent(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID)); - if (!initActivityState(intent)) { - finish(); - return; - } - Log.d(TAG, "Restoring from killed activity"); - } - } - - - private boolean initActivityState(Intent intent) { - /** - * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id, - * then jump to the NotesListActivity - */ - mWorkingNote = null; - if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { - long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); - mUserQuery = ""; - /** - * Starting from the searched result - */ - //根据键值查找ID - if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) { - noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY)); - mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY); - } - //如果ID在数据库中未找到 - if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) { - Intent jump = new Intent(this, NotesListActivity.class); - startActivity(jump); - //程序将跳转到上面声明的intent——jump - showToast(R.string.error_note_not_exist); - finish(); - return false; - } - //ID在数据库中找到 - else { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load note failed with note id" + noteId); - //打印出红色的错误信息 - finish(); - return false; - } - } - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { - long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); - int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); - int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, - Notes.TYPE_WIDGET_INVALIDE); - int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, - ResourceParser.getDefaultBgId(this)); - String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); - long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); - if (callDate != 0 && phoneNumber != null) { - if (TextUtils.isEmpty(phoneNumber)) { - Log.w(TAG, "The call record number is null"); - } - long noteId = 0; - if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), - phoneNumber, callDate)) > 0) { - mWorkingNote = WorkingNote.load(this, noteId); - if (mWorkingNote == null) { - Log.e(TAG, "load call note failed with note id" + noteId); - finish(); - return false; - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, - widgetType, bgResId); - mWorkingNote.convertToCallNote(phoneNumber, callDate); - } - } else { - mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, - bgResId); - } - - getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE - | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - } else { - Log.e(TAG, "Intent not specified action, should not support"); - finish(); - return false; - } - mWorkingNote.setOnSettingStatusChangedListener(this); - return true; - } - - - @Override - protected void onResume() { - super.onResume(); - 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 - */ - showAlertHeader(); - } - - private void showAlertHeader() { - if (mWorkingNote.hasClockAlert()) { - long time = System.currentTimeMillis(); - if (time > mWorkingNote.getAlertDate()) { - mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired); - } - else { - mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString( - mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS)); - } - mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE); - } else { - mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE); - mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE); - }; - } - - - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - initActivityState(intent); - } - @Override - 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 - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState"); - } - @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); - return true; - } - return super.dispatchTouchEvent(ev); - } - - private boolean inRangeOfView(View view, MotionEvent ev) { - int []location = new int[2]; - view.getLocationOnScreen(location); - int x = location[0]; - int y = location[1]; - if (ev.getX() < x - || ev.getX() > (x + view.getWidth()) - || ev.getY() < y - || ev.getY() > (y + view.getHeight())) - { - return false; - } - return true; - } - - private void initResources() { - mHeadViewPanel = findViewById(R.id.note_title); - mNoteHeaderHolder = new HeadViewHolder(); - mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date); - mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon); - mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); - mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); - mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); - 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} - */ - if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) { - mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; - } - mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); - } - - @Override - protected void onPause() { - super.onPause(); - if(saveNote()) { - Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length()); - } - clearSettingState(); - } - private void updateWidget() { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - mWorkingNote.getWidgetId() - }); - - sendBroadcast(intent); - 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); - } 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(); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - getWorkingText(); - switchToListMode(mWorkingNote.getContent()); - } else { - mNoteEditor.setTextAppearance(this, - TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - } - mFontSizeSelector.setVisibility(View.GONE); - } - } - - @Override - public void onBackPressed() { - if(clearSettingState()) { - return; - } - - saveNote(); - super.onBackPressed(); - } - - private boolean clearSettingState() { - if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) { - mNoteBgColorSelector.setVisibility(View.GONE); - return true; - } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) { - mFontSizeSelector.setVisibility(View.GONE); - return true; - } - return false; - } - public void onBackgroundColorChanged() { - findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility( - View.VISIBLE); - mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); - mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); - } - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - if (isFinishing()) { - return true; - } - clearSettingState(); - menu.clear(); - if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_note_edit, menu); - } else { - getMenuInflater().inflate(R.menu.note_edit, menu); - } - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode); - } else { - menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode); - } - if (mWorkingNote.hasClockAlert()) { - menu.findItem(R.id.menu_alert).setVisible(false); - } else { - menu.findItem(R.id.menu_delete_remind).setVisible(false); - } - return true; - } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.menu_new_note) { - createNewNote(); - } - else if (itemId == 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); - builder.setMessage(getString(R.string.alert_message_delete_note)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteCurrentNote(); - finish(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - } else if (itemId == R.id.menu_font_size) { - mFontSizeSelector.setVisibility(View.VISIBLE); - findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE); - } else if (itemId == R.id.menu_list_mode) { - mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? - TextNote.MODE_CHECK_LIST : 0); - } else if (itemId == R.id.menu_share) { - getWorkingText(); - sendTo(this, mWorkingNote.getContent()); - } else if (itemId == R.id.menu_send_to_desktop) { - sendToDesktop(); - } else if (itemId == R.id.menu_alert) { - setReminder(); - } else if (itemId == R.id.menu_delete_remind) { - mWorkingNote.setAlertDate(0, false); - } - return true; - } - - private void setReminder() { - DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis()); - d.setOnDateTimeSetListener(new OnDateTimeSetListener() { - public void OnDateTimeSet(AlertDialog dialog, long date) { - mWorkingNote.setAlertDate(date , true); - //选择提醒的日期 - } - }); - d.show(); - } - - - /** - * Share note to apps that support {@link Intent#ACTION_SEND} action - * and {@text/plain} type - */ - private void sendTo(Context context, String info) { - Intent intent = new Intent(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_TEXT, info); - intent.setType("text/plain"); - context.startActivity(intent); - } - private void createNewNote() { - // Firstly, save current editing notes - saveNote(); - - // For safety, start a new NoteEditActivity - finish(); - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId()); - startActivity(intent); - } - private void deleteCurrentNote() { - if (mWorkingNote.existInDatabase()) { - HashSet ids = new HashSet(); - long id = mWorkingNote.getNoteId(); - if (id != Notes.ID_ROOT_FOLDER) { - ids.add(id); - } else { - Log.d(TAG, "Wrong note id, should not happen"); - } - if (!isSyncMode()) { - if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) { - Log.e(TAG, "Delete Note error"); - } - } else { - if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - } - mWorkingNote.markDeleted(true); - } - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - public void onClockAlertChanged(long date, boolean set) { - /** - * User could set clock to an unsaved note, so before setting the - * alert clock, we should save the note first - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - if (mWorkingNote.getNoteId() > 0) { - Intent intent = new Intent(this, AlarmReceiver.class); - intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId())); - PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); - AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE)); - showAlertHeader(); - if(!set) { - alarmManager.cancel(pendingIntent); - } else { - alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent); - } - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Clock alert setting error"); - showToast(R.string.error_note_empty_for_clock); - } - } - public void onWidgetChanged() { - updateWidget(); - } - public void onEditTextDelete(int index, String text) { - int childCount = mEditTextList.getChildCount(); - if (childCount == 1) { - return; - } - - for (int i = index + 1; i < childCount; i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i - 1); - } - - mEditTextList.removeViewAt(index); - NoteEditText edit = null; - if(index == 0) { - edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById( - R.id.et_edit_text); - } else { - edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById( - R.id.et_edit_text); - } - int length = edit.length(); - edit.append(text); - edit.requestFocus(); - edit.setSelection(length); - } - public void onEditTextEnter(int index, String text) { - /** - * Should not happen, check for debug - */ - if(index > mEditTextList.getChildCount()) { - Log.e(TAG, "Index out of mEditTextList boundrary, should not happen"); - } - - View view = getListItem(text, index); - mEditTextList.addView(view, index); - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.requestFocus(); - edit.setSelection(0); - for (int i = index + 1; i < mEditTextList.getChildCount(); i++) { - ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text)) - .setIndex(i); - } - } - private void switchToListMode(String text) { - mEditTextList.removeAllViews(); - String[] items = text.split("\n"); - int index = 0; - for (String item : items) { - if(!TextUtils.isEmpty(item)) { - mEditTextList.addView(getListItem(item, index)); - index++; - } - } - mEditTextList.addView(getListItem("", index)); - mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus(); - - mNoteEditor.setVisibility(View.GONE); - mEditTextList.setVisibility(View.VISIBLE); - } - private Spannable getHighlightQueryResult(String fullText, String userQuery) { - SpannableString spannable = new SpannableString(fullText == null ? "" : fullText); - if (!TextUtils.isEmpty(userQuery)) { - mPattern = Pattern.compile(userQuery); - Matcher m = mPattern.matcher(fullText); - int start = 0; - while (m.find(start)) { - spannable.setSpan( - new BackgroundColorSpan(this.getResources().getColor( - R.color.user_query_highlight)), m.start(), m.end(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); - start = m.end(); - } - } - return spannable; - } - private View getListItem(String item, int index) { - View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null); - final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId)); - CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item)); - cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - } - } - }); - - if (item.startsWith(TAG_CHECKED)) { - cb.setChecked(true); - edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - item = item.substring(TAG_CHECKED.length(), item.length()).trim(); - } else if (item.startsWith(TAG_UNCHECKED)) { - cb.setChecked(false); - edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); - item = item.substring(TAG_UNCHECKED.length(), item.length()).trim(); - } - - edit.setOnTextViewChangeListener(this); - edit.setIndex(index); - edit.setText(getHighlightQueryResult(item, mUserQuery)); - return view; - } - public void onTextChange(int index, boolean hasText) { - if (index >= mEditTextList.getChildCount()) { - Log.e(TAG, "Wrong index, should not happen"); - return; - } - if(hasText) { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE); - } else { - mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE); - } - } - - public void onCheckListModeChanged(int oldMode, int newMode) { - if (newMode == TextNote.MODE_CHECK_LIST) { - switchToListMode(mNoteEditor.getText().toString()); - //检查模式切换到列表模式 - } else { - if (!getWorkingText()) { - mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ", - "")); - } - //若是获取到文本就改变其检查标记 - mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); - mEditTextList.setVisibility(View.GONE); - mNoteEditor.setVisibility(View.VISIBLE); - //修改文本编辑器的内容和可见性 - } - } - private boolean getWorkingText() { - boolean hasChecked = false; - //初始化check标记 - if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { - // 若模式为CHECK_LIST - StringBuilder sb = new StringBuilder(); - //创建可变字符串 - for (int i = 0; i < mEditTextList.getChildCount(); i++) { - View view = mEditTextList.getChildAt(i); - //遍历所有子编辑框的视图 - NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); - if (!TextUtils.isEmpty(edit.getText())) { - //若文本不为空 - if (((CheckBox) view.findViewById(R.id.cb_edit_item)).isChecked()) { - //该选项框已打钩 - sb.append(TAG_CHECKED).append(" ").append(edit.getText()).append("\n"); - hasChecked = true; - //扩展字符串为已打钩并把标记置true - } else { - sb.append(TAG_UNCHECKED).append(" ").append(edit.getText()).append("\n"); - //扩展字符串添加未打钩 - } - } - } - mWorkingNote.setWorkingText(sb.toString()); - //利用编辑好的字符串设置运行便签的内容 - } else { - mWorkingNote.setWorkingText(mNoteEditor.getText().toString()); - // 若不是该模式直接用编辑器中的内容设置运行中标签的内容 - } - return hasChecked; - } - /* - * 函数功能:保存便签 - * 函数实现:如下注释 - */ - private boolean saveNote() { - getWorkingText(); - boolean saved = mWorkingNote.saveNote(); - //运行 getWorkingText()之后保存 - if (saved) { - /** - * There are two modes from List view to edit view, open one note, - * create/edit a node. Opening node requires to the original - * position in the list when back from edit view, while creating a - * new node requires to the top of the list. This code - * {@link #RESULT_OK} is used to identify the create/edit state - */ - //如英文注释所说链接RESULT_OK是为了识别保存的2种情况,一是创建后保存,二是修改后保存 - setResult(RESULT_OK); - } - return saved; - } - - private void sendToDesktop() { - /** - * Before send message to home, we should make sure that current - * editing note is exists in databases. So, for new note, firstly - * save it - */ - if (!mWorkingNote.existInDatabase()) { - saveNote(); - } - - if (mWorkingNote.getNoteId() > 0) { - Intent sender = new Intent(); - Intent shortcutIntent = new Intent(this, NoteEditActivity.class); - shortcutIntent.setAction(Intent.ACTION_VIEW); - shortcutIntent.putExtra(Intent.EXTRA_UID, mWorkingNote.getNoteId()); - sender.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); - sender.putExtra(Intent.EXTRA_SHORTCUT_NAME, - makeShortcutIconTitle(mWorkingNote.getContent())); - sender.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, - Intent.ShortcutIconResource.fromContext(this, R.drawable.icon_app)); - sender.putExtra("duplicate", true); - sender.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); - showToast(R.string.info_note_enter_desktop); - sendBroadcast(sender); - } else { - /** - * There is the condition that user has input nothing (the note is - * not worthy saving), we have no note id, remind the user that he - * should input something - */ - Log.e(TAG, "Send to desktop error"); - showToast(R.string.error_note_empty_for_send_to_desktop); - } - } - private String makeShortcutIconTitle(String content) { - content = content.replace(TAG_CHECKED, ""); - content = content.replace(TAG_UNCHECKED, ""); - return content.length() > SHORTCUT_ICON_TITLE_MAX_LEN ? content.substring(0, - SHORTCUT_ICON_TITLE_MAX_LEN) : content; - //直接设置为content中的内容并返回,有勾选和未勾选2种 - } - private void showToast(int resId) { - showToast(resId, Toast.LENGTH_SHORT); - } - private void showToast(int resId, int duration) { - Toast.makeText(this, resId, duration).show(); - } -} diff --git a/src/ui/NoteEditText.java b/src/ui/NoteEditText.java deleted file mode 100644 index c935358..0000000 --- a/src/ui/NoteEditText.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.graphics.Rect; -import android.text.Layout; -import android.text.Selection; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.style.URLSpan; -import android.util.AttributeSet; -import android.util.Log; -import android.view.ContextMenu; -import android.view.KeyEvent; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.widget.EditText; - -import net.micode.notes.R; - -import java.util.HashMap; -import java.util.Map; - -/** - * @Package: net.micode.notes.ui - * @ClassName: NoteEditText - * @Description: - * @Author: YangYizhe - * @CreateDate: 12/21/2023 12:38 AM - * @Version: 1.0 - */ -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 Map sSchemaActionResMap = new HashMap(); - static { - sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel); - sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web); - sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email); - } - - /** - * Call by the {@link NoteEditActivity} to delete or add edit text - * 该接口用于实现对TextView组件中的文字信息进行修改 - */ - public interface OnTextViewChangeListener { - /** - * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens - * and the text is null - * 当delete键按下时删除当前编辑的文字块 - */ - void onEditTextDelete(int index, String text); - - /** - * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER} - * happen - * 当enter键按下时添加一个文字编辑块 - */ - void onEditTextEnter(int index, String text); - - /** - * Hide or show item option when text change - * 当文字发生变化时隐藏或者显示设置 - */ - void onTextChange(int index, boolean hasText); - } - - //声明文本视图变化监听器 - private OnTextViewChangeListener mOnTextViewChangeListener; - - /** - * 构造方法,实例化NoteEditText - */ - public NoteEditText(Context context) { - super(context, null); - mIndex = 0; - } - - //设置索引号 - public void setIndex(int index) { - mIndex = index; - } - - /** - * 设置文本视图变化监听器 - */ - public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { - mOnTextViewChangeListener = listener; - } - - /** - * 构造方法,是由参数集(文本编辑风格)实例化NoteEditText - */ - public NoteEditText(Context context, AttributeSet attrs) { - super(context, attrs, android.R.attr.editTextStyle); - } - /** - * 构造方法,是由参数集(文本编辑风格、定义风格)实例化NoteEditText - */ - public NoteEditText(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - // TODO Auto-generated constructor stub - } - - /** - * @method onTouchEvent - * @description 处理触摸事件,根据触摸点的位置设置光标的位置 - * @date: 12/21/2023 12:41 AM - * @author: YangYizhe - * @param - * @return - */ - @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(); - y -= getTotalPaddingTop(); - x += getScrollX(); - y += getScrollY(); - Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); - Selection.setSelection(getText(), off); - break; - } - return super.onTouchEvent(event); - } - /** - * @method onKeyDown - * @description 监听键盘按键按下 - * @date: 12/21/2023 12:40 AM - * @author: YangYizhe - * @param keyCode 键盘按键的编码 - * @param event 按键事件 - * @return boolean - */ - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - switch (keyCode) { - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - return false; - } - break; - case KeyEvent.KEYCODE_DEL: - mSelectionStartBeforeDelete = getSelectionStart(); - break; - default: - break; - } - return super.onKeyDown(keyCode, event); - } - - /** - * @method onKeyUp - * @description 监听按键抬起 - * @date: 12/21/2023 12:39 AM - * @author: YangYizhe - * @param keyCode - * @param 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; - } - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - case KeyEvent.KEYCODE_ENTER: - if (mOnTextViewChangeListener != null) { - int selectionStart = getSelectionStart(); - String text = getText().subSequence(selectionStart, length()).toString(); - setText(getText().subSequence(0, selectionStart)); - mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - } else { - Log.d(TAG, "OnTextViewChangeListener was not seted"); - } - break; - default: - break; - } - return super.onKeyUp(keyCode, event); - } - - /** - * @method onFocusChanged - * @description 处理当前视图下的焦点改变事件 - * @date: 12/21/2023 12:39 AM - * @author: YangYizhe - * @param focused 代表获得或失去焦点 - * @param direction - * @param previouslyFocusedRect 上一个访问的焦点区域 - */ - @Override - protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { - if (mOnTextViewChangeListener != null) { - if (!focused && TextUtils.isEmpty(getText())) { - mOnTextViewChangeListener.onTextChange(mIndex, false); - } else { - mOnTextViewChangeListener.onTextChange(mIndex, true); - } - } - super.onFocusChanged(focused, direction, previouslyFocusedRect); - } - - /** - * @method onCreateContextMenu - * @description - * @date: 12/21/2023 12:39 AM - * @author: YangYizhe - * @param - * @return - */ - @Override - protected void onCreateContextMenu(ContextMenu menu) { - if (getText() instanceof Spanned) { - int selStart = getSelectionStart(); - int selEnd = getSelectionEnd(); - - int min = Math.min(selStart, selEnd); - int max = Math.max(selStart, selEnd); - - final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); - if (urls.length == 1) { - int defaultResId = 0; - for(String schema: sSchemaActionResMap.keySet()) { - if(urls[0].getURL().indexOf(schema) >= 0) { - defaultResId = sSchemaActionResMap.get(schema); - break; - } - } - - if (defaultResId == 0) { - defaultResId = R.string.note_link_other; - } - menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener( - new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - // goto a new intent - urls[0].onClick(NoteEditText.this); - return true; - } - }); - } - } - super.onCreateContextMenu(menu); - } -} diff --git a/src/ui/NoteItemData.java b/src/ui/NoteItemData.java deleted file mode 100644 index 0f5a878..0000000 --- a/src/ui/NoteItemData.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.text.TextUtils; - -import net.micode.notes.data.Contact; -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, - }; - - 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; - - 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; - 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); - if (!TextUtils.isEmpty(mPhoneNumber)) { - mName = Contact.getContact(context, mPhoneNumber); - if (mName == null) { - mName = mPhoneNumber; - } - } - } - - if (mName == null) { - mName = ""; - } - checkPostion(cursor); - } - - private void checkPostion(Cursor cursor) { - mIsLastItem = cursor.isLast() ? true : false; - mIsFirstItem = cursor.isFirst() ? true : false; - mIsOnlyOneItem = (cursor.getCount() == 1); - mIsMultiNotesFollowingFolder = false; - mIsOneNoteFollowingFolder = false; - - if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { - int position = cursor.getPosition(); - if (cursor.moveToPrevious()) { - if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER - || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) { - if (cursor.getCount() > (position + 1)) { - mIsMultiNotesFollowingFolder = true; - } else { - mIsOneNoteFollowingFolder = true; - } - } - if (!cursor.moveToNext()) { - throw new IllegalStateException("cursor move to previous but can't move back"); - } - } - } - } - - 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; - } - - 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; - } - - public int getBgColorId() { - return mBgColorId; - } - - public long getParentId() { - return mParentId; - } - - public int getNotesCount() { - return mNotesCount; - } - - public long getFolderId () { - return mParentId; - } - - public int getType() { - return mType; - } - - public int getWidgetType() { - return mWidgetType; - } - - 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)); - } - - public static int getNoteType(Cursor cursor) { - return cursor.getInt(TYPE_COLUMN); - } -} diff --git a/src/ui/NotesListActivity.java b/src/ui/NotesListActivity.java deleted file mode 100644 index b7cd7d7..0000000 --- a/src/ui/NotesListActivity.java +++ /dev/null @@ -1,990 +0,0 @@ -package net.micode.notes.ui; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.appwidget.AppWidgetManager; -import android.content.AsyncQueryHandler; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.database.Cursor; -import android.os.AsyncTask; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.util.Log; -import android.view.ActionMode; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.Display; -import android.view.HapticFeedbackConstants; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnCreateContextMenuListener; -import android.view.View.OnTouchListener; -import android.view.inputmethod.InputMethodManager; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.AdapterView.OnItemLongClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ListView; -import android.widget.PopupMenu; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; -import net.micode.notes.model.WorkingNote; -import net.micode.notes.tool.BackupUtils; -import net.micode.notes.tool.DataUtils; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute; -import net.micode.notes.widget.NoteWidgetProvider_2x; -import net.micode.notes.widget.NoteWidgetProvider_4x; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashSet; -//主界面,一进入就是这个界面 -/** - * @author k - * - */ -public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener { //没有用特定的标签加注释。。。感觉没有什么用 - private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; - - private static final int FOLDER_LIST_QUERY_TOKEN = 1; - - private static final int MENU_FOLDER_DELETE = 0; - - private static final int MENU_FOLDER_VIEW = 1; - - private static final int MENU_FOLDER_CHANGE_NAME = 2; - - private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; //单行超过80个字符 - - private enum ListEditState { - NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER - }; - - private ListEditState mState; - - private BackgroundQueryHandler mBackgroundQueryHandler; - - private NotesListAdapter mNotesListAdapter; - - private ListView mNotesListView; - - private Button mAddNewNote; - - private boolean mDispatch; - - private int mOriginY; - - private int mDispatchY; - - private TextView mTitleBar; - - private long mCurrentFolderId; - - private ContentResolver mContentResolver; - - private ModeCallback mModeCallBack; - - private static final String TAG = "NotesListActivity"; - - public static final int NOTES_LISTVIEW_SCROLL_RATE = 30; - - private NoteItemData mFocusNoteDataItem; - - private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?"; - - private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>" - + Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR (" - + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " - + NoteColumns.NOTES_COUNT + ">0)"; - - private final static int REQUEST_CODE_OPEN_NODE = 102; - private final static int REQUEST_CODE_NEW_NODE = 103; - - @Override - /** - * @method onCreate - * @description - * @date: 9:58 AM - * @author: YangYizhe - * @param [savedInstanceState] - * @return void - */ - protected void onCreate(final Bundle savedInstanceState) { //需要是final类型 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 - // final类不能被继承,没有子类,final类中的方法默认是final的。 - //final方法不能被子类的方法覆盖,但可以被继承。 - //final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 - //final不能用于修饰构造方法。 - super.onCreate(savedInstanceState); // 调用父类的onCreate函数 - setContentView(R.layout.note_list); - initResources(); - - /** - * Insert an introduction when user firstly use this application - */ - setAppInfoFromRawRes(); - } - - @Override - // 返回一些子模块完成的数据交给主Activity处理 - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - // 结果值 和 要求值 符合要求 - if (resultCode == RESULT_OK - && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { - mNotesListAdapter.changeCursor(null); - } else { - super.onActivityResult(requestCode, resultCode, data); - // 调用 Activity 的onActivityResult() - } - } - - private void setAppInfoFromRawRes() { - // Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。 - SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); - if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { - StringBuilder sb = new StringBuilder(); - InputStream in = null; - try { - // 把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后, - // 以openRawResource方法(不带后缀的资源文件名)打开这个文件。 - in = getResources().openRawResource(R.raw.introduction); - if (in != null) { - InputStreamReader isr = new InputStreamReader(in); - BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; // 自行定义的数值,使用者不知道有什么意义 - int len = 0; - while ((len = br.read(buf)) > 0) { - sb.append(buf, 0, len); - } - } else { - Log.e(TAG, "Read introduction file error"); - return; - } - } catch (IOException e) { - e.printStackTrace(); - return; - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - // 创建空的WorkingNote - WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, - AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, - ResourceParser.RED); - note.setWorkingText(sb.toString()); - if (note.saveNote()) { - // 更新保存note的信息 - sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); - } else { - Log.e(TAG, "Save introduction note error"); - return; - } - } - } - - @Override - protected void onStart() { - super.onStart(); - startAsyncNotesListQuery(); - } - - // 初始化资源 - private void initResources() { - mContentResolver = this.getContentResolver(); // 获取应用程序的数据,得到类似数据表的东西 - mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - - // findViewById 是安卓编程的定位函数,主要是引用.R文件里的引用名 - mNotesListView = (ListView) findViewById(R.id.notes_list); // 绑定XML中的ListView,作为Item的容器 - mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), - null, false); - mNotesListView.setOnItemClickListener(new OnListItemClickListener()); - mNotesListView.setOnItemLongClickListener(this); - mNotesListAdapter = new NotesListAdapter(this); - mNotesListView.setAdapter(mNotesListAdapter); - mAddNewNote = (Button) findViewById(R.id.btn_new_note);// 在activity中要获取该按钮 - mAddNewNote.setOnClickListener(this); - mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); - mDispatch = false; - mDispatchY = 0; - mOriginY = 0; - mTitleBar = (TextView) findViewById(R.id.tv_title_bar); - mState = ListEditState.NOTE_LIST; - mModeCallBack = new ModeCallback(); - } - - // 继承自ListView.MultiChoiceModeListener 和 OnMenuItemClickListener - private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { - private DropdownMenu mDropDownMenu; - private ActionMode mActionMode; - private MenuItem mMoveMenu; - - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - getMenuInflater().inflate(R.menu.note_list_options, menu); - menu.findItem(R.id.delete).setOnMenuItemClickListener(this); - mMoveMenu = menu.findItem(R.id.move); - if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER - || DataUtils.getUserFolderCount(mContentResolver) == 0) { - mMoveMenu.setVisible(false); - } else { - mMoveMenu.setVisible(true); - mMoveMenu.setOnMenuItemClickListener(this); - } - mActionMode = mode; - mNotesListAdapter.setChoiceMode(true); - mNotesListView.setLongClickable(false); - mAddNewNote.setVisibility(View.GONE); - - View customView = LayoutInflater.from(NotesListActivity.this).inflate( - R.layout.note_list_dropdown_menu, null); - mode.setCustomView(customView); - mDropDownMenu = new DropdownMenu(NotesListActivity.this, - (Button) customView.findViewById(R.id.selection_menu), - R.menu.note_list_dropdown); - mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){ - public boolean onMenuItemClick(final MenuItem item) { - mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected()); - updateMenu(); - return true; - } - - }); - return true; - } - - // 更新菜单 - private void updateMenu() { - int selectedCount = mNotesListAdapter.getSelectedCount(); - // Update dropdown menu - String format = getResources().getString(R.string.menu_select_title, selectedCount); - mDropDownMenu.setTitle(format); // 更改标题 - MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); - if (item != null) { - if (mNotesListAdapter.isAllSelected()) { - item.setChecked(true); - item.setTitle(R.string.menu_deselect_all); - } else { - item.setChecked(false); - item.setTitle(R.string.menu_select_all); - } - } - } - - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - // TODO Auto-generated method stub - return false; - } - - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - // TODO Auto-generated method stub - return false; - } - - public void onDestroyActionMode(ActionMode mode) { - mNotesListAdapter.setChoiceMode(false); - mNotesListView.setLongClickable(true); - mAddNewNote.setVisibility(View.VISIBLE); - } - - public void finishActionMode() { - mActionMode.finish(); - } - - public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { - mNotesListAdapter.setCheckedItem(position, checked); - updateMenu(); - } - - public boolean onMenuItemClick(MenuItem item) { - if (mNotesListAdapter.getSelectedCount() == 0) { - Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), - Toast.LENGTH_SHORT).show(); - return true; - } - - int itemId = item.getItemId(); - if (itemId == R.id.delete) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_notes, - mNotesListAdapter.getSelectedCount())); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, - int which) { - batchDelete(); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show(); - } else if (itemId == R.id.move) { - startQueryDestinationFolders(); - } else { - return false; - } - return true; - } - } - - private class NewNoteOnTouchListener implements OnTouchListener { - - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: { - Display display = getWindowManager().getDefaultDisplay(); - int screenHeight = display.getHeight(); - int newNoteViewHeight = mAddNewNote.getHeight(); - int start = screenHeight - newNoteViewHeight; - int eventY = start + (int) event.getY(); - /** - * Minus TitleBar's height - */ - if (mState == ListEditState.SUB_FOLDER) { - eventY -= mTitleBar.getHeight(); - start -= mTitleBar.getHeight(); - } - /** - * HACKME:When click the transparent part of "New Note" button, dispatch - * the event to the list view behind this button. The transparent part of - * "New Note" button could be expressed by formula y=-0.12x+94锛圲nit:pixel锛� - * and the line top of the button. The coordinate based on left of the "New - * Note" button. The 94 represents maximum height of the transparent part. - * Notice that, if the background of the button changes, the formula should - * also change. This is very bad, just for the UI designer's strong requirement. - */ - if (event.getY() < (event.getX() * (-0.12) + 94)) { - View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1 - - mNotesListView.getFooterViewsCount()); - if (view != null && view.getBottom() > start - && (view.getTop() < (start + 94))) { - mOriginY = (int) event.getY(); - mDispatchY = eventY; - event.setLocation(event.getX(), mDispatchY); - mDispatch = true; - return mNotesListView.dispatchTouchEvent(event); - } - } - break; - } - case MotionEvent.ACTION_MOVE: { - if (mDispatch) { - mDispatchY += (int) event.getY() - mOriginY; - event.setLocation(event.getX(), mDispatchY); - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - default: { - if (mDispatch) { - event.setLocation(event.getX(), mDispatchY); - mDispatch = false; - return mNotesListView.dispatchTouchEvent(event); - } - break; - } - } - return false; - } - - }; - - private void startAsyncNotesListQuery() { - String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION - : NORMAL_SELECTION; - mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null, - Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] { - String.valueOf(mCurrentFolderId) - }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC"); - } - - private final class BackgroundQueryHandler extends AsyncQueryHandler { - public BackgroundQueryHandler(ContentResolver contentResolver) { - super(contentResolver); - } - - @Override - protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - switch (token) { - case FOLDER_NOTE_LIST_QUERY_TOKEN: - mNotesListAdapter.changeCursor(cursor); - break; - case FOLDER_LIST_QUERY_TOKEN: - if (cursor != null && cursor.getCount() > 0) { - showFolderListMenu(cursor); - } else { - Log.e(TAG, "Query folder failed"); - } - break; - default: - return; - } - } - } - - private void showFolderListMenu(Cursor cursor) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(R.string.menu_title_select_folder); - final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); - builder.setAdapter(adapter, new DialogInterface.OnClickListener() { - - public void onClick(DialogInterface dialog, int which) { - DataUtils.batchMoveToFolder(mContentResolver, - mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); - Toast.makeText( - NotesListActivity.this, - getString(R.string.format_move_notes_to_folder, - mNotesListAdapter.getSelectedCount(), - adapter.getFolderName(NotesListActivity.this, which)), - Toast.LENGTH_SHORT).show(); - mModeCallBack.finishActionMode(); - } - }); - builder.show(); - } - - private void createNewNote() { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); - this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); - } - - private void batchDelete() { - new AsyncTask>() { - protected HashSet doInBackground(Void... unused) { - HashSet widgets = mNotesListAdapter.getSelectedWidget(); - if (!isSyncMode()) { - // if not synced, delete notes directly - if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter - .getSelectedItemIds())) { - } else { - Log.e(TAG, "Delete notes error, should not happens"); - } - } else { - // in sync mode, we'll move the deleted note into the trash - // folder - if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter - .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { - Log.e(TAG, "Move notes to trash folder error, should not happens"); - } - } - return widgets; - } - - @Override - protected void onPostExecute(HashSet widgets) { - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - mModeCallBack.finishActionMode(); - } - }.execute(); - } - - private void deleteFolder(long folderId) { - if (folderId == Notes.ID_ROOT_FOLDER) { - Log.e(TAG, "Wrong folder id, should not happen " + folderId); - return; - } - - HashSet ids = new HashSet(); - ids.add(folderId); - HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver, - folderId); - if (!isSyncMode()) { - // if not synced, delete folder directly - DataUtils.batchDeleteNotes(mContentResolver, ids); - } else { - // in sync mode, we'll move the deleted folder into the trash folder - DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER); - } - if (widgets != null) { - for (AppWidgetAttribute widget : widgets) { - if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID - && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) { - updateWidget(widget.widgetId, widget.widgetType); - } - } - } - } - - private void openNode(NoteItemData data) { - Intent intent = new Intent(this, NoteEditActivity.class); - intent.setAction(Intent.ACTION_VIEW); - intent.putExtra(Intent.EXTRA_UID, data.getId()); - this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); - } - - private void openFolder(NoteItemData data) { - mCurrentFolderId = data.getId(); - startAsyncNotesListQuery(); - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mState = ListEditState.CALL_RECORD_FOLDER; - mAddNewNote.setVisibility(View.GONE); - } else { - mState = ListEditState.SUB_FOLDER; - } - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mTitleBar.setText(R.string.call_record_folder_name); - } else { - mTitleBar.setText(data.getSnippet()); - } - mTitleBar.setVisibility(View.VISIBLE); - } - - public void onClick(View v) { - if (v.getId() == R.id.btn_new_note) { - createNewNote(); - } - } - - private void showSoftInput() { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - if (inputMethodManager != null) { - inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); - } - } - - private void hideSoftInput(View view) { - InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - - private void showCreateOrModifyFolderDialog(final boolean create) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); - final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); - showSoftInput(); - if (!create) { - if (mFocusNoteDataItem != null) { - etName.setText(mFocusNoteDataItem.getSnippet()); - builder.setTitle(getString(R.string.menu_folder_change_name)); - } else { - Log.e(TAG, "The long click data item is null"); - return; - } - } else { - etName.setText(""); - builder.setTitle(this.getString(R.string.menu_create_folder)); - } - - builder.setPositiveButton(android.R.string.ok, null); - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - hideSoftInput(etName); - } - }); - - final Dialog dialog = builder.setView(view).show(); - final Button positive = (Button)dialog.findViewById(android.R.id.button1); - positive.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - hideSoftInput(etName); - String name = etName.getText().toString(); - if (DataUtils.checkVisibleFolderName(mContentResolver, name)) { - Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name), - Toast.LENGTH_LONG).show(); - etName.setSelection(0, etName.length()); - return; - } - if (!create) { - if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - values.put(NoteColumns.LOCAL_MODIFIED, 1); - mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID - + "=?", new String[] { - String.valueOf(mFocusNoteDataItem.getId()) - }); - } - } else if (!TextUtils.isEmpty(name)) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.SNIPPET, name); - values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER); - mContentResolver.insert(Notes.CONTENT_NOTE_URI, values); - } - dialog.dismiss(); - } - }); - - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } - /** - * When the name edit text is null, disable the positive button - */ - etName.addTextChangedListener(new TextWatcher() { - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - // TODO Auto-generated method stub - - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (TextUtils.isEmpty(etName.getText())) { - positive.setEnabled(false); - } else { - positive.setEnabled(true); - } - } - - public void afterTextChanged(Editable s) { - // TODO Auto-generated method stub - - } - }); - } - - /* (non-Javadoc) - * @see android.app.Activity#onBackPressed() - * 按返回键时根据情况更改类中的数据 - */ - @Override - public void onBackPressed() { switch (mState) { - case SUB_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - startAsyncNotesListQuery(); - mTitleBar.setVisibility(View.GONE); - break; - case CALL_RECORD_FOLDER: - mCurrentFolderId = Notes.ID_ROOT_FOLDER; - mState = ListEditState.NOTE_LIST; - mAddNewNote.setVisibility(View.VISIBLE); - mTitleBar.setVisibility(View.GONE); - startAsyncNotesListQuery(); - break; - case NOTE_LIST: - super.onBackPressed(); - break; - default: - break; - } - } - - /** - * @param appWidgetId - * @param appWidgetType - * 根据不同类型的widget更新插件,通过intent传送数据 - */ - private void updateWidget(int appWidgetId, int appWidgetType) { - Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); - if (appWidgetType == Notes.TYPE_WIDGET_2X) { - intent.setClass(this, NoteWidgetProvider_2x.class); - } else if (appWidgetType == Notes.TYPE_WIDGET_4X) { - intent.setClass(this, NoteWidgetProvider_4x.class); - } else { - Log.e(TAG, "Unspported widget type"); - return; - } - - intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { - appWidgetId - }); - - sendBroadcast(intent); - setResult(RESULT_OK, intent); - } - - /** - * 声明监听器,建立菜单,包括名称,视图,删除操作,更改名称操作; - */ - private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - if (mFocusNoteDataItem != null) { - menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); - menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view); - menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete); - menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name); - } - } - }; - - @Override - public void onContextMenuClosed(Menu menu) { - if (mNotesListView != null) { - mNotesListView.setOnCreateContextMenuListener(null); - } - super.onContextMenuClosed(menu); - } - - /* (non-Javadoc) - * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) - * 针对menu中不同的选择进行不同的处理,里面详细注释 - */ - @Override - public boolean onContextItemSelected(MenuItem item) { - if (mFocusNoteDataItem == null) { - Log.e(TAG, "The long click data item is null"); - return false; - } - switch (item.getItemId()) { - case MENU_FOLDER_VIEW: - openFolder(mFocusNoteDataItem);//打开对应文件 - break; - case MENU_FOLDER_DELETE: - AlertDialog.Builder builder = new AlertDialog.Builder(this);//设置确认是否删除的对话框 - builder.setTitle(getString(R.string.alert_title_delete)); - builder.setIcon(android.R.drawable.ic_dialog_alert); - builder.setMessage(getString(R.string.alert_message_delete_folder)); - builder.setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - deleteFolder(mFocusNoteDataItem.getId()); - } - }); - builder.setNegativeButton(android.R.string.cancel, null); - builder.show();//显示对话框 - break; - case MENU_FOLDER_CHANGE_NAME: - showCreateOrModifyFolderDialog(false); - break; - default: - break; - } - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - menu.clear(); - if (mState == ListEditState.NOTE_LIST) { - getMenuInflater().inflate(R.menu.note_list, menu); - // set sync or sync_cancel - menu.findItem(R.id.menu_sync).setTitle( - GTaskSyncService.isSyncing() ? R.string.menu_sync_cancel : R.string.menu_sync); - } else if (mState == ListEditState.SUB_FOLDER) { - getMenuInflater().inflate(R.menu.sub_folder, menu); - } else if (mState == ListEditState.CALL_RECORD_FOLDER) { - getMenuInflater().inflate(R.menu.call_record_folder, menu); - } else { - Log.e(TAG, "Wrong state:" + mState); - } - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int itemId = item.getItemId(); - if (itemId == R.id.menu_new_folder) { - showCreateOrModifyFolderDialog(true); - } else if (itemId == R.id.menu_export_text) { - exportNoteToText(); - } else if (itemId == R.id.menu_sync) { - if (isSyncMode()) { - if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { - GTaskSyncService.startSync(this); - } else { - GTaskSyncService.cancelSync(this); - } - } else { - startPreferenceActivity(); - } - } else if (itemId == R.id.menu_setting) { - startPreferenceActivity(); - } else if (itemId == R.id.menu_new_note) { - createNewNote(); - } else if (itemId == R.id.menu_search) { - onSearchRequested(); - } - return true; - } - - /* (non-Javadoc) - * @see android.app.Activity#onSearchRequested() - * 直接调用startSearch函数 - */ - @Override - public boolean onSearchRequested() { - startSearch(null, false, null /* appData */, false); - return true; - } - - /** - * 函数功能:实现将便签导出到文本功能 - */ - private void exportNoteToText() { - final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); - new AsyncTask() { - - @Override - protected Integer doInBackground(Void... unused) { - return backup.exportToText(); - } - - @Override - protected void onPostExecute(Integer result) { - if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_unmounted)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SUCCESS) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.success_sdcard_export)); - builder.setMessage(NotesListActivity.this.getString( - R.string.format_exported_file_location, backup - .getExportedTextFileName(), backup.getExportedTextFileDir())); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } else if (result == BackupUtils.STATE_SYSTEM_ERROR) { - AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); - builder.setTitle(NotesListActivity.this - .getString(R.string.failed_sdcard_export)); - builder.setMessage(NotesListActivity.this - .getString(R.string.error_sdcard_export)); - builder.setPositiveButton(android.R.string.ok, null); - builder.show(); - } - } - - }.execute(); - } - - /** - * @return - * 功能:判断是否正在同步 - */ - private boolean isSyncMode() { - return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; - } - - /** - * 功能:跳转到PreferenceActivity界面 - */ - private void startPreferenceActivity() { - Activity from = getParent() != null ? getParent() : this; - Intent intent = new Intent(from, NotesPreferenceActivity.class); - from.startActivityIfNeeded(intent, -1); - } - - /** - * @author k - * 函数功能:实现对便签列表项的点击事件(短按) - */ - private class OnListItemClickListener implements OnItemClickListener { - - public void onItemClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - NoteItemData item = ((NotesListItem) view).getItemData(); - if (mNotesListAdapter.isInChoiceMode()) { - if (item.getType() == Notes.TYPE_NOTE) { - position = position - mNotesListView.getHeaderViewsCount(); - mModeCallBack.onItemCheckedStateChanged(null, position, id, - !mNotesListAdapter.isSelectedItem(position)); - } - return; - } - - switch (mState) { - case NOTE_LIST: - if (item.getType() == Notes.TYPE_FOLDER - || item.getType() == Notes.TYPE_SYSTEM) { - openFolder(item); - } else if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in NOTE_LIST"); - } - break; - case SUB_FOLDER: - case CALL_RECORD_FOLDER: - if (item.getType() == Notes.TYPE_NOTE) { - openNode(item); - } else { - Log.e(TAG, "Wrong note type in SUB_FOLDER"); - } - break; - default: - break; - } - } - } - - } - - /** - * 查询目标文件 - */ - private void startQueryDestinationFolders() { - String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; - selection = (mState == ListEditState.NOTE_LIST) ? selection: - "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; - - mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, - null, - Notes.CONTENT_NOTE_URI, - FoldersListAdapter.PROJECTION, - selection, - new String[] { - String.valueOf(Notes.TYPE_FOLDER), - String.valueOf(Notes.ID_TRASH_FOLER), - String.valueOf(mCurrentFolderId) - }, - NoteColumns.MODIFIED_DATE + " DESC"); - } - - /* (non-Javadoc) - * @see android.widget.AdapterView.OnItemLongClickListener#onItemLongClick(android.widget.AdapterView, android.view.View, int, long) - * 长按某一项时进行的操作 - * 如果长按的是便签,则通过ActionMode菜单实现;如果长按的是文件夹,则通过ContextMenu菜单实现; - * 具体ActionMOde菜单和ContextMenu菜单的详细见精度笔记 - */ - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - if (view instanceof NotesListItem) { - mFocusNoteDataItem = ((NotesListItem) view).getItemData(); - if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) { - if (mNotesListView.startActionMode(mModeCallBack) != null) { - mModeCallBack.onItemCheckedStateChanged(null, position, id, true); - mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - } else { - Log.e(TAG, "startActionMode fails"); - } - } else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) { - mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener); - } - } - return false; - } -} \ No newline at end of file diff --git a/src/ui/NotesListAdapter.java b/src/ui/NotesListAdapter.java deleted file mode 100644 index b165769..0000000 --- a/src/ui/NotesListAdapter.java +++ /dev/null @@ -1,257 +0,0 @@ -package net.micode.notes.ui; - -import android.content.Context; -import android.database.Cursor; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; - - -import net.micode.notes.data.Notes; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; - - -/* - * 功能:直译为便签表连接器,继承了CursorAdapter,它为cursor和ListView提供了连接的桥梁。 - * 所以NotesListAdapter实现的是鼠标和编辑便签链接的桥梁 - */ -public class NotesListAdapter extends CursorAdapter { - private static final String TAG = "NotesListAdapter"; - private Context mContext; - private HashMap mSelectedIndex; - private int mNotesCount; //便签数 - private boolean mChoiceMode; //选择模式标记 - - /* - * 桌面widget的属性,包括编号和类型 - */ - public static class AppWidgetAttribute { - public int widgetId; - public int widgetType; - }; - - /* - * 函数功能:初始化便签链接器 - * 函数实现:根据传进来的内容设置相关变量 - */ - public NotesListAdapter(Context context) { - super(context, null); //父类对象置空 - mSelectedIndex = new HashMap(); //新建选项下标的hash表 - mContext = context; - mNotesCount = 0; - } - - @Override - /* - * 函数功能:新建一个视图来存储光标所指向的数据 - * 函数实现:使用兄弟类NotesListItem新建一个项目选项 - */ - public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new NotesListItem(context); - } - - /* - * 函数功能:将已经存在的视图和鼠标指向的数据进行捆绑 - * 函数实现:如下注释 - */ - @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof NotesListItem) { - //若view是NotesListItem的一个实例 - NoteItemData itemData = new NoteItemData(context, cursor); - ((NotesListItem) view).bind(context, itemData, mChoiceMode, - isSelectedItem(cursor.getPosition())); - //则新建一个项目选项并且用bind跟将view和鼠标,内容,便签数据捆绑在一起 - } - } - - /* - * 函数功能:设置勾选框 - * 函数实现:如下注释 - */ - public void setCheckedItem(final int position, final boolean checked) { - mSelectedIndex.put(position, checked); - //根据定位和是否勾选设置下标 - notifyDataSetChanged(); - //在修改后刷新activity - } - - /* - * 函数功能:判断单选按钮是否勾选 - */ - public boolean isInChoiceMode() { - return mChoiceMode; - } - - /* - * 函数功能:设置单项选项框 - * 函数实现:重置下标并且根据参数mode设置选项 - */ - public void setChoiceMode(boolean mode) { - mSelectedIndex.clear(); - mChoiceMode = mode; - } - - /* - * 函数功能:选择全部选项 - * 函数实现:如下注释 - */ - public void selectAll(boolean checked) { - Cursor cursor = getCursor(); - //获取光标位置 - for (int i = 0; i < getCount(); i++) { - if (cursor.moveToPosition(i)) { - if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { - setCheckedItem(i, checked); - } - } - } - //遍历所有光标可用的位置在判断为便签类型之后勾选单项框 - } - - /* - * 函数功能:建立选择项的下标列表 - * 函数实现:如下注释 - */ - public HashSet getSelectedItemIds() { - HashSet itemSet = new HashSet(); - //建立hash表 - for (Integer position : mSelectedIndex.keySet()) { - //遍历所有的关键 - if (mSelectedIndex.get(position) == true) { - //若光标位置可用 - Long id = getItemId(position); - if (id == Notes.ID_ROOT_FOLDER) { - //原文件不需要添加 - Log.d(TAG, "Wrong item id, should not happen"); - } else { - itemSet.add(id); - } - //则将id该下标假如选项集合中 - - } - } - - return itemSet; - } - - /* - * 函数功能:建立桌面Widget的选项表 - * 函数实现:如下注释 - */ - public HashSet getSelectedWidget() { - HashSet itemSet = new HashSet(); - for (Integer position : mSelectedIndex.keySet()) { - if (mSelectedIndex.get(position) == true) { - Cursor c = (Cursor) getItem(position); - //以上4句和getSelectedItemIds一样,不再重复 - if (c != null) { - //光标位置可用的话就建立新的Widget属性并编辑下标和类型,最后添加到选项集中 - AppWidgetAttribute widget = new AppWidgetAttribute(); - NoteItemData item = new NoteItemData(mContext, c); - widget.widgetId = item.getWidgetId(); - widget.widgetType = item.getWidgetType(); - itemSet.add(widget); - /** - * Don't close cursor here, only the adapter could close it - */ - } else { - Log.e(TAG, "Invalid cursor"); - return null; - } - } - } - return itemSet; - } - - /* - * 函数功能:获取选项个数 - * 函数实现:如下注释 - */ - public int getSelectedCount() { - Collection values = mSelectedIndex.values(); - //首先获取选项下标的值 - if (null == values) { - return 0; - } - Iterator iter = values.iterator(); - //初始化叠加器 - int count = 0; - while (iter.hasNext()) { - if (true == iter.next()) { - //若value值为真计数+1 - count++; - } - } - return count; - } - - /* - * 函数功能:判断是否全部选中 - * 函数实现:如下注释 - */ - public boolean isAllSelected() { - int checkedCount = getSelectedCount(); - return (checkedCount != 0 && checkedCount == mNotesCount); - //获取选项数看是否等于便签的个数 - } - - /* - * 函数功能:判断是否为选项表 - * 函数实现:通过传递的下标来确定 - */ - public boolean isSelectedItem(final int position) { - if (null == mSelectedIndex.get(position)) { - return false; - } - return mSelectedIndex.get(position); - } - - @Override - /* - * 函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 - * 函数实现:如下注释 - */ - protected void onContentChanged() { - super.onContentChanged(); - //执行基类函数 - calcNotesCount(); - } - - @Override - /* - * 函数功能:在activity光标发生局部变动的时候回调该函数计算便签的数量 - */ - public void changeCursor(Cursor cursor) { - super.changeCursor(cursor); - //执行基类函数 - calcNotesCount(); - } - - /* - * 函数功能:计算便签数量 - * - */ - private void calcNotesCount() { - mNotesCount = 0; - for (int i = 0; i < getCount(); i++) { - //获取总数同时遍历 - Cursor c = (Cursor) getItem(i); - if (c != null) { - if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { - mNotesCount++; - //若该位置不为空并且文本类型为便签就+1 - } - } else { - Log.e(TAG, "Invalid cursor"); - return; - } - //否则报错 - } - } -} \ No newline at end of file diff --git a/src/ui/NotesListItem.java b/src/ui/NotesListItem.java deleted file mode 100644 index fa8b3d2..0000000 --- a/src/ui/NotesListItem.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.micode.notes.ui; - -import android.content.Context; -import android.text.format.DateUtils; -import android.view.View; -import android.widget.CheckBox; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import net.micode.notes.R; -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; //打钩框 - - /*初始化基本信息*/ - public NotesListItem(Context context) { - super(context); //super()它的主要作用是调整调用父类构造函数的顺序 - inflate(context, R.layout.note_item, this);//Inflate可用于将一个xml中定义的布局控件找出来,这里的xml是r。layout - //findViewById用于从contentView中查找指定ID的View,转换出来的形式根据需要而定; - mAlert = (ImageView) findViewById(R.id.iv_alert_icon); - mTitle = (TextView) findViewById(R.id.tv_title); - mTime = (TextView) findViewById(R.id.tv_time); - mCallName = (TextView) findViewById(R.id.tv_name); - mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); - } - ///根据data的属性对各个控件的属性的控制,主要是可见性Visibility,内容setText,格式setTextAppearance - 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); ///格子打钩 - } else { - mCheckBox.setVisibility(View.GONE); - } - - mItemData = data; - ///设置控件属性,一共三种情况,由data的id和父id是否与保存到文件夹的id一致来决定 - if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.GONE); - mAlert.setVisibility(View.VISIBLE); - //设置该textview的style - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - //settext为设置内容 - mTitle.setText(context.getString(R.string.call_record_folder_name) - + context.getString(R.string.format_folder_files_count, data.getNotesCount())); - mAlert.setImageResource(R.drawable.call_record); - } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { - mCallName.setVisibility(View.VISIBLE); - mCallName.setText(data.getCallName()); - mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem); - mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); - ///关于闹钟的设置 - if (data.hasAlert()) { - mAlert.setImageResource(R.drawable.clock);//图片来源的设置 - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } else { - mCallName.setVisibility(View.GONE); - mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); - ///设置title格式 - 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);///设置图片来源 - mAlert.setVisibility(View.VISIBLE); - } else { - mAlert.setVisibility(View.GONE); - } - } - } - ///设置内容,获取相关时间,从data里编辑的日期中获取 - mTime. setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); - - setBackground(data); - } - //根据data的文件属性来设置背景 - private void setBackground(NoteItemData data) { - int id = data.getBgColorId(); - //,若是note型文件,则4种情况,对于4种不同情况的背景来源 - 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 { - //若不是note直接调用文件夹的背景来源 - setBackgroundResource(NoteItemBgResources.getFolderBgRes()); - } - } - public NoteItemData getItemData() { - return mItemData; - } -} \ No newline at end of file diff --git a/src/ui/NotesPreferenceActivity.java b/src/ui/NotesPreferenceActivity.java deleted file mode 100644 index 6f8a89f..0000000 --- a/src/ui/NotesPreferenceActivity.java +++ /dev/null @@ -1,514 +0,0 @@ -package net.micode.notes.ui; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.app.ActionBar; -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.ContentValues; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.text.TextUtils; -import android.text.format.DateFormat; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; -import android.widget.Toast; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.gtask.remote.GTaskSyncService; - -/* - *该类功能:NotesPreferenceActivity,在小米便签中主要实现的是对背景颜色和字体大小的数据储存。 - * 继承了PreferenceActivity主要功能为对系统信息和配置进行自动保存的Activity - */ -public class NotesPreferenceActivity extends PreferenceActivity { - public static final String PREFERENCE_NAME = "notes_preferences"; - //优先名 - public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; - //同步账号 - public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; - //同步时间 - public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; - - private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; - //同步密码 - private static final String AUTHORITIES_FILTER_KEY = "authorities"; - //本地密码 - private PreferenceCategory mAccountCategory; - //账户分组 - private GTaskReceiver mReceiver; - //同步任务接收器 - private Account[] mOriAccounts; - //账户 - private boolean mHasAddedAccount; - //账户的hash标记 - - @Override - /* - *函数功能:创建一个activity,在函数里要完成所有的正常静态设置 - *参数:Bundle icicle:存放了 activity 当前的状态 - *函数实现:如下注释 - */ - protected void onCreate(Bundle icicle) { - //先执行父类的创建函数 - super.onCreate(icicle); - - /* using the app icon for navigation */ - getActionBar().setDisplayHomeAsUpEnabled(true); - //给左上角图标的左边加上一个返回的图标 - - addPreferencesFromResource(R.xml.preferences); - //添加xml来源并显示 xml - mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); - //根据同步账户关键码来初始化分组 - mReceiver = new GTaskReceiver(); - IntentFilter filter = new IntentFilter(); - filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); - registerReceiver(mReceiver, filter); - //初始化同步组件 - - mOriAccounts = null; - View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); - //获取listvivew,ListView的作用:用于列出所有选择 - getListView().addHeaderView(header, null, true); - //在listview组件上方添加其他组件 - } - - @Override - /* - * 函数功能:activity交互功能的实现,用于接受用户的输入 - * 函数实现:如下注释 - */ - protected void onResume() { - //先执行父类 的交互实现 - super.onResume(); - - // need to set sync account automatically if user has added a new - // account - if (mHasAddedAccount) { - //若用户新加了账户则自动设置同步账户 - Account[] accounts = getGoogleAccounts(); - //获取google同步账户 - if (mOriAccounts != null && accounts.length > mOriAccounts.length) { - //若原账户不为空且当前账户有增加 - for (Account accountNew : accounts) { - boolean found = false; - for (Account accountOld : mOriAccounts) { - if (TextUtils.equals(accountOld.name, accountNew.name)) { - //更新账户 - found = true; - break; - } - } - if (!found) { - setSyncAccount(accountNew.name); - //若是没有找到旧的账户,那么同步账号中就只添加新账户 - break; - } - } - } - } - - refreshUI(); - //刷新标签界面 - } - - @Override - /* - * 函数功能:销毁一个activity - * 函数实现:如下注释 - */ - protected void onDestroy() { - if (mReceiver != null) { - unregisterReceiver(mReceiver); - //注销接收器 - } - super.onDestroy(); - //执行父类的销毁动作 - } - - /* - * 函数功能:重新设置账户信息 - * 函数实现:如下注释 - */ - private void loadAccountPreference() { - mAccountCategory.removeAll(); - //销毁所有的分组 - Preference accountPref = new Preference(this); - //建立首选项 - final String defaultAccount = getSyncAccountName(this); - accountPref.setTitle(getString(R.string.preferences_account_title)); - accountPref.setSummary(getString(R.string.preferences_account_summary)); - //设置首选项的大标题和小标题 - accountPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - public boolean onPreferenceClick(Preference preference) { - //建立监听器 - if (!GTaskSyncService.isSyncing()) { - if (TextUtils.isEmpty(defaultAccount)) { - // the first time to set account - //若是第一次建立账户显示选择账户提示对话框 - showSelectAccountAlertDialog(); - } else { - // if the account has already been set, we need to promp - // user about the risk - //若是已经建立则显示修改对话框并进行修改操作 - showChangeAccountConfirmAlertDialog(); - } - } else { - //若在没有同步的情况下,则在toast中显示不能修改 - Toast.makeText(NotesPreferenceActivity.this, - R.string.preferences_toast_cannot_change_account, Toast.LENGTH_SHORT) - .show(); - } - return true; - } - }); - - //根据新建首选项编辑新的账户分组 - mAccountCategory.addPreference(accountPref); - } - - /* - *函数功能:设置按键的状态和最后同步的时间 - *函数实现:如下注释 - */ - private void loadSyncButton() { - Button syncButton = (Button) findViewById(R.id.preference_sync_button); - TextView lastSyncTimeView = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - //获取同步按钮控件和最终同步时间的的窗口 - // set button state - //设置按钮的状态 - if (GTaskSyncService.isSyncing()) { - //若是在同步状态下 - syncButton.setText(getString(R.string.preferences_button_sync_cancel)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.cancelSync(NotesPreferenceActivity.this); - } - }); - //设置按钮显示的文本为“取消同步”以及监听器 - } else { - syncButton.setText(getString(R.string.preferences_button_sync_immediately)); - syncButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - GTaskSyncService.startSync(NotesPreferenceActivity.this); - } - }); - //若是不同步则设置按钮显示的文本为“立即同步”以及对应监听器 - } - syncButton.setEnabled(!TextUtils.isEmpty(getSyncAccountName(this))); - //设置按键可用还是不可用 - - // set last sync time - // 设置最终同步时间 - if (GTaskSyncService.isSyncing()) { - //若是在同步的情况下 - lastSyncTimeView.setText(GTaskSyncService.getProgressString()); - lastSyncTimeView.setVisibility(View.VISIBLE); - // 根据当前同步服务器设置时间显示框的文本以及可见性 - } else { - //若是非同步情况 - long lastSyncTime = getLastSyncTime(this); - if (lastSyncTime != 0) { - lastSyncTimeView.setText(getString(R.string.preferences_last_sync_time, - DateFormat.format(getString(R.string.preferences_last_sync_time_format), - lastSyncTime))); - lastSyncTimeView.setVisibility(View.VISIBLE); - //则根据最后同步时间的信息来编辑时间显示框的文本内容和可见性 - } else { - //若时间为空直接设置为不可见状态 - lastSyncTimeView.setVisibility(View.GONE); - } - } - } - /* - *函数功能:刷新标签界面 - *函数实现:调用上文设置账号和设置按键两个函数来实现 - */ - private void refreshUI() { - loadAccountPreference(); - 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)); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_select_account_tips)); - //设置标题以及子标题的内容 - dialogBuilder.setCustomTitle(titleView); - dialogBuilder.setPositiveButton(null, null); - //设置对话框的自定义标题,建立一个YES的按钮 - Account[] accounts = getGoogleAccounts(); - String defAccount = getSyncAccountName(this); - //获取同步账户信息 - mOriAccounts = accounts; - mHasAddedAccount = false; - - if (accounts.length > 0) { - //若账户不为空 - CharSequence[] items = new CharSequence[accounts.length]; - final CharSequence[] itemMapping = items; - int checkedItem = -1; - int index = 0; - for (Account account : accounts) { - if (TextUtils.equals(account.name, defAccount)) { - checkedItem = index; - //在账户列表中查询到所需账户 - } - items[index++] = account.name; - } - dialogBuilder.setSingleChoiceItems(items, checkedItem, - //在对话框建立一个单选的复选框 - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - setSyncAccount(itemMapping[which].toString()); - dialog.dismiss(); - //取消对话框 - refreshUI(); - } - //设置点击后执行的事件,包括检录新同步账户和刷新标签界面 - }); - //建立对话框网络版的监听器 - } - - View addAccountView = LayoutInflater.from(this).inflate(R.layout.add_account_text, null); - dialogBuilder.setView(addAccountView); - //给新加账户对话框设置自定义样式 - - final AlertDialog dialog = dialogBuilder.show(); - //显示对话框 - addAccountView.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - mHasAddedAccount = true; - //将新加账户的hash置true - Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS"); - //建立网络建立组件 - intent.putExtra(AUTHORITIES_FILTER_KEY, new String[] { - "gmail-ls" - }); - startActivityForResult(intent, -1); - //跳回上一个选项 - dialog.dismiss(); - } - }); - //建立新加账户对话框的监听器 - } - - /* - * 函数功能:显示账户选择对话框和相关账户操作 - * 函数实现:如下注释 - */ - private void showChangeAccountConfirmAlertDialog() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - //创建一个新的对话框 - View titleView = LayoutInflater.from(this).inflate(R.layout.account_dialog_title, null); - TextView titleTextView = (TextView) titleView.findViewById(R.id.account_dialog_title); - titleTextView.setText(getString(R.string.preferences_dialog_change_account_title, - getSyncAccountName(this))); - TextView subtitleTextView = (TextView) titleView.findViewById(R.id.account_dialog_subtitle); - subtitleTextView.setText(getString(R.string.preferences_dialog_change_account_warn_msg)); - //根据同步修改的账户信息设置标题以及子标题的内容 - dialogBuilder.setCustomTitle(titleView); - //设置对话框的自定义标题 - CharSequence[] menuItemArray = new CharSequence[] { - getString(R.string.preferences_menu_change_account), - getString(R.string.preferences_menu_remove_account), - getString(R.string.preferences_menu_cancel) - }; - //定义一些标记字符串 - dialogBuilder.setItems(menuItemArray, new DialogInterface.OnClickListener() { - //设置对话框要显示的一个list,用于显示几个命令时,即change,remove,cancel - public void onClick(DialogInterface dialog, int which) { - //按键功能,由which来决定 - if (which == 0) { - //进入账户选择对话框 - showSelectAccountAlertDialog(); - } else if (which == 1) { - //删除账户并且跟新便签界面 - removeSyncAccount(); - refreshUI(); - } - } - }); - dialogBuilder.show(); - //显示对话框 - } - - /* - *函数功能:获取谷歌账户 - *函数实现:通过账户管理器直接获取 - */ - private Account[] getGoogleAccounts() { - AccountManager accountManager = AccountManager.get(this); - return accountManager.getAccountsByType("com.google"); - } - - /* - * 函数功能:设置同步账户 - * 函数实现:如下注释: - */ - private void setSyncAccount(String account) { - if (!getSyncAccountName(this).equals(account)) { - //假如该账号不在同步账号列表中 - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - //编辑共享的首选项 - if (account != null) { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); - } else { - editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - //将该账号加入到首选项中 - - editor.commit(); - //提交修改的数据 - - - setLastSyncTime(this, 0); - //将最后同步时间清零 - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - //重置当地同步任务的信息 - - Toast.makeText(NotesPreferenceActivity.this, - getString(R.string.preferences_toast_success_set_accout, account), - Toast.LENGTH_SHORT).show(); - //将toast的文本信息置为“设置账户成功”并显示出来 - } - } - /* - * 函数功能:删除同步账户 - * 函数实现:如下注释: - */ - private void removeSyncAccount() { - SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - //设置共享首选项 - - if (settings.contains(PREFERENCE_SYNC_ACCOUNT_NAME)) { - editor.remove(PREFERENCE_SYNC_ACCOUNT_NAME); - //假如当前首选项中有账户就删除 - } - if (settings.contains(PREFERENCE_LAST_SYNC_TIME)) { - editor.remove(PREFERENCE_LAST_SYNC_TIME); - //删除当前首选项中有账户时间 - } - editor.commit(); - //提交更新后的数据 - - // clean up local gtask related info - new Thread(new Runnable() { - public void run() { - ContentValues values = new ContentValues(); - values.put(NoteColumns.GTASK_ID, ""); - values.put(NoteColumns.SYNC_ID, 0); - getContentResolver().update(Notes.CONTENT_NOTE_URI, values, null, null); - } - }).start(); - //重置当地同步任务的信息 - } - - /* - * 函数功能:获取同步账户名称 - * 函数实现:通过共享的首选项里的信息直接获取 - */ - public static String getSyncAccountName(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); - } - - /* - * 函数功能:设置最终同步的时间 - * 函数实现:如下注释 - */ - public static void setLastSyncTime(Context context, long time) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - SharedPreferences.Editor editor = settings.edit(); - // 从共享首选项中找到相关账户并获取其编辑器 - editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); - editor.commit(); - //编辑最终同步时间并提交更新 - } - /* - * 函数功能:获取最终同步时间 - * 函数实现:通过共享的首选项里的信息直接获取 - */ - public static long getLastSyncTime(Context context) { - SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); - return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); - } - - /* - * 函数功能:接受同步信息 - * 函数实现:继承BroadcastReceiver - */ - private class GTaskReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - refreshUI(); - if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) { - //获取随广播而来的Intent中的同步服务的数据 - TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview); - syncStatus.setText(intent - .getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG)); - //通过获取的数据在设置系统的状态 - } - - } - } - - /* - * 函数功能:处理菜单的选项 - * 函数实现:如下注释 - * 参数:MenuItem菜单选项 - */ - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - //根据选项的id选择,这里只有一个主页 - case android.R.id.home: - Intent intent = new Intent(this, NotesListActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(intent); - return true; - //在主页情况下在创建连接组件intent,发出清空的信号并开始一个相应的activity - default: - return false; - } - } -} - \ No newline at end of file diff --git a/src/widget/NoteWidgetProvider.java b/src/widget/NoteWidgetProvider.java deleted file mode 100644 index d6534c8..0000000 --- a/src/widget/NoteWidgetProvider.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.util.Log; -import android.widget.RemoteViews; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.data.Notes.NoteColumns; -import net.micode.notes.tool.ResourceParser; -import net.micode.notes.ui.NoteEditActivity; -import net.micode.notes.ui.NotesListActivity; -//定义了一个抽象类,提供便签挂件 -public abstract class NoteWidgetProvider extends AppWidgetProvider { - public static final String [] PROJECTION = new String [] { - NoteColumns.ID, - NoteColumns.BG_COLOR_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; - - private static final String TAG = "NoteWidgetProvider"; - - @Override - public void onDeleted(Context context, int[] appWidgetIds) { - ContentValues values = new ContentValues(); - values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - for (int i = 0; i < appWidgetIds.length; i++) { - context.getContentResolver().update(Notes.CONTENT_NOTE_URI, - values, - NoteColumns.WIDGET_ID + "=?", - new String[] { String.valueOf(appWidgetIds[i])}); - } - } - - private Cursor getNoteWidgetInfo(Context context, int widgetId) { - return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, - PROJECTION, - NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", - new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, - null); - } - - protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - update(context, appWidgetManager, appWidgetIds, false); - } - - 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); - intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - 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) { - Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]); - c.close(); - return; - } - snippet = c.getString(COLUMN_SNIPPET); - bgId = c.getInt(COLUMN_BG_COLOR_ID); - intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID)); - intent.setAction(Intent.ACTION_VIEW); - } else { - snippet = context.getResources().getString(R.string.widget_havenot_content); - intent.setAction(Intent.ACTION_INSERT_OR_EDIT); - } - - if (c != null) { - c.close(); - } - - 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 = 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); - } - - rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); - appWidgetManager.updateAppWidget(appWidgetIds[i], rv); - } - } - } - - protected abstract int getBgResourceId(int bgId); - - protected abstract int getLayoutId(); - - protected abstract int getWidgetType(); -} diff --git a/src/widget/NoteWidgetProvider_2x.java b/src/widget/NoteWidgetProvider_2x.java deleted file mode 100644 index adcb2f7..0000000 --- a/src/widget/NoteWidgetProvider_2x.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_2x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - @Override - protected int getLayoutId() { - return R.layout.widget_2x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_2X; - } -} diff --git a/src/widget/NoteWidgetProvider_4x.java b/src/widget/NoteWidgetProvider_4x.java deleted file mode 100644 index c12a02e..0000000 --- a/src/widget/NoteWidgetProvider_4x.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.micode.notes.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; - -import net.micode.notes.R; -import net.micode.notes.data.Notes; -import net.micode.notes.tool.ResourceParser; - - -public class NoteWidgetProvider_4x extends NoteWidgetProvider { - @Override - public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { - super.update(context, appWidgetManager, appWidgetIds); - } - - protected int getLayoutId() { - return R.layout.widget_4x; - } - - @Override - protected int getBgResourceId(int bgId) { - return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId); - } - - @Override - protected int getWidgetType() { - return Notes.TYPE_WIDGET_4X; - } -}