Compare commits

..

3 Commits

Author SHA1 Message Date
lilium-saber 2ae28433c8 更改
2 years ago
lilium-saber 26662d5255 gy
2 years ago
lilium-saber 9f50a77930 all
2 years ago

@ -1,2 +0,0 @@
#Mon Apr 10 21:32:01 HKT 2023
gradle.version=7.5

Binary file not shown.

@ -1,11 +0,0 @@
s
java:S4144Á"\Update this method so that its implementation is not identical to "getParentId" on line 185.(ø¦¯ÿ
>
java:S1125T"(Remove the unnecessary boolean literals.(ú«€É
m
java:S3776p"RRefactor this method to reduce its Cognitive Complexity from 18 to the 15 allowed.(Ñý¨úýÿÿÿÿ
C
java:S1125q"(Remove the unnecessary boolean literals.(¢´—Öÿÿÿÿÿ
>
java:S1125r"(Remove the unnecessary boolean literals.(ãêÛì

@ -1,39 +0,0 @@
t
java:S22930"YReplace the type specification in this constructor call with the diamond operator ("<>").(àÉ™âùÿÿÿÿ
o
java:S2293]"YReplace the type specification in this constructor call with the diamond operator ("<>").(œ€ÄÑ
o
java:S2293m"YReplace the type specification in this constructor call with the diamond operator ("<>").(¾<>Ȫ
J
java:S1066U"/Merge this if statement with the enclosing one.(ßÚ§µúÿÿÿÿ
ˆ
java:S1319\"mThe return type of this method should be an interface such as "Set" rather than the implementation "HashSet".(“Ÿóßûÿÿÿÿ
ˆ
java:S1319l"mThe return type of this method should be an interface such as "Set" rather than the implementation "HashSet".(•Ñòóýÿÿÿÿ
j
java:S1104*"TMake widgetId a static final constant or non-public and provide accessors if needed.(åÇŽ<C387>
q
java:S1104+"VMake widgetType a static final constant or non-public and provide accessors if needed.(ö漬þÿÿÿÿ
C
java:S5411_"(Use a primitive boolean expression here.(ɯÀÐüÿÿÿÿ
C
java:S5411o"(Use a primitive boolean expression here.(ɯÀÐüÿÿÿÿ
D
java:S5411"(Use a primitive boolean expression here.( „Œ¢ùÿÿÿÿ
7
java:S1116,"Remove this empty statement.(ôŸŽìúÿÿÿÿ
D
java:S1874/".Remove this use of "<init>"; it is deprecated.(ÌÖçü
J
java:S2864^"4Iterate over the "entrySet" instead of the "keySet".(਷â
B
java:S1125_"'Remove the unnecessary boolean literal.(ɯÀÐüÿÿÿÿ
J
java:S2864n"4Iterate over the "entrySet" instead of the "keySet".(਷â
B
java:S1125o"'Remove the unnecessary boolean literal.(ɯÀÐüÿÿÿÿ
A
java:S1168|"+Return an empty collection instead of null.(¥¹ï<C2B9>
C
java:S1125"'Remove the unnecessary boolean literal.( „Œ¢ùÿÿÿÿ

@ -1,35 +0,0 @@
t
java:S22932"YReplace the type specification in this constructor call with the diamond operator ("<>").(áºÐ»ûÿÿÿÿ
t
java:S2293Z"YReplace the type specification in this constructor call with the diamond operator ("<>").(áºÐ»ûÿÿÿÿ
u
java:S2293Ò"YReplace the type specification in this constructor call with the diamond operator ("<>").(Ûª¡úÿÿÿÿ
b
java:S1192D"GDefine a constant instead of duplicating this literal "%s: %s" 4 times.(ÇÇ÷«ùÿÿÿÿ
c
java:S1192x"HDefine a constant instead of duplicating this literal "=? AND " 4 times.(„¼¹<C2BC>úÿÿÿÿ
J
java:S1066~"/Merge this if statement with the enclosing one.(䲜¼øÿÿÿÿ
v
java:S1319("`The type of "ids" should be an interface such as "Set" rather than the implementation "HashSet".(îîè“
{
java:S1319S"`The type of "ids" should be an interface such as "Set" rather than the implementation "HashSet".(󆱋ÿÿÿÿÿ

java:S1319È"mThe return type of this method should be an interface such as "Set" rather than the implementation "HashSet".(ÛëÈðýÿÿÿÿ
U
java:S1118&":Add a private constructor to hide the implicit public one.(³¡¸<C2A1>ÿÿÿÿÿ
T
java:S1155-">Use isEmpty() to check whether the collection is empty or not.(´¤”Ó
Z
java:S2147E"DCombine this catch with the one at line 67, which has the same body.(æš©›
[
java:S2147l"ECombine this catch with the one at line 106, which has the same body.(æš©›
k
java:S3252æ"OUse static access with "net.micode.notes.data.Notes$DataColumns" for "NOTE_ID".(ž“ñ§ûÿÿÿÿ
m
java:S3252æ"QUse static access with "net.micode.notes.data.Notes$DataColumns" for "MIME_TYPE".(ž“ñ§ûÿÿÿÿ
f
java:S3252ø"OUse static access with "net.micode.notes.data.Notes$DataColumns" for "NOTE_ID".(ýʹà
m
java:S3252ù"QUse static access with "net.micode.notes.data.Notes$DataColumns" for "MIME_TYPE".(±ðŒ“úÿÿÿÿ

@ -1,3 +0,0 @@
m
java:S37763"RRefactor this method to reduce its Cognitive Complexity from 16 to the 15 allowed.(üßú–ùÿÿÿÿ

@ -1,7 +0,0 @@
3
java:S2386!"Make this member "protected".(±ê™–
D
java:S1874*".Remove this use of "<init>"; it is deprecated.(椱
M
java:S1135+"2Complete the task associated to this TODO comment.(ƒŠ® úÿÿÿÿ

@ -1,20 +0,0 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "net.micode.notes",
"variantName": "debug",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 1,
"versionName": "0.1",
"outputFile": "app-debug.apk"
}
],
"elementType": "File"
}

@ -1,2 +0,0 @@
#- File Locator -
listingFile=../../apk/debug/output-metadata.json

@ -1,97 +0,0 @@
#Thu Apr 27 19:48:33 HKT 2023
net.micode.notes.app-main-7\:/drawable-hdpi/call_record.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_call_record.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_green.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_green.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_yellow.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_yellow.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_small.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_small.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_white.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_white.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_white.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_white.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_down.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_down.9.png.flat
net.micode.notes.app-main-7\:/color/secondary_text_dark.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\color_secondary_text_dark.xml.flat
net.micode.notes.app-main-7\:/layout/widget_4x.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_widget_4x.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/menu_delete.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_menu_delete.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/clock.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_clock.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/dropdown_icon.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_dropdown_icon.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_green.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_green.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_white_single.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_single.9.png.flat
net.micode.notes.app-main-7\:/raw-zh-rCN/introduction=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\raw-zh-rCN_introduction.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_green.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_green.png.flat
net.micode.notes.app-main-7\:/xml/preferences.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\xml_preferences.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/delete.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_delete.png.flat
net.micode.notes.app-main-7\:/menu/call_record_folder.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_call_record_folder.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_red.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_red.png.flat
net.micode.notes.app-main-7\:/layout/widget_2x.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_widget_2x.xml.flat
net.micode.notes.app-main-7\:/layout/add_account_text.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_add_account_text.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/selected.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_selected.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_middle.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_middle.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_single.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_single.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_large.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_large.png.flat
net.micode.notes.app-main-7\:/layout/settings_header.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_settings_header.xml.flat
net.micode.notes.app-main-7\:/menu/call_note_edit.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_call_note_edit.xml.flat
net.micode.notes.app-main-7\:/raw/introduction=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\raw_introduction.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_yellow.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_yellow.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_red.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_red.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/title_alert.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_title_alert.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_yellow.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_yellow.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_color_green.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_color_green.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_red.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_red.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/title_bar_bg.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_title_bar_bg.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_green_up.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_up.9.png.flat
net.micode.notes.app-main-7\:/layout/note_list_dropdown_menu.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list_dropdown_menu.xml.flat
net.micode.notes.app-main-7\:/layout/note_list_footer.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list_footer.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_white_up.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_up.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_blue.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_blue.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/bg_color_btn_mask.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_bg_color_btn_mask.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_blue.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_blue.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/bg_btn_set_color.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_bg_btn_set_color.png.flat
net.micode.notes.app-main-7\:/xml/searchable.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\xml_searchable.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/notification.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_notification.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_up.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_up.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/note_edit_color_selector_panel.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_note_edit_color_selector_panel.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_white_middle.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_middle.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_folder.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_folder.9.png.flat
net.micode.notes.app-main-7\:/menu/note_edit.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_note_edit.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_super.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_super.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/new_note_normal.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_new_note_normal.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_yellow.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_yellow.9.png.flat
net.micode.notes.app-main-7\:/menu/sub_folder.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_sub_folder.xml.flat
net.micode.notes.app-main-7\:/layout/account_dialog_title.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_account_dialog_title.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_green.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_green.png.flat
net.micode.notes.app-main-7\:/layout/dialog_edit_text.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_dialog_edit_text.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_middle.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_middle.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_normal.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_normal.png.flat
net.micode.notes.app-main-7\:/layout/note_edit.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_edit.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_green_single.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_single.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_red_single.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_single.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/menu_move.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_menu_move.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_green_down.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_down.9.png.flat
net.micode.notes.app-main-7\:/layout/note_edit_list_item.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_edit_list_item.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_blue.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_blue.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/font_size_selector_bg.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_size_selector_bg.9.png.flat
net.micode.notes.app-main-7\:/xml/widget_4x_info.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\xml_widget_4x_info.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/search_result.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_search_result.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_white.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_white.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_green_middle.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_middle.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_white_down.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_down.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_up.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_up.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_red_middle.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_middle.9.png.flat
net.micode.notes.app-main-7\:/menu/note_list.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list.xml.flat
net.micode.notes.app-main-7\:/drawable/new_note.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable_new_note.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_red.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_red.9.png.flat
net.micode.notes.app-main-7\:/layout/note_list.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list.xml.flat
net.micode.notes.app-main-7\:/color/primary_text_dark.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\color_primary_text_dark.xml.flat
net.micode.notes.app-main-7\:/layout/datetime_picker.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_datetime_picker.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_single.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_single.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_red_down.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_down.9.png.flat
net.micode.notes.app-main-7\:/menu/note_list_options.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list_options.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/icon_app.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_icon_app.png.flat
net.micode.notes.app-main-7\:/layout/note_item.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_note_item.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_background.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_background.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_footer_bg.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_footer_bg.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/new_note_pressed.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_new_note_pressed.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_red_up.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_up.9.png.flat
net.micode.notes.app-main-7\:/menu/note_list_dropdown.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list_dropdown.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_white.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_white.9.png.flat
net.micode.notes.app-main-7\:/xml/widget_2x_info.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\xml_widget_2x_info.xml.flat
net.micode.notes.app-main-7\:/layout/folder_list_item.xml=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\layout_folder_list_item.xml.flat
net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_blue.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_blue.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_down.9.png=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_down.9.png.flat

File diff suppressed because one or more lines are too long

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\main\assets"/><source path="D:\Work-java\MINOTES\minotes\app\build\intermediates\shader_assets\debug\out"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\debug\assets"/></dataSet></merger>

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\main\jniLibs"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\debug\jniLibs"/></dataSet></merger>

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<merger version="3"><dataSet config="main" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\main\shaders"/></dataSet><dataSet config="debug" ignore_pattern="!.svn:!.git:!.ds_store:!*.scc:.*:&lt;dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~"><source path="D:\Work-java\MINOTES\minotes\app\src\debug\shaders"/></dataSet></merger>

@ -1,4 +0,0 @@
#Thu Apr 27 20:45:53 HKT 2023
base.0=D\:\\Work-java\\MINOTES\\minotes\\app\\build\\intermediates\\dex\\debug\\mergeDexDebug\\classes.dex
renamed.0=classes.dex
path.0=classes.dex

@ -1,273 +0,0 @@
1<?xml version="1.0" encoding="utf-8"?>
2<!--
3 Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
4
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16-->
17<manifest xmlns:android="http://schemas.android.com/apk/res/android"
18 package="net.micode.notes"
19 android:versionCode="1"
20 android:versionName="0.1" >
21
22 <uses-sdk
22-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
23 android:minSdkVersion="14"
23-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:15-41
24 android:targetSdkVersion="14" />
24-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
25
26 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
26-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:25:5-81
26-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:25:22-78
27 <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
27-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:26:5-88
27-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:26:22-85
28 <uses-permission android:name="android.permission.INTERNET" />
28-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:27:5-67
28-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:27:22-64
29 <uses-permission android:name="android.permission.READ_CONTACTS" />
29-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:28:5-72
29-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:28:22-69
30 <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
30-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:29:5-74
30-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:29:22-71
31 <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
31-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:30:5-80
31-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:30:22-77
32 <uses-permission android:name="android.permission.GET_ACCOUNTS" />
32-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:31:5-71
32-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:31:22-68
33 <uses-permission android:name="android.permission.USE_CREDENTIALS" />
33-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:32:5-74
33-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:32:22-71
34 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
34-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:33:5-81
34-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:33:22-78
35
36 <application
36-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:35:5-149:19
37 android:debuggable="true"
38 android:icon="@drawable/icon_app"
38-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:36:9-42
39 android:label="@string/app_name"
39-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:37:9-41
40 android:testOnly="true" >
41 <activity
41-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:38:9-51:20
42 android:name="net.micode.notes.ui.NotesListActivity"
42-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:39:13-49
43 android:configChanges="keyboardHidden|orientation|screenSize"
43-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:40:13-74
44 android:label="@string/app_name"
44-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:41:13-45
45 android:launchMode="singleTop"
45-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:42:13-43
46 android:theme="@style/NoteTheme"
46-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:43:13-45
47 android:uiOptions="splitActionBarWhenNarrow"
47-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:44:13-57
48 android:windowSoftInputMode="adjustPan" >
48-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:45:13-52
49 <intent-filter>
49-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:47:13-50:29
50 <action android:name="android.intent.action.MAIN" />
50-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:48:17-69
50-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:48:25-66
51
52 <category android:name="android.intent.category.LAUNCHER" />
52-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:49:17-77
52-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:49:27-74
53 </intent-filter>
54 </activity>
55 <activity
55-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:53:9-81:20
56 android:name="net.micode.notes.ui.NoteEditActivity"
56-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:54:13-48
57 android:configChanges="keyboardHidden|orientation|screenSize"
57-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:55:13-74
58 android:launchMode="singleTop"
58-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:56:13-43
59 android:theme="@style/NoteTheme" >
59-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:57:13-45
60 <intent-filter>
60-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:59:13-64:29
61 <action android:name="android.intent.action.VIEW" />
61-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:60:17-69
61-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:60:25-66
62
63 <category android:name="android.intent.category.DEFAULT" />
63-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:17-76
63-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:27-73
64
65 <data android:mimeType="vnd.android.cursor.item/text_note" />
65-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:17-78
65-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:23-75
66 <data android:mimeType="vnd.android.cursor.item/call_note" />
66-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:17-78
66-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:23-75
67 </intent-filter>
68 <intent-filter>
68-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:66:13-71:29
69 <action android:name="android.intent.action.INSERT_OR_EDIT" />
69-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:67:17-79
69-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:67:25-76
70
71 <category android:name="android.intent.category.DEFAULT" />
71-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:17-76
71-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:27-73
72
73 <data android:mimeType="vnd.android.cursor.item/text_note" />
73-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:17-78
73-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:23-75
74 <data android:mimeType="vnd.android.cursor.item/call_note" />
74-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:17-78
74-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:23-75
75 </intent-filter>
76 <intent-filter>
76-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:73:13-76:29
77 <action android:name="android.intent.action.SEARCH" />
77-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:74:17-71
77-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:74:25-68
78
79 <category android:name="android.intent.category.DEFAULT" />
79-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:17-76
79-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:27-73
80 </intent-filter>
81
82 <meta-data
82-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:78:13-80:54
83 android:name="android.app.searchable"
83-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:79:17-54
84 android:resource="@xml/searchable" />
84-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:80:17-51
85 </activity>
86
87 <provider
87-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:83:9-86:43
88 android:name="net.micode.notes.data.NotesProvider"
88-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:84:13-63
89 android:authorities="micode_notes"
89-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:85:13-47
90 android:multiprocess="true" />
90-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:86:13-40
91
92 <receiver
92-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:88:9-100:20
93 android:name="net.micode.notes.widget.NoteWidgetProvider_2x"
93-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:89:13-57
94 android:label="@string/app_widget2x2" >
94-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:90:13-50
95 <intent-filter>
95-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:91:13-95:29
96 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
96-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:17-84
96-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:25-81
97 <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
97-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:17-85
97-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:25-82
98 <action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
98-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:17-85
98-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:25-82
99 </intent-filter>
100
101 <meta-data
101-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:97:13-99:58
102 android:name="android.appwidget.provider"
102-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:98:17-58
103 android:resource="@xml/widget_2x_info" />
103-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:99:17-55
104 </receiver>
105 <receiver
105-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:101:9-114:20
106 android:name="net.micode.notes.widget.NoteWidgetProvider_4x"
106-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:102:13-57
107 android:label="@string/app_widget4x4" >
107-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:103:13-50
108 <intent-filter>
108-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:91:13-95:29
109 <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
109-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:17-84
109-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:25-81
110 <action android:name="android.appwidget.action.APPWIDGET_DELETED" />
110-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:17-85
110-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:25-82
111 <action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
111-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:17-85
111-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:25-82
112 </intent-filter>
113
114 <meta-data
114-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:97:13-99:58
115 android:name="android.appwidget.provider"
115-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:98:17-58
116 android:resource="@xml/widget_4x_info" />
116-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:99:17-55
117 </receiver>
118 <receiver android:name="net.micode.notes.ui.AlarmInitReceiver" >
118-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:116:9-120:20
118-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:116:19-55
119 <intent-filter>
119-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:117:13-119:29
120 <action android:name="android.intent.action.BOOT_COMPLETED" />
120-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:118:17-79
120-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:118:25-76
121 </intent-filter>
122 </receiver>
123 <receiver
123-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:122:9-125:20
124 android:name="net.micode.notes.ui.AlarmReceiver"
124-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:123:13-61
125 android:process=":remote" >
125-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:124:13-38
126 </receiver>
127
128 <activity
128-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:127:9-132:20
129 android:name="net.micode.notes.ui.AlarmAlertActivity"
129-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:128:13-50
130 android:label="@string/app_name"
130-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:129:13-45
131 android:launchMode="singleInstance"
131-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:130:13-48
132 android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
132-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:131:13-75
133 </activity>
134 <activity
134-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:134:9-139:20
135 android:name="net.micode.notes.ui.NotesPreferenceActivity"
135-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:135:13-71
136 android:label="@string/preferences_title"
136-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:136:13-54
137 android:launchMode="singleTop"
137-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:137:13-43
138 android:theme="@android:style/Theme.Holo.Light" >
138-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:138:13-60
139 </activity>
140
141 <service
141-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:141:9-144:19
142 android:name="net.micode.notes.gtask.remote.GTaskSyncService"
142-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:142:13-74
143 android:exported="false" >
143-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:143:13-37
144 </service>
145
146 <meta-data
146-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:146:9-148:52
147 android:name="android.app.default_searchable"
147-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:147:13-58
148 android:value=".ui.NoteEditActivity" />
148-->D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:148:13-49
149 </application>
150
151</manifest>

@ -1,203 +0,0 @@
{
"logs": [
{
"outputFile": "net.micode.notes.app-merged_res-5:/values-zh-rCN_values-zh-rCN.arsc.flat",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rCN\\arrays.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endLines": "21",
"endColumns": "19",
"endOffsets": "817"
},
"to": {
"startLines": "2",
"startColumns": "4",
"startOffsets": "105",
"endLines": "5",
"endColumns": "19",
"endOffsets": "210"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rCN\\strings.xml",
"from": {
"startLines": "128,74,73,72,71,19,20,21,118,119,127,126,125,26,82,83,81,80,79,95,94,93,85,39,38,63,29,30,86,40,75,120,70,66,77,41,47,52,42,62,61,60,56,55,53,54,57,78,58,48,69,59,67,46,51,50,49,65,45,64,43,44,68,28,34,36,33,35,32,31,25,24,102,101,105,117,110,109,111,112,114,113,103,104,108,106,107,100,115,116,124,122,121,123,27,84,92,97,96,98,91,90,89,88,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "6947,3667,3601,3528,3478,827,867,915,6446,6491,6895,6841,6791,1199,4142,4210,4083,4018,3955,4873,4813,4750,4342,1849,1798,3049,1369,1422,4396,1911,3740,6548,3419,3206,3846,1970,2251,2497,2023,2989,2936,2885,2690,2642,2548,2596,2736,3906,2783,2294,3360,2833,3249,2208,2450,2394,2339,3151,2164,3109,2073,2114,3301,1318,1623,1719,1576,1672,1529,1484,1148,1095,5248,5189,5471,6372,5782,5713,5846,5924,6107,6034,5323,5389,5658,5528,5593,5140,6211,6294,6753,6646,6598,6691,1261,4287,4691,4986,4928,5053,4643,4598,4550,4499,963,1029",
"endLines": "130,74,73,72,71,19,20,21,118,119,127,126,125,26,82,83,81,80,79,95,94,93,85,39,38,63,29,30,86,40,75,120,70,66,77,41,47,52,42,62,61,60,56,55,53,54,57,78,58,48,69,59,67,46,51,50,49,65,45,64,43,44,68,28,34,36,33,35,32,31,25,24,102,101,105,117,110,109,111,112,114,113,103,104,108,106,107,100,115,116,124,122,121,123,27,84,92,97,96,98,91,90,89,88,22,23",
"endColumns": "14,72,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,64,62,54,59,62,53,61,50,59,52,61,84,58,80,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "7119,3735,3662,3596,3523,862,910,958,6486,6543,6942,6890,6836,1256,4205,4282,4137,4078,4013,4923,4868,4808,4391,1906,1844,3104,1417,1479,4476,1965,3816,6593,3473,3244,3901,2018,2289,2543,2068,3044,2984,2931,2731,2685,2591,2637,2778,3950,2828,2334,3414,2880,3296,2246,2492,2445,2389,3201,2203,3146,2109,2159,3355,1364,1667,1763,1618,1714,1571,1524,1194,1143,5318,5243,5523,6441,5841,5777,5919,6029,6206,6102,5384,5466,5708,5588,5653,5184,6289,6367,6786,6686,6641,6748,1313,4337,4745,5048,4981,5110,4686,4638,4593,4545,1024,1090"
},
"to": {
"startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "215,384,457,523,596,646,686,734,782,827,884,936,990,1040,1102,1170,1247,1306,1371,1434,1489,1549,1612,1666,1728,1779,1839,1892,1954,2039,2098,2179,2229,2288,2331,2391,2444,2487,2538,2588,2648,2701,2752,2798,2846,2894,2940,2987,3036,3086,3131,3190,3242,3294,3337,3384,3440,3495,3550,3594,3636,3677,3727,3786,3837,3886,3935,3982,4029,4076,4121,4172,4225,4300,4359,4416,4490,4554,4623,4701,4811,4915,4988,5054,5136,5191,5256,5321,5370,5453,5531,5569,5614,5662,5724,5781,5836,5895,5962,6020,6082,6130,6175,6223,6274,6340",
"endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"endColumns": "14,72,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,64,62,54,59,62,53,61,50,59,52,61,84,58,80,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "379,452,518,591,641,681,729,777,822,879,931,985,1035,1097,1165,1242,1301,1366,1429,1484,1544,1607,1661,1723,1774,1834,1887,1949,2034,2093,2174,2224,2283,2326,2386,2439,2482,2533,2583,2643,2696,2747,2793,2841,2889,2935,2982,3031,3081,3126,3185,3237,3289,3332,3379,3435,3490,3545,3589,3631,3672,3722,3781,3832,3881,3930,3977,4024,4071,4116,4167,4220,4295,4354,4411,4485,4549,4618,4696,4806,4910,4983,5049,5131,5186,5251,5316,5365,5448,5526,5564,5609,5657,5719,5776,5831,5890,5957,6015,6077,6125,6170,6218,6269,6335,6401"
}
}
]
},
{
"outputFile": "net.micode.notes.app-merged_res-5:/values_values.arsc.flat",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\FontColor.xml",
"from": {
"startLines": "4,7,6,2,3,5",
"startColumns": "4,4,4,4,4,4",
"startOffsets": "133,255,213,55,95,172",
"endColumns": "38,45,41,39,37,40",
"endOffsets": "167,296,250,90,128,208"
},
"to": {
"startLines": "12,13,14,15,16,17",
"startColumns": "4,4,4,4,4,4",
"startOffsets": "420,459,505,547,587,625",
"endColumns": "38,45,41,39,37,40",
"endOffsets": "454,500,542,582,620,661"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\strings.xml",
"from": {
"startLines": "131,72,75,74,73,19,20,21,120,121,130,129,128,26,83,84,82,81,80,96,95,94,86,39,38,64,29,30,87,41,76,122,71,67,77,42,48,53,43,63,62,61,57,56,54,55,58,78,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,103,102,106,118,111,110,112,113,115,114,104,105,109,107,108,101,116,117,127,125,124,126,27,85,93,98,97,99,92,91,90,89,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "8195,3898,4159,4063,3994,827,870,922,7641,7690,8143,8085,8034,1282,4748,4842,4677,4593,4510,5709,5626,5524,5018,2004,1953,3397,1486,1539,5079,2097,4242,7753,3827,3582,4344,2156,2471,2772,2214,3326,3265,3208,2986,2934,2831,2884,3036,4422,3086,2518,3761,3146,3631,2424,2717,2629,2571,3520,2374,3475,2271,2314,3694,1431,1750,1858,1703,1805,1647,1599,1227,1174,6165,6098,6406,7544,6770,6689,6844,6933,7175,7096,6249,6324,6630,6470,6550,6043,7319,7441,7993,7866,7809,7919,1366,4950,5438,5844,5775,5924,5379,5324,5262,5202,974,1084",
"endLines": "135,72,75,74,73,19,20,21,120,121,130,129,128,26,83,84,82,81,80,96,95,94,86,39,38,64,29,30,87,41,76,122,71,67,77,42,48,53,43,63,62,61,57,56,54,55,58,78,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,103,102,106,118,111,110,112,113,115,114,104,105,109,107,108,101,116,117,127,125,124,126,27,85,93,98,97,99,92,91,90,89,22,23",
"endColumns": "14,95,82,95,68,42,51,51,48,62,51,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,77,57,46,58,56,70,60,56,49,51,52,49,49,56,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89",
"endOffsets": "8599,3989,4237,4154,4058,865,917,969,7685,7748,8190,8138,8080,1361,4837,4945,4743,4672,4588,5770,5704,5621,5074,2061,1999,3470,1534,1594,5179,2151,4339,7803,3893,3626,4417,2209,2513,2826,2266,3392,3321,3260,3031,2981,2879,2929,3081,4474,3141,2566,3822,3203,3689,2466,2767,2712,2624,3577,2419,3515,2309,2369,3756,1481,1800,1906,1745,1853,1698,1642,1277,1222,6244,6160,6465,7635,6839,6765,6928,7091,7314,7170,6319,6401,6684,6545,6625,6093,7436,7539,8029,7914,7861,7988,1426,5013,5519,5919,5839,6013,5433,5374,5319,5257,1079,1169"
},
"to": {
"startLines": "24,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "985,1338,1434,1517,1613,1682,1725,1777,1829,1878,1941,1993,2051,2102,2186,2280,2388,2459,2543,2626,2692,2775,2877,2938,3000,3051,3129,3182,3242,3347,3406,3508,3563,3634,3683,3761,3819,3866,3925,3982,4053,4114,4171,4221,4273,4326,4376,4426,4483,4543,4596,4662,4724,4787,4834,4889,4977,5035,5097,5147,5192,5235,5295,5362,5417,5472,5525,5572,5625,5681,5729,5784,5837,5921,5988,6052,6148,6222,6303,6392,6555,6699,6778,6853,6935,6994,7074,7154,7209,7331,7434,7475,7528,7585,7659,7724,7792,7878,7958,8027,8121,8180,8235,8297,8357,8467",
"endLines": "28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133",
"endColumns": "14,95,82,95,68,42,51,51,48,62,51,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,77,57,46,58,56,70,60,56,49,51,52,49,49,56,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89",
"endOffsets": "1333,1429,1512,1608,1677,1720,1772,1824,1873,1936,1988,2046,2097,2181,2275,2383,2454,2538,2621,2687,2770,2872,2933,2995,3046,3124,3177,3237,3342,3401,3503,3558,3629,3678,3756,3814,3861,3920,3977,4048,4109,4166,4216,4268,4321,4371,4421,4478,4538,4591,4657,4719,4782,4829,4884,4972,5030,5092,5142,5187,5230,5290,5357,5412,5467,5520,5567,5620,5676,5724,5779,5832,5916,5983,6047,6143,6217,6298,6387,6550,6694,6773,6848,6930,6989,7069,7149,7204,7326,7429,7470,7523,7580,7654,7719,7787,7873,7953,8022,8116,8175,8230,8292,8352,8462,8552"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\styles.xml",
"from": {
"startLines": "64,69,78,74,36,40,44,49,54,32,59,28,25,19,22",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "2499,2704,3077,2916,1332,1515,1700,1886,2090,1149,2297,1031,921,713,819",
"endLines": "67,72,81,76,39,43,47,52,57,35,62,30,27,21,24",
"endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12",
"endOffsets": "2698,2910,3283,3071,1510,1695,1880,2084,2291,1327,2493,1143,1026,814,916"
},
"to": {
"startLines": "134,138,142,146,149,153,157,161,165,169,173,177,180,183,186",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "8557,8761,8972,9182,9342,9525,9710,9895,10098,10304,10487,10688,10805,10915,11021",
"endLines": "137,141,145,148,152,156,160,164,168,172,176,179,182,185,188",
"endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12",
"endOffsets": "8756,8967,9177,9337,9520,9705,9890,10093,10299,10482,10683,10800,10910,11016,11118"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\dimens.xml",
"from": {
"startLines": "19,20,21,22,18",
"startColumns": "4,4,4,4,4",
"startOffsets": "764,816,869,922,712",
"endColumns": "51,52,52,51,51",
"endOffsets": "811,864,917,969,759"
},
"to": {
"startLines": "19,20,21,22,23",
"startColumns": "4,4,4,4,4",
"startOffsets": "723,775,828,881,933",
"endColumns": "51,52,52,51,51",
"endOffsets": "770,823,876,928,980"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\arrays.xml",
"from": {
"startLines": "19,26",
"startColumns": "4,4",
"startOffsets": "739,1047",
"endLines": "24,29",
"endColumns": "19,19",
"endOffsets": "1041,1162"
},
"to": {
"startLines": "2,8",
"startColumns": "4,4",
"startOffsets": "105,300",
"endLines": "7,11",
"endColumns": "19,19",
"endOffsets": "295,415"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\colors.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endColumns": "56",
"endOffsets": "764"
},
"to": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "666",
"endColumns": "56",
"endOffsets": "718"
}
}
]
},
{
"outputFile": "net.micode.notes.app-merged_res-5:/values-zh-rTW_values-zh-rTW.arsc.flat",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rTW\\arrays.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endLines": "21",
"endColumns": "19",
"endOffsets": "817"
},
"to": {
"startLines": "2",
"startColumns": "4",
"startOffsets": "105",
"endLines": "5",
"endColumns": "19",
"endOffsets": "210"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rTW\\strings.xml",
"from": {
"startLines": "129,75,74,73,72,19,20,21,118,119,128,127,126,26,81,82,80,79,78,94,93,92,84,40,39,64,29,30,85,41,37,120,71,67,76,42,48,53,43,63,62,61,57,56,54,55,58,77,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "6938,3763,3697,3624,3574,843,883,931,6436,6481,6886,6832,6782,1215,4132,4200,4073,4007,3944,4862,4802,4739,4332,1945,1894,3145,1385,1438,4386,2007,1784,6538,3515,3302,3835,2066,2347,2593,2119,3085,3032,2981,2786,2738,2644,2692,2832,3895,2879,2390,3456,2929,3345,2304,2546,2490,2435,3247,2260,3205,2169,2210,3397,1334,1639,1735,1592,1688,1545,1500,1164,1111,5237,5178,5460,6361,5771,5702,5835,5913,6096,6023,5312,5378,5647,5517,5582,5129,6200,6283,6744,6637,6589,6682,1277,4277,4680,4975,4917,5042,4632,4587,4539,4488,979,1045",
"endLines": "131,75,74,73,72,19,20,21,118,119,128,127,126,26,81,82,80,79,78,94,93,92,84,40,39,64,29,30,85,41,37,120,71,67,76,42,48,53,43,63,62,61,57,56,54,55,58,77,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23",
"endColumns": "14,71,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,65,62,54,59,62,53,61,50,59,52,61,83,58,79,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "7110,3830,3758,3692,3619,878,926,974,6476,6533,6933,6881,6827,1272,4195,4272,4127,4068,4002,4912,4857,4797,4381,2002,1940,3200,1433,1495,4465,2061,1859,6583,3569,3340,3890,2114,2385,2639,2164,3140,3080,3027,2827,2781,2687,2733,2874,3939,2924,2430,3510,2976,3392,2342,2588,2541,2485,3297,2299,3242,2205,2255,3451,1380,1683,1779,1634,1730,1587,1540,1210,1159,5307,5232,5512,6430,5830,5766,5908,6018,6195,6091,5373,5455,5697,5577,5642,5173,6278,6356,6777,6677,6632,6739,1329,4327,4734,5037,4970,5099,4675,4627,4582,4534,1040,1106"
},
"to": {
"startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "215,384,456,522,595,645,685,733,781,826,883,935,989,1039,1101,1169,1246,1305,1371,1434,1489,1549,1612,1666,1728,1779,1839,1892,1954,2038,2097,2177,2227,2286,2329,2389,2442,2485,2536,2586,2646,2699,2750,2796,2844,2892,2938,2985,3034,3084,3129,3188,3240,3292,3335,3382,3438,3493,3548,3592,3634,3675,3725,3784,3835,3884,3933,3980,4027,4074,4119,4170,4223,4298,4357,4414,4488,4552,4621,4699,4809,4913,4986,5052,5134,5189,5254,5319,5368,5451,5529,5567,5612,5660,5722,5779,5834,5893,5960,6018,6080,6128,6173,6221,6272,6338",
"endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"endColumns": "14,71,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,65,62,54,59,62,53,61,50,59,52,61,83,58,79,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "379,451,517,590,640,680,728,776,821,878,930,984,1034,1096,1164,1241,1300,1366,1429,1484,1544,1607,1661,1723,1774,1834,1887,1949,2033,2092,2172,2222,2281,2324,2384,2437,2480,2531,2581,2641,2694,2745,2791,2839,2887,2933,2980,3029,3079,3124,3183,3235,3287,3330,3377,3433,3488,3543,3587,3629,3670,3720,3779,3830,3879,3928,3975,4022,4069,4114,4165,4218,4293,4352,4409,4483,4547,4616,4694,4804,4908,4981,5047,5129,5184,5249,5314,5363,5446,5524,5562,5607,5655,5717,5774,5829,5888,5955,6013,6075,6123,6168,6216,6267,6333,6399"
}
}
]
}
]
}

@ -1,47 +0,0 @@
{
"logs": [
{
"outputFile": "net.micode.notes.app-mergeDebugResources-3:/values-zh-rCN/values-zh-rCN.xml",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rCN\\arrays.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endLines": "21",
"endColumns": "19",
"endOffsets": "817"
},
"to": {
"startLines": "2",
"startColumns": "4",
"startOffsets": "105",
"endLines": "5",
"endColumns": "19",
"endOffsets": "210"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rCN\\strings.xml",
"from": {
"startLines": "128,74,73,72,71,19,20,21,118,119,127,126,125,26,82,83,81,80,79,95,94,93,85,39,38,63,29,30,86,40,75,120,70,66,77,41,47,52,42,62,61,60,56,55,53,54,57,78,58,48,69,59,67,46,51,50,49,65,45,64,43,44,68,28,34,36,33,35,32,31,25,24,102,101,105,117,110,109,111,112,114,113,103,104,108,106,107,100,115,116,124,122,121,123,27,84,92,97,96,98,91,90,89,88,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "6947,3667,3601,3528,3478,827,867,915,6446,6491,6895,6841,6791,1199,4142,4210,4083,4018,3955,4873,4813,4750,4342,1849,1798,3049,1369,1422,4396,1911,3740,6548,3419,3206,3846,1970,2251,2497,2023,2989,2936,2885,2690,2642,2548,2596,2736,3906,2783,2294,3360,2833,3249,2208,2450,2394,2339,3151,2164,3109,2073,2114,3301,1318,1623,1719,1576,1672,1529,1484,1148,1095,5248,5189,5471,6372,5782,5713,5846,5924,6107,6034,5323,5389,5658,5528,5593,5140,6211,6294,6753,6646,6598,6691,1261,4287,4691,4986,4928,5053,4643,4598,4550,4499,963,1029",
"endLines": "130,74,73,72,71,19,20,21,118,119,127,126,125,26,82,83,81,80,79,95,94,93,85,39,38,63,29,30,86,40,75,120,70,66,77,41,47,52,42,62,61,60,56,55,53,54,57,78,58,48,69,59,67,46,51,50,49,65,45,64,43,44,68,28,34,36,33,35,32,31,25,24,102,101,105,117,110,109,111,112,114,113,103,104,108,106,107,100,115,116,124,122,121,123,27,84,92,97,96,98,91,90,89,88,22,23",
"endColumns": "14,72,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,64,62,54,59,62,53,61,50,59,52,61,84,58,80,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "7119,3735,3662,3596,3523,862,910,958,6486,6543,6942,6890,6836,1256,4205,4282,4137,4078,4013,4923,4868,4808,4391,1906,1844,3104,1417,1479,4476,1965,3816,6593,3473,3244,3901,2018,2289,2543,2068,3044,2984,2931,2731,2685,2591,2637,2778,3950,2828,2334,3414,2880,3296,2246,2492,2445,2389,3201,2203,3146,2109,2159,3355,1364,1667,1763,1618,1714,1571,1524,1194,1143,5318,5243,5523,6441,5841,5777,5919,6029,6206,6102,5384,5466,5708,5588,5653,5184,6289,6367,6786,6686,6641,6748,1313,4337,4745,5048,4981,5110,4686,4638,4593,4545,1024,1090"
},
"to": {
"startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "215,384,457,523,596,646,686,734,782,827,884,936,990,1040,1102,1170,1247,1306,1371,1434,1489,1549,1612,1666,1728,1779,1839,1892,1954,2039,2098,2179,2229,2288,2331,2391,2444,2487,2538,2588,2648,2701,2752,2798,2846,2894,2940,2987,3036,3086,3131,3190,3242,3294,3337,3384,3440,3495,3550,3594,3636,3677,3727,3786,3837,3886,3935,3982,4029,4076,4121,4172,4225,4300,4359,4416,4490,4554,4623,4701,4811,4915,4988,5054,5136,5191,5256,5321,5370,5453,5531,5569,5614,5662,5724,5781,5836,5895,5962,6020,6082,6130,6175,6223,6274,6340",
"endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"endColumns": "14,72,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,64,62,54,59,62,53,61,50,59,52,61,84,58,80,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "379,452,518,591,641,681,729,777,822,879,931,985,1035,1097,1165,1242,1301,1366,1429,1484,1544,1607,1661,1723,1774,1834,1887,1949,2034,2093,2174,2224,2283,2326,2386,2439,2482,2533,2583,2643,2696,2747,2793,2841,2889,2935,2982,3031,3081,3126,3185,3237,3289,3332,3379,3435,3490,3545,3589,3631,3672,3722,3781,3832,3881,3930,3977,4024,4071,4116,4167,4220,4295,4354,4411,4485,4549,4618,4696,4806,4910,4983,5049,5131,5186,5251,5316,5365,5448,5526,5564,5609,5657,5719,5776,5831,5890,5957,6015,6077,6125,6170,6218,6269,6335,6401"
}
}
]
}
]
}

@ -1,47 +0,0 @@
{
"logs": [
{
"outputFile": "net.micode.notes.app-mergeDebugResources-3:/values-zh-rTW/values-zh-rTW.xml",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rTW\\arrays.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endLines": "21",
"endColumns": "19",
"endOffsets": "817"
},
"to": {
"startLines": "2",
"startColumns": "4",
"startOffsets": "105",
"endLines": "5",
"endColumns": "19",
"endOffsets": "210"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values-zh-rTW\\strings.xml",
"from": {
"startLines": "129,75,74,73,72,19,20,21,118,119,128,127,126,26,81,82,80,79,78,94,93,92,84,40,39,64,29,30,85,41,37,120,71,67,76,42,48,53,43,63,62,61,57,56,54,55,58,77,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "6938,3763,3697,3624,3574,843,883,931,6436,6481,6886,6832,6782,1215,4132,4200,4073,4007,3944,4862,4802,4739,4332,1945,1894,3145,1385,1438,4386,2007,1784,6538,3515,3302,3835,2066,2347,2593,2119,3085,3032,2981,2786,2738,2644,2692,2832,3895,2879,2390,3456,2929,3345,2304,2546,2490,2435,3247,2260,3205,2169,2210,3397,1334,1639,1735,1592,1688,1545,1500,1164,1111,5237,5178,5460,6361,5771,5702,5835,5913,6096,6023,5312,5378,5647,5517,5582,5129,6200,6283,6744,6637,6589,6682,1277,4277,4680,4975,4917,5042,4632,4587,4539,4488,979,1045",
"endLines": "131,75,74,73,72,19,20,21,118,119,128,127,126,26,81,82,80,79,78,94,93,92,84,40,39,64,29,30,85,41,37,120,71,67,76,42,48,53,43,63,62,61,57,56,54,55,58,77,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23",
"endColumns": "14,71,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,65,62,54,59,62,53,61,50,59,52,61,83,58,79,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "7110,3830,3758,3692,3619,878,926,974,6476,6533,6933,6881,6827,1272,4195,4272,4127,4068,4002,4912,4857,4797,4381,2002,1940,3200,1433,1495,4465,2061,1859,6583,3569,3340,3890,2114,2385,2639,2164,3140,3080,3027,2827,2781,2687,2733,2874,3939,2924,2430,3510,2976,3392,2342,2588,2541,2485,3297,2299,3242,2205,2255,3451,1380,1683,1779,1634,1730,1587,1540,1210,1159,5307,5232,5512,6430,5830,5766,5908,6018,6195,6091,5373,5455,5697,5577,5642,5173,6278,6356,6777,6677,6632,6739,1329,4327,4734,5037,4970,5099,4675,4627,4582,4534,1040,1106"
},
"to": {
"startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "215,384,456,522,595,645,685,733,781,826,883,935,989,1039,1101,1169,1246,1305,1371,1434,1489,1549,1612,1666,1728,1779,1839,1892,1954,2038,2097,2177,2227,2286,2329,2389,2442,2485,2536,2586,2646,2699,2750,2796,2844,2892,2938,2985,3034,3084,3129,3188,3240,3292,3335,3382,3438,3493,3548,3592,3634,3675,3725,3784,3835,3884,3933,3980,4027,4074,4119,4170,4223,4298,4357,4414,4488,4552,4621,4699,4809,4913,4986,5052,5134,5189,5254,5319,5368,5451,5529,5567,5612,5660,5722,5779,5834,5893,5960,6018,6080,6128,6173,6221,6272,6338",
"endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113",
"endColumns": "14,71,65,72,49,39,47,47,44,56,51,53,49,61,67,76,58,65,62,54,59,62,53,61,50,59,52,61,83,58,79,49,58,42,59,52,42,50,49,59,52,50,45,47,47,45,46,48,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,81,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65",
"endOffsets": "379,451,517,590,640,680,728,776,821,878,930,984,1034,1096,1164,1241,1300,1366,1429,1484,1544,1607,1661,1723,1774,1834,1887,1949,2033,2092,2172,2222,2281,2324,2384,2437,2480,2531,2581,2641,2694,2745,2791,2839,2887,2933,2980,3029,3079,3124,3183,3235,3287,3330,3377,3433,3488,3543,3587,3629,3670,3720,3779,3830,3879,3928,3975,4022,4069,4114,4165,4218,4293,4352,4409,4483,4547,4616,4694,4804,4908,4981,5047,5129,5184,5249,5314,5363,5446,5524,5562,5607,5655,5717,5774,5829,5888,5955,6013,6075,6123,6168,6216,6267,6333,6399"
}
}
]
}
]
}

@ -1,117 +0,0 @@
{
"logs": [
{
"outputFile": "net.micode.notes.app-mergeDebugResources-3:/values/values.xml",
"map": [
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\FontColor.xml",
"from": {
"startLines": "4,7,6,2,3,5",
"startColumns": "4,4,4,4,4,4",
"startOffsets": "133,255,213,55,95,172",
"endColumns": "38,45,41,39,37,40",
"endOffsets": "167,296,250,90,128,208"
},
"to": {
"startLines": "12,13,14,15,16,17",
"startColumns": "4,4,4,4,4,4",
"startOffsets": "420,459,505,547,587,625",
"endColumns": "38,45,41,39,37,40",
"endOffsets": "454,500,542,582,620,661"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\strings.xml",
"from": {
"startLines": "131,72,75,74,73,19,20,21,120,121,130,129,128,26,83,84,82,81,80,96,95,94,86,39,38,64,29,30,87,41,76,122,71,67,77,42,48,53,43,63,62,61,57,56,54,55,58,78,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,103,102,106,118,111,110,112,113,115,114,104,105,109,107,108,101,116,117,127,125,124,126,27,85,93,98,97,99,92,91,90,89,22,23",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "8195,3898,4159,4063,3994,827,870,922,7641,7690,8143,8085,8034,1282,4748,4842,4677,4593,4510,5709,5626,5524,5018,2004,1953,3397,1486,1539,5079,2097,4242,7753,3827,3582,4344,2156,2471,2772,2214,3326,3265,3208,2986,2934,2831,2884,3036,4422,3086,2518,3761,3146,3631,2424,2717,2629,2571,3520,2374,3475,2271,2314,3694,1431,1750,1858,1703,1805,1647,1599,1227,1174,6165,6098,6406,7544,6770,6689,6844,6933,7175,7096,6249,6324,6630,6470,6550,6043,7319,7441,7993,7866,7809,7919,1366,4950,5438,5844,5775,5924,5379,5324,5262,5202,974,1084",
"endLines": "135,72,75,74,73,19,20,21,120,121,130,129,128,26,83,84,82,81,80,96,95,94,86,39,38,64,29,30,87,41,76,122,71,67,77,42,48,53,43,63,62,61,57,56,54,55,58,78,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,103,102,106,118,111,110,112,113,115,114,104,105,109,107,108,101,116,117,127,125,124,126,27,85,93,98,97,99,92,91,90,89,22,23",
"endColumns": "14,95,82,95,68,42,51,51,48,62,51,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,77,57,46,58,56,70,60,56,49,51,52,49,49,56,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89",
"endOffsets": "8599,3989,4237,4154,4058,865,917,969,7685,7748,8190,8138,8080,1361,4837,4945,4743,4672,4588,5770,5704,5621,5074,2061,1999,3470,1534,1594,5179,2151,4339,7803,3893,3626,4417,2209,2513,2826,2266,3392,3321,3260,3031,2981,2879,2929,3081,4474,3141,2566,3822,3203,3689,2466,2767,2712,2624,3577,2419,3515,2309,2369,3756,1481,1800,1906,1745,1853,1698,1642,1277,1222,6244,6160,6465,7635,6839,6765,6928,7091,7314,7170,6319,6401,6684,6545,6625,6093,7436,7539,8029,7914,7861,7988,1426,5013,5519,5919,5839,6013,5433,5374,5319,5257,1079,1169"
},
"to": {
"startLines": "24,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "985,1338,1434,1517,1613,1682,1725,1777,1829,1878,1941,1993,2051,2102,2186,2280,2388,2459,2543,2626,2692,2775,2877,2938,3000,3051,3129,3182,3242,3347,3406,3508,3563,3634,3683,3761,3819,3866,3925,3982,4053,4114,4171,4221,4273,4326,4376,4426,4483,4543,4596,4662,4724,4787,4834,4889,4977,5035,5097,5147,5192,5235,5295,5362,5417,5472,5525,5572,5625,5681,5729,5784,5837,5921,5988,6052,6148,6222,6303,6392,6555,6699,6778,6853,6935,6994,7074,7154,7209,7331,7434,7475,7528,7585,7659,7724,7792,7878,7958,8027,8121,8180,8235,8297,8357,8467",
"endLines": "28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133",
"endColumns": "14,95,82,95,68,42,51,51,48,62,51,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,77,57,46,58,56,70,60,56,49,51,52,49,49,56,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89",
"endOffsets": "1333,1429,1512,1608,1677,1720,1772,1824,1873,1936,1988,2046,2097,2181,2275,2383,2454,2538,2621,2687,2770,2872,2933,2995,3046,3124,3177,3237,3342,3401,3503,3558,3629,3678,3756,3814,3861,3920,3977,4048,4109,4166,4216,4268,4321,4371,4421,4478,4538,4591,4657,4719,4782,4829,4884,4972,5030,5092,5142,5187,5230,5290,5357,5412,5467,5520,5567,5620,5676,5724,5779,5832,5916,5983,6047,6143,6217,6298,6387,6550,6694,6773,6848,6930,6989,7069,7149,7204,7326,7429,7470,7523,7580,7654,7719,7787,7873,7953,8022,8116,8175,8230,8292,8352,8462,8552"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\styles.xml",
"from": {
"startLines": "64,69,78,74,36,40,44,49,54,32,59,28,25,19,22",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "2499,2704,3077,2916,1332,1515,1700,1886,2090,1149,2297,1031,921,713,819",
"endLines": "67,72,81,76,39,43,47,52,57,35,62,30,27,21,24",
"endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12",
"endOffsets": "2698,2910,3283,3071,1510,1695,1880,2084,2291,1327,2493,1143,1026,814,916"
},
"to": {
"startLines": "134,138,142,146,149,153,157,161,165,169,173,177,180,183,186",
"startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",
"startOffsets": "8557,8761,8972,9182,9342,9525,9710,9895,10098,10304,10487,10688,10805,10915,11021",
"endLines": "137,141,145,148,152,156,160,164,168,172,176,179,182,185,188",
"endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12",
"endOffsets": "8756,8967,9177,9337,9520,9705,9890,10093,10299,10482,10683,10800,10910,11016,11118"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\dimens.xml",
"from": {
"startLines": "19,20,21,22,18",
"startColumns": "4,4,4,4,4",
"startOffsets": "764,816,869,922,712",
"endColumns": "51,52,52,51,51",
"endOffsets": "811,864,917,969,759"
},
"to": {
"startLines": "19,20,21,22,23",
"startColumns": "4,4,4,4,4",
"startOffsets": "723,775,828,881,933",
"endColumns": "51,52,52,51,51",
"endOffsets": "770,823,876,928,980"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\arrays.xml",
"from": {
"startLines": "19,26",
"startColumns": "4,4",
"startOffsets": "739,1047",
"endLines": "24,29",
"endColumns": "19,19",
"endOffsets": "1041,1162"
},
"to": {
"startLines": "2,8",
"startColumns": "4,4",
"startOffsets": "105,300",
"endLines": "7,11",
"endColumns": "19,19",
"endOffsets": "295,415"
}
},
{
"source": "D:\\Work-java\\MINOTES\\minotes\\app\\src\\main\\res\\values\\colors.xml",
"from": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "712",
"endColumns": "56",
"endOffsets": "764"
},
"to": {
"startLines": "18",
"startColumns": "4",
"startOffsets": "666",
"endColumns": "56",
"endOffsets": "718"
}
}
]
}
]
}

@ -1,386 +0,0 @@
[
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_middle.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_middle.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_title_bar_bg.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/title_bar_bg.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_list_dropdown_menu.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_list_dropdown_menu.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_folder_list_item.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/folder_list_item.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_selected.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/selected.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_yellow.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_yellow.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_sub_folder.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/sub_folder.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_footer_bg.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_footer_bg.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_color_green.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_color_green.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_clock.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/clock.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/raw_introduction.flat",
"source": "net.micode.notes.app-main-7:/raw/introduction"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_yellow.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_yellow.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_up.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_up.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_blue.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_blue.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_green.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_green.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable_new_note.xml.flat",
"source": "net.micode.notes.app-main-7:/drawable/new_note.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_widget_2x.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/widget_2x.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/xml_widget_2x_info.xml.flat",
"source": "net.micode.notes.app-main-7:/xml/widget_2x_info.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_call_record_folder.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/call_record_folder.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/xml_preferences.xml.flat",
"source": "net.micode.notes.app-main-7:/xml/preferences.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_dialog_edit_text.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/dialog_edit_text.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_blue.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_blue.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_single.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_single.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/color_secondary_text_dark.xml.flat",
"source": "net.micode.notes.app-main-7:/color/secondary_text_dark.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/xml_widget_4x_info.xml.flat",
"source": "net.micode.notes.app-main-7:/xml/widget_4x_info.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_up.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_up.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_middle.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_middle.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_single.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_single.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_yellow.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_yellow.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_edit.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_edit.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_widget_4x.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/widget_4x.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_green.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_green.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_menu_delete.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/menu_delete.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_list.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_list.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_down.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_down.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_icon_app.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/icon_app.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_dropdown_icon.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/dropdown_icon.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_bg_btn_set_color.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/bg_btn_set_color.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_note_list.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/note_list.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_list_footer.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_list_footer.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_menu_move.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/menu_move.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_bg_color_btn_mask.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/bg_color_btn_mask.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_add_account_text.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/add_account_text.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_datetime_picker.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/datetime_picker.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_super.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_super.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_single.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_single.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_yellow.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_yellow.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_delete.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/delete.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_green.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_green.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_note_edit.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/note_edit.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_account_dialog_title.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/account_dialog_title.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_call_record.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/call_record.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_up.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_up.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_folder.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_folder.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_single.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_single.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_notification.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/notification.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_down.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_down.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_new_note_pressed.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/new_note_pressed.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_white.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_white.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_item.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_item.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_settings_header.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/settings_header.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_note_edit_color_selector_panel.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/note_edit_color_selector_panel.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_title_alert.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/title_alert.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_red.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_red.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_large.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_large.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_middle.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_middle.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_blue.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_blue.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_up.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_up.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_white.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_white.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_up.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_up.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_white.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_white.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_white.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_white.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_down.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_down.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/raw-zh-rCN_introduction.flat",
"source": "net.micode.notes.app-main-7:/raw-zh-rCN/introduction"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_background.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_background.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_search_result.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/search_result.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_green.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_green.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_red.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_red.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/xml_searchable.xml.flat",
"source": "net.micode.notes.app-main-7:/xml/searchable.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_middle.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_middle.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_normal.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_normal.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_middle.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_middle.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_note_list_dropdown.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/note_list_dropdown.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_new_note_normal.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/new_note_normal.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/layout_note_edit_list_item.xml.flat",
"source": "net.micode.notes.app-main-7:/layout/note_edit_list_item.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_down.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_down.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_size_selector_bg.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_size_selector_bg.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_red.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_red.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_blue.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_blue.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_note_list_options.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/note_list_options.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/menu_call_note_edit.xml.flat",
"source": "net.micode.notes.app-main-7:/menu/call_note_edit.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_single.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_single.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_red.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_red.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/color_primary_text_dark.xml.flat",
"source": "net.micode.notes.app-main-7:/color/primary_text_dark.xml"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_down.9.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_down.9.png"
},
{
"merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_small.png.flat",
"source": "net.micode.notes.app-main-7:/drawable-hdpi/font_small.png"
}
]

@ -1,308 +0,0 @@
int array format_for_exported_note 0x7f010000
int array menu_share_ways 0x7f010001
int color Blue 0x7f020000
int color Bright_Blue 0x7f020001
int color Default 0x7f020002
int color Green 0x7f020003
int color Red 0x7f020004
int color Yellow 0x7f020005
int color primary_text_dark 0x7f020006
int color secondary_text_dark 0x7f020007
int color user_query_highlight 0x7f020008
int dimen text_font_size_large 0x7f030000
int dimen text_font_size_medium 0x7f030001
int dimen text_font_size_normal 0x7f030002
int dimen text_font_size_small 0x7f030003
int dimen text_font_size_super 0x7f030004
int drawable bg_btn_set_color 0x7f040000
int drawable bg_color_btn_mask 0x7f040001
int drawable call_record 0x7f040002
int drawable clock 0x7f040003
int drawable delete 0x7f040004
int drawable dropdown_icon 0x7f040005
int drawable edit_blue 0x7f040006
int drawable edit_green 0x7f040007
int drawable edit_red 0x7f040008
int drawable edit_title_blue 0x7f040009
int drawable edit_title_green 0x7f04000a
int drawable edit_title_red 0x7f04000b
int drawable edit_title_white 0x7f04000c
int drawable edit_title_yellow 0x7f04000d
int drawable edit_white 0x7f04000e
int drawable edit_yellow 0x7f04000f
int drawable font_color_green 0x7f040010
int drawable font_large 0x7f040011
int drawable font_normal 0x7f040012
int drawable font_size_selector_bg 0x7f040013
int drawable font_small 0x7f040014
int drawable font_super 0x7f040015
int drawable icon_app 0x7f040016
int drawable list_background 0x7f040017
int drawable list_blue_down 0x7f040018
int drawable list_blue_middle 0x7f040019
int drawable list_blue_single 0x7f04001a
int drawable list_blue_up 0x7f04001b
int drawable list_folder 0x7f04001c
int drawable list_footer_bg 0x7f04001d
int drawable list_green_down 0x7f04001e
int drawable list_green_middle 0x7f04001f
int drawable list_green_single 0x7f040020
int drawable list_green_up 0x7f040021
int drawable list_red_down 0x7f040022
int drawable list_red_middle 0x7f040023
int drawable list_red_single 0x7f040024
int drawable list_red_up 0x7f040025
int drawable list_white_down 0x7f040026
int drawable list_white_middle 0x7f040027
int drawable list_white_single 0x7f040028
int drawable list_white_up 0x7f040029
int drawable list_yellow_down 0x7f04002a
int drawable list_yellow_middle 0x7f04002b
int drawable list_yellow_single 0x7f04002c
int drawable list_yellow_up 0x7f04002d
int drawable menu_delete 0x7f04002e
int drawable menu_move 0x7f04002f
int drawable new_note 0x7f040030
int drawable new_note_normal 0x7f040031
int drawable new_note_pressed 0x7f040032
int drawable note_edit_color_selector_panel 0x7f040033
int drawable notification 0x7f040034
int drawable search_result 0x7f040035
int drawable selected 0x7f040036
int drawable title_alert 0x7f040037
int drawable title_bar_bg 0x7f040038
int drawable widget_2x_blue 0x7f040039
int drawable widget_2x_green 0x7f04003a
int drawable widget_2x_red 0x7f04003b
int drawable widget_2x_white 0x7f04003c
int drawable widget_2x_yellow 0x7f04003d
int drawable widget_4x_blue 0x7f04003e
int drawable widget_4x_green 0x7f04003f
int drawable widget_4x_red 0x7f040040
int drawable widget_4x_white 0x7f040041
int drawable widget_4x_yellow 0x7f040042
int id account_dialog_subtitle 0x7f050000
int id account_dialog_title 0x7f050001
int id action_select_all 0x7f050002
int id amPm 0x7f050003
int id btn_new_note 0x7f050004
int id btn_set_bg_color 0x7f050005
int id cb_edit_item 0x7f050006
int id date 0x7f050007
int id delete 0x7f050008
int id et_edit_text 0x7f050009
int id et_foler_name 0x7f05000a
int id font_size_selector 0x7f05000b
int id hour 0x7f05000c
int id iv_Bright_blue_select 0x7f05000d
int id iv_alert_icon 0x7f05000e
int id iv_bg_blue 0x7f05000f
int id iv_bg_blue_select 0x7f050010
int id iv_bg_green 0x7f050011
int id iv_bg_green_select 0x7f050012
int id iv_bg_red 0x7f050013
int id iv_bg_red_select 0x7f050014
int id iv_bg_white 0x7f050015
int id iv_bg_white_select 0x7f050016
int id iv_bg_yellow 0x7f050017
int id iv_bg_yellow_select 0x7f050018
int id iv_default_select 0x7f050019
int id iv_green_select 0x7f05001a
int id iv_large_select 0x7f05001b
int id iv_medium_select 0x7f05001c
int id iv_red_select 0x7f05001d
int id iv_small_select 0x7f05001e
int id iv_super_select 0x7f05001f
int id ll_font_Bright_blue 0x7f050020
int id ll_font_color_selector 0x7f050021
int id ll_font_default 0x7f050022
int id ll_font_green 0x7f050023
int id ll_font_large 0x7f050024
int id ll_font_normal 0x7f050025
int id ll_font_red 0x7f050026
int id ll_font_small 0x7f050027
int id ll_font_super 0x7f050028
int id menu_alert 0x7f050029
int id menu_change_font_color 0x7f05002a
int id menu_delete 0x7f05002b
int id menu_delete_remind 0x7f05002c
int id menu_export_text 0x7f05002d
int id menu_font_size 0x7f05002e
int id menu_insert_img 0x7f05002f
int id menu_list_mode 0x7f050030
int id menu_new_folder 0x7f050031
int id menu_new_note 0x7f050032
int id menu_search 0x7f050033
int id menu_send_to_desktop 0x7f050034
int id menu_setting 0x7f050035
int id menu_share 0x7f050036
int id menu_sync 0x7f050037
int id minute 0x7f050038
int id move 0x7f050039
int id navigation_bar 0x7f05003a
int id note_bg_color_selector 0x7f05003b
int id note_edit_list 0x7f05003c
int id note_edit_view 0x7f05003d
int id note_item 0x7f05003e
int id note_title 0x7f05003f
int id notes_list 0x7f050040
int id prefenerece_sync_status_textview 0x7f050041
int id preference_sync_button 0x7f050042
int id selection_menu 0x7f050043
int id sv_note_edit 0x7f050044
int id tv_alert_date 0x7f050045
int id tv_folder_name 0x7f050046
int id tv_modified_date 0x7f050047
int id tv_name 0x7f050048
int id tv_time 0x7f050049
int id tv_title 0x7f05004a
int id tv_title_bar 0x7f05004b
int id widget_bg_image 0x7f05004c
int id widget_text 0x7f05004d
int layout account_dialog_title 0x7f060000
int layout add_account_text 0x7f060001
int layout datetime_picker 0x7f060002
int layout dialog_edit_text 0x7f060003
int layout folder_list_item 0x7f060004
int layout note_edit 0x7f060005
int layout note_edit_list_item 0x7f060006
int layout note_item 0x7f060007
int layout note_list 0x7f060008
int layout note_list_dropdown_menu 0x7f060009
int layout note_list_footer 0x7f06000a
int layout settings_header 0x7f06000b
int layout widget_2x 0x7f06000c
int layout widget_4x 0x7f06000d
int menu call_note_edit 0x7f070000
int menu call_record_folder 0x7f070001
int menu note_edit 0x7f070002
int menu note_list 0x7f070003
int menu note_list_dropdown 0x7f070004
int menu note_list_options 0x7f070005
int menu sub_folder 0x7f070006
int plurals search_results_title 0x7f080000
int raw introduction 0x7f090000
int string alert_message_delete_folder 0x7f0a0000
int string alert_message_delete_note 0x7f0a0001
int string alert_message_delete_notes 0x7f0a0002
int string alert_title_delete 0x7f0a0003
int string app_name 0x7f0a0004
int string app_widget2x2 0x7f0a0005
int string app_widget4x4 0x7f0a0006
int string button_delete 0x7f0a0007
int string call_record_folder_name 0x7f0a0008
int string change_txt_color 0x7f0a0009
int string datetime_dialog_cancel 0x7f0a000a
int string datetime_dialog_ok 0x7f0a000b
int string delete_remind_time_message 0x7f0a000c
int string error_note_empty_for_clock 0x7f0a000d
int string error_note_empty_for_send_to_desktop 0x7f0a000e
int string error_note_not_exist 0x7f0a000f
int string error_sdcard_export 0x7f0a0010
int string error_sdcard_unmounted 0x7f0a0011
int string error_sync_cancelled 0x7f0a0012
int string error_sync_internal 0x7f0a0013
int string error_sync_network 0x7f0a0014
int string failed_sdcard_export 0x7f0a0015
int string file_name_txt_format 0x7f0a0016
int string file_path 0x7f0a0017
int string folder_exist 0x7f0a0018
int string format_date_ymd 0x7f0a0019
int string format_datetime_mdhm 0x7f0a001a
int string format_exported_file_location 0x7f0a001b
int string format_folder_files_count 0x7f0a001c
int string format_move_notes_to_folder 0x7f0a001d
int string hint_foler_name 0x7f0a001e
int string info_note_enter_desktop 0x7f0a001f
int string menu_alert 0x7f0a0020
int string menu_change_font_color 0x7f0a0021
int string menu_create_folder 0x7f0a0022
int string menu_delete 0x7f0a0023
int string menu_deselect_all 0x7f0a0024
int string menu_export_text 0x7f0a0025
int string menu_folder_change_name 0x7f0a0026
int string menu_folder_delete 0x7f0a0027
int string menu_folder_view 0x7f0a0028
int string menu_font_large 0x7f0a0029
int string menu_font_normal 0x7f0a002a
int string menu_font_size 0x7f0a002b
int string menu_font_small 0x7f0a002c
int string menu_font_super 0x7f0a002d
int string menu_insert_img 0x7f0a002e
int string menu_list_mode 0x7f0a002f
int string menu_move 0x7f0a0030
int string menu_move_parent_folder 0x7f0a0031
int string menu_normal_mode 0x7f0a0032
int string menu_remove_remind 0x7f0a0033
int string menu_search 0x7f0a0034
int string menu_select_all 0x7f0a0035
int string menu_select_none 0x7f0a0036
int string menu_select_title 0x7f0a0037
int string menu_send_to_desktop 0x7f0a0038
int string menu_setting 0x7f0a0039
int string menu_share 0x7f0a003a
int string menu_sync 0x7f0a003b
int string menu_sync_cancel 0x7f0a003c
int string menu_title_select_folder 0x7f0a003d
int string note_alert_expired 0x7f0a003e
int string note_link_email 0x7f0a003f
int string note_link_other 0x7f0a0040
int string note_link_tel 0x7f0a0041
int string note_link_web 0x7f0a0042
int string notealert_enter 0x7f0a0043
int string notealert_ok 0x7f0a0044
int string notelist_menu_new 0x7f0a0045
int string notelist_string_info 0x7f0a0046
int string preferences_account_summary 0x7f0a0047
int string preferences_account_title 0x7f0a0048
int string preferences_add_account 0x7f0a0049
int string preferences_bg_random_appear_title 0x7f0a004a
int string preferences_button_sync_cancel 0x7f0a004b
int string preferences_button_sync_immediately 0x7f0a004c
int string preferences_dialog_change_account_title 0x7f0a004d
int string preferences_dialog_change_account_warn_msg 0x7f0a004e
int string preferences_dialog_select_account_tips 0x7f0a004f
int string preferences_dialog_select_account_title 0x7f0a0050
int string preferences_last_sync_time 0x7f0a0051
int string preferences_last_sync_time_format 0x7f0a0052
int string preferences_menu_cancel 0x7f0a0053
int string preferences_menu_change_account 0x7f0a0054
int string preferences_menu_remove_account 0x7f0a0055
int string preferences_title 0x7f0a0056
int string preferences_toast_cannot_change_account 0x7f0a0057
int string preferences_toast_success_set_accout 0x7f0a0058
int string search 0x7f0a0059
int string search_hint 0x7f0a005a
int string search_label 0x7f0a005b
int string search_setting_description 0x7f0a005c
int string set_remind_time_message 0x7f0a005d
int string success_sdcard_export 0x7f0a005e
int string success_sync_account 0x7f0a005f
int string sync_progress_init_list 0x7f0a0060
int string sync_progress_login 0x7f0a0061
int string sync_progress_syncing 0x7f0a0062
int string ticker_cancel 0x7f0a0063
int string ticker_fail 0x7f0a0064
int string ticker_success 0x7f0a0065
int string ticker_syncing 0x7f0a0066
int string widget_havenot_content 0x7f0a0067
int string widget_under_visit_mode 0x7f0a0068
int style HighlightTextAppearancePrimary 0x7f0b0000
int style HighlightTextAppearanceSecondary 0x7f0b0001
int style NoteActionBarStyle 0x7f0b0002
int style NoteTheme 0x7f0b0003
int style TextAppearanceLarge 0x7f0b0004
int style TextAppearanceMedium 0x7f0b0005
int style TextAppearanceNormal 0x7f0b0006
int style TextAppearancePrimaryItem 0x7f0b0007
int style TextAppearanceSecondaryItem 0x7f0b0008
int style TextAppearanceSuper 0x7f0b0009
int style TextAppearanceUnderMenuIcon 0x7f0b000a
int style TextColorBrightBlue 0x7f0b000b
int style TextColorDefault 0x7f0b000c
int style TextColorGreen 0x7f0b000d
int style TextColorRed 0x7f0b000e
int xml preferences 0x7f0c0000
int xml searchable 0x7f0c0001
int xml widget_2x_info 0x7f0c0002
int xml widget_4x_info 0x7f0c0003

@ -1,8 +0,0 @@
net.micode.notes.app-pngs-0 D:\Work-java\MINOTES\minotes\app\build\generated\res\pngs\debug
net.micode.notes.app-resValues-1 D:\Work-java\MINOTES\minotes\app\build\generated\res\resValues\debug
net.micode.notes.app-rs-2 D:\Work-java\MINOTES\minotes\app\build\generated\res\rs\debug
net.micode.notes.app-mergeDebugResources-3 D:\Work-java\MINOTES\minotes\app\build\intermediates\incremental\debug\mergeDebugResources\merged.dir
net.micode.notes.app-mergeDebugResources-4 D:\Work-java\MINOTES\minotes\app\build\intermediates\incremental\debug\mergeDebugResources\stripped.dir
net.micode.notes.app-merged_res-5 D:\Work-java\MINOTES\minotes\app\build\intermediates\merged_res\debug
net.micode.notes.app-debug-6 D:\Work-java\MINOTES\minotes\app\src\debug\res
net.micode.notes.app-main-7 D:\Work-java\MINOTES\minotes\app\src\main\res

@ -1,308 +0,0 @@
net.micode.notes:xml/widget_4x_info = 0x7f0c0003
net.micode.notes:xml/preferences = 0x7f0c0000
net.micode.notes:style/TextColorGreen = 0x7f0b000d
net.micode.notes:style/TextColorDefault = 0x7f0b000c
net.micode.notes:style/TextAppearanceSecondaryItem = 0x7f0b0008
net.micode.notes:style/TextAppearanceNormal = 0x7f0b0006
net.micode.notes:style/TextAppearanceLarge = 0x7f0b0004
net.micode.notes:style/HighlightTextAppearancePrimary = 0x7f0b0000
net.micode.notes:string/widget_havenot_content = 0x7f0a0067
net.micode.notes:string/ticker_syncing = 0x7f0a0066
net.micode.notes:string/ticker_success = 0x7f0a0065
net.micode.notes:style/HighlightTextAppearanceSecondary = 0x7f0b0001
net.micode.notes:string/ticker_cancel = 0x7f0a0063
net.micode.notes:string/sync_progress_syncing = 0x7f0a0062
net.micode.notes:string/sync_progress_init_list = 0x7f0a0060
net.micode.notes:string/search_label = 0x7f0a005b
net.micode.notes:string/preferences_toast_success_set_accout = 0x7f0a0058
net.micode.notes:string/preferences_toast_cannot_change_account = 0x7f0a0057
net.micode.notes:string/preferences_title = 0x7f0a0056
net.micode.notes:string/preferences_menu_remove_account = 0x7f0a0055
net.micode.notes:style/NoteActionBarStyle = 0x7f0b0002
net.micode.notes:string/preferences_menu_change_account = 0x7f0a0054
net.micode.notes:string/preferences_menu_cancel = 0x7f0a0053
net.micode.notes:string/preferences_last_sync_time = 0x7f0a0051
net.micode.notes:string/preferences_dialog_select_account_title = 0x7f0a0050
net.micode.notes:string/preferences_dialog_change_account_warn_msg = 0x7f0a004e
net.micode.notes:string/preferences_button_sync_immediately = 0x7f0a004c
net.micode.notes:string/preferences_button_sync_cancel = 0x7f0a004b
net.micode.notes:string/preferences_account_summary = 0x7f0a0047
net.micode.notes:string/success_sdcard_export = 0x7f0a005e
net.micode.notes:string/notelist_string_info = 0x7f0a0046
net.micode.notes:string/notelist_menu_new = 0x7f0a0045
net.micode.notes:string/notealert_ok = 0x7f0a0044
net.micode.notes:string/notealert_enter = 0x7f0a0043
net.micode.notes:string/note_link_web = 0x7f0a0042
net.micode.notes:string/note_link_tel = 0x7f0a0041
net.micode.notes:string/note_link_other = 0x7f0a0040
net.micode.notes:string/note_link_email = 0x7f0a003f
net.micode.notes:string/note_alert_expired = 0x7f0a003e
net.micode.notes:string/menu_sync_cancel = 0x7f0a003c
net.micode.notes:string/menu_sync = 0x7f0a003b
net.micode.notes:string/menu_share = 0x7f0a003a
net.micode.notes:string/menu_select_title = 0x7f0a0037
net.micode.notes:style/TextAppearanceMedium = 0x7f0b0005
net.micode.notes:string/menu_select_none = 0x7f0a0036
net.micode.notes:string/menu_title_select_folder = 0x7f0a003d
net.micode.notes:string/menu_select_all = 0x7f0a0035
net.micode.notes:string/menu_search = 0x7f0a0034
net.micode.notes:string/menu_remove_remind = 0x7f0a0033
net.micode.notes:string/menu_normal_mode = 0x7f0a0032
net.micode.notes:string/menu_move_parent_folder = 0x7f0a0031
net.micode.notes:string/menu_move = 0x7f0a0030
net.micode.notes:string/menu_list_mode = 0x7f0a002f
net.micode.notes:string/menu_insert_img = 0x7f0a002e
net.micode.notes:string/menu_font_super = 0x7f0a002d
net.micode.notes:string/menu_font_small = 0x7f0a002c
net.micode.notes:string/menu_export_text = 0x7f0a0025
net.micode.notes:string/menu_deselect_all = 0x7f0a0024
net.micode.notes:string/menu_create_folder = 0x7f0a0022
net.micode.notes:string/info_note_enter_desktop = 0x7f0a001f
net.micode.notes:string/format_move_notes_to_folder = 0x7f0a001d
net.micode.notes:string/format_folder_files_count = 0x7f0a001c
net.micode.notes:string/format_date_ymd = 0x7f0a0019
net.micode.notes:style/TextAppearancePrimaryItem = 0x7f0b0007
net.micode.notes:string/hint_foler_name = 0x7f0a001e
net.micode.notes:string/folder_exist = 0x7f0a0018
net.micode.notes:string/file_path = 0x7f0a0017
net.micode.notes:string/ticker_fail = 0x7f0a0064
net.micode.notes:string/file_name_txt_format = 0x7f0a0016
net.micode.notes:string/failed_sdcard_export = 0x7f0a0015
net.micode.notes:string/set_remind_time_message = 0x7f0a005d
net.micode.notes:string/error_sync_network = 0x7f0a0014
net.micode.notes:string/error_note_not_exist = 0x7f0a000f
net.micode.notes:string/error_note_empty_for_send_to_desktop = 0x7f0a000e
net.micode.notes:string/error_note_empty_for_clock = 0x7f0a000d
net.micode.notes:style/TextColorBrightBlue = 0x7f0b000b
net.micode.notes:string/datetime_dialog_ok = 0x7f0a000b
net.micode.notes:string/datetime_dialog_cancel = 0x7f0a000a
net.micode.notes:string/menu_folder_view = 0x7f0a0028
net.micode.notes:id/menu_delete = 0x7f05002b
net.micode.notes:string/change_txt_color = 0x7f0a0009
net.micode.notes:drawable/list_green_up = 0x7f040021
net.micode.notes:string/call_record_folder_name = 0x7f0a0008
net.micode.notes:drawable/new_note_normal = 0x7f040031
net.micode.notes:string/button_delete = 0x7f0a0007
net.micode.notes:string/app_widget2x2 = 0x7f0a0005
net.micode.notes:string/menu_font_normal = 0x7f0a002a
net.micode.notes:string/format_exported_file_location = 0x7f0a001b
net.micode.notes:raw/introduction = 0x7f090000
net.micode.notes:string/delete_remind_time_message = 0x7f0a000c
net.micode.notes:dimen/text_font_size_super = 0x7f030004
net.micode.notes:drawable/selected = 0x7f040036
net.micode.notes:plurals/search_results_title = 0x7f080000
net.micode.notes:menu/sub_folder = 0x7f070006
net.micode.notes:menu/note_edit = 0x7f070002
net.micode.notes:layout/note_list = 0x7f060008
net.micode.notes:drawable/list_white_single = 0x7f040028
net.micode.notes:layout/note_item = 0x7f060007
net.micode.notes:xml/widget_2x_info = 0x7f0c0002
net.micode.notes:string/alert_message_delete_folder = 0x7f0a0000
net.micode.notes:layout/datetime_picker = 0x7f060002
net.micode.notes:id/btn_new_note = 0x7f050004
net.micode.notes:id/ll_font_Bright_blue = 0x7f050020
net.micode.notes:layout/note_list_footer = 0x7f06000a
net.micode.notes:id/widget_text = 0x7f05004d
net.micode.notes:id/tv_title_bar = 0x7f05004b
net.micode.notes:drawable/widget_2x_blue = 0x7f040039
net.micode.notes:id/tv_time = 0x7f050049
net.micode.notes:color/Red = 0x7f020004
net.micode.notes:id/tv_name = 0x7f050048
net.micode.notes:id/selection_menu = 0x7f050043
net.micode.notes:string/error_sdcard_export = 0x7f0a0010
net.micode.notes:id/preference_sync_button = 0x7f050042
net.micode.notes:string/alert_message_delete_notes = 0x7f0a0002
net.micode.notes:drawable/title_alert = 0x7f040037
net.micode.notes:id/note_title = 0x7f05003f
net.micode.notes:string/preferences_last_sync_time_format = 0x7f0a0052
net.micode.notes:id/note_edit_view = 0x7f05003d
net.micode.notes:id/navigation_bar = 0x7f05003a
net.micode.notes:string/app_widget4x4 = 0x7f0a0006
net.micode.notes:drawable/font_normal = 0x7f040012
net.micode.notes:id/minute = 0x7f050038
net.micode.notes:drawable/font_super = 0x7f040015
net.micode.notes:id/menu_sync = 0x7f050037
net.micode.notes:id/menu_share = 0x7f050036
net.micode.notes:id/menu_setting = 0x7f050035
net.micode.notes:string/widget_under_visit_mode = 0x7f0a0068
net.micode.notes:id/menu_send_to_desktop = 0x7f050034
net.micode.notes:id/menu_search = 0x7f050033
net.micode.notes:drawable/list_green_down = 0x7f04001e
net.micode.notes:id/menu_new_note = 0x7f050032
net.micode.notes:id/menu_new_folder = 0x7f050031
net.micode.notes:id/menu_list_mode = 0x7f050030
net.micode.notes:id/iv_medium_select = 0x7f05001c
net.micode.notes:id/menu_export_text = 0x7f05002d
net.micode.notes:drawable/edit_blue = 0x7f040006
net.micode.notes:id/prefenerece_sync_status_textview = 0x7f050041
net.micode.notes:string/menu_font_size = 0x7f0a002b
net.micode.notes:string/menu_change_font_color = 0x7f0a0021
net.micode.notes:string/menu_alert = 0x7f0a0020
net.micode.notes:drawable/edit_title_yellow = 0x7f04000d
net.micode.notes:id/ll_font_color_selector = 0x7f050021
net.micode.notes:id/menu_alert = 0x7f050029
net.micode.notes:string/success_sync_account = 0x7f0a005f
net.micode.notes:id/ll_font_super = 0x7f050028
net.micode.notes:id/ll_font_small = 0x7f050027
net.micode.notes:menu/call_record_folder = 0x7f070001
net.micode.notes:id/ll_font_normal = 0x7f050025
net.micode.notes:id/ll_font_large = 0x7f050024
net.micode.notes:id/note_bg_color_selector = 0x7f05003b
net.micode.notes:drawable/search_result = 0x7f040035
net.micode.notes:id/iv_super_select = 0x7f05001f
net.micode.notes:layout/note_edit = 0x7f060005
net.micode.notes:id/notes_list = 0x7f050040
net.micode.notes:string/error_sdcard_unmounted = 0x7f0a0011
net.micode.notes:drawable/font_color_green = 0x7f040010
net.micode.notes:id/iv_red_select = 0x7f05001d
net.micode.notes:drawable/new_note = 0x7f040030
net.micode.notes:id/sv_note_edit = 0x7f050044
net.micode.notes:id/iv_green_select = 0x7f05001a
net.micode.notes:style/TextAppearanceSuper = 0x7f0b0009
net.micode.notes:color/secondary_text_dark = 0x7f020007
net.micode.notes:id/move = 0x7f050039
net.micode.notes:id/iv_bg_yellow_select = 0x7f050018
net.micode.notes:menu/call_note_edit = 0x7f070000
net.micode.notes:drawable/new_note_pressed = 0x7f040032
net.micode.notes:id/iv_bg_blue = 0x7f05000f
net.micode.notes:layout/settings_header = 0x7f06000b
net.micode.notes:id/iv_default_select = 0x7f050019
net.micode.notes:id/iv_bg_yellow = 0x7f050017
net.micode.notes:string/error_sync_cancelled = 0x7f0a0012
net.micode.notes:id/iv_bg_white_select = 0x7f050016
net.micode.notes:id/iv_bg_white = 0x7f050015
net.micode.notes:string/menu_font_large = 0x7f0a0029
net.micode.notes:drawable/widget_4x_blue = 0x7f04003e
net.micode.notes:id/iv_large_select = 0x7f05001b
net.micode.notes:id/widget_bg_image = 0x7f05004c
net.micode.notes:id/iv_bg_green_select = 0x7f050012
net.micode.notes:id/amPm = 0x7f050003
net.micode.notes:id/iv_bg_green = 0x7f050011
net.micode.notes:id/et_edit_text = 0x7f050009
net.micode.notes:id/et_foler_name = 0x7f05000a
net.micode.notes:drawable/edit_green = 0x7f040007
net.micode.notes:layout/widget_4x = 0x7f06000d
net.micode.notes:string/search = 0x7f0a0059
net.micode.notes:id/cb_edit_item = 0x7f050006
net.micode.notes:id/btn_set_bg_color = 0x7f050005
net.micode.notes:id/account_dialog_subtitle = 0x7f050000
net.micode.notes:id/iv_bg_blue_select = 0x7f050010
net.micode.notes:string/preferences_dialog_change_account_title = 0x7f0a004d
net.micode.notes:drawable/menu_move = 0x7f04002f
net.micode.notes:drawable/widget_4x_white = 0x7f040041
net.micode.notes:menu/note_list = 0x7f070003
net.micode.notes:id/account_dialog_title = 0x7f050001
net.micode.notes:drawable/widget_4x_green = 0x7f04003f
net.micode.notes:style/NoteTheme = 0x7f0b0003
net.micode.notes:id/hour = 0x7f05000c
net.micode.notes:drawable/note_edit_color_selector_panel = 0x7f040033
net.micode.notes:drawable/widget_2x_yellow = 0x7f04003d
net.micode.notes:dimen/text_font_size_large = 0x7f030000
net.micode.notes:id/tv_alert_date = 0x7f050045
net.micode.notes:drawable/widget_2x_red = 0x7f04003b
net.micode.notes:style/TextAppearanceUnderMenuIcon = 0x7f0b000a
net.micode.notes:id/delete = 0x7f050008
net.micode.notes:drawable/widget_2x_green = 0x7f04003a
net.micode.notes:drawable/title_bar_bg = 0x7f040038
net.micode.notes:id/iv_bg_red = 0x7f050013
net.micode.notes:drawable/notification = 0x7f040034
net.micode.notes:drawable/list_green_single = 0x7f040020
net.micode.notes:string/alert_message_delete_note = 0x7f0a0001
net.micode.notes:id/tv_modified_date = 0x7f050047
net.micode.notes:drawable/list_blue_middle = 0x7f040019
net.micode.notes:id/iv_small_select = 0x7f05001e
net.micode.notes:menu/note_list_options = 0x7f070005
net.micode.notes:xml/searchable = 0x7f0c0001
net.micode.notes:string/menu_folder_delete = 0x7f0a0027
net.micode.notes:id/ll_font_green = 0x7f050023
net.micode.notes:drawable/dropdown_icon = 0x7f040005
net.micode.notes:id/date = 0x7f050007
net.micode.notes:color/Bright_Blue = 0x7f020001
net.micode.notes:color/Yellow = 0x7f020005
net.micode.notes:drawable/list_yellow_single = 0x7f04002c
net.micode.notes:drawable/list_red_up = 0x7f040025
net.micode.notes:drawable/widget_4x_yellow = 0x7f040042
net.micode.notes:drawable/list_yellow_middle = 0x7f04002b
net.micode.notes:id/tv_folder_name = 0x7f050046
net.micode.notes:drawable/list_yellow_down = 0x7f04002a
net.micode.notes:drawable/clock = 0x7f040003
net.micode.notes:drawable/list_white_up = 0x7f040029
net.micode.notes:layout/dialog_edit_text = 0x7f060003
net.micode.notes:string/preferences_account_title = 0x7f0a0048
net.micode.notes:drawable/edit_white = 0x7f04000e
net.micode.notes:drawable/list_white_middle = 0x7f040027
net.micode.notes:id/menu_change_font_color = 0x7f05002a
net.micode.notes:color/user_query_highlight = 0x7f020008
net.micode.notes:id/iv_Bright_blue_select = 0x7f05000d
net.micode.notes:drawable/list_white_down = 0x7f040026
net.micode.notes:layout/folder_list_item = 0x7f060004
net.micode.notes:layout/note_list_dropdown_menu = 0x7f060009
net.micode.notes:drawable/list_blue_down = 0x7f040018
net.micode.notes:drawable/list_red_middle = 0x7f040023
net.micode.notes:drawable/list_red_down = 0x7f040022
net.micode.notes:id/action_select_all = 0x7f050002
net.micode.notes:drawable/list_green_middle = 0x7f04001f
net.micode.notes:string/menu_send_to_desktop = 0x7f0a0038
net.micode.notes:drawable/list_red_single = 0x7f040024
net.micode.notes:string/preferences_add_account = 0x7f0a0049
net.micode.notes:drawable/bg_btn_set_color = 0x7f040000
net.micode.notes:string/preferences_bg_random_appear_title = 0x7f0a004a
net.micode.notes:layout/widget_2x = 0x7f06000c
net.micode.notes:drawable/list_footer_bg = 0x7f04001d
net.micode.notes:string/alert_title_delete = 0x7f0a0003
net.micode.notes:drawable/edit_title_green = 0x7f04000a
net.micode.notes:drawable/icon_app = 0x7f040016
net.micode.notes:drawable/font_small = 0x7f040014
net.micode.notes:string/sync_progress_login = 0x7f0a0061
net.micode.notes:array/menu_share_ways = 0x7f010001
net.micode.notes:drawable/widget_2x_white = 0x7f04003c
net.micode.notes:layout/add_account_text = 0x7f060001
net.micode.notes:style/TextColorRed = 0x7f0b000e
net.micode.notes:id/tv_title = 0x7f05004a
net.micode.notes:color/primary_text_dark = 0x7f020006
net.micode.notes:drawable/font_size_selector_bg = 0x7f040013
net.micode.notes:drawable/list_blue_up = 0x7f04001b
net.micode.notes:drawable/widget_4x_red = 0x7f040040
net.micode.notes:string/search_setting_description = 0x7f0a005c
net.micode.notes:drawable/list_blue_single = 0x7f04001a
net.micode.notes:drawable/font_large = 0x7f040011
net.micode.notes:drawable/delete = 0x7f040004
net.micode.notes:drawable/edit_yellow = 0x7f04000f
net.micode.notes:id/note_item = 0x7f05003e
net.micode.notes:id/ll_font_default = 0x7f050022
net.micode.notes:color/Blue = 0x7f020000
net.micode.notes:drawable/edit_title_white = 0x7f04000c
net.micode.notes:id/note_edit_list = 0x7f05003c
net.micode.notes:id/iv_alert_icon = 0x7f05000e
net.micode.notes:drawable/edit_red = 0x7f040008
net.micode.notes:drawable/edit_title_red = 0x7f04000b
net.micode.notes:string/menu_delete = 0x7f0a0023
net.micode.notes:drawable/list_folder = 0x7f04001c
net.micode.notes:drawable/call_record = 0x7f040002
net.micode.notes:drawable/edit_title_blue = 0x7f040009
net.micode.notes:id/iv_bg_red_select = 0x7f050014
net.micode.notes:string/error_sync_internal = 0x7f0a0013
net.micode.notes:drawable/menu_delete = 0x7f04002e
net.micode.notes:string/menu_folder_change_name = 0x7f0a0026
net.micode.notes:color/Default = 0x7f020002
net.micode.notes:string/search_hint = 0x7f0a005a
net.micode.notes:id/menu_font_size = 0x7f05002e
net.micode.notes:drawable/bg_color_btn_mask = 0x7f040001
net.micode.notes:dimen/text_font_size_small = 0x7f030003
net.micode.notes:dimen/text_font_size_normal = 0x7f030002
net.micode.notes:drawable/list_background = 0x7f040017
net.micode.notes:string/app_name = 0x7f0a0004
net.micode.notes:menu/note_list_dropdown = 0x7f070004
net.micode.notes:string/menu_setting = 0x7f0a0039
net.micode.notes:dimen/text_font_size_medium = 0x7f030001
net.micode.notes:string/format_datetime_mdhm = 0x7f0a001a
net.micode.notes:color/Green = 0x7f020003
net.micode.notes:drawable/list_yellow_up = 0x7f04002d
net.micode.notes:id/menu_insert_img = 0x7f05002f
net.micode.notes:string/preferences_dialog_select_account_tips = 0x7f0a004f
net.micode.notes:id/font_size_selector = 0x7f05000b
net.micode.notes:layout/note_edit_list_item = 0x7f060006
net.micode.notes:layout/account_dialog_title = 0x7f060000
net.micode.notes:id/ll_font_red = 0x7f050026
net.micode.notes:array/format_for_exported_note = 0x7f010000
net.micode.notes:id/menu_delete_remind = 0x7f05002c

@ -1,235 +0,0 @@
-- Merging decision tree log ---
manifest
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:1-150:12
package
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:19:5-31
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
android:versionName
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:21:5-30
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
xmlns:android
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:18:11-69
android:versionCode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:20:5-28
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
uses-sdk
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
android:targetSdkVersion
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:5-44
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
android:minSdkVersion
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:23:15-41
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
INJECTED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml
uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:25:5-81
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:25:22-78
uses-permission#com.android.launcher.permission.INSTALL_SHORTCUT
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:26:5-88
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:26:22-85
uses-permission#android.permission.INTERNET
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:27:5-67
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:27:22-64
uses-permission#android.permission.READ_CONTACTS
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:28:5-72
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:28:22-69
uses-permission#android.permission.MANAGE_ACCOUNTS
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:29:5-74
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:29:22-71
uses-permission#android.permission.AUTHENTICATE_ACCOUNTS
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:30:5-80
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:30:22-77
uses-permission#android.permission.GET_ACCOUNTS
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:31:5-71
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:31:22-68
uses-permission#android.permission.USE_CREDENTIALS
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:32:5-74
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:32:22-71
uses-permission#android.permission.RECEIVE_BOOT_COMPLETED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:33:5-81
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:33:22-78
application
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:35:5-149:19
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:37:9-41
android:icon
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:36:9-42
activity#net.micode.notes.ui.NotesListActivity
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:38:9-51:20
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:41:13-45
android:launchMode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:42:13-43
android:windowSoftInputMode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:45:13-52
android:uiOptions
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:44:13-57
android:configChanges
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:40:13-74
android:theme
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:43:13-45
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:39:13-49
intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:47:13-50:29
action#android.intent.action.MAIN
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:48:17-69
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:48:25-66
category#android.intent.category.LAUNCHER
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:49:17-77
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:49:27-74
activity#net.micode.notes.ui.NoteEditActivity
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:53:9-81:20
android:launchMode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:56:13-43
android:configChanges
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:55:13-74
android:theme
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:57:13-45
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:54:13-48
intent-filter#action:name:android.intent.action.VIEW+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:59:13-64:29
action#android.intent.action.VIEW
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:60:17-69
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:60:25-66
category#android.intent.category.DEFAULT
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:17-76
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:61:27-73
data
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:17-78
android:mimeType
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:62:23-75
intent-filter#action:name:android.intent.action.INSERT_OR_EDIT+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:66:13-71:29
action#android.intent.action.INSERT_OR_EDIT
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:67:17-79
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:67:25-76
intent-filter#action:name:android.intent.action.SEARCH+category:name:android.intent.category.DEFAULT
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:73:13-76:29
action#android.intent.action.SEARCH
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:74:17-71
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:74:25-68
meta-data#android.app.searchable
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:78:13-80:54
android:resource
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:80:17-51
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:79:17-54
provider#net.micode.notes.data.NotesProvider
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:83:9-86:43
android:authorities
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:85:13-47
android:multiprocess
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:86:13-40
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:84:13-63
receiver#net.micode.notes.widget.NoteWidgetProvider_2x
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:88:9-100:20
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:90:13-50
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:89:13-57
intent-filter#action:name:android.appwidget.action.APPWIDGET_DELETED+action:name:android.appwidget.action.APPWIDGET_UPDATE+action:name:android.intent.action.PRIVACY_MODE_CHANGED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:91:13-95:29
action#android.appwidget.action.APPWIDGET_UPDATE
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:17-84
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:92:25-81
action#android.appwidget.action.APPWIDGET_DELETED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:17-85
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:93:25-82
action#android.intent.action.PRIVACY_MODE_CHANGED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:17-85
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:94:25-82
meta-data#android.appwidget.provider
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:97:13-99:58
android:resource
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:99:17-55
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:98:17-58
receiver#net.micode.notes.widget.NoteWidgetProvider_4x
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:101:9-114:20
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:103:13-50
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:102:13-57
receiver#net.micode.notes.ui.AlarmInitReceiver
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:116:9-120:20
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:116:19-55
intent-filter#action:name:android.intent.action.BOOT_COMPLETED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:117:13-119:29
action#android.intent.action.BOOT_COMPLETED
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:118:17-79
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:118:25-76
receiver#net.micode.notes.ui.AlarmReceiver
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:122:9-125:20
android:process
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:124:13-38
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:123:13-61
activity#net.micode.notes.ui.AlarmAlertActivity
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:127:9-132:20
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:129:13-45
android:launchMode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:130:13-48
android:theme
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:131:13-75
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:128:13-50
activity#net.micode.notes.ui.NotesPreferenceActivity
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:134:9-139:20
android:label
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:136:13-54
android:launchMode
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:137:13-43
android:theme
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:138:13-60
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:135:13-71
service#net.micode.notes.gtask.remote.GTaskSyncService
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:141:9-144:19
android:exported
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:143:13-37
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:142:13-74
meta-data#android.app.default_searchable
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:146:9-148:52
android:value
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:148:13-49
android:name
ADDED from D:\Work-java\MINOTES\minotes\app\src\main\AndroidManifest.xml:147:13-58

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,350 @@
/*
* 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;// 查询结果中笔记id所在列的索引
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;// 定义以上数据列MIME类呼叫日期号码的索引初始值
private final String[] TEXT_FORMAT;// 定义带有3个元素字符串数组TEXT_FORMAT
private static final int FORMAT_FOLDER_NAME = 0;// 格式化后目录名称FORMAT_FOLDER_NAME= 0
private static final int FORMAT_NOTE_DATE = 1;
private static final int FORMAT_NOTE_CONTENT = 2;// 格式化后的笔记内容索引为2
private Context mContext;// 声名Context类型和字符串类型
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 = "";
}// 初始化文件路径mFileDirectory = ""为空
// 创建TextExport对象
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, // 查询CONTENT_DATA_URI对应的数据表
DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] {
noteId
}, null);
// 使用DataColumns.NOTE_ID是否为限制查询条件并查询noted对应的数据行
if (dataCursor != null) {// 若查询不为空,则执行以下代码:
if (dataCursor.moveToFirst()) {// 移动游标为第一条记录并循环记录
do {
String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE);// 获取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);// 从记录中获取phonenumber和calldate的值并输出号码
if (!TextUtils.isEmpty(phoneNumber)) {// 若电话号码不为空
ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
phoneNumber));// 输出电话号码输出到PrintStream实例PS中
}
// Print call date
ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat
.format(mContext.getString(R.string.format_datetime_mdhm),
callDate)));// 输出通话日期信息到PrintStream中
// Print call attachment location
if (!TextUtils.isEmpty(location)) {// 若位置信息不为空
ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
location));
} // 输出位置信息到PrintStream实例PS中
} else if (DataConstants.NOTE.equals(mimeType)) {// 若数据类型为Note则执行以下语句
String content = dataCursor.getString(DATA_COLUMN_CONTENT);// 从Cursor中获取信息
if (!TextUtils.isEmpty(content)) {
ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
content));// 将内容信息格式化输出rintStream实例PS中
}
}
} 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) {// 若出现IO异常则廖永Log类的e方法将异常信息输出日志中
Log.e(TAG, e.toString());
}
}
// 使用rintStream实例PS的write方法写入字节数组到输出流中包括换行和字母数字
/**
* Note will be exported as text which is user readable
*/
public int exportToText() {// 定义exportToText(),返回值类型为整型
if (!externalStorageAvailable()) {
Log.d(TAG, "Media was not mounted");
return STATE_SD_CARD_UNMOUONTED;
}
// 若外部存储不可用输出日记信息返回表示Media was not mounted
PrintStream ps = getExportToTextPrintStream();// 获取打印输出
if (ps == null) {
Log.e(TAG, "get print stream error");
return STATE_SYSTEM_ERROR;
} // 若获取不到打印输出输出get print stream error",并返回错误
// First export folder and its notes
Cursor folderCursor = mContext.getContentResolver().query(// 声名Cursor类的变量folder存储调查结果
Notes.CONTENT_NOTE_URI,
NOTE_PROJECTION, // 调用getContentResolver()查询目标为Note表中数据和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) {// 判断folder是否为空
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);// 若记录对应通话记录文件夹给folder赋值Notes.ID_CALL_RECORD_FOLDER
} else {// 否则folder赋值为记录的摘要字段值
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);// 获取当前记录对应文件夹id并赋值给folder
exportFolderToText(folderId, ps);
} while (folderCursor.moveToNext());// 将当前记录文件夹导出为文本形式结果写入PS中
}
folderCursor.close();
}
// Export notes in root's folder
Cursor noteCursor = mContext.getContentResolver().query(// 通过getContentResolver()获取resolver对象并调用querty方法查询
Notes.CONTENT_NOTE_URI, // 查询URI
NOTE_PROJECTION, // 查询列
NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID
+ "=0",
null, null);// 限制查询类型为Notes.TYPE_NOTE且父id为0的note记录
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());
} // 或i去当前Note记录的id吧id对应数据写入输出流中
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, // 使用getExportToTextPrintStream()再sd卡上生成指定名称和路径的文本文件
R.string.file_name_txt_format);
if (file == null) {
Log.e(TAG, "create file to exported failed");
return null;// 若生成文件失败返回null再logcat输出错误信息
}
mFileName = file.getName();
mFileDirectory = mContext.getString(R.string.file_path);// 将成功创建文件保存为FoleNAMe路径柏村委mFileDiectory
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream(file);
ps = new PrintStream(fos);// 创建对象fos用于写入文件
} catch (FileNotFoundException e) {// 使用fos创建PrintStream对象PS一边向文件夹写入数据
e.printStackTrace();
return null;// 若无法找到写入目标文件再logcat输出错误信息并返回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());// 再strtingbuilder中添加SD卡根目录路径
sb.append(context.getString(filePathResId));
File filedir = new File(sb.toString());// 添加文件路径字符串资源id并返回file对象表示该目录
sb.append(context.getString(
fileNameFormatResId,
DateFormat.format(context.getString(R.string.format_date_ymd),
System.currentTimeMillis())));// 再StringBuilder添加文件名格式字符串资源id并使用dateFormat替换为当前日期格式化字符串
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();
} // 如果不能在指定目录下创建新的文件则抛出IOException异常
return null;
}
}

@ -0,0 +1,304 @@
/*
* 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;
//导入android 包content、database等
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;
//导入net-micode包下数据
import java.util.ArrayList;
import java.util.HashSet;
//导入JAVA ArrayList和HashSet类
public class DataUtils {// 对DataUtils类进行定义
public static final String TAG = "DataUtils";// 定义静态不可变字TAG符串常量"DataUtils"
public static boolean batchDeleteNotes(ContentResolver resolver, HashSet<Long> 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;
}
// 定义批量删除笔记。若ids参数为null输出"the ids is null"并返回true若ids参数为0输出"no id is in the
// hashset"并返回true
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
// 定义操作列表存储ContentProviderOperation对象
for (long id : ids) {// 遍历id列表
if (id == Notes.ID_ROOT_FOLDER) {
Log.e(TAG, "Don't delete system folder root");
continue;
} // 如果id为系统根目录打印"不要删除系统根目录"并进行下一次循环
ContentProviderOperation.Builder builder = ContentProviderOperation
.newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
operationList.add(builder.build());// 创造builder对象删除指定id的ContentProviderOperation
}
try {// 调用applybatch
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;// 若返回为空或第一个结果为null输出删除失败返回false否则返回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()));
} // 若remoteexeption或operationapplicationexception异常返回false
return false;
}
public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
ContentValues values = new ContentValues();// 创建contentValues对象
values.put(NoteColumns.PARENT_ID, desFolderId);// 移动笔记至目标文件夹
values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);// 更新笔记的原始父类文件夹id
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<Long> ids,
long folderId) {// 若ids为空打印log并返回true
if (ids == null) {
Log.d(TAG, "the ids is null");
return true;
} // 用于批量移动笔记至文件夹
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
for (long id : ids) {// 遍历笔记id集合
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并返回false
Log.d(TAG, "delete notes failed, ids:" + ids.toString());
return false;
}
return true;// 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;// 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;
}// 检查笔记是否在数据库中可见,若不可见输出"get folder count failed:"
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<AppWidgetAttribute> getFolderNoteWidget(ContentResolver resolver, long folderId) {
// 查询文件夹中所有小部件id和类型
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<AppWidgetAttribute> set = null;
if (c != null) {
if (c.moveToFirst()) {
set = new HashSet<AppWidgetAttribute>();
// 遍历查询结果将小部件id和类型存入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();
} // 返回文件夹中所有小部件HashSet集合
return set;
}
public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {// 获取一段笔记的getCallNumberByNoteId
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) {
// 使用ContentResover对象来查询数据并返回Cursor对象
Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, // 查询Note id字段
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) {// 使用ContentResovler对象查询数据返回Cursor对象
Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, // 查询snippet字段
new String[] { NoteColumns.SNIPPET },
NoteColumns.ID + "=?",
new String[] { String.valueOf(noteId) },
null);
if (cursor != null) {
String snippet = "";
if (cursor.moveToFirst()) {// 获取查询结果中第0列的值即snippet字段值
snippet = cursor.getString(0);
}
cursor.close();
return snippet;
}
throw new IllegalArgumentException("Note is not found with id: " + noteId);
}// 通过noteld获取信息返回字符串
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;
}
}

@ -0,0 +1,185 @@
/*
* 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;// bai
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;// da
public static final int TEXT_SUPER = 3;// chaoda
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
};// 定义私有静态常量G_EDIT_RESOURCES 用于储存图片资源id
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
};// 定义另一个私有静态常量用于储存笔记编辑页面标题背景资源id
public static int getNoteBgResource(int id) {
return BG_EDIT_RESOURCES[id];
}
public static int getNoteTitleBgResource(int id) {
return BG_EDIT_TITLE_RESOURCES[id];
}
}// 初始化编辑页面标题背景资源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[] { // 定义final整型数组 BG_FIRST_RESOURCES
R.drawable.list_yellow_up, // 黄色背景上边框图案id
R.drawable.list_blue_up, // 蓝色背景上边框图案id
R.drawable.list_white_up, // 白色背景边框图案id
R.drawable.list_green_up, // 绿色背景边框图案id
R.drawable.list_red_up// 红色背景边框图案id
};
private final static int[] BG_NORMAL_RESOURCES = new int[] {
R.drawable.list_yellow_middle, // 黄色背景中间边框图案id
R.drawable.list_blue_middle, // 蓝色背景中间边框图案id
R.drawable.list_white_middle, // 白色背景中间边框图案id
R.drawable.list_green_middle, // 绿色背景中间边框图案id
R.drawable.list_red_middle// 红色背景中间边框图案id
};
private final static int[] BG_LAST_RESOURCES = new int[] {
R.drawable.list_yellow_down, // 黄色背景中下间边框图案id
R.drawable.list_blue_down, // 蓝色背景中下间边框图案id
R.drawable.list_white_down, // 白色背景中下间边框图案id
R.drawable.list_green_down, // 绿色背景中下间边框图案id
R.drawable.list_red_down,// 红色背景中下间边框图案id
};
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];
}
// 定义getNoteBgFirstRes方法用于返回G_FIRST_RESOURCES[id]
public static int getNoteBgLastRes(int id) {
return BG_LAST_RESOURCES[id];
}
// 定义getNoteBgLastRes方法用于返回 BG_LAST_RESOURCES[id]
public static int getNoteBgSingleRes(int id) {
return BG_SINGLE_RESOURCES[id];
}
// 定义getNoteBgSingleRes方法用于返回BG_SINGLE_RESOURCES[id]
public static int getNoteBgNormalRes(int id) {
return BG_NORMAL_RESOURCES[id];
}
// 定义etNoteBgNormalRes方法用于返回BG_NORMAL_RESOURCES[id]
public static int getFolderBgRes() {
return R.drawable.list_folder;
}// 定义getFolderBgRes方法用于返回 R.drawable.list_folder
}
public static class WidgetBgResources {// 定义静态内部类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,
};// 管理小部件2x2格式不同颜色资源图片
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
};// 管理小部件4x4格式不同颜色资源图片
public static int getWidget4xBgResource(int id) {
return BG_4X_RESOURCES[id];
}
}
public static class TextAppearanceResources {// 定义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;
}
}
}

@ -0,0 +1,133 @@
/*
* 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
};// 定义字符串数组PROJECTION包含IDB G_COLOR_ID 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存储键值对数据
ContentValues values = new ContentValues();
values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);// 将无效小部件id存储ContentValues中
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]) });// 通过getcontent函数获取程序contentValues对象用update方法更新
}
}
private Cursor getNoteWidgetInfo(Context context, int widgetId) {
return context.getContentResolver().query(Notes.CONTENT_NOTE_URI,
PROJECTION, // 获取ContentResovler对象并用querty方法查询数据·
NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?",
new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) },
null);
}// 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++) {// 判断当前小部件id是否合法若合法才可进行操作
if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) {
int bgId = ResourceParser.getDefaultBgId(context);// 获取默认背景图片id并将其作为当前部件的背景
String snippet = "";
Intent intent = new Intent(context, NoteEditActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);// 创建internet对象设置flag标志
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;
} // 判断数据库查询结果c是否为空若查询结果大于1则记录日志错误并返回
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);// 将当前记录id作为extra数据存入启动internet对象中
} 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);// 如果是将小部件文本设置为“访问模式下”并创建一个PendingIntent使点击小部件时跳转至NotesListActivity
} else {
rv.setTextViewText(R.id.widget_text, snippet);
pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent,
PendingIntent.FLAG_UPDATE_CURRENT);
} // 如果不是将小部件文本设置为片段内容并创建一个PendingIntent使点击小部件时跳转至NoteEditActivity
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();// 获取背景资源id布局资源id小部件类型
}

@ -0,0 +1,198 @@
/*
* 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.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;
public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { // 实现OnClickListener接口用于监听对话框按钮的点击事件
private long mNoteId; // 用于存储笔记Id
private String mSnippet; // 用于存储笔记内容摘要
private static final int SNIPPET_PREW_MAX_LEN = 60;// 限制笔记长度
MediaPlayer mPlayer;
// onCreate() 函数在 Activity 初始化时调用,用于初始化
// savedInstanceState 该参数用于恢复 Activity 状态。
@Override
protected void onCreate(Bundle savedInstanceState) {// 重写onCreate()方法用于初始化该方法在Activity初始化时调用
super.onCreate(savedInstanceState);
// 界面显示:无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置窗口没有标题
// 获取 Window 对象,添加 FLAG_SHOW_WHEN_LOCKED 标记
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();
// 从Intent对象中获取笔记的 Id 和内容
try {
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
// 根据便签Id从数据库中获取便签内容
// getContentResolver() 实现数据共享,实例存储
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;
}
// 创建 MediaPlayer 对象,根据笔记是否存在数据库中来展示操作对话框或者直接退出
mPlayer = new MediaPlayer();
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
playAlarmSound();
} else {
finish();
}
}
// 用于判断屏幕是否被唤醒(亮着)
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
// 用于实现报警铃声的播放
private void playAlarmSound() {
// 获取系统默认的铃声
Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM);
// 获取静音模式下允许响铃的类型
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); // 设置报警铃声
mPlayer.prepare(); // 准备同步
mPlayer.setLooping(true); // 设置循环播放
mPlayer.start(); // 开始播放
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
// 以下的 e.printStackTrace() 函数功能是抛出异常,还将显示出更深的调用信息
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 创建一个对话框标题为app的名字内容为mSnippet确定按钮为notealert_ok
// 当屏幕开启时取消按钮为notealert_enter点击弹出框外部可以隐藏弹出框
private void showActionDialog() {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
// 为对话框设置标题
dialog.setTitle(R.string.app_name);
// 为对话框设置内容
dialog.setMessage(mSnippet);
// 给对话框添加“OK”按钮
dialog.setPositiveButton(R.string.notealert_ok, this);
if (isScreenOn()) {
// 给对话框添加“CANCEL”按钮
dialog.setNegativeButton(R.string.notealert_enter, this);
}
// 给对话框设置监听器
dialog.show().setOnDismissListener(this);
}
// 当对话框界面内某个按钮被点击时调用以下方法
// 接收 对话框界面 和 点击的按钮位置which 为参数
public void onClick(DialogInterface dialog, int which) {
// switch语句根据按钮位置的不同执行不同的操作
switch (which) {
// 当点击点击的是返回按键
case DialogInterface.BUTTON_NEGATIVE:
// 将编辑的便签内容传输到特定类中
Intent intent = new Intent(this, NoteEditActivity.class);
// 设置操作属性
intent.setAction(Intent.ACTION_VIEW);
// 创建一个特定的Note Id传输给便签
intent.putExtra(Intent.EXTRA_UID, 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;
}
}
}

@ -0,0 +1,73 @@
/*
* 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.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;
//定时向用户推送闹钟提醒
public class AlarmInitReceiver extends BroadcastReceiver {// 继承BroadcastReceiver类,用于接收广播,并且在接收到广播后启动AlarmAlertActivity
// 对数据库的操作调用笔记Id和时钟时间
private static final String[] PROJECTION = new String[] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE
};
private static final int COLUMN_ID = 0;
private static final int COLUMN_ALERTED_DATE = 1;
// 重写 BroadcastReceiver 的 onReceive 方法
@Override
public void onReceive(Context context, Intent intent) {
// 获取当前系统时间
long currentDate = System.currentTimeMillis();
// 查询数据库,找出大于当前系统时间、类型相等的笔记的记录
Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI,
PROJECTION,
NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE,
new String[] { String.valueOf(currentDate) },
null);
// 当查询结果不为空时
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();
}
}
}

@ -0,0 +1,32 @@
/*
* 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.BroadcastReceiver;//广播接收器
import android.content.Context;
import android.content.Intent;
public class AlarmReceiver extends BroadcastReceiver { // 继承BroadcastReceiver类,用于接收广播,并且在接收到广播后启动AlarmAlertActivity
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, AlarmAlertActivity.class);// 设置intent的类为AlarmAlertActivity,可以用于启动Activity
// 为intent对象添加一个标志表示它将启动一个新的任务栈
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);// 启动Activity
}
}

@ -0,0 +1,93 @@
/*
* 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.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;
// 指定每个列表项的布局模板指定Cursor中的每个字段应该绑定到那些视图上
// 以文件夹的形式展现给用户
public class FoldersListAdapter extends CursorAdapter {
// 指定查询时返回的列NoteColumns是一个接口
public static final String[] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET
};
// 定义查询文件夹表是返回的列的索引
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) {
return new FolderListItem(context);// 返回一个FolderListItem对象该对象继承自LinearLayout用于显示文件夹名称
}
// 用于绑定视图和数据
@Override
public void bindView(View view, Context context, Cursor cursor) {
// 判断视图对象是否为 FolderListItem 的实例
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);// 将获取到的文件夹名称设置到FolderListItem对象中
}
}
// 获取对应文件夹名称
public String getFolderName(Context context, int position) {
Cursor cursor = (Cursor) getItem(position);
// 根据文件夹id获取文件夹的名称
return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
}
// 用于显示文件夹名称
private class FolderListItem extends LinearLayout {// 继承自LinearLayout用于显示文件夹名称该类只有一个TextView对象
private TextView mName;// 用于显示文件夹名称该类只有一个TextView对象
public FolderListItem(Context context) {// 构造函数
super(context);
// 将布局文件加载到当前视图
inflate(context, R.layout.folder_list_item, this);
// 将获取到的TextView对象赋值给mName
mName = (TextView) findViewById(R.id.tv_folder_name);
}
// 将给定的名称设置到mName中
public void bind(String name) {
mName.setText(name);
}
}
}

@ -0,0 +1,990 @@
/*
* 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.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;
public class NoteEditActivity extends Activity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener {
// 头部视图空间
private class HeadViewHolder {
// 文本视图,显示修改的日期
public TextView tvModified;
// 图像视图,显示警告图标
public ImageView ivAlertIcon;
// 文本视图,显示警告日期
public TextView tvAlertDate;
// 图像按钮,用于设置背景颜色
public ImageView ibSetBgColor;
}
// 用于存储不同背景选择按钮的id和对应颜色
private static final Map<Integer, Integer> sBgSelectorBtnsMap = new HashMap<Integer, Integer>();
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);
}
// 用于存储不同颜色值和对应的背景选择器的id
private static final Map<Integer, Integer> sBgSelectorSelectionMap = new HashMap<Integer, Integer>();
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);
}
// 用于存储不同字体大小按钮id和对应的字体大小
private static final Map<Integer, Integer> sFontSizeBtnsMap = new HashMap<Integer, Integer>();
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);
}
// 用于存储不同字体大小和对应的字体选择器的id
private static final Map<Integer, Integer> sFontSelectorSelectionMap = new HashMap<Integer, Integer>();
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;
// 用于存储正在编辑的笔记
private WorkingNote mWorkingNote;
// 用于存储用户的偏好设置
private SharedPreferences mSharedPrefs;
private int mFontSizeId;
// 用于表示字体大小偏好设置键
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
// 用于限制快捷方式图标标题的最大长度
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
// 表示已被选中的标签符号
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;
// 在活动创建时进行一些初始化操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
// 如果传入的参数为空且调用initActivityState方法传入getIntent方法返回的Intent对象返回false
// 表示活动状态初始化失败,结束活动
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.ACTION_VIEW
Intent intent = new Intent(Intent.ACTION_VIEW);
// 将Intent.EXTRA_UID作为额外数据放入intent对象中
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; // 将mWorkingNote置空
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);
}
// 如果在内容提供者中noteId对应的笔记不可见或者不是笔记类型
if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
Intent jump = new Intent(this, NotesListActivity.class);
// 程序将跳转到上面声明的intent——jump
startActivity(jump);
showToast(R.string.error_note_not_exist);
finish();
return false;
} else {
// 否则向 load函数 传入当前活动和noteId作为参数返回一个WorkingNote对象
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())) { // 如果用户指定的动作为Intent.ACTION_INSERT_OR_EDIT
// New note
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
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));
// Parse call-record note
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0);
if (callDate != 0 && phoneNumber != null) {
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() {
// 设置笔记编辑器的文字外观根据字体大小的id选择合适的资源
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) {// 保存当前的工作笔记的id
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) {
// 获取被点击的视图的id
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) {
// 判断Activity是否正在结束
if (isFinishing()) {
return true;
}
clearSettingState();
// 清空菜单所有项目
menu.clear();
// 判断当前笔记的文件夹id是否是通话记录文件夹的id
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) {
// 根据被点击项目的id进行不同的处理
switch (item.getItemId()) {
case R.id.menu_new_note:
createNewNote();
break;
case R.id.menu_delete:
// 创建对话框,询问用户是否删除
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setIcon(android.R.drawable.ic_dialog_alert);
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();
break;
case R.id.menu_font_size:
// 将字体大小选择器和当前字体大小对应的视图设置为可见
mFontSizeSelector.setVisibility(View.VISIBLE);
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
break;
case R.id.menu_list_mode:
// 根据当前笔记是否是清单模式,切换到相反的模式,并更新笔记的清单模式属性
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ? TextNote.MODE_CHECK_LIST : 0);
break;
case R.id.menu_share:
getWorkingText();
// 将文本发送给其他应用
sendTo(this, mWorkingNote.getContent());
break;
case R.id.menu_send_to_desktop:
// 将当前笔记作为一个快捷方式发送到桌面
sendToDesktop();
break;
case R.id.menu_alert:
// 设置一个闹钟提醒
setReminder();
break;
case R.id.menu_delete_remind:
// 将当前笔记的提醒日期设置为0并更新数据库
mWorkingNote.setAlertDate(0, false);
break;
default:
break;
}
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<Long> ids = new HashSet<Long>();
long id = mWorkingNote.getNoteId();
// 判断是否为根文件夹id
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;
}
// 笔记闹钟提醒发生变化时调用, set 是是否设置提醒的标志
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();
}
// 大于0,即保存到了数据库中,否则就是未保存到数据库
if (mWorkingNote.getNoteId() > 0) {
// 用于发送一个闹钟接收的广播将当前笔记的uri作为数据放入意图中
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;
if (mWorkingNote.getCheckListMode() == TextNote.MODE_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;
} 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();
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
*/
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;
}
// 显示提示的视图
private void showToast(int resId) {
showToast(resId, Toast.LENGTH_SHORT);
}
// 持续显示提示视图
private void showToast(int resId, int duration) {
Toast.makeText(this, resId, duration).show();
}
}

@ -0,0 +1,233 @@
/*
* 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;
// 继承EditText设置标签设置文本框
public class NoteEditText extends EditText {
private static final String TAG = "NoteEditText";
private int mIndex;
private int mSelectionStartBeforeDelete;
private static final String SCHEME_TEL = "tel:";
private static final String SCHEME_HTTP = "http:";
private static final String SCHEME_EMAIL = "mailto:";
// 建立一个字符和整数的hash表用于链接电话网站还有邮箱
private static final Map<String, Integer> sSchemaActionResMap = new HashMap<String, Integer>();
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
*/
// 在NoteEditActivity中删除或添加文本的操作可以看做是一个文本是否被变的标记
public interface OnTextViewChangeListener {
/**
* Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens
* and the text is null
*/
void onEditTextDelete(int index, String text);
/**
* Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER}
* happen
*/
void onEditTextEnter(int index, String text);
/**
* Hide or show item option when text change
*/
void onTextChange(int index, boolean hasText);
}
private OnTextViewChangeListener mOnTextViewChangeListener;
// 根据context设置文本
public NoteEditText(Context context) {
super(context, null);
mIndex = 0;
}
// 设置当前光标
public void setIndex(int index) {
mIndex = index;
}
// 初始化文本修改标记
public void setOnTextViewChangeListener(OnTextViewChangeListener listener) {
mOnTextViewChangeListener = listener;
}
// 初始化便签
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
}
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
// 根据用户触摸的位置,获取对应的文本偏移量,并设置为选择状态。
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
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);
}
// 处理用户按下一个键盘按键时会触发 的事件
@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);
}
// 处理用户松开一个键盘按键时会触发 的事件
@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);
}
// 当焦点发生变化时,会自动调用该方法来处理焦点改变的事件
@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);
}
// 生成上下文菜单
@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);
}
}

@ -0,0 +1,956 @@
/*
* 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.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;
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";
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;// 当前选中的item
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
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
initResources();
/**
* Insert an introduction when user firstly use this application
*/
setAppInfoFromRawRes();
}
@Override
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);
}
}
private void setAppInfoFromRawRes() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) {
StringBuilder sb = new StringBuilder();
InputStream in = null;
try {
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 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()) {
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;
mNotesListView = (ListView) findViewById(R.id.notes_list);
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);
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();
}
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(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;
}
switch (item.getItemId()) {
case 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();
break;
case R.id.move:
startQueryDestinationFolders();// 是否需要查询,如果不需要,直接调用startMove
break;
default:
return false;
}
return true;
}
}
private class NewNoteOnTouchListener implements OnTouchListener {// 为了解决点击新建按钮时,点击到下面的item的问题
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+94Unit: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));// 为了能够在子文件夹中移动便签,这里需要使用adapter.getItemId(which)而不是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<Void, Void, HashSet<AppWidgetAttribute>>() {
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
HashSet<AppWidgetAttribute> 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<AppWidgetAttribute> 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<Long> ids = new HashSet<Long>();
ids.add(folderId);
HashSet<AppWidgetAttribute> 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) {
switch (v.getId()) {
case R.id.btn_new_note:
createNewNote();
break;
default:
break;
}
}
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
}
});
}
@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;
}
}
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);
}
@Override
public boolean onContextItemSelected(MenuItem item) {// 为了解决长按菜单无法弹出的问题将此方法改为public
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) {// 是否选中,选中后的操作
switch (item.getItemId()) {
case R.id.menu_new_folder: {
showCreateOrModifyFolderDialog(true);
break;
}
case R.id.menu_export_text: {
exportNoteToText();
break;
}
case 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();
}
break;
}
case R.id.menu_setting: {
startPreferenceActivity();
break;
}
case R.id.menu_new_note: {
createNewNote();
break;
}
case R.id.menu_search:
onSearchRequested();
break;
default:
break;
}
return true;
}
@Override
public boolean onSearchRequested() {
startSearch(null, false, null /* appData */, false);
return true;
}
private void exportNoteToText() {// 是否有SD卡是否有权限
final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
new AsyncTask<Void, Void, Integer>() {
@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();
}
private boolean isSyncMode() {// 是否同步模式
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
}
private void startPreferenceActivity() {// 启动设置界面
Activity from = getParent() != null ? getParent() : this;
Intent intent = new Intent(from, NotesPreferenceActivity.class);
from.startActivityIfNeeded(intent, -1);
}
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");// 查询文件夹列表,按修改时间排序,最近修改的排在最前面
}
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;
}
}

@ -0,0 +1,197 @@
/*
* 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.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;
// 用于创建笔记应用的列表适配器
public class NotesListAdapter extends CursorAdapter {
private static final String TAG = "NotesListAdapter";
private Context mContext;
private HashMap<Integer, Boolean> mSelectedIndex;
private int mNotesCount;
private boolean mChoiceMode;
public static class AppWidgetAttribute {
public int widgetId;
public int widgetType;
};
public NotesListAdapter(Context context) {
super(context, null);
mSelectedIndex = new HashMap<Integer, Boolean>();
mContext = context;
mNotesCount = 0;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new NotesListItem(context);
}
// 用于绑定视图和数据
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view instanceof NotesListItem) {
NoteItemData itemData = new NoteItemData(context, cursor);
((NotesListItem) view).bind(context, itemData, mChoiceMode,
isSelectedItem(cursor.getPosition()));
}
}
// 设置勾选框,并更新视图
public void setCheckedItem(final int position, final boolean checked) {
mSelectedIndex.put(position, checked);
notifyDataSetChanged();
}
// 判断单选按钮是否勾选
public boolean isInChoiceMode() {
return mChoiceMode;
}
// 设置单项选项框
public void setChoiceMode(boolean mode) {
mSelectedIndex.clear();
mChoiceMode = mode;
}
// 根据参数checked选择或取消选择所有的便签项
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);
}
}
}
}
// 获取所有选中的项的id
public HashSet<Long> getSelectedItemIds() {
HashSet<Long> itemSet = new HashSet<Long>();// 创建一个HashSet对象,用于存放选中的项的id
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);
}
}
}
return itemSet;// 返回所有选中的项的id
}
// 获取所有选中的项的小部件属性
public HashSet<AppWidgetAttribute> getSelectedWidget() {
HashSet<AppWidgetAttribute> itemSet = new HashSet<AppWidgetAttribute>();
for (Integer position : mSelectedIndex.keySet()) {
if (mSelectedIndex.get(position) == true) {
Cursor c = (Cursor) getItem(position);
if (c != null) {
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<Boolean> values = mSelectedIndex.values();
if (null == values) {
return 0;
}
Iterator<Boolean> iter = values.iterator();
int count = 0;
while (iter.hasNext()) {
if (true == iter.next()) {
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
protected void onContentChanged() {
super.onContentChanged();
calcNotesCount();
}
// 光标发生变动时,回调该函数计算便签数量
@Override
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++;
}
} else {
Log.e(TAG, "Invalid cursor");
return;
}
}
}
}

@ -0,0 +1,413 @@
/*
* 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.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;
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;
// 在活动创建时执行一些初始化操作
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
/* using the app icon for navigation */
getActionBar().setDisplayHomeAsUpEnabled(true);
// 从xml文件中加载活动的偏好设置
addPreferencesFromResource(R.xml.preferences);
mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);
mReceiver = new GTaskReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME);
registerReceiver(mReceiver, filter);
mOriAccounts = null;
// 从xml文件中加载了一个视图并赋值给header这个局部变量
View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);
// 将这个视图添加到列表的头部
getListView().addHeaderView(header, null, true);
}
@Override
protected void onResume() {
super.onResume();
// need to set sync account automatically if user has added a new
// account
if (mHasAddedAccount) {
Account[] accounts = getGoogleAccounts();
if (mOriAccounts != null && accounts.length > mOriAccounts.length) {
for (Account accountNew : accounts) {
boolean found = false;
for (Account accountOld : mOriAccounts) {
if (TextUtils.equals(accountOld.name, accountNew.name)) {
found = true;
break;
}
}
if (!found) {
setSyncAccount(accountNew.name);
break;
}
}
}
}
// 刷新用户界面
refreshUI();
}
// 在活动销毁时执行一些清理操作
@Override
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.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);
// 获取同步账户信息
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;
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() {
public void onClick(DialogInterface dialog, int 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();
// clean up last sync time
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();
}
}
// 删除同步账户
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);
}
// 接收同步状态和信息
private class GTaskReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
refreshUI();
if (intent.getBooleanExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_IS_SYNCING, false)) {
TextView syncStatus = (TextView) findViewById(R.id.prefenerece_sync_status_textview);
syncStatus.setText(intent
.getStringExtra(GTaskSyncService.GTASK_SERVICE_BROADCAST_PROGRESS_MSG));
}
}
}
// 处理菜单选项
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, NotesListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return false;
}
}
}

@ -0,0 +1,74 @@
/*
* 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.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;
public class Contact { // 定义连接类
private static HashMap<String, String> sContactCache; // 定义连接哈希表
private static final String TAG = "Contact"; // 设置TAG的值为'连接'
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 = '+')"; // SQL语句
public static String getContact(Context context, String phoneNumber) { // 获取连接
if (sContactCache == null) {
sContactCache = new HashMap<String, String>(); // 连接哈希表为空时创建连接哈希表
}
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, // 通话记录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; // 没找到返回NULL
}
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save