diff --git a/Notes-master/.gitignore b/Notes-master/.gitignore
deleted file mode 100644
index 7df8dff..0000000
--- a/Notes-master/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-# generated files
-bin/
-gen/
-
-# Local configuration file (sdk path, etc)
-project.properties
-.settings/
-.classpath
-.project
diff --git a/Notes-master/AndroidManifest.xml b/Notes-master/AndroidManifest.xml
deleted file mode 100644
index e5c7d47..0000000
--- a/Notes-master/AndroidManifest.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/NOTICE b/Notes-master/NOTICE
deleted file mode 100644
index 9a54521..0000000
--- a/Notes-master/NOTICE
+++ /dev/null
@@ -1,190 +0,0 @@
-
- Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
-
- 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.
-
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
diff --git a/Notes-master/README b/Notes-master/README
deleted file mode 100644
index fc0d824..0000000
--- a/Notes-master/README
+++ /dev/null
@@ -1,23 +0,0 @@
-[中文]
-
-1. MiCode便签是小米便签的社区开源版,由MIUI团队(www.miui.com) 发起并贡献第一批代码,遵循NOTICE文件所描述的开源协议,
- 今后为MiCode社区(www.micode.net) 拥有,并由社区发布和维护。
-
-2. Bug反馈和跟踪,请访问Github,
- https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
-
-3. 功能建议和综合讨论,请访问MiCode,
- http://micode.net/forum.php?mod=forumdisplay&fid=38
-
-
-[English]
-
-1. MiCode Notes is open source edition of XM notepad, it's first initiated and sponsored by MIUI team (www.miui.com).
- It's opened under license described by NOTICE file. It's owned by the MiCode community (www.micode.net). In future,
- the MiCode community will release and maintain this project.
-
-2. Regarding issue tracking, please visit Github,
- https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
-
-3. Regarding feature request and general discussion, please visit Micode forum,
- http://micode.net/forum.php?mod=forumdisplay&fid=38
diff --git a/Notes-master/res/color/primary_text_dark.xml b/Notes-master/res/color/primary_text_dark.xml
deleted file mode 100644
index 7c85459..0000000
--- a/Notes-master/res/color/primary_text_dark.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/color/secondary_text_dark.xml b/Notes-master/res/color/secondary_text_dark.xml
deleted file mode 100644
index c1c2384..0000000
--- a/Notes-master/res/color/secondary_text_dark.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/drawable-hdpi/bg_btn_set_color.png b/Notes-master/res/drawable-hdpi/bg_btn_set_color.png
deleted file mode 100644
index 5eb5d44..0000000
Binary files a/Notes-master/res/drawable-hdpi/bg_btn_set_color.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/bg_color_btn_mask.png b/Notes-master/res/drawable-hdpi/bg_color_btn_mask.png
deleted file mode 100644
index 100db77..0000000
Binary files a/Notes-master/res/drawable-hdpi/bg_color_btn_mask.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/call_record.png b/Notes-master/res/drawable-hdpi/call_record.png
deleted file mode 100644
index fb88ca4..0000000
Binary files a/Notes-master/res/drawable-hdpi/call_record.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/clock.png b/Notes-master/res/drawable-hdpi/clock.png
deleted file mode 100644
index 5f2ae9a..0000000
Binary files a/Notes-master/res/drawable-hdpi/clock.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/delete.png b/Notes-master/res/drawable-hdpi/delete.png
deleted file mode 100644
index 643de3e..0000000
Binary files a/Notes-master/res/drawable-hdpi/delete.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/dropdown_icon.9.png b/Notes-master/res/drawable-hdpi/dropdown_icon.9.png
deleted file mode 100644
index 5525025..0000000
Binary files a/Notes-master/res/drawable-hdpi/dropdown_icon.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_blue.9.png b/Notes-master/res/drawable-hdpi/edit_blue.9.png
deleted file mode 100644
index 55a1856..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_blue.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_green.9.png b/Notes-master/res/drawable-hdpi/edit_green.9.png
deleted file mode 100644
index 2cb2d60..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_green.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_red.9.png b/Notes-master/res/drawable-hdpi/edit_red.9.png
deleted file mode 100644
index bae944a..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_red.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_title_blue.9.png b/Notes-master/res/drawable-hdpi/edit_title_blue.9.png
deleted file mode 100644
index 96e6092..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_title_blue.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_title_green.9.png b/Notes-master/res/drawable-hdpi/edit_title_green.9.png
deleted file mode 100644
index 08d8644..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_title_green.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_title_red.9.png b/Notes-master/res/drawable-hdpi/edit_title_red.9.png
deleted file mode 100644
index 9c430e5..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_title_red.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_title_white.9.png b/Notes-master/res/drawable-hdpi/edit_title_white.9.png
deleted file mode 100644
index 19e8d95..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_title_white.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_title_yellow.9.png b/Notes-master/res/drawable-hdpi/edit_title_yellow.9.png
deleted file mode 100644
index bf8f580..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_title_yellow.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_white.9.png b/Notes-master/res/drawable-hdpi/edit_white.9.png
deleted file mode 100644
index 918f7a6..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_white.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/edit_yellow.9.png b/Notes-master/res/drawable-hdpi/edit_yellow.9.png
deleted file mode 100644
index 10cb642..0000000
Binary files a/Notes-master/res/drawable-hdpi/edit_yellow.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/font_large.png b/Notes-master/res/drawable-hdpi/font_large.png
deleted file mode 100644
index 78cf2e6..0000000
Binary files a/Notes-master/res/drawable-hdpi/font_large.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/font_normal.png b/Notes-master/res/drawable-hdpi/font_normal.png
deleted file mode 100644
index 9de7ced..0000000
Binary files a/Notes-master/res/drawable-hdpi/font_normal.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/font_size_selector_bg.9.png b/Notes-master/res/drawable-hdpi/font_size_selector_bg.9.png
deleted file mode 100644
index be8e64c..0000000
Binary files a/Notes-master/res/drawable-hdpi/font_size_selector_bg.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/font_small.png b/Notes-master/res/drawable-hdpi/font_small.png
deleted file mode 100644
index d3ff104..0000000
Binary files a/Notes-master/res/drawable-hdpi/font_small.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/font_super.png b/Notes-master/res/drawable-hdpi/font_super.png
deleted file mode 100644
index 85b13a1..0000000
Binary files a/Notes-master/res/drawable-hdpi/font_super.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/icon_app.png b/Notes-master/res/drawable-hdpi/icon_app.png
deleted file mode 100644
index 418aadc..0000000
Binary files a/Notes-master/res/drawable-hdpi/icon_app.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_background.png b/Notes-master/res/drawable-hdpi/list_background.png
deleted file mode 100644
index 087e1f9..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_background.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_blue_down.9.png b/Notes-master/res/drawable-hdpi/list_blue_down.9.png
deleted file mode 100644
index b88eebf..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_blue_down.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_blue_middle.9.png b/Notes-master/res/drawable-hdpi/list_blue_middle.9.png
deleted file mode 100644
index 96b1c8b..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_blue_middle.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_blue_single.9.png b/Notes-master/res/drawable-hdpi/list_blue_single.9.png
deleted file mode 100644
index d7e7206..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_blue_single.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_blue_up.9.png b/Notes-master/res/drawable-hdpi/list_blue_up.9.png
deleted file mode 100644
index 632e88c..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_blue_up.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_folder.9.png b/Notes-master/res/drawable-hdpi/list_folder.9.png
deleted file mode 100644
index 829f61b..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_folder.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_footer_bg.9.png b/Notes-master/res/drawable-hdpi/list_footer_bg.9.png
deleted file mode 100644
index 5325c25..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_footer_bg.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_green_down.9.png b/Notes-master/res/drawable-hdpi/list_green_down.9.png
deleted file mode 100644
index 64a39d9..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_green_down.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_green_middle.9.png b/Notes-master/res/drawable-hdpi/list_green_middle.9.png
deleted file mode 100644
index 897325a..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_green_middle.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_green_single.9.png b/Notes-master/res/drawable-hdpi/list_green_single.9.png
deleted file mode 100644
index c83405f..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_green_single.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_green_up.9.png b/Notes-master/res/drawable-hdpi/list_green_up.9.png
deleted file mode 100644
index 141f9e1..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_green_up.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_red_down.9.png b/Notes-master/res/drawable-hdpi/list_red_down.9.png
deleted file mode 100644
index 4224309..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_red_down.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_red_middle.9.png b/Notes-master/res/drawable-hdpi/list_red_middle.9.png
deleted file mode 100644
index 9988f17..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_red_middle.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_red_single.9.png b/Notes-master/res/drawable-hdpi/list_red_single.9.png
deleted file mode 100644
index 587c348..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_red_single.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_red_up.9.png b/Notes-master/res/drawable-hdpi/list_red_up.9.png
deleted file mode 100644
index 46b4757..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_red_up.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_white_down.9.png b/Notes-master/res/drawable-hdpi/list_white_down.9.png
deleted file mode 100644
index 29f9d8c..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_white_down.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_white_middle.9.png b/Notes-master/res/drawable-hdpi/list_white_middle.9.png
deleted file mode 100644
index 77a4ab4..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_white_middle.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_white_single.9.png b/Notes-master/res/drawable-hdpi/list_white_single.9.png
deleted file mode 100644
index 3e79189..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_white_single.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_white_up.9.png b/Notes-master/res/drawable-hdpi/list_white_up.9.png
deleted file mode 100644
index e23cd5c..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_white_up.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_yellow_down.9.png b/Notes-master/res/drawable-hdpi/list_yellow_down.9.png
deleted file mode 100644
index 31cfc1e..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_yellow_down.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_yellow_middle.9.png b/Notes-master/res/drawable-hdpi/list_yellow_middle.9.png
deleted file mode 100644
index b6549b2..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_yellow_middle.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_yellow_single.9.png b/Notes-master/res/drawable-hdpi/list_yellow_single.9.png
deleted file mode 100644
index 3faf507..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_yellow_single.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/list_yellow_up.9.png b/Notes-master/res/drawable-hdpi/list_yellow_up.9.png
deleted file mode 100644
index 4ae791c..0000000
Binary files a/Notes-master/res/drawable-hdpi/list_yellow_up.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/menu_delete.png b/Notes-master/res/drawable-hdpi/menu_delete.png
deleted file mode 100644
index ccdfc4b..0000000
Binary files a/Notes-master/res/drawable-hdpi/menu_delete.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/menu_move.png b/Notes-master/res/drawable-hdpi/menu_move.png
deleted file mode 100644
index 1140b71..0000000
Binary files a/Notes-master/res/drawable-hdpi/menu_move.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/new_note_normal.png b/Notes-master/res/drawable-hdpi/new_note_normal.png
deleted file mode 100644
index e24e0d1..0000000
Binary files a/Notes-master/res/drawable-hdpi/new_note_normal.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/new_note_pressed.png b/Notes-master/res/drawable-hdpi/new_note_pressed.png
deleted file mode 100644
index c748936..0000000
Binary files a/Notes-master/res/drawable-hdpi/new_note_pressed.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/note_edit_color_selector_panel.png b/Notes-master/res/drawable-hdpi/note_edit_color_selector_panel.png
deleted file mode 100644
index fc49552..0000000
Binary files a/Notes-master/res/drawable-hdpi/note_edit_color_selector_panel.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/notification.png b/Notes-master/res/drawable-hdpi/notification.png
deleted file mode 100644
index b13ab4a..0000000
Binary files a/Notes-master/res/drawable-hdpi/notification.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/search_result.png b/Notes-master/res/drawable-hdpi/search_result.png
deleted file mode 100644
index ff2befd..0000000
Binary files a/Notes-master/res/drawable-hdpi/search_result.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/selected.png b/Notes-master/res/drawable-hdpi/selected.png
deleted file mode 100644
index b889bef..0000000
Binary files a/Notes-master/res/drawable-hdpi/selected.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/title_alert.png b/Notes-master/res/drawable-hdpi/title_alert.png
deleted file mode 100644
index 544ee9c..0000000
Binary files a/Notes-master/res/drawable-hdpi/title_alert.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/title_bar_bg.9.png b/Notes-master/res/drawable-hdpi/title_bar_bg.9.png
deleted file mode 100644
index eb6bff0..0000000
Binary files a/Notes-master/res/drawable-hdpi/title_bar_bg.9.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_2x_blue.png b/Notes-master/res/drawable-hdpi/widget_2x_blue.png
deleted file mode 100644
index a1707f4..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_2x_blue.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_2x_green.png b/Notes-master/res/drawable-hdpi/widget_2x_green.png
deleted file mode 100644
index f86886c..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_2x_green.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_2x_red.png b/Notes-master/res/drawable-hdpi/widget_2x_red.png
deleted file mode 100644
index 0e66c29..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_2x_red.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_2x_white.png b/Notes-master/res/drawable-hdpi/widget_2x_white.png
deleted file mode 100644
index 5f0619a..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_2x_white.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_2x_yellow.png b/Notes-master/res/drawable-hdpi/widget_2x_yellow.png
deleted file mode 100644
index 12d1c2b..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_2x_yellow.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_4x_blue.png b/Notes-master/res/drawable-hdpi/widget_4x_blue.png
deleted file mode 100644
index 9183738..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_4x_blue.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_4x_green.png b/Notes-master/res/drawable-hdpi/widget_4x_green.png
deleted file mode 100644
index fa8b452..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_4x_green.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_4x_red.png b/Notes-master/res/drawable-hdpi/widget_4x_red.png
deleted file mode 100644
index 62de074..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_4x_red.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_4x_white.png b/Notes-master/res/drawable-hdpi/widget_4x_white.png
deleted file mode 100644
index a37d67c..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_4x_white.png and /dev/null differ
diff --git a/Notes-master/res/drawable-hdpi/widget_4x_yellow.png b/Notes-master/res/drawable-hdpi/widget_4x_yellow.png
deleted file mode 100644
index d7c5fa4..0000000
Binary files a/Notes-master/res/drawable-hdpi/widget_4x_yellow.png and /dev/null differ
diff --git a/Notes-master/res/drawable/new_note.xml b/Notes-master/res/drawable/new_note.xml
deleted file mode 100644
index 2154ebc..0000000
--- a/Notes-master/res/drawable/new_note.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/account_dialog_title.xml b/Notes-master/res/layout/account_dialog_title.xml
deleted file mode 100644
index 7717112..0000000
--- a/Notes-master/res/layout/account_dialog_title.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/add_account_text.xml b/Notes-master/res/layout/add_account_text.xml
deleted file mode 100644
index c799178..0000000
--- a/Notes-master/res/layout/add_account_text.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/datetime_picker.xml b/Notes-master/res/layout/datetime_picker.xml
deleted file mode 100644
index f10d592..0000000
--- a/Notes-master/res/layout/datetime_picker.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/dialog_edit_text.xml b/Notes-master/res/layout/dialog_edit_text.xml
deleted file mode 100644
index 361b39a..0000000
--- a/Notes-master/res/layout/dialog_edit_text.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/folder_list_item.xml b/Notes-master/res/layout/folder_list_item.xml
deleted file mode 100644
index 77e8148..0000000
--- a/Notes-master/res/layout/folder_list_item.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/note_edit.xml b/Notes-master/res/layout/note_edit.xml
deleted file mode 100644
index 10b2aa7..0000000
--- a/Notes-master/res/layout/note_edit.xml
+++ /dev/null
@@ -1,400 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/note_edit_list_item.xml b/Notes-master/res/layout/note_edit_list_item.xml
deleted file mode 100644
index a885f9c..0000000
--- a/Notes-master/res/layout/note_edit_list_item.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/note_item.xml b/Notes-master/res/layout/note_item.xml
deleted file mode 100644
index d541f6a..0000000
--- a/Notes-master/res/layout/note_item.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/note_list.xml b/Notes-master/res/layout/note_list.xml
deleted file mode 100644
index 6b25d38..0000000
--- a/Notes-master/res/layout/note_list.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/note_list_dropdown_menu.xml b/Notes-master/res/layout/note_list_dropdown_menu.xml
deleted file mode 100644
index 3fa271d..0000000
--- a/Notes-master/res/layout/note_list_dropdown_menu.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/note_list_footer.xml b/Notes-master/res/layout/note_list_footer.xml
deleted file mode 100644
index 5ca7b22..0000000
--- a/Notes-master/res/layout/note_list_footer.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/settings_header.xml b/Notes-master/res/layout/settings_header.xml
deleted file mode 100644
index 5eb8c50..0000000
--- a/Notes-master/res/layout/settings_header.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/layout/widget_2x.xml b/Notes-master/res/layout/widget_2x.xml
deleted file mode 100644
index 55970ce..0000000
--- a/Notes-master/res/layout/widget_2x.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/layout/widget_4x.xml b/Notes-master/res/layout/widget_4x.xml
deleted file mode 100644
index dc9bb51..0000000
--- a/Notes-master/res/layout/widget_4x.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/menu/call_note_edit.xml b/Notes-master/res/menu/call_note_edit.xml
deleted file mode 100644
index 02c0528..0000000
--- a/Notes-master/res/menu/call_note_edit.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
diff --git a/Notes-master/res/menu/call_record_folder.xml b/Notes-master/res/menu/call_record_folder.xml
deleted file mode 100644
index c664346..0000000
--- a/Notes-master/res/menu/call_record_folder.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
diff --git a/Notes-master/res/menu/note_edit.xml b/Notes-master/res/menu/note_edit.xml
deleted file mode 100644
index 35cacd1..0000000
--- a/Notes-master/res/menu/note_edit.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/menu/note_list.xml b/Notes-master/res/menu/note_list.xml
deleted file mode 100644
index 42ea736..0000000
--- a/Notes-master/res/menu/note_list.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
-
diff --git a/Notes-master/res/menu/note_list_dropdown.xml b/Notes-master/res/menu/note_list_dropdown.xml
deleted file mode 100644
index 7cbaadc..0000000
--- a/Notes-master/res/menu/note_list_dropdown.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/menu/note_list_options.xml b/Notes-master/res/menu/note_list_options.xml
deleted file mode 100644
index daac008..0000000
--- a/Notes-master/res/menu/note_list_options.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/menu/sub_folder.xml b/Notes-master/res/menu/sub_folder.xml
deleted file mode 100644
index b00de26..0000000
--- a/Notes-master/res/menu/sub_folder.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/raw-zh-rCN/introduction b/Notes-master/res/raw-zh-rCN/introduction
deleted file mode 100644
index 7188359..0000000
--- a/Notes-master/res/raw-zh-rCN/introduction
+++ /dev/null
@@ -1,7 +0,0 @@
-欢迎使用MIUI便签!
-
- 无论从软件中直接添加,还是从桌面拖出widget,MIUI便签能让你快速建立和保存便签;
-
- 除了调整文字大小、便签背景、文件夹等基础功能外,你会发现MIUI便签也提供了清单模式、便签提醒、软件加密、导出到SD卡、同步google task的高级功能,让你的生活记录更加美好和安全;
-
- 来分享你的使用体验吧:http://www.miui.com/index.php
diff --git a/Notes-master/res/raw/introduction b/Notes-master/res/raw/introduction
deleted file mode 100644
index 269cf7b..0000000
--- a/Notes-master/res/raw/introduction
+++ /dev/null
@@ -1 +0,0 @@
-Welcome to use MIUI notes!
\ No newline at end of file
diff --git a/Notes-master/res/values-zh-rCN/arrays.xml b/Notes-master/res/values-zh-rCN/arrays.xml
deleted file mode 100644
index a092386..0000000
--- a/Notes-master/res/values-zh-rCN/arrays.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
- 短信
- 邮件
-
-
\ No newline at end of file
diff --git a/Notes-master/res/values-zh-rCN/strings.xml b/Notes-master/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 09f75ed..0000000
--- a/Notes-master/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
-
-
- 便签
- 便签2x2
- 便签4x4
- 没有关联内容,点击新建便签。
- 访客模式下,便签内容不可见
- ...
- 新建便签
- 成功删除提醒
- 创建提醒
- 已过期
- yyyyMMdd
- MM月dd日 kk:mm
- 知道了
- 查看
- 呼叫电话
- 发送邮件
- 浏览网页
- 打开地图
-
- 新建文件夹
- 导出文本
- 同步
- 取消同步
- 设置
- 搜索
- 删除
- 移动到文件夹
- 选中了 %d 项
- 没有选中项,操作无效
- 全选
- 取消全选
- 文字大小
- 小
- 正常
- 大
- 超大
- 进入清单模式
- 退出清单模式
- 查看文件夹
- 刪除文件夹
- 修改文件夹名称
- 文件夹 %1$s 已存在,请重新命名
- 分享
- 发送到桌面
- 提醒我
- 删除提醒
- 选择文件夹
- 上一级文件夹
- 已添加到桌面
- 删除
- 确认要删除所选的 %d 条便签吗?
- 确认要删除该条便签吗?
- 确认删除文件夹及所包含的便签吗?
- 已将所选 %1$d 条便签移到 %2$s 文件夹
-
- SD卡被占用,不能操作
- 导出文本时发生错误,请检查SD卡
- 要查看的便签不存在
- 不能为空便签设置闹钟提醒
- 不能将空便签发送到桌面
- 导出成功
- 导出失败
- 已将文本文件(%1$s)输出至SD卡(%2$s)目录
-
- 同步便签...
- 同步成功
- 同步失败
- 同步已取消
- 与%1$s同步成功
- 同步失败,请检查网络和帐号设置
- 同步失败,发生内部错误
- 同步已取消
- 登录%1$s...
- 正在获取服务器便签列表...
- 正在同步本地便签...
-
- 设置
- 同步账号
- 与google task同步便签记录
- 上次同步于 %1$s
- 添加账号
- 更换账号
- 删除账号
- 取消
- 立即同步
- 取消同步
- 当前帐号 %1$s
- 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复
- 同步便签
- 请选择google帐号,便签将与该帐号的google task内容同步。
- 正在同步中,不能修改同步帐号
- 同步帐号已设置为%1$s
- 新建便签背景颜色随机
- 删除
- 通话便签
- 请输入名称
- 正在搜索便签
- 搜索便签
- 便签中的文字
- 便签
- 设置
- 取消
-
- %1$s 条符合“%2$s”的搜索结果
-
-
-
diff --git a/Notes-master/res/values-zh-rTW/arrays.xml b/Notes-master/res/values-zh-rTW/arrays.xml
deleted file mode 100644
index 5297209..0000000
--- a/Notes-master/res/values-zh-rTW/arrays.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
- 短信
- 郵件
-
-
\ No newline at end of file
diff --git a/Notes-master/res/values-zh-rTW/strings.xml b/Notes-master/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 3c41894..0000000
--- a/Notes-master/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-
-
-
-
-
- 便簽
- 便簽2x2
- 便簽4x4
- 沒有關聯內容,點擊新建便簽。
- 訪客模式下,便籤內容不可見
- ...
- 新建便簽
- 成功刪除提醒
- 創建提醒
- 已過期
- yyyyMMdd
- MM月dd日 kk:mm
- 知道了
- 查看
- 呼叫電話
- 發送郵件
- 浏覽網頁
- 打開地圖
- 已將所選 %1$d 便籤移到 %2$s 文件夾
-
- 新建文件夾
- 導出文本
- 同步
- 取消同步
- 設置
- 搜尋
- 刪除
- 移動到文件夾
- 選中了 %d 項
- 沒有選中項,操作無效
- 全選
- 取消全選
- 文字大小
- 小
- 正常
- 大
- 超大
- 進入清單模式
- 退出清單模式
- 查看文件夾
- 刪除文件夾
- 修改文件夾名稱
- 文件夾 %1$s 已存在,請重新命名
- 分享
- 發送到桌面
- 提醒我
- 刪除提醒
- 選擇文件夾
- 上一級文件夾
- 已添加到桌面
- 刪除
- 确认要刪除所選的 %d 條便籤嗎?
- 确认要删除該條便籤嗎?
- 確認刪除檔夾及所包含的便簽嗎?
- SD卡被佔用,不能操作
- 導出TXT時發生錯誤,請檢查SD卡
- 要查看的便籤不存在
- 不能爲空便籤設置鬧鐘提醒
- 不能將空便籤發送到桌面
- 導出成功
- 導出失敗
- 已將文本文件(%1$s)導出至SD(%2$s)目錄
-
- 同步便簽...
- 同步成功
- 同步失敗
- 同步已取消
- 與%1$s同步成功
- 同步失敗,請檢查網絡和帳號設置
- 同步失敗,發生內部錯誤
- 同步已取消
- 登陸%1$s...
- 正在獲取服務器便籤列表...
- 正在同步本地便籤...
-
- 設置
- 同步賬號
- 与google task同步便簽記錄
- 上次同步于 %1$s
- 添加賬號
- 更換賬號
- 刪除賬號
- 取消
- 立即同步
- 取消同步
- 當前帳號 %1$s
- 如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復
- 同步便簽
- 請選擇google帳號,便簽將與該帳號的google task內容同步。
- 正在同步中,不能修改同步帳號
- 同步帳號已設置為%1$s
- 新建便籤背景顏色隨機
-
- 刪除
- 通話便籤
- 請輸入名稱
-
- 正在搜索便籤
- 搜索便籤
- 便籤中的文字
- 便籤
- 設置
- 取消
-
- %1$s 條符合”%2$s“的搜尋結果
-
-
-
diff --git a/Notes-master/res/values/arrays.xml b/Notes-master/res/values/arrays.xml
deleted file mode 100644
index e00210b..0000000
--- a/Notes-master/res/values/arrays.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
- -%s
- --%s
- --%s
- --%s
-
-
-
- Messaging
- Email
-
-
\ No newline at end of file
diff --git a/Notes-master/res/values/colors.xml b/Notes-master/res/values/colors.xml
deleted file mode 100644
index 123ffbf..0000000
--- a/Notes-master/res/values/colors.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
- #335b5b5b
-
diff --git a/Notes-master/res/values/dimens.xml b/Notes-master/res/values/dimens.xml
deleted file mode 100644
index 194e84f..0000000
--- a/Notes-master/res/values/dimens.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
- 33sp
- 26sp
- 20sp
- 17sp
- 14sp
-
\ No newline at end of file
diff --git a/Notes-master/res/values/strings.xml b/Notes-master/res/values/strings.xml
deleted file mode 100644
index 55df868..0000000
--- a/Notes-master/res/values/strings.xml
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
- Notes
- Notes 2x2
- Notes 4x4
- No associated note found, click to create associated note.
- Privacy mode,can not see note content
- ...
- Add note
- Delete reminder successfully
- Set reminder
- Expired
- yyyyMMdd
- MMMd kk:mm
- Got it
- Take a look
- Call
- Send email
- Browse web
- Open map
-
- /MIUI/notes/
- notes_%s.txt
-
- (%d)
- New Folder
- Export text
- Sync
- Cancel syncing
- Settings
- Search
- Delete
- Move to folder
- %d selected
- Nothing selected, the operation is invalid
- Select all
- Deselect all
- Font size
- Small
- Medium
- Large
- Super
- Enter check list
- Leave check list
- View folder
- Delete folder
- Change folder name
- The folder %1$s exist, please rename
- Share
- Send to home
- Remind me
- Delete reminder
- Select folder
- Parent folder
- Note added to home
- Confirm to delete folder and its notes?
- Delete selected notes
- Confirm to delete the selected %d notes?
- Confirm to delete this note?
- Have moved selected %1$d notes to %2$s folder
-
- SD card busy, not available now
- Export failed, please check SD card
- The note is not exist
- Sorry, can not set clock on empty note
- Sorry, can not send and empty note to home
- Export successful
- Export fail
- Export text file (%1$s) to SD (%2$s) directory
-
- Syncing notes...
- Sync is successful
- Sync is failed
- Sync is canceled
- Sync is successful with account %1$s
- Sync failed, please check network and account settings
- Sync failed, internal error occurs
- Sync is canceled
- Logging into %1$s...
- Getting remote note list...
- Synchronize local notes with Google Task...
-
- Settings
- Sync account
- Sync notes with google task
- Last sync time %1$s
- yyyy-MM-dd hh:mm:ss
- Add account
- Change sync account
- Remove sync account
- Cancel
- Sync immediately
- Cancel syncing
- Current account %1$s
- All sync related information will be deleted, which may result in duplicated items sometime
- Sync notes
- Please select a google account. Local notes will be synced with google task.
- Cannot change the account because sync is in progress
- %1$s has been set as the sync account
- New note background color random
-
- Delete
- Call notes
- Input name
-
- Searching Notes
- Search notes
- Text in your notes
- Notes
- set
- cancel
-
- %1$s result for \"%2$s\"
-
- %1$s results for \"%2$s\"
-
-
-
diff --git a/Notes-master/res/values/styles.xml b/Notes-master/res/values/styles.xml
deleted file mode 100644
index d750e65..0000000
--- a/Notes-master/res/values/styles.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/res/xml/preferences.xml b/Notes-master/res/xml/preferences.xml
deleted file mode 100644
index fe58f8f..0000000
--- a/Notes-master/res/xml/preferences.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Notes-master/res/xml/searchable.xml b/Notes-master/res/xml/searchable.xml
deleted file mode 100644
index bf74f14..0000000
--- a/Notes-master/res/xml/searchable.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
diff --git a/Notes-master/res/xml/widget_2x_info.xml b/Notes-master/res/xml/widget_2x_info.xml
deleted file mode 100644
index ac8b225..0000000
--- a/Notes-master/res/xml/widget_2x_info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
diff --git a/Notes-master/res/xml/widget_4x_info.xml b/Notes-master/res/xml/widget_4x_info.xml
deleted file mode 100644
index cf79f9c..0000000
--- a/Notes-master/res/xml/widget_4x_info.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
diff --git a/Notes-master/src/net/micode/notes/data/.idea/.gitignore b/Notes-master/src/net/micode/notes/data/.idea/.gitignore
deleted file mode 100644
index 35410ca..0000000
--- a/Notes-master/src/net/micode/notes/data/.idea/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# 默认忽略的文件
-/shelf/
-/workspace.xml
-# 基于编辑器的 HTTP 客户端请求
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/Notes-master/src/net/micode/notes/data/.idea/data.iml b/Notes-master/src/net/micode/notes/data/.idea/data.iml
deleted file mode 100644
index d6ebd48..0000000
--- a/Notes-master/src/net/micode/notes/data/.idea/data.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/src/net/micode/notes/data/.idea/modules.xml b/Notes-master/src/net/micode/notes/data/.idea/modules.xml
deleted file mode 100644
index 91a0752..0000000
--- a/Notes-master/src/net/micode/notes/data/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/src/net/micode/notes/data/.idea/workspace.xml b/Notes-master/src/net/micode/notes/data/.idea/workspace.xml
deleted file mode 100644
index 9a4abf3..0000000
--- a/Notes-master/src/net/micode/notes/data/.idea/workspace.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- {
- "associatedIndex": 5
-}
-
-
-
-
-
- {
- "keyToString": {
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "ignore.virus.scanning.warn.message": "true",
- "kotlin-language-version-configured": "true",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "vue.rearranger.settings.migration": "true"
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
- 1743483514444
-
-
- 1743483514444
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Notes-master/src/net/micode/notes/data/Contact.java b/Notes-master/src/net/micode/notes/data/Contact.java
deleted file mode 100644
index d97ac5d..0000000
--- a/Notes-master/src/net/micode/notes/data/Contact.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.data;
-
-import android.content.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 sContactCache;
- private static final String TAG = "Contact";
-
- private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER
- + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'"
- + " AND " + Data.RAW_CONTACT_ID + " IN "
- + "(SELECT raw_contact_id "
- + " FROM phone_lookup"
- + " WHERE min_match = '+')";
-
- public static String getContact(Context context, String phoneNumber) {
- if(sContactCache == null) {
- sContactCache = new HashMap();
- }
-
- if(sContactCache.containsKey(phoneNumber)) {
- return sContactCache.get(phoneNumber);
- }
-
- String selection = CALLER_ID_SELECTION.replace("+",
- PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
- Cursor cursor = context.getContentResolver().query(
- Data.CONTENT_URI,
- new String [] { Phone.DISPLAY_NAME },
- selection,
- new String[] { phoneNumber },
- null);
-
- if (cursor != null && cursor.moveToFirst()) {
- try {
- String name = cursor.getString(0);
- sContactCache.put(phoneNumber, name);
- return name;
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, " Cursor get string error " + e.toString());
- return null;
- } finally {
- cursor.close();
- }
- } else {
- Log.d(TAG, "No contact matched with number:" + phoneNumber);
- return null;
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/data/Notes.java b/Notes-master/src/net/micode/notes/data/Notes.java
deleted file mode 100644
index f240604..0000000
--- a/Notes-master/src/net/micode/notes/data/Notes.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.data;
-
-import android.net.Uri;
-public class Notes {
- public static final String AUTHORITY = "micode_notes";
- public static final String TAG = "Notes";
- public static final int TYPE_NOTE = 0;
- public static final int TYPE_FOLDER = 1;
- public static final int TYPE_SYSTEM = 2;
-
- /**
- * Following IDs are system folders' identifiers
- * {@link Notes#ID_ROOT_FOLDER } is default folder
- * {@link Notes#ID_TEMPARAY_FOLDER } is for notes belonging no folder
- * {@link Notes#ID_CALL_RECORD_FOLDER} is to store call records
- */
- public static final int ID_ROOT_FOLDER = 0;
- public static final int ID_TEMPARAY_FOLDER = -1;
- public static final int ID_CALL_RECORD_FOLDER = -2;
- public static final int ID_TRASH_FOLER = -3;
-
- public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date";
- public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id";
- public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id";
- public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type";
- public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id";
- public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date";
-
- public static final int TYPE_WIDGET_INVALIDE = -1;
- public static final int TYPE_WIDGET_2X = 0;
- public static final int TYPE_WIDGET_4X = 1;
-
- public static class DataConstants {
- public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
- public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
- }
-
- /**
- * Uri to query all notes and folders
- */
- public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note");
-
- /**
- * Uri to query data
- */
- public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
-
- public interface NoteColumns {
- /**
- * The unique ID for a row
- *
Type: INTEGER (long)
- */
- public static final String ID = "_id";
-
- /**
- * The parent's id for note or folder
- *
Type: INTEGER (long)
- */
- public static final String PARENT_ID = "parent_id";
-
- /**
- * Created data for note or folder
- *
Type: INTEGER (long)
- */
- public static final String CREATED_DATE = "created_date";
-
- /**
- * Latest modified date
- *
Type: INTEGER (long)
- */
- public static final String MODIFIED_DATE = "modified_date";
-
-
- /**
- * Alert date
- *
Type: INTEGER (long)
- */
- public static final String ALERTED_DATE = "alert_date";
-
- /**
- * Folder's name or text content of note
- *
Type: TEXT
- */
- public static final String SNIPPET = "snippet";
-
- /**
- * Note's widget id
- *
Type: INTEGER (long)
- */
- public static final String WIDGET_ID = "widget_id";
-
- /**
- * Note's widget type
- *
Type: INTEGER (long)
- */
- public static final String WIDGET_TYPE = "widget_type";
-
- /**
- * Note's background color's id
- *
Type: INTEGER (long)
- */
- public static final String BG_COLOR_ID = "bg_color_id";
-
- /**
- * For text note, it doesn't has attachment, for multi-media
- * note, it has at least one attachment
- *
Type: INTEGER
- */
- public static final String HAS_ATTACHMENT = "has_attachment";
-
- /**
- * Folder's count of notes
- *
Type: INTEGER (long)
- */
- public static final String NOTES_COUNT = "notes_count";
-
- /**
- * The file type: folder or note
- *
Type: INTEGER
- */
- public static final String TYPE = "type";
-
- /**
- * The last sync id
- *
Type: INTEGER (long)
- */
- public static final String SYNC_ID = "sync_id";
-
- /**
- * Sign to indicate local modified or not
- *
Type: INTEGER
- */
- public static final String LOCAL_MODIFIED = "local_modified";
-
- /**
- * Original parent id before moving into temporary folder
- *
Type : INTEGER
- */
- public static final String ORIGIN_PARENT_ID = "origin_parent_id";
-
- /**
- * The gtask id
- *
Type : TEXT
- */
- public static final String GTASK_ID = "gtask_id";
-
- /**
- * The version code
- *
Type : INTEGER (long)
- */
- public static final String VERSION = "version";
- }
-
- public interface DataColumns {
- /**
- * The unique ID for a row
- *
Type: INTEGER (long)
- */
- public static final String ID = "_id";
-
- /**
- * The MIME type of the item represented by this row.
- *
Type: Text
- */
- public static final String MIME_TYPE = "mime_type";
-
- /**
- * The reference id to note that this data belongs to
- *
Type: INTEGER (long)
- */
- public static final String NOTE_ID = "note_id";
-
- /**
- * Created data for note or folder
- *
Type: INTEGER (long)
- */
- public static final String CREATED_DATE = "created_date";
-
- /**
- * Latest modified date
- *
Type: INTEGER (long)
- */
- public static final String MODIFIED_DATE = "modified_date";
-
- /**
- * Data's content
- *
Type: TEXT
- */
- public static final String CONTENT = "content";
-
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * integer data type
- *
Type: INTEGER
- */
- public static final String DATA1 = "data1";
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * integer data type
- *
Type: INTEGER
- */
- public static final String DATA2 = "data2";
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- *
Type: TEXT
- */
- public static final String DATA3 = "data3";
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- *
Type: TEXT
- */
- public static final String DATA4 = "data4";
-
- /**
- * Generic data column, the meaning is {@link #MIMETYPE} specific, used for
- * TEXT data type
- *
Type: TEXT
- */
- public static final String DATA5 = "data5";
- }
-
- public static final class TextNote implements DataColumns {
- /**
- * Mode to indicate the text in check list mode or not
- *
Type: Integer 1:check list mode 0: normal mode
- */
- public static final String MODE = DATA1;
-
- public static final int MODE_CHECK_LIST = 1;
-
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note";
-
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
-
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
- }
-
- public static final class CallNote implements DataColumns {
- /**
- * Call date for this record
- *
Type: INTEGER (long)
- */
- public static final String CALL_DATE = DATA1;
-
- /**
- * Phone number for this record
- *
Type: TEXT
- */
- public static final String PHONE_NUMBER = DATA3;
-
- public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note";
-
- public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note";
-
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
- }
-}
diff --git a/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java b/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java
deleted file mode 100644
index 1f7b963..0000000
--- a/Notes-master/src/net/micode/notes/data/NotesDatabaseHelper.java
+++ /dev/null
@@ -1,362 +0,0 @@
- /*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.data;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteOpenHelper;
-import android.util.Log;
-
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-
-
-public class NotesDatabaseHelper extends SQLiteOpenHelper {
- private static final String DB_NAME = "note.db";
-
- private static final int DB_VERSION = 4;
-
- public interface TABLE {
- public static final String NOTE = "note";
-
- public static final String DATA = "data";
- }
-
- private static final String TAG = "NotesDatabaseHelper";
-
- private static NotesDatabaseHelper mInstance;
-
- private static final String CREATE_NOTE_TABLE_SQL =
- "CREATE TABLE " + TABLE.NOTE + "(" +
- NoteColumns.ID + " INTEGER PRIMARY KEY," +
- NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.NOTES_COUNT + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.SNIPPET + " TEXT NOT NULL DEFAULT ''," +
- NoteColumns.TYPE + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.WIDGET_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," +
- NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," +
- NoteColumns.VERSION + " INTEGER NOT NULL DEFAULT 0" +
- ")";
-
- private static final String CREATE_DATA_TABLE_SQL =
- "CREATE TABLE " + TABLE.DATA + "(" +
- DataColumns.ID + " INTEGER PRIMARY KEY," +
- DataColumns.MIME_TYPE + " TEXT NOT NULL," +
- DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," +
- NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- NoteColumns.MODIFIED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," +
- DataColumns.CONTENT + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA1 + " INTEGER," +
- DataColumns.DATA2 + " INTEGER," +
- DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," +
- DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" +
- ")";
-
- private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
- "CREATE INDEX IF NOT EXISTS note_id_index ON " +
- TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
-
- /**
- * Increase folder's note count when move note to the folder
- */
- private static final String NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER increase_folder_count_on_update "+
- " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
- " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
- " END";
-
- /**
- * Decrease folder's note count when move note from folder
- */
- private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER decrease_folder_count_on_update " +
- " AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
- " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
- " AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
- " END";
-
- /**
- * Increase folder's note count when insert new note to the folder
- */
- private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
- "CREATE TRIGGER increase_folder_count_on_insert " +
- " AFTER INSERT ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
- " WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
- " END";
-
- /**
- * Decrease folder's note count when delete note from the folder
- */
- private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER =
- "CREATE TRIGGER decrease_folder_count_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN " +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
- " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
- " AND " + NoteColumns.NOTES_COUNT + ">0;" +
- " END";
-
- /**
- * Update note's content when insert data with type {@link DataConstants#NOTE}
- */
- private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER =
- "CREATE TRIGGER update_note_content_on_insert " +
- " AFTER INSERT ON " + TABLE.DATA +
- " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
- " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";
-
- /**
- * Update note's content when data with {@link DataConstants#NOTE} type has changed
- */
- private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER =
- "CREATE TRIGGER update_note_content_on_update " +
- " AFTER UPDATE ON " + TABLE.DATA +
- " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT +
- " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" +
- " END";
-
- /**
- * Update note's content when data with {@link DataConstants#NOTE} type has deleted
- */
- private static final String DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER =
- "CREATE TRIGGER update_note_content_on_delete " +
- " AFTER delete ON " + TABLE.DATA +
- " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.SNIPPET + "=''" +
- " WHERE " + NoteColumns.ID + "=old." + DataColumns.NOTE_ID + ";" +
- " END";
-
- /**
- * Delete datas belong to note which has been deleted
- */
- private static final String NOTE_DELETE_DATA_ON_DELETE_TRIGGER =
- "CREATE TRIGGER delete_data_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN" +
- " DELETE FROM " + TABLE.DATA +
- " WHERE " + DataColumns.NOTE_ID + "=old." + NoteColumns.ID + ";" +
- " END";
-
- /**
- * Delete notes belong to folder which has been deleted
- */
- private static final String FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER =
- "CREATE TRIGGER folder_delete_notes_on_delete " +
- " AFTER DELETE ON " + TABLE.NOTE +
- " BEGIN" +
- " DELETE FROM " + TABLE.NOTE +
- " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
-
- /**
- * Move notes belong to folder which has been moved to trash folder
- */
- private static final String FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER =
- "CREATE TRIGGER folder_move_notes_on_trash " +
- " AFTER UPDATE ON " + TABLE.NOTE +
- " WHEN new." + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
- " BEGIN" +
- " UPDATE " + TABLE.NOTE +
- " SET " + NoteColumns.PARENT_ID + "=" + Notes.ID_TRASH_FOLER +
- " WHERE " + NoteColumns.PARENT_ID + "=old." + NoteColumns.ID + ";" +
- " END";
-
- public NotesDatabaseHelper(Context context) {
- super(context, DB_NAME, null, DB_VERSION);
- }
-
- public void createNoteTable(SQLiteDatabase db) {
- db.execSQL(CREATE_NOTE_TABLE_SQL);
- reCreateNoteTableTriggers(db);
- createSystemFolder(db);
- Log.d(TAG, "note table has been created");
- }
-
- private void reCreateNoteTableTriggers(SQLiteDatabase db) {
- db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_update");
- db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_update");
- db.execSQL("DROP TRIGGER IF EXISTS decrease_folder_count_on_delete");
- db.execSQL("DROP TRIGGER IF EXISTS delete_data_on_delete");
- db.execSQL("DROP TRIGGER IF EXISTS increase_folder_count_on_insert");
- db.execSQL("DROP TRIGGER IF EXISTS folder_delete_notes_on_delete");
- db.execSQL("DROP TRIGGER IF EXISTS folder_move_notes_on_trash");
-
- db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
- db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER);
- db.execSQL(NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER);
- db.execSQL(NOTE_DELETE_DATA_ON_DELETE_TRIGGER);
- db.execSQL(NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER);
- db.execSQL(FOLDER_DELETE_NOTES_ON_DELETE_TRIGGER);
- db.execSQL(FOLDER_MOVE_NOTES_ON_TRASH_TRIGGER);
- }
-
- private void createSystemFolder(SQLiteDatabase db) {
- ContentValues values = new ContentValues();
-
- /**
- * call record foler for call notes
- */
- values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER);
- values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- db.insert(TABLE.NOTE, null, values);
-
- /**
- * root folder which is default folder
- */
- values.clear();
- values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER);
- values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- db.insert(TABLE.NOTE, null, values);
-
- /**
- * temporary folder which is used for moving note
- */
- values.clear();
- values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER);
- values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- db.insert(TABLE.NOTE, null, values);
-
- /**
- * create trash folder
- */
- values.clear();
- values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
- values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- db.insert(TABLE.NOTE, null, values);
- }
-
- public void createDataTable(SQLiteDatabase db) {
- db.execSQL(CREATE_DATA_TABLE_SQL);
- reCreateDataTableTriggers(db);
- db.execSQL(CREATE_DATA_NOTE_ID_INDEX_SQL);
- Log.d(TAG, "data table has been created");
- }
-
- private void reCreateDataTableTriggers(SQLiteDatabase db) {
- db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_insert");
- db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_update");
- db.execSQL("DROP TRIGGER IF EXISTS update_note_content_on_delete");
-
- db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER);
- db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER);
- db.execSQL(DATA_UPDATE_NOTE_CONTENT_ON_DELETE_TRIGGER);
- }
-
- static synchronized NotesDatabaseHelper getInstance(Context context) {
- if (mInstance == null) {
- mInstance = new NotesDatabaseHelper(context);
- }
- return mInstance;
- }
-
- @Override
- public void onCreate(SQLiteDatabase db) {
- createNoteTable(db);
- createDataTable(db);
- }
-
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- boolean reCreateTriggers = false;
- boolean skipV2 = false;
-
- if (oldVersion == 1) {
- upgradeToV2(db);
- skipV2 = true; // this upgrade including the upgrade from v2 to v3
- oldVersion++;
- }
-
- if (oldVersion == 2 && !skipV2) {
- upgradeToV3(db);
- reCreateTriggers = true;
- oldVersion++;
- }
-
- if (oldVersion == 3) {
- upgradeToV4(db);
- oldVersion++;
- }
-
- if (reCreateTriggers) {
- reCreateNoteTableTriggers(db);
- reCreateDataTableTriggers(db);
- }
-
- if (oldVersion != newVersion) {
- throw new IllegalStateException("Upgrade notes database to version " + newVersion
- + "fails");
- }
- }
-
- private void upgradeToV2(SQLiteDatabase db) {
- db.execSQL("DROP TABLE IF EXISTS " + TABLE.NOTE);
- db.execSQL("DROP TABLE IF EXISTS " + TABLE.DATA);
- createNoteTable(db);
- createDataTable(db);
- }
-
- private void upgradeToV3(SQLiteDatabase db) {
- // drop unused triggers
- db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_insert");
- db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_delete");
- db.execSQL("DROP TRIGGER IF EXISTS update_note_modified_date_on_update");
- // add a column for gtask id
- db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID
- + " TEXT NOT NULL DEFAULT ''");
- // add a trash system folder
- ContentValues values = new ContentValues();
- values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER);
- values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- db.insert(TABLE.NOTE, null, values);
- }
-
- private void upgradeToV4(SQLiteDatabase db) {
- db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
- + " INTEGER NOT NULL DEFAULT 0");
- }
-}
diff --git a/Notes-master/src/net/micode/notes/data/NotesProvider.java b/Notes-master/src/net/micode/notes/data/NotesProvider.java
deleted file mode 100644
index edb0a60..0000000
--- a/Notes-master/src/net/micode/notes/data/NotesProvider.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.data;
-
-
-import android.app.SearchManager;
-import android.content.ContentProvider;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Intent;
-import android.content.UriMatcher;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.data.NotesDatabaseHelper.TABLE;
-
-
-public class NotesProvider extends ContentProvider {
- private static final UriMatcher mMatcher;
-
- private NotesDatabaseHelper mHelper;
-
- private static final String TAG = "NotesProvider";
-
- private static final int URI_NOTE = 1;
- private static final int URI_NOTE_ITEM = 2;
- private static final int URI_DATA = 3;
- private static final int URI_DATA_ITEM = 4;
-
- private static final int URI_SEARCH = 5;
- private static final int URI_SEARCH_SUGGEST = 6;
-
- static {
- mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE);
- mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM);
- mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA);
- mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM);
- mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH);
- mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST);
- mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST);
- }
-
- /**
- * x'0A' represents the '\n' character in sqlite. For title and content in the search result,
- * we will trim '\n' and white space in order to show more information.
- */
- private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
- + NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
- + "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
- + R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
- + "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
- + "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
-
- private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
- + " FROM " + TABLE.NOTE
- + " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
- + " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
- + " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
-
- @Override
- public boolean onCreate() {
- mHelper = NotesDatabaseHelper.getInstance(getContext());
- return true;
- }
-
- @Override
- public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
- String sortOrder) {
- Cursor c = null;
- SQLiteDatabase db = mHelper.getReadableDatabase();
- String id = null;
- switch (mMatcher.match(uri)) {
- case URI_NOTE:
- c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null,
- sortOrder);
- break;
- case URI_NOTE_ITEM:
- id = uri.getPathSegments().get(1);
- c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id
- + parseSelection(selection), selectionArgs, null, null, sortOrder);
- break;
- case URI_DATA:
- c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null,
- sortOrder);
- break;
- case URI_DATA_ITEM:
- id = uri.getPathSegments().get(1);
- c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id
- + parseSelection(selection), selectionArgs, null, null, sortOrder);
- break;
- case URI_SEARCH:
- case URI_SEARCH_SUGGEST:
- if (sortOrder != null || projection != null) {
- throw new IllegalArgumentException(
- "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query");
- }
-
- String searchString = null;
- if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) {
- if (uri.getPathSegments().size() > 1) {
- searchString = uri.getPathSegments().get(1);
- }
- } else {
- searchString = uri.getQueryParameter("pattern");
- }
-
- if (TextUtils.isEmpty(searchString)) {
- return null;
- }
-
- try {
- searchString = String.format("%%%s%%", searchString);
- c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,
- new String[] { searchString });
- } catch (IllegalStateException ex) {
- Log.e(TAG, "got exception: " + ex.toString());
- }
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- if (c != null) {
- c.setNotificationUri(getContext().getContentResolver(), uri);
- }
- return c;
- }
-
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- SQLiteDatabase db = mHelper.getWritableDatabase();
- long dataId = 0, noteId = 0, insertedId = 0;
- switch (mMatcher.match(uri)) {
- case URI_NOTE:
- insertedId = noteId = db.insert(TABLE.NOTE, null, values);
- break;
- case URI_DATA:
- if (values.containsKey(DataColumns.NOTE_ID)) {
- noteId = values.getAsLong(DataColumns.NOTE_ID);
- } else {
- Log.d(TAG, "Wrong data format without note id:" + values.toString());
- }
- insertedId = dataId = db.insert(TABLE.DATA, null, values);
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- // Notify the note uri
- if (noteId > 0) {
- getContext().getContentResolver().notifyChange(
- ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);
- }
-
- // Notify the data uri
- if (dataId > 0) {
- getContext().getContentResolver().notifyChange(
- ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
- }
-
- return ContentUris.withAppendedId(uri, insertedId);
- }
-
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {
- int count = 0;
- String id = null;
- SQLiteDatabase db = mHelper.getWritableDatabase();
- boolean deleteData = false;
- switch (mMatcher.match(uri)) {
- case URI_NOTE:
- selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 ";
- count = db.delete(TABLE.NOTE, selection, selectionArgs);
- break;
- case URI_NOTE_ITEM:
- id = uri.getPathSegments().get(1);
- /**
- * ID that smaller than 0 is system folder which is not allowed to
- * trash
- */
- long noteId = Long.valueOf(id);
- if (noteId <= 0) {
- break;
- }
- count = db.delete(TABLE.NOTE,
- NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs);
- break;
- case URI_DATA:
- count = db.delete(TABLE.DATA, selection, selectionArgs);
- deleteData = true;
- break;
- case URI_DATA_ITEM:
- id = uri.getPathSegments().get(1);
- count = db.delete(TABLE.DATA,
- DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs);
- deleteData = true;
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
- if (count > 0) {
- if (deleteData) {
- getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);
- }
- getContext().getContentResolver().notifyChange(uri, null);
- }
- return count;
- }
-
- @Override
- public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- int count = 0;
- String id = null;
- SQLiteDatabase db = mHelper.getWritableDatabase();
- boolean updateData = false;
- switch (mMatcher.match(uri)) {
- case URI_NOTE:
- increaseNoteVersion(-1, selection, selectionArgs);
- count = db.update(TABLE.NOTE, values, selection, selectionArgs);
- break;
- case URI_NOTE_ITEM:
- id = uri.getPathSegments().get(1);
- increaseNoteVersion(Long.valueOf(id), selection, selectionArgs);
- count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id
- + parseSelection(selection), selectionArgs);
- break;
- case URI_DATA:
- count = db.update(TABLE.DATA, values, selection, selectionArgs);
- updateData = true;
- break;
- case URI_DATA_ITEM:
- id = uri.getPathSegments().get(1);
- count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id
- + parseSelection(selection), selectionArgs);
- updateData = true;
- break;
- default:
- throw new IllegalArgumentException("Unknown URI " + uri);
- }
-
- if (count > 0) {
- if (updateData) {
- getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);
- }
- getContext().getContentResolver().notifyChange(uri, null);
- }
- return count;
- }
-
- private String parseSelection(String selection) {
- return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
- }
-
- private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
- StringBuilder sql = new StringBuilder(120);
- sql.append("UPDATE ");
- sql.append(TABLE.NOTE);
- sql.append(" SET ");
- sql.append(NoteColumns.VERSION);
- sql.append("=" + NoteColumns.VERSION + "+1 ");
-
- if (id > 0 || !TextUtils.isEmpty(selection)) {
- sql.append(" WHERE ");
- }
- if (id > 0) {
- sql.append(NoteColumns.ID + "=" + String.valueOf(id));
- }
- if (!TextUtils.isEmpty(selection)) {
- String selectString = id > 0 ? parseSelection(selection) : selection;
- for (String args : selectionArgs) {
- selectString = selectString.replaceFirst("\\?", args);
- }
- sql.append(selectString);
- }
-
- mHelper.getWritableDatabase().execSQL(sql.toString());
- }
-
- @Override
- public String getType(Uri uri) {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/MetaData.java b/Notes-master/src/net/micode/notes/gtask/data/MetaData.java
deleted file mode 100644
index 3a2050b..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/MetaData.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.database.Cursor;
-import android.util.Log;
-
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-
-public class MetaData extends Task {
- private final static String TAG = MetaData.class.getSimpleName();
-
- private String mRelatedGid = null;
-
- public void setMeta(String gid, JSONObject metaInfo) {
- try {
- metaInfo.put(GTaskStringUtils.META_HEAD_GTASK_ID, gid);
- } catch (JSONException e) {
- Log.e(TAG, "failed to put related gid");
- }
- setNotes(metaInfo.toString());
- setName(GTaskStringUtils.META_NOTE_NAME);
- }
-
- public String getRelatedGid() {
- return mRelatedGid;
- }
-
- @Override
- public boolean isWorthSaving() {
- return getNotes() != null;
- }
-
- @Override
- public void setContentByRemoteJSON(JSONObject js) {
- super.setContentByRemoteJSON(js);
- if (getNotes() != null) {
- try {
- JSONObject metaInfo = new JSONObject(getNotes().trim());
- mRelatedGid = metaInfo.getString(GTaskStringUtils.META_HEAD_GTASK_ID);
- } catch (JSONException e) {
- Log.w(TAG, "failed to get related gid");
- mRelatedGid = null;
- }
- }
- }
-
- @Override
- public void setContentByLocalJSON(JSONObject js) {
- // this function should not be called
- throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
- }
-
- @Override
- public JSONObject getLocalJSONFromContent() {
- throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
- }
-
- @Override
- public int getSyncAction(Cursor c) {
- throw new IllegalAccessError("MetaData:getSyncAction should not be called");
- }
-
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/Node.java b/Notes-master/src/net/micode/notes/gtask/data/Node.java
deleted file mode 100644
index 63950e0..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/Node.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.database.Cursor;
-
-import org.json.JSONObject;
-
-public abstract class Node {
- public static final int SYNC_ACTION_NONE = 0;
-
- public static final int SYNC_ACTION_ADD_REMOTE = 1;
-
- public static final int SYNC_ACTION_ADD_LOCAL = 2;
-
- public static final int SYNC_ACTION_DEL_REMOTE = 3;
-
- public static final int SYNC_ACTION_DEL_LOCAL = 4;
-
- public static final int SYNC_ACTION_UPDATE_REMOTE = 5;
-
- public static final int SYNC_ACTION_UPDATE_LOCAL = 6;
-
- public static final int SYNC_ACTION_UPDATE_CONFLICT = 7;
-
- public static final int SYNC_ACTION_ERROR = 8;
-
- private String mGid;
-
- private String mName;
-
- private long mLastModified;
-
- private boolean mDeleted;
-
- public Node() {
- mGid = null;
- mName = "";
- mLastModified = 0;
- mDeleted = false;
- }
-
- public abstract JSONObject getCreateAction(int actionId);
-
- public abstract JSONObject getUpdateAction(int actionId);
-
- public abstract void setContentByRemoteJSON(JSONObject js);
-
- public abstract void setContentByLocalJSON(JSONObject js);
-
- public abstract JSONObject getLocalJSONFromContent();
-
- public abstract int getSyncAction(Cursor c);
-
- public void setGid(String gid) {
- this.mGid = gid;
- }
-
- public void setName(String name) {
- this.mName = name;
- }
-
- public void setLastModified(long lastModified) {
- this.mLastModified = lastModified;
- }
-
- public void setDeleted(boolean deleted) {
- this.mDeleted = deleted;
- }
-
- public String getGid() {
- return this.mGid;
- }
-
- public String getName() {
- return this.mName;
- }
-
- public long getLastModified() {
- return this.mLastModified;
- }
-
- public boolean getDeleted() {
- return this.mDeleted;
- }
-
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/SqlData.java b/Notes-master/src/net/micode/notes/gtask/data/SqlData.java
deleted file mode 100644
index d3ec3be..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/SqlData.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.data.NotesDatabaseHelper.TABLE;
-import net.micode.notes.gtask.exception.ActionFailureException;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-
-public class SqlData {
- private static final String TAG = SqlData.class.getSimpleName();
-
- private static final int INVALID_ID = -99999;
-
- public static final String[] PROJECTION_DATA = new String[] {
- DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
- DataColumns.DATA3
- };
-
- public static final int DATA_ID_COLUMN = 0;
-
- public static final int DATA_MIME_TYPE_COLUMN = 1;
-
- public static final int DATA_CONTENT_COLUMN = 2;
-
- public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
-
- public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
-
- private ContentResolver mContentResolver;
-
- private boolean mIsCreate;
-
- private long mDataId;
-
- private String mDataMimeType;
-
- private String mDataContent;
-
- private long mDataContentData1;
-
- private String mDataContentData3;
-
- private ContentValues mDiffDataValues;
-
- public SqlData(Context context) {
- mContentResolver = context.getContentResolver();
- mIsCreate = true;
- mDataId = INVALID_ID;
- mDataMimeType = DataConstants.NOTE;
- mDataContent = "";
- mDataContentData1 = 0;
- mDataContentData3 = "";
- mDiffDataValues = new ContentValues();
- }
-
- public SqlData(Context context, Cursor c) {
- mContentResolver = context.getContentResolver();
- mIsCreate = false;
- loadFromCursor(c);
- mDiffDataValues = new ContentValues();
- }
-
- private void loadFromCursor(Cursor c) {
- mDataId = c.getLong(DATA_ID_COLUMN);
- mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
- mDataContent = c.getString(DATA_CONTENT_COLUMN);
- mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
- mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
- }
-
- public void setContent(JSONObject js) throws JSONException {
- long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
- if (mIsCreate || mDataId != dataId) {
- mDiffDataValues.put(DataColumns.ID, dataId);
- }
- mDataId = dataId;
-
- String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
- : DataConstants.NOTE;
- if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
- mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
- }
- mDataMimeType = dataMimeType;
-
- String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
- if (mIsCreate || !mDataContent.equals(dataContent)) {
- mDiffDataValues.put(DataColumns.CONTENT, dataContent);
- }
- mDataContent = dataContent;
-
- long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
- if (mIsCreate || mDataContentData1 != dataContentData1) {
- mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
- }
- mDataContentData1 = dataContentData1;
-
- String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
- if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
- mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
- }
- mDataContentData3 = dataContentData3;
- }
-
- public JSONObject getContent() throws JSONException {
- if (mIsCreate) {
- Log.e(TAG, "it seems that we haven't created this in database yet");
- return null;
- }
- JSONObject js = new JSONObject();
- js.put(DataColumns.ID, mDataId);
- js.put(DataColumns.MIME_TYPE, mDataMimeType);
- js.put(DataColumns.CONTENT, mDataContent);
- js.put(DataColumns.DATA1, mDataContentData1);
- js.put(DataColumns.DATA3, mDataContentData3);
- return js;
- }
-
- public void commit(long noteId, boolean validateVersion, long version) {
-
- if (mIsCreate) {
- if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
- mDiffDataValues.remove(DataColumns.ID);
- }
-
- mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
- Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
- try {
- mDataId = Long.valueOf(uri.getPathSegments().get(1));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Get note id error :" + e.toString());
- throw new ActionFailureException("create note failed");
- }
- } else {
- if (mDiffDataValues.size() > 0) {
- int result = 0;
- if (!validateVersion) {
- result = mContentResolver.update(ContentUris.withAppendedId(
- Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
- } else {
- result = mContentResolver.update(ContentUris.withAppendedId(
- Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
- " ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE
- + " WHERE " + NoteColumns.VERSION + "=?)", new String[] {
- String.valueOf(noteId), String.valueOf(version)
- });
- }
- if (result == 0) {
- Log.w(TAG, "there is no update. maybe user updates note when syncing");
- }
- }
- }
-
- mDiffDataValues.clear();
- mIsCreate = false;
- }
-
- public long getId() {
- return mDataId;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java b/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java
deleted file mode 100644
index 79a4095..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/SqlNote.java
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.appwidget.AppWidgetManager;
-import android.content.ContentResolver;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-import net.micode.notes.tool.ResourceParser;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-
-
-public class SqlNote {
- private static final String TAG = SqlNote.class.getSimpleName();
-
- private static final int INVALID_ID = -99999;
-
- public static final String[] PROJECTION_NOTE = new String[] {
- NoteColumns.ID, NoteColumns.ALERTED_DATE, NoteColumns.BG_COLOR_ID,
- NoteColumns.CREATED_DATE, NoteColumns.HAS_ATTACHMENT, NoteColumns.MODIFIED_DATE,
- NoteColumns.NOTES_COUNT, NoteColumns.PARENT_ID, NoteColumns.SNIPPET, NoteColumns.TYPE,
- NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE, NoteColumns.SYNC_ID,
- NoteColumns.LOCAL_MODIFIED, NoteColumns.ORIGIN_PARENT_ID, NoteColumns.GTASK_ID,
- NoteColumns.VERSION
- };
-
- public static final int ID_COLUMN = 0;
-
- public static final int ALERTED_DATE_COLUMN = 1;
-
- public static final int BG_COLOR_ID_COLUMN = 2;
-
- public static final int CREATED_DATE_COLUMN = 3;
-
- public static final int HAS_ATTACHMENT_COLUMN = 4;
-
- public static final int MODIFIED_DATE_COLUMN = 5;
-
- public static final int NOTES_COUNT_COLUMN = 6;
-
- public static final int PARENT_ID_COLUMN = 7;
-
- public static final int SNIPPET_COLUMN = 8;
-
- public static final int TYPE_COLUMN = 9;
-
- public static final int WIDGET_ID_COLUMN = 10;
-
- public static final int WIDGET_TYPE_COLUMN = 11;
-
- public static final int SYNC_ID_COLUMN = 12;
-
- public static final int LOCAL_MODIFIED_COLUMN = 13;
-
- public static final int ORIGIN_PARENT_ID_COLUMN = 14;
-
- public static final int GTASK_ID_COLUMN = 15;
-
- public static final int VERSION_COLUMN = 16;
-
- private Context mContext;
-
- private ContentResolver mContentResolver;
-
- private boolean mIsCreate;
-
- private long mId;
-
- private long mAlertDate;
-
- private int mBgColorId;
-
- private long mCreatedDate;
-
- private int mHasAttachment;
-
- private long mModifiedDate;
-
- private long mParentId;
-
- private String mSnippet;
-
- private int mType;
-
- private int mWidgetId;
-
- private int mWidgetType;
-
- private long mOriginParent;
-
- private long mVersion;
-
- private ContentValues mDiffNoteValues;
-
- private ArrayList mDataList;
-
- public SqlNote(Context context) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = true;
- mId = INVALID_ID;
- mAlertDate = 0;
- mBgColorId = ResourceParser.getDefaultBgId(context);
- mCreatedDate = System.currentTimeMillis();
- mHasAttachment = 0;
- mModifiedDate = System.currentTimeMillis();
- mParentId = 0;
- mSnippet = "";
- mType = Notes.TYPE_NOTE;
- mWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
- mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
- mOriginParent = 0;
- mVersion = 0;
- mDiffNoteValues = new ContentValues();
- mDataList = new ArrayList();
- }
-
- public SqlNote(Context context, Cursor c) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = false;
- loadFromCursor(c);
- mDataList = new ArrayList();
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
- mDiffNoteValues = new ContentValues();
- }
-
- public SqlNote(Context context, long id) {
- mContext = context;
- mContentResolver = context.getContentResolver();
- mIsCreate = false;
- loadFromCursor(id);
- mDataList = new ArrayList();
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
- mDiffNoteValues = new ContentValues();
-
- }
-
- private void loadFromCursor(long id) {
- Cursor c = null;
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, PROJECTION_NOTE, "(_id=?)",
- new String[] {
- String.valueOf(id)
- }, null);
- if (c != null) {
- c.moveToNext();
- loadFromCursor(c);
- } else {
- Log.w(TAG, "loadFromCursor: cursor = null");
- }
- } finally {
- if (c != null)
- c.close();
- }
- }
-
- private void loadFromCursor(Cursor c) {
- mId = c.getLong(ID_COLUMN);
- mAlertDate = c.getLong(ALERTED_DATE_COLUMN);
- mBgColorId = c.getInt(BG_COLOR_ID_COLUMN);
- mCreatedDate = c.getLong(CREATED_DATE_COLUMN);
- mHasAttachment = c.getInt(HAS_ATTACHMENT_COLUMN);
- mModifiedDate = c.getLong(MODIFIED_DATE_COLUMN);
- mParentId = c.getLong(PARENT_ID_COLUMN);
- mSnippet = c.getString(SNIPPET_COLUMN);
- mType = c.getInt(TYPE_COLUMN);
- mWidgetId = c.getInt(WIDGET_ID_COLUMN);
- mWidgetType = c.getInt(WIDGET_TYPE_COLUMN);
- mVersion = c.getLong(VERSION_COLUMN);
- }
-
- private void loadDataContent() {
- Cursor c = null;
- mDataList.clear();
- try {
- c = mContentResolver.query(Notes.CONTENT_DATA_URI, SqlData.PROJECTION_DATA,
- "(note_id=?)", new String[] {
- String.valueOf(mId)
- }, null);
- if (c != null) {
- if (c.getCount() == 0) {
- Log.w(TAG, "it seems that the note has not data");
- return;
- }
- while (c.moveToNext()) {
- SqlData data = new SqlData(mContext, c);
- mDataList.add(data);
- }
- } else {
- Log.w(TAG, "loadDataContent: cursor = null");
- }
- } finally {
- if (c != null)
- c.close();
- }
- }
-
- public boolean setContent(JSONObject js) {
- try {
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
- Log.w(TAG, "cannot set system folder");
- } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {
- // for folder we can only update the snnipet and type
- String snippet = note.has(NoteColumns.SNIPPET) ? note
- .getString(NoteColumns.SNIPPET) : "";
- if (mIsCreate || !mSnippet.equals(snippet)) {
- mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
- }
- mSnippet = snippet;
-
- int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
- : Notes.TYPE_NOTE;
- if (mIsCreate || mType != type) {
- mDiffNoteValues.put(NoteColumns.TYPE, type);
- }
- mType = type;
- } else if (note.getInt(NoteColumns.TYPE) == Notes.TYPE_NOTE) {
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
- long id = note.has(NoteColumns.ID) ? note.getLong(NoteColumns.ID) : INVALID_ID;
- if (mIsCreate || mId != id) {
- mDiffNoteValues.put(NoteColumns.ID, id);
- }
- mId = id;
-
- long alertDate = note.has(NoteColumns.ALERTED_DATE) ? note
- .getLong(NoteColumns.ALERTED_DATE) : 0;
- if (mIsCreate || mAlertDate != alertDate) {
- mDiffNoteValues.put(NoteColumns.ALERTED_DATE, alertDate);
- }
- mAlertDate = alertDate;
-
- int bgColorId = note.has(NoteColumns.BG_COLOR_ID) ? note
- .getInt(NoteColumns.BG_COLOR_ID) : ResourceParser.getDefaultBgId(mContext);
- if (mIsCreate || mBgColorId != bgColorId) {
- mDiffNoteValues.put(NoteColumns.BG_COLOR_ID, bgColorId);
- }
- mBgColorId = bgColorId;
-
- long createDate = note.has(NoteColumns.CREATED_DATE) ? note
- .getLong(NoteColumns.CREATED_DATE) : System.currentTimeMillis();
- if (mIsCreate || mCreatedDate != createDate) {
- mDiffNoteValues.put(NoteColumns.CREATED_DATE, createDate);
- }
- mCreatedDate = createDate;
-
- int hasAttachment = note.has(NoteColumns.HAS_ATTACHMENT) ? note
- .getInt(NoteColumns.HAS_ATTACHMENT) : 0;
- if (mIsCreate || mHasAttachment != hasAttachment) {
- mDiffNoteValues.put(NoteColumns.HAS_ATTACHMENT, hasAttachment);
- }
- mHasAttachment = hasAttachment;
-
- long modifiedDate = note.has(NoteColumns.MODIFIED_DATE) ? note
- .getLong(NoteColumns.MODIFIED_DATE) : System.currentTimeMillis();
- if (mIsCreate || mModifiedDate != modifiedDate) {
- mDiffNoteValues.put(NoteColumns.MODIFIED_DATE, modifiedDate);
- }
- mModifiedDate = modifiedDate;
-
- long parentId = note.has(NoteColumns.PARENT_ID) ? note
- .getLong(NoteColumns.PARENT_ID) : 0;
- if (mIsCreate || mParentId != parentId) {
- mDiffNoteValues.put(NoteColumns.PARENT_ID, parentId);
- }
- mParentId = parentId;
-
- String snippet = note.has(NoteColumns.SNIPPET) ? note
- .getString(NoteColumns.SNIPPET) : "";
- if (mIsCreate || !mSnippet.equals(snippet)) {
- mDiffNoteValues.put(NoteColumns.SNIPPET, snippet);
- }
- mSnippet = snippet;
-
- int type = note.has(NoteColumns.TYPE) ? note.getInt(NoteColumns.TYPE)
- : Notes.TYPE_NOTE;
- if (mIsCreate || mType != type) {
- mDiffNoteValues.put(NoteColumns.TYPE, type);
- }
- mType = type;
-
- int widgetId = note.has(NoteColumns.WIDGET_ID) ? note.getInt(NoteColumns.WIDGET_ID)
- : AppWidgetManager.INVALID_APPWIDGET_ID;
- if (mIsCreate || mWidgetId != widgetId) {
- mDiffNoteValues.put(NoteColumns.WIDGET_ID, widgetId);
- }
- mWidgetId = widgetId;
-
- int widgetType = note.has(NoteColumns.WIDGET_TYPE) ? note
- .getInt(NoteColumns.WIDGET_TYPE) : Notes.TYPE_WIDGET_INVALIDE;
- if (mIsCreate || mWidgetType != widgetType) {
- mDiffNoteValues.put(NoteColumns.WIDGET_TYPE, widgetType);
- }
- mWidgetType = widgetType;
-
- long originParent = note.has(NoteColumns.ORIGIN_PARENT_ID) ? note
- .getLong(NoteColumns.ORIGIN_PARENT_ID) : 0;
- if (mIsCreate || mOriginParent != originParent) {
- mDiffNoteValues.put(NoteColumns.ORIGIN_PARENT_ID, originParent);
- }
- mOriginParent = originParent;
-
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- SqlData sqlData = null;
- if (data.has(DataColumns.ID)) {
- long dataId = data.getLong(DataColumns.ID);
- for (SqlData temp : mDataList) {
- if (dataId == temp.getId()) {
- sqlData = temp;
- }
- }
- }
-
- if (sqlData == null) {
- sqlData = new SqlData(mContext);
- mDataList.add(sqlData);
- }
-
- sqlData.setContent(data);
- }
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return false;
- }
- return true;
- }
-
- public JSONObject getContent() {
- try {
- JSONObject js = new JSONObject();
-
- if (mIsCreate) {
- Log.e(TAG, "it seems that we haven't created this in database yet");
- return null;
- }
-
- JSONObject note = new JSONObject();
- if (mType == Notes.TYPE_NOTE) {
- note.put(NoteColumns.ID, mId);
- note.put(NoteColumns.ALERTED_DATE, mAlertDate);
- note.put(NoteColumns.BG_COLOR_ID, mBgColorId);
- note.put(NoteColumns.CREATED_DATE, mCreatedDate);
- note.put(NoteColumns.HAS_ATTACHMENT, mHasAttachment);
- note.put(NoteColumns.MODIFIED_DATE, mModifiedDate);
- note.put(NoteColumns.PARENT_ID, mParentId);
- note.put(NoteColumns.SNIPPET, mSnippet);
- note.put(NoteColumns.TYPE, mType);
- note.put(NoteColumns.WIDGET_ID, mWidgetId);
- note.put(NoteColumns.WIDGET_TYPE, mWidgetType);
- note.put(NoteColumns.ORIGIN_PARENT_ID, mOriginParent);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
-
- JSONArray dataArray = new JSONArray();
- for (SqlData sqlData : mDataList) {
- JSONObject data = sqlData.getContent();
- if (data != null) {
- dataArray.put(data);
- }
- }
- js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
- } else if (mType == Notes.TYPE_FOLDER || mType == Notes.TYPE_SYSTEM) {
- note.put(NoteColumns.ID, mId);
- note.put(NoteColumns.TYPE, mType);
- note.put(NoteColumns.SNIPPET, mSnippet);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
- }
-
- return js;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- return null;
- }
-
- public void setParentId(long id) {
- mParentId = id;
- mDiffNoteValues.put(NoteColumns.PARENT_ID, id);
- }
-
- public void setGtaskId(String gid) {
- mDiffNoteValues.put(NoteColumns.GTASK_ID, gid);
- }
-
- public void setSyncId(long syncId) {
- mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId);
- }
-
- public void resetLocalModified() {
- mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0);
- }
-
- public long getId() {
- return mId;
- }
-
- public long getParentId() {
- return mParentId;
- }
-
- public String getSnippet() {
- return mSnippet;
- }
-
- public boolean isNoteType() {
- return mType == Notes.TYPE_NOTE;
- }
-
- public void commit(boolean validateVersion) {
- if (mIsCreate) {
- if (mId == INVALID_ID && mDiffNoteValues.containsKey(NoteColumns.ID)) {
- mDiffNoteValues.remove(NoteColumns.ID);
- }
-
- Uri uri = mContentResolver.insert(Notes.CONTENT_NOTE_URI, mDiffNoteValues);
- try {
- mId = Long.valueOf(uri.getPathSegments().get(1));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Get note id error :" + e.toString());
- throw new ActionFailureException("create note failed");
- }
- if (mId == 0) {
- throw new IllegalStateException("Create thread id failed");
- }
-
- if (mType == Notes.TYPE_NOTE) {
- for (SqlData sqlData : mDataList) {
- sqlData.commit(mId, false, -1);
- }
- }
- } else {
- if (mId <= 0 && mId != Notes.ID_ROOT_FOLDER && mId != Notes.ID_CALL_RECORD_FOLDER) {
- Log.e(TAG, "No such note");
- throw new IllegalStateException("Try to update note with invalid id");
- }
- if (mDiffNoteValues.size() > 0) {
- mVersion ++;
- int result = 0;
- if (!validateVersion) {
- result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
- + NoteColumns.ID + "=?)", new String[] {
- String.valueOf(mId)
- });
- } else {
- result = mContentResolver.update(Notes.CONTENT_NOTE_URI, mDiffNoteValues, "("
- + NoteColumns.ID + "=?) AND (" + NoteColumns.VERSION + "<=?)",
- new String[] {
- String.valueOf(mId), String.valueOf(mVersion)
- });
- }
- if (result == 0) {
- Log.w(TAG, "there is no update. maybe user updates note when syncing");
- }
- }
-
- if (mType == Notes.TYPE_NOTE) {
- for (SqlData sqlData : mDataList) {
- sqlData.commit(mId, validateVersion, mVersion);
- }
- }
- }
-
- // refresh local info
- loadFromCursor(mId);
- if (mType == Notes.TYPE_NOTE)
- loadDataContent();
-
- mDiffNoteValues.clear();
- mIsCreate = false;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/Task.java b/Notes-master/src/net/micode/notes/gtask/data/Task.java
deleted file mode 100644
index 6a19454..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/Task.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.database.Cursor;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-
-public class Task extends Node {
- private static final String TAG = Task.class.getSimpleName();
-
- private boolean mCompleted;
-
- private String mNotes;
-
- private JSONObject mMetaInfo;
-
- private Task mPriorSibling;
-
- private TaskList mParent;
-
- public Task() {
- super();
- mCompleted = false;
- mNotes = null;
- mPriorSibling = null;
- mParent = null;
- mMetaInfo = null;
- }
-
- public JSONObject getCreateAction(int actionId) {
- JSONObject js = new JSONObject();
-
- try {
- // action_type
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
-
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
-
- // index
- js.put(GTaskStringUtils.GTASK_JSON_INDEX, mParent.getChildTaskIndex(this));
-
- // entity_delta
- JSONObject entity = new JSONObject();
- entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
- entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
- entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE,
- GTaskStringUtils.GTASK_JSON_TYPE_TASK);
- if (getNotes() != null) {
- entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
- }
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
- // parent_id
- js.put(GTaskStringUtils.GTASK_JSON_PARENT_ID, mParent.getGid());
-
- // dest_parent_type
- js.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT_TYPE,
- GTaskStringUtils.GTASK_JSON_TYPE_GROUP);
-
- // list_id
- js.put(GTaskStringUtils.GTASK_JSON_LIST_ID, mParent.getGid());
-
- // prior_sibling_id
- if (mPriorSibling != null) {
- js.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, mPriorSibling.getGid());
- }
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate task-create jsonobject");
- }
-
- return js;
- }
-
- public JSONObject getUpdateAction(int actionId) {
- JSONObject js = new JSONObject();
-
- try {
- // action_type
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
-
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
-
- // id
- js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
-
- // entity_delta
- JSONObject entity = new JSONObject();
- entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
- if (getNotes() != null) {
- entity.put(GTaskStringUtils.GTASK_JSON_NOTES, getNotes());
- }
- entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate task-update jsonobject");
- }
-
- return js;
- }
-
- public void setContentByRemoteJSON(JSONObject js) {
- if (js != null) {
- try {
- // id
- if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
- setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
- }
-
- // last_modified
- if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
- setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
- }
-
- // name
- if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
- setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
- }
-
- // notes
- if (js.has(GTaskStringUtils.GTASK_JSON_NOTES)) {
- setNotes(js.getString(GTaskStringUtils.GTASK_JSON_NOTES));
- }
-
- // deleted
- if (js.has(GTaskStringUtils.GTASK_JSON_DELETED)) {
- setDeleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_DELETED));
- }
-
- // completed
- if (js.has(GTaskStringUtils.GTASK_JSON_COMPLETED)) {
- setCompleted(js.getBoolean(GTaskStringUtils.GTASK_JSON_COMPLETED));
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to get task content from jsonobject");
- }
- }
- }
-
- public void setContentByLocalJSON(JSONObject js) {
- if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)
- || !js.has(GTaskStringUtils.META_HEAD_DATA)) {
- Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
- }
-
- try {
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
-
- if (note.getInt(NoteColumns.TYPE) != Notes.TYPE_NOTE) {
- Log.e(TAG, "invalid type");
- return;
- }
-
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {
- setName(data.getString(DataColumns.CONTENT));
- break;
- }
- }
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
-
- public JSONObject getLocalJSONFromContent() {
- String name = getName();
- try {
- if (mMetaInfo == null) {
- // new task created from web
- if (name == null) {
- Log.w(TAG, "the note seems to be an empty one");
- return null;
- }
-
- JSONObject js = new JSONObject();
- JSONObject note = new JSONObject();
- JSONArray dataArray = new JSONArray();
- JSONObject data = new JSONObject();
- data.put(DataColumns.CONTENT, name);
- dataArray.put(data);
- js.put(GTaskStringUtils.META_HEAD_DATA, dataArray);
- note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
- js.put(GTaskStringUtils.META_HEAD_NOTE, note);
- return js;
- } else {
- // synced task
- JSONObject note = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- JSONArray dataArray = mMetaInfo.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
-
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (TextUtils.equals(data.getString(DataColumns.MIME_TYPE), DataConstants.NOTE)) {
- data.put(DataColumns.CONTENT, getName());
- break;
- }
- }
-
- note.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
- return mMetaInfo;
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return null;
- }
- }
-
- public void setMetaInfo(MetaData metaData) {
- if (metaData != null && metaData.getNotes() != null) {
- try {
- mMetaInfo = new JSONObject(metaData.getNotes());
- } catch (JSONException e) {
- Log.w(TAG, e.toString());
- mMetaInfo = null;
- }
- }
- }
-
- public int getSyncAction(Cursor c) {
- try {
- JSONObject noteInfo = null;
- if (mMetaInfo != null && mMetaInfo.has(GTaskStringUtils.META_HEAD_NOTE)) {
- noteInfo = mMetaInfo.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- }
-
- if (noteInfo == null) {
- Log.w(TAG, "it seems that note meta has been deleted");
- return SYNC_ACTION_UPDATE_REMOTE;
- }
-
- if (!noteInfo.has(NoteColumns.ID)) {
- Log.w(TAG, "remote note id seems to be deleted");
- return SYNC_ACTION_UPDATE_LOCAL;
- }
-
- // validate the note id now
- if (c.getLong(SqlNote.ID_COLUMN) != noteInfo.getLong(NoteColumns.ID)) {
- Log.w(TAG, "note id doesn't match");
- return SYNC_ACTION_UPDATE_LOCAL;
- }
-
- if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
- // there is no local update
- if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // no update both side
- return SYNC_ACTION_NONE;
- } else {
- // apply remote to local
- return SYNC_ACTION_UPDATE_LOCAL;
- }
- } else {
- // validate gtask id
- if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {
- Log.e(TAG, "gtask id doesn't match");
- return SYNC_ACTION_ERROR;
- }
- if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // local modification only
- return SYNC_ACTION_UPDATE_REMOTE;
- } else {
- return SYNC_ACTION_UPDATE_CONFLICT;
- }
- }
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
-
- return SYNC_ACTION_ERROR;
- }
-
- public boolean isWorthSaving() {
- return mMetaInfo != null || (getName() != null && getName().trim().length() > 0)
- || (getNotes() != null && getNotes().trim().length() > 0);
- }
-
- public void setCompleted(boolean completed) {
- this.mCompleted = completed;
- }
-
- public void setNotes(String notes) {
- this.mNotes = notes;
- }
-
- public void setPriorSibling(Task priorSibling) {
- this.mPriorSibling = priorSibling;
- }
-
- public void setParent(TaskList parent) {
- this.mParent = parent;
- }
-
- public boolean getCompleted() {
- return this.mCompleted;
- }
-
- public String getNotes() {
- return this.mNotes;
- }
-
- public Task getPriorSibling() {
- return this.mPriorSibling;
- }
-
- public TaskList getParent() {
- return this.mParent;
- }
-
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/data/TaskList.java b/Notes-master/src/net/micode/notes/gtask/data/TaskList.java
deleted file mode 100644
index 4ea21c5..0000000
--- a/Notes-master/src/net/micode/notes/gtask/data/TaskList.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.data;
-
-import android.database.Cursor;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
-
-
-public class TaskList extends Node {
- private static final String TAG = TaskList.class.getSimpleName();
-
- private int mIndex;
-
- private ArrayList mChildren;
-
- public TaskList() {
- super();
- mChildren = new ArrayList();
- mIndex = 1;
- }
-
- public JSONObject getCreateAction(int actionId) {
- JSONObject js = new JSONObject();
-
- try {
- // action_type
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE);
-
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
-
- // index
- js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex);
-
- // entity_delta
- JSONObject entity = new JSONObject();
- entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
- entity.put(GTaskStringUtils.GTASK_JSON_CREATOR_ID, "null");
- entity.put(GTaskStringUtils.GTASK_JSON_ENTITY_TYPE,
- GTaskStringUtils.GTASK_JSON_TYPE_GROUP);
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate tasklist-create jsonobject");
- }
-
- return js;
- }
-
- public JSONObject getUpdateAction(int actionId) {
- JSONObject js = new JSONObject();
-
- try {
- // action_type
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE);
-
- // action_id
- js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId);
-
- // id
- js.put(GTaskStringUtils.GTASK_JSON_ID, getGid());
-
- // entity_delta
- JSONObject entity = new JSONObject();
- entity.put(GTaskStringUtils.GTASK_JSON_NAME, getName());
- entity.put(GTaskStringUtils.GTASK_JSON_DELETED, getDeleted());
- js.put(GTaskStringUtils.GTASK_JSON_ENTITY_DELTA, entity);
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to generate tasklist-update jsonobject");
- }
-
- return js;
- }
-
- public void setContentByRemoteJSON(JSONObject js) {
- if (js != null) {
- try {
- // id
- if (js.has(GTaskStringUtils.GTASK_JSON_ID)) {
- setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID));
- }
-
- // last_modified
- if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) {
- setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED));
- }
-
- // name
- if (js.has(GTaskStringUtils.GTASK_JSON_NAME)) {
- setName(js.getString(GTaskStringUtils.GTASK_JSON_NAME));
- }
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("fail to get tasklist content from jsonobject");
- }
- }
- }
-
- public void setContentByLocalJSON(JSONObject js) {
- if (js == null || !js.has(GTaskStringUtils.META_HEAD_NOTE)) {
- Log.w(TAG, "setContentByLocalJSON: nothing is avaiable");
- }
-
- try {
- JSONObject folder = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
-
- if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_FOLDER) {
- String name = folder.getString(NoteColumns.SNIPPET);
- setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + name);
- } else if (folder.getInt(NoteColumns.TYPE) == Notes.TYPE_SYSTEM) {
- if (folder.getLong(NoteColumns.ID) == Notes.ID_ROOT_FOLDER)
- setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT);
- else if (folder.getLong(NoteColumns.ID) == Notes.ID_CALL_RECORD_FOLDER)
- setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_CALL_NOTE);
- else
- Log.e(TAG, "invalid system folder");
- } else {
- Log.e(TAG, "error type");
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
- }
-
- public JSONObject getLocalJSONFromContent() {
- try {
- JSONObject js = new JSONObject();
- JSONObject folder = new JSONObject();
-
- String folderName = getName();
- if (getName().startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX))
- folderName = folderName.substring(GTaskStringUtils.MIUI_FOLDER_PREFFIX.length(),
- folderName.length());
- folder.put(NoteColumns.SNIPPET, folderName);
- if (folderName.equals(GTaskStringUtils.FOLDER_DEFAULT)
- || folderName.equals(GTaskStringUtils.FOLDER_CALL_NOTE))
- folder.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM);
- else
- folder.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
-
- js.put(GTaskStringUtils.META_HEAD_NOTE, folder);
-
- return js;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return null;
- }
- }
-
- public int getSyncAction(Cursor c) {
- try {
- if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) {
- // there is no local update
- if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // no update both side
- return SYNC_ACTION_NONE;
- } else {
- // apply remote to local
- return SYNC_ACTION_UPDATE_LOCAL;
- }
- } else {
- // validate gtask id
- if (!c.getString(SqlNote.GTASK_ID_COLUMN).equals(getGid())) {
- Log.e(TAG, "gtask id doesn't match");
- return SYNC_ACTION_ERROR;
- }
- if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) {
- // local modification only
- return SYNC_ACTION_UPDATE_REMOTE;
- } else {
- // for folder conflicts, just apply local modification
- return SYNC_ACTION_UPDATE_REMOTE;
- }
- }
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- }
-
- return SYNC_ACTION_ERROR;
- }
-
- public int getChildTaskCount() {
- return mChildren.size();
- }
-
- public boolean addChildTask(Task task) {
- boolean ret = false;
- if (task != null && !mChildren.contains(task)) {
- ret = mChildren.add(task);
- if (ret) {
- // need to set prior sibling and parent
- task.setPriorSibling(mChildren.isEmpty() ? null : mChildren
- .get(mChildren.size() - 1));
- task.setParent(this);
- }
- }
- return ret;
- }
-
- public boolean addChildTask(Task task, int index) {
- if (index < 0 || index > mChildren.size()) {
- Log.e(TAG, "add child task: invalid index");
- return false;
- }
-
- int pos = mChildren.indexOf(task);
- if (task != null && pos == -1) {
- mChildren.add(index, task);
-
- // update the task list
- Task preTask = null;
- Task afterTask = null;
- if (index != 0)
- preTask = mChildren.get(index - 1);
- if (index != mChildren.size() - 1)
- afterTask = mChildren.get(index + 1);
-
- task.setPriorSibling(preTask);
- if (afterTask != null)
- afterTask.setPriorSibling(task);
- }
-
- return true;
- }
-
- public boolean removeChildTask(Task task) {
- boolean ret = false;
- int index = mChildren.indexOf(task);
- if (index != -1) {
- ret = mChildren.remove(task);
-
- if (ret) {
- // reset prior sibling and parent
- task.setPriorSibling(null);
- task.setParent(null);
-
- // update the task list
- if (index != mChildren.size()) {
- mChildren.get(index).setPriorSibling(
- index == 0 ? null : mChildren.get(index - 1));
- }
- }
- }
- return ret;
- }
-
- public boolean moveChildTask(Task task, int index) {
-
- if (index < 0 || index >= mChildren.size()) {
- Log.e(TAG, "move child task: invalid index");
- return false;
- }
-
- int pos = mChildren.indexOf(task);
- if (pos == -1) {
- Log.e(TAG, "move child task: the task should in the list");
- return false;
- }
-
- if (pos == index)
- return true;
- return (removeChildTask(task) && addChildTask(task, index));
- }
-
- public Task findChildTaskByGid(String gid) {
- for (int i = 0; i < mChildren.size(); i++) {
- Task t = mChildren.get(i);
- if (t.getGid().equals(gid)) {
- return t;
- }
- }
- return null;
- }
-
- public int getChildTaskIndex(Task task) {
- return mChildren.indexOf(task);
- }
-
- public Task getChildTaskByIndex(int index) {
- if (index < 0 || index >= mChildren.size()) {
- Log.e(TAG, "getTaskByIndex: invalid index");
- return null;
- }
- return mChildren.get(index);
- }
-
- public Task getChilTaskByGid(String gid) {
- for (Task task : mChildren) {
- if (task.getGid().equals(gid))
- return task;
- }
- return null;
- }
-
- public ArrayList getChildTaskList() {
- return this.mChildren;
- }
-
- public void setIndex(int index) {
- this.mIndex = index;
- }
-
- public int getIndex() {
- return this.mIndex;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java b/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java
deleted file mode 100644
index 15504be..0000000
--- a/Notes-master/src/net/micode/notes/gtask/exception/ActionFailureException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.exception;
-
-public class ActionFailureException extends RuntimeException {
- private static final long serialVersionUID = 4425249765923293627L;
-
- public ActionFailureException() {
- super();
- }
-
- public ActionFailureException(String paramString) {
- super(paramString);
- }
-
- public ActionFailureException(String paramString, Throwable paramThrowable) {
- super(paramString, paramThrowable);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java b/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java
deleted file mode 100644
index b08cfb1..0000000
--- a/Notes-master/src/net/micode/notes/gtask/exception/NetworkFailureException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.exception;
-
-public class NetworkFailureException extends Exception {
- private static final long serialVersionUID = 2107610287180234136L;
-
- public NetworkFailureException() {
- super();
- }
-
- public NetworkFailureException(String paramString) {
- super(paramString);
- }
-
- public NetworkFailureException(String paramString, Throwable paramThrowable) {
- super(paramString, paramThrowable);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java b/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java
deleted file mode 100644
index b3b61e7..0000000
--- a/Notes-master/src/net/micode/notes/gtask/remote/GTaskASyncTask.java
+++ /dev/null
@@ -1,123 +0,0 @@
-
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.AsyncTask;
-
-import net.micode.notes.R;
-import net.micode.notes.ui.NotesListActivity;
-import net.micode.notes.ui.NotesPreferenceActivity;
-
-
-public class GTaskASyncTask extends AsyncTask {
-
- private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
-
- public interface OnCompleteListener {
- void onComplete();
- }
-
- private Context mContext;
-
- private NotificationManager mNotifiManager;
-
- private GTaskManager mTaskManager;
-
- private OnCompleteListener mOnCompleteListener;
-
- public GTaskASyncTask(Context context, OnCompleteListener listener) {
- mContext = context;
- mOnCompleteListener = listener;
- mNotifiManager = (NotificationManager) mContext
- .getSystemService(Context.NOTIFICATION_SERVICE);
- mTaskManager = GTaskManager.getInstance();
- }
-
- public void cancelSync() {
- mTaskManager.cancelSync();
- }
-
- public void publishProgess(String message) {
- publishProgress(new String[] {
- message
- });
- }
-
- private void showNotification(int tickerId, String content) {
- Notification notification = new Notification(R.drawable.notification, mContext
- .getString(tickerId), System.currentTimeMillis());
- notification.defaults = Notification.DEFAULT_LIGHTS;
- notification.flags = Notification.FLAG_AUTO_CANCEL;
- PendingIntent pendingIntent;
- if (tickerId != R.string.ticker_success) {
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesPreferenceActivity.class), 0);
-
- } else {
- pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
- NotesListActivity.class), 0);
- }
- notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
- pendingIntent);
- mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
- }
-
- @Override
- protected Integer doInBackground(Void... unused) {
- publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
- .getSyncAccountName(mContext)));
- return mTaskManager.sync(mContext, this);
- }
-
- @Override
- protected void onProgressUpdate(String... progress) {
- showNotification(R.string.ticker_syncing, progress[0]);
- if (mContext instanceof GTaskSyncService) {
- ((GTaskSyncService) mContext).sendBroadcast(progress[0]);
- }
- }
-
- @Override
- protected void onPostExecute(Integer result) {
- if (result == GTaskManager.STATE_SUCCESS) {
- showNotification(R.string.ticker_success, mContext.getString(
- R.string.success_sync_account, mTaskManager.getSyncAccount()));
- NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis());
- } else if (result == GTaskManager.STATE_NETWORK_ERROR) {
- showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network));
- } else if (result == GTaskManager.STATE_INTERNAL_ERROR) {
- showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal));
- } else if (result == GTaskManager.STATE_SYNC_CANCELLED) {
- showNotification(R.string.ticker_cancel, mContext
- .getString(R.string.error_sync_cancelled));
- }
- if (mOnCompleteListener != null) {
- new Thread(new Runnable() {
-
- public void run() {
- mOnCompleteListener.onComplete();
- }
- }).start();
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java b/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java
deleted file mode 100644
index c67dfdf..0000000
--- a/Notes-master/src/net/micode/notes/gtask/remote/GTaskClient.java
+++ /dev/null
@@ -1,585 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.accounts.AccountManagerFuture;
-import android.app.Activity;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.gtask.data.Node;
-import net.micode.notes.gtask.data.Task;
-import net.micode.notes.gtask.data.TaskList;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.gtask.exception.NetworkFailureException;
-import net.micode.notes.tool.GTaskStringUtils;
-import net.micode.notes.ui.NotesPreferenceActivity;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.cookie.Cookie;
-import org.apache.http.impl.client.BasicCookieStore;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.message.BasicNameValuePair;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.params.HttpProtocolParams;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.Inflater;
-import java.util.zip.InflaterInputStream;
-
-
-public class GTaskClient {
- private static final String TAG = GTaskClient.class.getSimpleName();
-
- private static final String GTASK_URL = "https://mail.google.com/tasks/";
-
- private static final String GTASK_GET_URL = "https://mail.google.com/tasks/ig";
-
- private static final String GTASK_POST_URL = "https://mail.google.com/tasks/r/ig";
-
- private static GTaskClient mInstance = null;
-
- private DefaultHttpClient mHttpClient;
-
- private String mGetUrl;
-
- private String mPostUrl;
-
- private long mClientVersion;
-
- private boolean mLoggedin;
-
- private long mLastLoginTime;
-
- private int mActionId;
-
- private Account mAccount;
-
- private JSONArray mUpdateArray;
-
- private GTaskClient() {
- mHttpClient = null;
- mGetUrl = GTASK_GET_URL;
- mPostUrl = GTASK_POST_URL;
- mClientVersion = -1;
- mLoggedin = false;
- mLastLoginTime = 0;
- mActionId = 1;
- mAccount = null;
- mUpdateArray = null;
- }
-
- public static synchronized GTaskClient getInstance() {
- if (mInstance == null) {
- mInstance = new GTaskClient();
- }
- return mInstance;
- }
-
- public boolean login(Activity activity) {
- // we suppose that the cookie would expire after 5 minutes
- // then we need to re-login
- final long interval = 1000 * 60 * 5;
- if (mLastLoginTime + interval < System.currentTimeMillis()) {
- mLoggedin = false;
- }
-
- // need to re-login after account switch
- if (mLoggedin
- && !TextUtils.equals(getSyncAccount().name, NotesPreferenceActivity
- .getSyncAccountName(activity))) {
- mLoggedin = false;
- }
-
- if (mLoggedin) {
- Log.d(TAG, "already logged in");
- return true;
- }
-
- mLastLoginTime = System.currentTimeMillis();
- String authToken = loginGoogleAccount(activity, false);
- if (authToken == null) {
- Log.e(TAG, "login google account failed");
- return false;
- }
-
- // login with custom domain if necessary
- if (!(mAccount.name.toLowerCase().endsWith("gmail.com") || mAccount.name.toLowerCase()
- .endsWith("googlemail.com"))) {
- StringBuilder url = new StringBuilder(GTASK_URL).append("a/");
- int index = mAccount.name.indexOf('@') + 1;
- String suffix = mAccount.name.substring(index);
- url.append(suffix + "/");
- mGetUrl = url.toString() + "ig";
- mPostUrl = url.toString() + "r/ig";
-
- if (tryToLoginGtask(activity, authToken)) {
- mLoggedin = true;
- }
- }
-
- // try to login with google official url
- if (!mLoggedin) {
- mGetUrl = GTASK_GET_URL;
- mPostUrl = GTASK_POST_URL;
- if (!tryToLoginGtask(activity, authToken)) {
- return false;
- }
- }
-
- mLoggedin = true;
- return true;
- }
-
- private String loginGoogleAccount(Activity activity, boolean invalidateToken) {
- String authToken;
- AccountManager accountManager = AccountManager.get(activity);
- Account[] accounts = accountManager.getAccountsByType("com.google");
-
- if (accounts.length == 0) {
- Log.e(TAG, "there is no available google account");
- return null;
- }
-
- String accountName = NotesPreferenceActivity.getSyncAccountName(activity);
- Account account = null;
- for (Account a : accounts) {
- if (a.name.equals(accountName)) {
- account = a;
- break;
- }
- }
- if (account != null) {
- mAccount = account;
- } else {
- Log.e(TAG, "unable to get an account with the same name in the settings");
- return null;
- }
-
- // get the token now
- AccountManagerFuture accountManagerFuture = accountManager.getAuthToken(account,
- "goanna_mobile", null, activity, null, null);
- try {
- Bundle authTokenBundle = accountManagerFuture.getResult();
- authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
- if (invalidateToken) {
- accountManager.invalidateAuthToken("com.google", authToken);
- loginGoogleAccount(activity, false);
- }
- } catch (Exception e) {
- Log.e(TAG, "get auth token failed");
- authToken = null;
- }
-
- return authToken;
- }
-
- private boolean tryToLoginGtask(Activity activity, String authToken) {
- if (!loginGtask(authToken)) {
- // maybe the auth token is out of date, now let's invalidate the
- // token and try again
- authToken = loginGoogleAccount(activity, true);
- if (authToken == null) {
- Log.e(TAG, "login google account failed");
- return false;
- }
-
- if (!loginGtask(authToken)) {
- Log.e(TAG, "login gtask failed");
- return false;
- }
- }
- return true;
- }
-
- private boolean loginGtask(String authToken) {
- int timeoutConnection = 10000;
- int timeoutSocket = 15000;
- HttpParams httpParameters = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
- HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
- mHttpClient = new DefaultHttpClient(httpParameters);
- BasicCookieStore localBasicCookieStore = new BasicCookieStore();
- mHttpClient.setCookieStore(localBasicCookieStore);
- HttpProtocolParams.setUseExpectContinue(mHttpClient.getParams(), false);
-
- // login gtask
- try {
- String loginUrl = mGetUrl + "?auth=" + authToken;
- HttpGet httpGet = new HttpGet(loginUrl);
- HttpResponse response = null;
- response = mHttpClient.execute(httpGet);
-
- // get the cookie now
- List cookies = mHttpClient.getCookieStore().getCookies();
- boolean hasAuthCookie = false;
- for (Cookie cookie : cookies) {
- if (cookie.getName().contains("GTL")) {
- hasAuthCookie = true;
- }
- }
- if (!hasAuthCookie) {
- Log.w(TAG, "it seems that there is no auth cookie");
- }
-
- // get the client version
- String resString = getResponseContent(response.getEntity());
- String jsBegin = "_setup(";
- String jsEnd = ")}";
- int begin = resString.indexOf(jsBegin);
- int end = resString.lastIndexOf(jsEnd);
- String jsString = null;
- if (begin != -1 && end != -1 && begin < end) {
- jsString = resString.substring(begin + jsBegin.length(), end);
- }
- JSONObject js = new JSONObject(jsString);
- mClientVersion = js.getLong("v");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return false;
- } catch (Exception e) {
- // simply catch all exceptions
- Log.e(TAG, "httpget gtask_url failed");
- return false;
- }
-
- return true;
- }
-
- private int getActionId() {
- return mActionId++;
- }
-
- private HttpPost createHttpPost() {
- HttpPost httpPost = new HttpPost(mPostUrl);
- httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
- httpPost.setHeader("AT", "1");
- return httpPost;
- }
-
- private String getResponseContent(HttpEntity entity) throws IOException {
- String contentEncoding = null;
- if (entity.getContentEncoding() != null) {
- contentEncoding = entity.getContentEncoding().getValue();
- Log.d(TAG, "encoding: " + contentEncoding);
- }
-
- InputStream input = entity.getContent();
- if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) {
- input = new GZIPInputStream(entity.getContent());
- } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) {
- Inflater inflater = new Inflater(true);
- input = new InflaterInputStream(entity.getContent(), inflater);
- }
-
- try {
- InputStreamReader isr = new InputStreamReader(input);
- BufferedReader br = new BufferedReader(isr);
- StringBuilder sb = new StringBuilder();
-
- while (true) {
- String buff = br.readLine();
- if (buff == null) {
- return sb.toString();
- }
- sb = sb.append(buff);
- }
- } finally {
- input.close();
- }
- }
-
- private JSONObject postRequest(JSONObject js) throws NetworkFailureException {
- if (!mLoggedin) {
- Log.e(TAG, "please login first");
- throw new ActionFailureException("not logged in");
- }
-
- HttpPost httpPost = createHttpPost();
- try {
- LinkedList list = new LinkedList();
- list.add(new BasicNameValuePair("r", js.toString()));
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, "UTF-8");
- httpPost.setEntity(entity);
-
- // execute the post
- HttpResponse response = mHttpClient.execute(httpPost);
- String jsString = getResponseContent(response.getEntity());
- return new JSONObject(jsString);
-
- } catch (ClientProtocolException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("postRequest failed");
- } catch (IOException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("postRequest failed");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("unable to convert response content to jsonobject");
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("error occurs when posting request");
- }
- }
-
- public void createTask(Task task) throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- JSONArray actionList = new JSONArray();
-
- // action_list
- actionList.put(task.getCreateAction(getActionId()));
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- // post
- JSONObject jsResponse = postRequest(jsPost);
- JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
- GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
- task.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("create task: handing jsonobject failed");
- }
- }
-
- public void createTaskList(TaskList tasklist) throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- JSONArray actionList = new JSONArray();
-
- // action_list
- actionList.put(tasklist.getCreateAction(getActionId()));
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- // post
- JSONObject jsResponse = postRequest(jsPost);
- JSONObject jsResult = (JSONObject) jsResponse.getJSONArray(
- GTaskStringUtils.GTASK_JSON_RESULTS).get(0);
- tasklist.setGid(jsResult.getString(GTaskStringUtils.GTASK_JSON_NEW_ID));
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("create tasklist: handing jsonobject failed");
- }
- }
-
- public void commitUpdate() throws NetworkFailureException {
- if (mUpdateArray != null) {
- try {
- JSONObject jsPost = new JSONObject();
-
- // action_list
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, mUpdateArray);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- postRequest(jsPost);
- mUpdateArray = null;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("commit update: handing jsonobject failed");
- }
- }
- }
-
- public void addUpdateNode(Node node) throws NetworkFailureException {
- if (node != null) {
- // too many update items may result in an error
- // set max to 10 items
- if (mUpdateArray != null && mUpdateArray.length() > 10) {
- commitUpdate();
- }
-
- if (mUpdateArray == null)
- mUpdateArray = new JSONArray();
- mUpdateArray.put(node.getUpdateAction(getActionId()));
- }
- }
-
- public void moveTask(Task task, TaskList preParent, TaskList curParent)
- throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- JSONArray actionList = new JSONArray();
- JSONObject action = new JSONObject();
-
- // action_list
- action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_MOVE);
- action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
- action.put(GTaskStringUtils.GTASK_JSON_ID, task.getGid());
- if (preParent == curParent && task.getPriorSibling() != null) {
- // put prioring_sibing_id only if moving within the tasklist and
- // it is not the first one
- action.put(GTaskStringUtils.GTASK_JSON_PRIOR_SIBLING_ID, task.getPriorSibling());
- }
- action.put(GTaskStringUtils.GTASK_JSON_SOURCE_LIST, preParent.getGid());
- action.put(GTaskStringUtils.GTASK_JSON_DEST_PARENT, curParent.getGid());
- if (preParent != curParent) {
- // put the dest_list only if moving between tasklists
- action.put(GTaskStringUtils.GTASK_JSON_DEST_LIST, curParent.getGid());
- }
- actionList.put(action);
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- postRequest(jsPost);
-
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("move task: handing jsonobject failed");
- }
- }
-
- public void deleteNode(Node node) throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- JSONArray actionList = new JSONArray();
-
- // action_list
- node.setDeleted(true);
- actionList.put(node.getUpdateAction(getActionId()));
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- postRequest(jsPost);
- mUpdateArray = null;
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("delete node: handing jsonobject failed");
- }
- }
-
- public JSONArray getTaskLists() throws NetworkFailureException {
- if (!mLoggedin) {
- Log.e(TAG, "please login first");
- throw new ActionFailureException("not logged in");
- }
-
- try {
- HttpGet httpGet = new HttpGet(mGetUrl);
- HttpResponse response = null;
- response = mHttpClient.execute(httpGet);
-
- // get the task list
- String resString = getResponseContent(response.getEntity());
- String jsBegin = "_setup(";
- String jsEnd = ")}";
- int begin = resString.indexOf(jsBegin);
- int end = resString.lastIndexOf(jsEnd);
- String jsString = null;
- if (begin != -1 && end != -1 && begin < end) {
- jsString = resString.substring(begin + jsBegin.length(), end);
- }
- JSONObject js = new JSONObject(jsString);
- return js.getJSONObject("t").getJSONArray(GTaskStringUtils.GTASK_JSON_LISTS);
- } catch (ClientProtocolException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("gettasklists: httpget failed");
- } catch (IOException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new NetworkFailureException("gettasklists: httpget failed");
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("get task lists: handing jasonobject failed");
- }
- }
-
- public JSONArray getTaskList(String listGid) throws NetworkFailureException {
- commitUpdate();
- try {
- JSONObject jsPost = new JSONObject();
- JSONArray actionList = new JSONArray();
- JSONObject action = new JSONObject();
-
- // action_list
- action.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE,
- GTaskStringUtils.GTASK_JSON_ACTION_TYPE_GETALL);
- action.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, getActionId());
- action.put(GTaskStringUtils.GTASK_JSON_LIST_ID, listGid);
- action.put(GTaskStringUtils.GTASK_JSON_GET_DELETED, false);
- actionList.put(action);
- jsPost.put(GTaskStringUtils.GTASK_JSON_ACTION_LIST, actionList);
-
- // client_version
- jsPost.put(GTaskStringUtils.GTASK_JSON_CLIENT_VERSION, mClientVersion);
-
- JSONObject jsResponse = postRequest(jsPost);
- return jsResponse.getJSONArray(GTaskStringUtils.GTASK_JSON_TASKS);
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("get task list: handing jsonobject failed");
- }
- }
-
- public Account getSyncAccount() {
- return mAccount;
- }
-
- public void resetUpdateArray() {
- mUpdateArray = null;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java b/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java
deleted file mode 100644
index d2b4082..0000000
--- a/Notes-master/src/net/micode/notes/gtask/remote/GTaskManager.java
+++ /dev/null
@@ -1,800 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.util.Log;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.gtask.data.MetaData;
-import net.micode.notes.gtask.data.Node;
-import net.micode.notes.gtask.data.SqlNote;
-import net.micode.notes.gtask.data.Task;
-import net.micode.notes.gtask.data.TaskList;
-import net.micode.notes.gtask.exception.ActionFailureException;
-import net.micode.notes.gtask.exception.NetworkFailureException;
-import net.micode.notes.tool.DataUtils;
-import net.micode.notes.tool.GTaskStringUtils;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-
-
-public class GTaskManager {
- private static final String TAG = GTaskManager.class.getSimpleName();
-
- public static final int STATE_SUCCESS = 0;
-
- public static final int STATE_NETWORK_ERROR = 1;
-
- public static final int STATE_INTERNAL_ERROR = 2;
-
- public static final int STATE_SYNC_IN_PROGRESS = 3;
-
- public static final int STATE_SYNC_CANCELLED = 4;
-
- private static GTaskManager mInstance = null;
-
- private Activity mActivity;
-
- private Context mContext;
-
- private ContentResolver mContentResolver;
-
- private boolean mSyncing;
-
- private boolean mCancelled;
-
- private HashMap mGTaskListHashMap;
-
- private HashMap mGTaskHashMap;
-
- private HashMap mMetaHashMap;
-
- private TaskList mMetaList;
-
- private HashSet mLocalDeleteIdMap;
-
- private HashMap mGidToNid;
-
- private HashMap mNidToGid;
-
- private GTaskManager() {
- mSyncing = false;
- mCancelled = false;
- mGTaskListHashMap = new HashMap();
- mGTaskHashMap = new HashMap();
- mMetaHashMap = new HashMap();
- mMetaList = null;
- mLocalDeleteIdMap = new HashSet();
- mGidToNid = new HashMap();
- mNidToGid = new HashMap();
- }
-
- public static synchronized GTaskManager getInstance() {
- if (mInstance == null) {
- mInstance = new GTaskManager();
- }
- return mInstance;
- }
-
- public synchronized void setActivityContext(Activity activity) {
- // used for getting authtoken
- mActivity = activity;
- }
-
- public int sync(Context context, GTaskASyncTask asyncTask) {
- if (mSyncing) {
- Log.d(TAG, "Sync is in progress");
- return STATE_SYNC_IN_PROGRESS;
- }
- mContext = context;
- mContentResolver = mContext.getContentResolver();
- mSyncing = true;
- mCancelled = false;
- mGTaskListHashMap.clear();
- mGTaskHashMap.clear();
- mMetaHashMap.clear();
- mLocalDeleteIdMap.clear();
- mGidToNid.clear();
- mNidToGid.clear();
-
- try {
- GTaskClient client = GTaskClient.getInstance();
- client.resetUpdateArray();
-
- // login google task
- if (!mCancelled) {
- if (!client.login(mActivity)) {
- throw new NetworkFailureException("login google task failed");
- }
- }
-
- // get the task list from google
- asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list));
- initGTaskList();
-
- // do content sync work
- asyncTask.publishProgess(mContext.getString(R.string.sync_progress_syncing));
- syncContent();
- } catch (NetworkFailureException e) {
- Log.e(TAG, e.toString());
- return STATE_NETWORK_ERROR;
- } catch (ActionFailureException e) {
- Log.e(TAG, e.toString());
- return STATE_INTERNAL_ERROR;
- } catch (Exception e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- return STATE_INTERNAL_ERROR;
- } finally {
- mGTaskListHashMap.clear();
- mGTaskHashMap.clear();
- mMetaHashMap.clear();
- mLocalDeleteIdMap.clear();
- mGidToNid.clear();
- mNidToGid.clear();
- mSyncing = false;
- }
-
- return mCancelled ? STATE_SYNC_CANCELLED : STATE_SUCCESS;
- }
-
- private void initGTaskList() throws NetworkFailureException {
- if (mCancelled)
- return;
- GTaskClient client = GTaskClient.getInstance();
- try {
- JSONArray jsTaskLists = client.getTaskLists();
-
- // init meta list first
- mMetaList = null;
- for (int i = 0; i < jsTaskLists.length(); i++) {
- JSONObject object = jsTaskLists.getJSONObject(i);
- String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
-
- if (name
- .equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_META)) {
- mMetaList = new TaskList();
- mMetaList.setContentByRemoteJSON(object);
-
- // load meta data
- JSONArray jsMetas = client.getTaskList(gid);
- for (int j = 0; j < jsMetas.length(); j++) {
- object = (JSONObject) jsMetas.getJSONObject(j);
- MetaData metaData = new MetaData();
- metaData.setContentByRemoteJSON(object);
- if (metaData.isWorthSaving()) {
- mMetaList.addChildTask(metaData);
- if (metaData.getGid() != null) {
- mMetaHashMap.put(metaData.getRelatedGid(), metaData);
- }
- }
- }
- }
- }
-
- // create meta list if not existed
- if (mMetaList == null) {
- mMetaList = new TaskList();
- mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_META);
- GTaskClient.getInstance().createTaskList(mMetaList);
- }
-
- // init task list
- for (int i = 0; i < jsTaskLists.length(); i++) {
- JSONObject object = jsTaskLists.getJSONObject(i);
- String gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- String name = object.getString(GTaskStringUtils.GTASK_JSON_NAME);
-
- if (name.startsWith(GTaskStringUtils.MIUI_FOLDER_PREFFIX)
- && !name.equals(GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_META)) {
- TaskList tasklist = new TaskList();
- tasklist.setContentByRemoteJSON(object);
- mGTaskListHashMap.put(gid, tasklist);
- mGTaskHashMap.put(gid, tasklist);
-
- // load tasks
- JSONArray jsTasks = client.getTaskList(gid);
- for (int j = 0; j < jsTasks.length(); j++) {
- object = (JSONObject) jsTasks.getJSONObject(j);
- gid = object.getString(GTaskStringUtils.GTASK_JSON_ID);
- Task task = new Task();
- task.setContentByRemoteJSON(object);
- if (task.isWorthSaving()) {
- task.setMetaInfo(mMetaHashMap.get(gid));
- tasklist.addChildTask(task);
- mGTaskHashMap.put(gid, task);
- }
- }
- }
- }
- } catch (JSONException e) {
- Log.e(TAG, e.toString());
- e.printStackTrace();
- throw new ActionFailureException("initGTaskList: handing JSONObject failed");
- }
- }
-
- private void syncContent() throws NetworkFailureException {
- int syncType;
- Cursor c = null;
- String gid;
- Node node;
-
- mLocalDeleteIdMap.clear();
-
- if (mCancelled) {
- return;
- }
-
- // for local deleted note
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type<>? AND parent_id=?)", new String[] {
- String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)
- }, null);
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- doContentSync(Node.SYNC_ACTION_DEL_REMOTE, node, c);
- }
-
- mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
- }
- } else {
- Log.w(TAG, "failed to query trash folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // sync folder first
- syncFolder();
-
- // for note existing in database
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type=? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_NOTE), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));
- mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);
- syncType = node.getSyncAction(c);
- } else {
- if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
- // local add
- syncType = Node.SYNC_ACTION_ADD_REMOTE;
- } else {
- // remote delete
- syncType = Node.SYNC_ACTION_DEL_LOCAL;
- }
- }
- doContentSync(syncType, node, c);
- }
- } else {
- Log.w(TAG, "failed to query existing note in database");
- }
-
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // go through remaining items
- Iterator> iter = mGTaskHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- node = entry.getValue();
- doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
- }
-
- // mCancelled can be set by another thread, so we neet to check one by
- // one
- // clear local delete table
- if (!mCancelled) {
- if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) {
- throw new ActionFailureException("failed to batch-delete local deleted notes");
- }
- }
-
- // refresh local sync id
- if (!mCancelled) {
- GTaskClient.getInstance().commitUpdate();
- refreshLocalSyncId();
- }
-
- }
-
- private void syncFolder() throws NetworkFailureException {
- Cursor c = null;
- String gid;
- Node node;
- int syncType;
-
- if (mCancelled) {
- return;
- }
-
- // for root folder
- try {
- c = mContentResolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
- Notes.ID_ROOT_FOLDER), SqlNote.PROJECTION_NOTE, null, null, null);
- if (c != null) {
- c.moveToNext();
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, (long) Notes.ID_ROOT_FOLDER);
- mNidToGid.put((long) Notes.ID_ROOT_FOLDER, gid);
- // for system folder, only update remote name if necessary
- if (!node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT))
- doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
- } else {
- doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
- }
- } else {
- Log.w(TAG, "failed to query root folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // for call-note folder
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, "(_id=?)",
- new String[] {
- String.valueOf(Notes.ID_CALL_RECORD_FOLDER)
- }, null);
- if (c != null) {
- if (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, (long) Notes.ID_CALL_RECORD_FOLDER);
- mNidToGid.put((long) Notes.ID_CALL_RECORD_FOLDER, gid);
- // for system folder, only update remote name if
- // necessary
- if (!node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX
- + GTaskStringUtils.FOLDER_CALL_NOTE))
- doContentSync(Node.SYNC_ACTION_UPDATE_REMOTE, node, c);
- } else {
- doContentSync(Node.SYNC_ACTION_ADD_REMOTE, node, c);
- }
- }
- } else {
- Log.w(TAG, "failed to query call note folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // for local existing folders
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type=? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- if (c != null) {
- while (c.moveToNext()) {
- gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- mGidToNid.put(gid, c.getLong(SqlNote.ID_COLUMN));
- mNidToGid.put(c.getLong(SqlNote.ID_COLUMN), gid);
- syncType = node.getSyncAction(c);
- } else {
- if (c.getString(SqlNote.GTASK_ID_COLUMN).trim().length() == 0) {
- // local add
- syncType = Node.SYNC_ACTION_ADD_REMOTE;
- } else {
- // remote delete
- syncType = Node.SYNC_ACTION_DEL_LOCAL;
- }
- }
- doContentSync(syncType, node, c);
- }
- } else {
- Log.w(TAG, "failed to query existing folder");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
-
- // for remote add folders
- Iterator> iter = mGTaskListHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- gid = entry.getKey();
- node = entry.getValue();
- if (mGTaskHashMap.containsKey(gid)) {
- mGTaskHashMap.remove(gid);
- doContentSync(Node.SYNC_ACTION_ADD_LOCAL, node, null);
- }
- }
-
- if (!mCancelled)
- GTaskClient.getInstance().commitUpdate();
- }
-
- private void doContentSync(int syncType, Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- MetaData meta;
- switch (syncType) {
- case Node.SYNC_ACTION_ADD_LOCAL:
- addLocalNode(node);
- break;
- case Node.SYNC_ACTION_ADD_REMOTE:
- addRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_DEL_LOCAL:
- meta = mMetaHashMap.get(c.getString(SqlNote.GTASK_ID_COLUMN));
- if (meta != null) {
- GTaskClient.getInstance().deleteNode(meta);
- }
- mLocalDeleteIdMap.add(c.getLong(SqlNote.ID_COLUMN));
- break;
- case Node.SYNC_ACTION_DEL_REMOTE:
- meta = mMetaHashMap.get(node.getGid());
- if (meta != null) {
- GTaskClient.getInstance().deleteNode(meta);
- }
- GTaskClient.getInstance().deleteNode(node);
- break;
- case Node.SYNC_ACTION_UPDATE_LOCAL:
- updateLocalNode(node, c);
- break;
- case Node.SYNC_ACTION_UPDATE_REMOTE:
- updateRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_UPDATE_CONFLICT:
- // merging both modifications maybe a good idea
- // right now just use local update simply
- updateRemoteNode(node, c);
- break;
- case Node.SYNC_ACTION_NONE:
- break;
- case Node.SYNC_ACTION_ERROR:
- default:
- throw new ActionFailureException("unkown sync action type");
- }
- }
-
- private void addLocalNode(Node node) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote;
- if (node instanceof TaskList) {
- if (node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_DEFAULT)) {
- sqlNote = new SqlNote(mContext, Notes.ID_ROOT_FOLDER);
- } else if (node.getName().equals(
- GTaskStringUtils.MIUI_FOLDER_PREFFIX + GTaskStringUtils.FOLDER_CALL_NOTE)) {
- sqlNote = new SqlNote(mContext, Notes.ID_CALL_RECORD_FOLDER);
- } else {
- sqlNote = new SqlNote(mContext);
- sqlNote.setContent(node.getLocalJSONFromContent());
- sqlNote.setParentId(Notes.ID_ROOT_FOLDER);
- }
- } else {
- sqlNote = new SqlNote(mContext);
- JSONObject js = node.getLocalJSONFromContent();
- try {
- if (js.has(GTaskStringUtils.META_HEAD_NOTE)) {
- JSONObject note = js.getJSONObject(GTaskStringUtils.META_HEAD_NOTE);
- if (note.has(NoteColumns.ID)) {
- long id = note.getLong(NoteColumns.ID);
- if (DataUtils.existInNoteDatabase(mContentResolver, id)) {
- // the id is not available, have to create a new one
- note.remove(NoteColumns.ID);
- }
- }
- }
-
- if (js.has(GTaskStringUtils.META_HEAD_DATA)) {
- JSONArray dataArray = js.getJSONArray(GTaskStringUtils.META_HEAD_DATA);
- for (int i = 0; i < dataArray.length(); i++) {
- JSONObject data = dataArray.getJSONObject(i);
- if (data.has(DataColumns.ID)) {
- long dataId = data.getLong(DataColumns.ID);
- if (DataUtils.existInDataDatabase(mContentResolver, dataId)) {
- // the data id is not available, have to create
- // a new one
- data.remove(DataColumns.ID);
- }
- }
- }
-
- }
- } catch (JSONException e) {
- Log.w(TAG, e.toString());
- e.printStackTrace();
- }
- sqlNote.setContent(js);
-
- Long parentId = mGidToNid.get(((Task) node).getParent().getGid());
- if (parentId == null) {
- Log.e(TAG, "cannot find task's parent id locally");
- throw new ActionFailureException("cannot add local node");
- }
- sqlNote.setParentId(parentId.longValue());
- }
-
- // create the local node
- sqlNote.setGtaskId(node.getGid());
- sqlNote.commit(false);
-
- // update gid-nid mapping
- mGidToNid.put(node.getGid(), sqlNote.getId());
- mNidToGid.put(sqlNote.getId(), node.getGid());
-
- // update meta
- updateRemoteMeta(node.getGid(), sqlNote);
- }
-
- private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote;
- // update the note locally
- sqlNote = new SqlNote(mContext, c);
- sqlNote.setContent(node.getLocalJSONFromContent());
-
- Long parentId = (node instanceof Task) ? mGidToNid.get(((Task) node).getParent().getGid())
- : new Long(Notes.ID_ROOT_FOLDER);
- if (parentId == null) {
- Log.e(TAG, "cannot find task's parent id locally");
- throw new ActionFailureException("cannot update local node");
- }
- sqlNote.setParentId(parentId.longValue());
- sqlNote.commit(true);
-
- // update meta info
- updateRemoteMeta(node.getGid(), sqlNote);
- }
-
- private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote = new SqlNote(mContext, c);
- Node n;
-
- // update remotely
- if (sqlNote.isNoteType()) {
- Task task = new Task();
- task.setContentByLocalJSON(sqlNote.getContent());
-
- String parentGid = mNidToGid.get(sqlNote.getParentId());
- if (parentGid == null) {
- Log.e(TAG, "cannot find task's parent tasklist");
- throw new ActionFailureException("cannot add remote task");
- }
- mGTaskListHashMap.get(parentGid).addChildTask(task);
-
- GTaskClient.getInstance().createTask(task);
- n = (Node) task;
-
- // add meta
- updateRemoteMeta(task.getGid(), sqlNote);
- } else {
- TaskList tasklist = null;
-
- // we need to skip folder if it has already existed
- String folderName = GTaskStringUtils.MIUI_FOLDER_PREFFIX;
- if (sqlNote.getId() == Notes.ID_ROOT_FOLDER)
- folderName += GTaskStringUtils.FOLDER_DEFAULT;
- else if (sqlNote.getId() == Notes.ID_CALL_RECORD_FOLDER)
- folderName += GTaskStringUtils.FOLDER_CALL_NOTE;
- else
- folderName += sqlNote.getSnippet();
-
- Iterator> iter = mGTaskListHashMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry entry = iter.next();
- String gid = entry.getKey();
- TaskList list = entry.getValue();
-
- if (list.getName().equals(folderName)) {
- tasklist = list;
- if (mGTaskHashMap.containsKey(gid)) {
- mGTaskHashMap.remove(gid);
- }
- break;
- }
- }
-
- // no match we can add now
- if (tasklist == null) {
- tasklist = new TaskList();
- tasklist.setContentByLocalJSON(sqlNote.getContent());
- GTaskClient.getInstance().createTaskList(tasklist);
- mGTaskListHashMap.put(tasklist.getGid(), tasklist);
- }
- n = (Node) tasklist;
- }
-
- // update local note
- sqlNote.setGtaskId(n.getGid());
- sqlNote.commit(false);
- sqlNote.resetLocalModified();
- sqlNote.commit(true);
-
- // gid-id mapping
- mGidToNid.put(n.getGid(), sqlNote.getId());
- mNidToGid.put(sqlNote.getId(), n.getGid());
- }
-
- private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- SqlNote sqlNote = new SqlNote(mContext, c);
-
- // update remotely
- node.setContentByLocalJSON(sqlNote.getContent());
- GTaskClient.getInstance().addUpdateNode(node);
-
- // update meta
- updateRemoteMeta(node.getGid(), sqlNote);
-
- // move task if necessary
- if (sqlNote.isNoteType()) {
- Task task = (Task) node;
- TaskList preParentList = task.getParent();
-
- String curParentGid = mNidToGid.get(sqlNote.getParentId());
- if (curParentGid == null) {
- Log.e(TAG, "cannot find task's parent tasklist");
- throw new ActionFailureException("cannot update remote task");
- }
- TaskList curParentList = mGTaskListHashMap.get(curParentGid);
-
- if (preParentList != curParentList) {
- preParentList.removeChildTask(task);
- curParentList.addChildTask(task);
- GTaskClient.getInstance().moveTask(task, preParentList, curParentList);
- }
- }
-
- // clear local modified flag
- sqlNote.resetLocalModified();
- sqlNote.commit(true);
- }
-
- private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException {
- if (sqlNote != null && sqlNote.isNoteType()) {
- MetaData metaData = mMetaHashMap.get(gid);
- if (metaData != null) {
- metaData.setMeta(gid, sqlNote.getContent());
- GTaskClient.getInstance().addUpdateNode(metaData);
- } else {
- metaData = new MetaData();
- metaData.setMeta(gid, sqlNote.getContent());
- mMetaList.addChildTask(metaData);
- mMetaHashMap.put(gid, metaData);
- GTaskClient.getInstance().createTask(metaData);
- }
- }
- }
-
- private void refreshLocalSyncId() throws NetworkFailureException {
- if (mCancelled) {
- return;
- }
-
- // get the latest gtask list
- mGTaskHashMap.clear();
- mGTaskListHashMap.clear();
- mMetaHashMap.clear();
- initGTaskList();
-
- Cursor c = null;
- try {
- c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE,
- "(type<>? AND parent_id<>?)", new String[] {
- String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER)
- }, NoteColumns.TYPE + " DESC");
- if (c != null) {
- while (c.moveToNext()) {
- String gid = c.getString(SqlNote.GTASK_ID_COLUMN);
- Node node = mGTaskHashMap.get(gid);
- if (node != null) {
- mGTaskHashMap.remove(gid);
- ContentValues values = new ContentValues();
- values.put(NoteColumns.SYNC_ID, node.getLastModified());
- mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI,
- c.getLong(SqlNote.ID_COLUMN)), values, null, null);
- } else {
- Log.e(TAG, "something is missed");
- throw new ActionFailureException(
- "some local items don't have gid after sync");
- }
- }
- } else {
- Log.w(TAG, "failed to query local note to refresh sync id");
- }
- } finally {
- if (c != null) {
- c.close();
- c = null;
- }
- }
- }
-
- public String getSyncAccount() {
- return GTaskClient.getInstance().getSyncAccount().name;
- }
-
- public void cancelSync() {
- mCancelled = true;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java b/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java
deleted file mode 100644
index cca36f7..0000000
--- a/Notes-master/src/net/micode/notes/gtask/remote/GTaskSyncService.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.gtask.remote;
-
-import android.app.Activity;
-import android.app.Service;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-
-public class GTaskSyncService extends Service {
- public final static String ACTION_STRING_NAME = "sync_action_type";
-
- public final static int ACTION_START_SYNC = 0;
-
- public final static int ACTION_CANCEL_SYNC = 1;
-
- public final static int ACTION_INVALID = 2;
-
- public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
-
- public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
-
- public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
-
- private static GTaskASyncTask mSyncTask = null;
-
- private static String mSyncProgress = "";
-
- private void startSync() {
- if (mSyncTask == null) {
- mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
- public void onComplete() {
- mSyncTask = null;
- sendBroadcast("");
- stopSelf();
- }
- });
- sendBroadcast("");
- mSyncTask.execute();
- }
- }
-
- private void cancelSync() {
- if (mSyncTask != null) {
- mSyncTask.cancelSync();
- }
- }
-
- @Override
- public void onCreate() {
- mSyncTask = null;
- }
-
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- Bundle bundle = intent.getExtras();
- if (bundle != null && bundle.containsKey(ACTION_STRING_NAME)) {
- switch (bundle.getInt(ACTION_STRING_NAME, ACTION_INVALID)) {
- case ACTION_START_SYNC:
- startSync();
- break;
- case ACTION_CANCEL_SYNC:
- cancelSync();
- break;
- default:
- break;
- }
- return START_STICKY;
- }
- return super.onStartCommand(intent, flags, startId);
- }
-
- @Override
- public void onLowMemory() {
- if (mSyncTask != null) {
- mSyncTask.cancelSync();
- }
- }
-
- public IBinder onBind(Intent intent) {
- return null;
- }
-
- public void sendBroadcast(String msg) {
- mSyncProgress = msg;
- Intent intent = new Intent(GTASK_SERVICE_BROADCAST_NAME);
- intent.putExtra(GTASK_SERVICE_BROADCAST_IS_SYNCING, mSyncTask != null);
- intent.putExtra(GTASK_SERVICE_BROADCAST_PROGRESS_MSG, msg);
- sendBroadcast(intent);
- }
-
- public static void startSync(Activity activity) {
- GTaskManager.getInstance().setActivityContext(activity);
- Intent intent = new Intent(activity, GTaskSyncService.class);
- intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_START_SYNC);
- activity.startService(intent);
- }
-
- public static void cancelSync(Context context) {
- Intent intent = new Intent(context, GTaskSyncService.class);
- intent.putExtra(GTaskSyncService.ACTION_STRING_NAME, GTaskSyncService.ACTION_CANCEL_SYNC);
- context.startService(intent);
- }
-
- public static boolean isSyncing() {
- return mSyncTask != null;
- }
-
- public static String getProgressString() {
- return mSyncProgress;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/model/Note.java b/Notes-master/src/net/micode/notes/model/Note.java
deleted file mode 100644
index 6706cf6..0000000
--- a/Notes-master/src/net/micode/notes/model/Note.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.model;
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.OperationApplicationException;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.CallNote;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.data.Notes.TextNote;
-
-import java.util.ArrayList;
-
-
-public class Note {
- private ContentValues mNoteDiffValues;
- private NoteData mNoteData;
- private static final String TAG = "Note";
- /**
- * Create a new note id for adding a new note to databases
- */
- public static synchronized long getNewNoteId(Context context, long folderId) {
- // Create a new note in the database
- ContentValues values = new ContentValues();
- long createdTime = System.currentTimeMillis();
- values.put(NoteColumns.CREATED_DATE, createdTime);
- values.put(NoteColumns.MODIFIED_DATE, createdTime);
- values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
- values.put(NoteColumns.LOCAL_MODIFIED, 1);
- values.put(NoteColumns.PARENT_ID, folderId);
- Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
-
- long noteId = 0;
- try {
- noteId = Long.valueOf(uri.getPathSegments().get(1));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Get note id error :" + e.toString());
- noteId = 0;
- }
- if (noteId == -1) {
- throw new IllegalStateException("Wrong note id:" + noteId);
- }
- return noteId;
- }
-
- public Note() {
- mNoteDiffValues = new ContentValues();
- mNoteData = new NoteData();
- }
-
- public void setNoteValue(String key, String value) {
- mNoteDiffValues.put(key, value);
- mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
- mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
- }
-
- public void setTextData(String key, String value) {
- mNoteData.setTextData(key, value);
- }
-
- public void setTextDataId(long id) {
- mNoteData.setTextDataId(id);
- }
-
- public long getTextDataId() {
- return mNoteData.mTextDataId;
- }
-
- public void setCallDataId(long id) {
- mNoteData.setCallDataId(id);
- }
-
- public void setCallData(String key, String value) {
- mNoteData.setCallData(key, value);
- }
-
- public boolean isLocalModified() {
- return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified();
- }
-
- public boolean syncNote(Context context, long noteId) {
- if (noteId <= 0) {
- throw new IllegalArgumentException("Wrong note id:" + noteId);
- }
-
- if (!isLocalModified()) {
- return true;
- }
-
- /**
- * In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and
- * {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the
- * note data info
- */
- if (context.getContentResolver().update(
- ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null,
- null) == 0) {
- Log.e(TAG, "Update note error, should not happen");
- // Do not return, fall through
- }
- mNoteDiffValues.clear();
-
- if (mNoteData.isLocalModified()
- && (mNoteData.pushIntoContentResolver(context, noteId) == null)) {
- return false;
- }
-
- return true;
- }
-
- private class NoteData {
- private long mTextDataId;
-
- private ContentValues mTextDataValues;
-
- private long mCallDataId;
-
- private ContentValues mCallDataValues;
-
- private static final String TAG = "NoteData";
-
- public NoteData() {
- mTextDataValues = new ContentValues();
- mCallDataValues = new ContentValues();
- mTextDataId = 0;
- mCallDataId = 0;
- }
-
- boolean isLocalModified() {
- return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
- }
-
- void setTextDataId(long id) {
- if(id <= 0) {
- throw new IllegalArgumentException("Text data id should larger than 0");
- }
- mTextDataId = id;
- }
-
- void setCallDataId(long id) {
- if (id <= 0) {
- throw new IllegalArgumentException("Call data id should larger than 0");
- }
- mCallDataId = id;
- }
-
- void setCallData(String key, String value) {
- mCallDataValues.put(key, value);
- mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
- mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
- }
-
- void setTextData(String key, String value) {
- mTextDataValues.put(key, value);
- mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
- mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
- }
-
- Uri pushIntoContentResolver(Context context, long noteId) {
- /**
- * Check for safety
- */
- if (noteId <= 0) {
- throw new IllegalArgumentException("Wrong note id:" + noteId);
- }
-
- ArrayList operationList = new ArrayList();
- ContentProviderOperation.Builder builder = null;
-
- if(mTextDataValues.size() > 0) {
- mTextDataValues.put(DataColumns.NOTE_ID, noteId);
- if (mTextDataId == 0) {
- mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE);
- Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
- mTextDataValues);
- try {
- setTextDataId(Long.valueOf(uri.getPathSegments().get(1)));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Insert new text data fail with noteId" + noteId);
- mTextDataValues.clear();
- return null;
- }
- } else {
- builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
- Notes.CONTENT_DATA_URI, mTextDataId));
- builder.withValues(mTextDataValues);
- operationList.add(builder.build());
- }
- mTextDataValues.clear();
- }
-
- if(mCallDataValues.size() > 0) {
- mCallDataValues.put(DataColumns.NOTE_ID, noteId);
- if (mCallDataId == 0) {
- mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE);
- Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI,
- mCallDataValues);
- try {
- setCallDataId(Long.valueOf(uri.getPathSegments().get(1)));
- } catch (NumberFormatException e) {
- Log.e(TAG, "Insert new call data fail with noteId" + noteId);
- mCallDataValues.clear();
- return null;
- }
- } else {
- builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId(
- Notes.CONTENT_DATA_URI, mCallDataId));
- builder.withValues(mCallDataValues);
- operationList.add(builder.build());
- }
- mCallDataValues.clear();
- }
-
- if (operationList.size() > 0) {
- try {
- ContentProviderResult[] results = context.getContentResolver().applyBatch(
- Notes.AUTHORITY, operationList);
- return (results == null || results.length == 0 || results[0] == null) ? null
- : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId);
- } catch (RemoteException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- return null;
- } catch (OperationApplicationException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- return null;
- }
- }
- return null;
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/model/WorkingNote.java b/Notes-master/src/net/micode/notes/model/WorkingNote.java
deleted file mode 100644
index be081e4..0000000
--- a/Notes-master/src/net/micode/notes/model/WorkingNote.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.model;
-
-import android.appwidget.AppWidgetManager;
-import android.content.ContentUris;
-import android.content.Context;
-import android.database.Cursor;
-import android.text.TextUtils;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.CallNote;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.data.Notes.TextNote;
-import net.micode.notes.tool.ResourceParser.NoteBgResources;
-
-
-public class WorkingNote {
- // Note for the working note
- private Note mNote;
- // Note Id
- private long mNoteId;
- // Note content
- private String mContent;
- // Note mode
- private int mMode;
-
- private long mAlertDate;
-
- private long mModifiedDate;
-
- private int mBgColorId;
-
- private int mWidgetId;
-
- private int mWidgetType;
-
- private long mFolderId;
-
- private Context mContext;
-
- private static final String TAG = "WorkingNote";
-
- private boolean mIsDeleted;
-
- private NoteSettingChangedListener mNoteSettingStatusListener;
-
- public static final String[] DATA_PROJECTION = new String[] {
- DataColumns.ID,
- DataColumns.CONTENT,
- DataColumns.MIME_TYPE,
- DataColumns.DATA1,
- DataColumns.DATA2,
- DataColumns.DATA3,
- DataColumns.DATA4,
- };
-
- public static final String[] NOTE_PROJECTION = new String[] {
- NoteColumns.PARENT_ID,
- NoteColumns.ALERTED_DATE,
- NoteColumns.BG_COLOR_ID,
- NoteColumns.WIDGET_ID,
- NoteColumns.WIDGET_TYPE,
- NoteColumns.MODIFIED_DATE
- };
-
- private static final int DATA_ID_COLUMN = 0;
-
- private static final int DATA_CONTENT_COLUMN = 1;
-
- private static final int DATA_MIME_TYPE_COLUMN = 2;
-
- private static final int DATA_MODE_COLUMN = 3;
-
- private static final int NOTE_PARENT_ID_COLUMN = 0;
-
- private static final int NOTE_ALERTED_DATE_COLUMN = 1;
-
- private static final int NOTE_BG_COLOR_ID_COLUMN = 2;
-
- private static final int NOTE_WIDGET_ID_COLUMN = 3;
-
- private static final int NOTE_WIDGET_TYPE_COLUMN = 4;
-
- private static final int NOTE_MODIFIED_DATE_COLUMN = 5;
-
- // New note construct
- private WorkingNote(Context context, long folderId) {
- mContext = context;
- mAlertDate = 0;
- mModifiedDate = System.currentTimeMillis();
- mFolderId = folderId;
- mNote = new Note();
- mNoteId = 0;
- mIsDeleted = false;
- mMode = 0;
- mWidgetType = Notes.TYPE_WIDGET_INVALIDE;
- }
-
- // Existing note construct
- private WorkingNote(Context context, long noteId, long folderId) {
- mContext = context;
- mNoteId = noteId;
- mFolderId = folderId;
- mIsDeleted = false;
- mNote = new Note();
- loadNote();
- }
-
- private void loadNote() {
- Cursor cursor = mContext.getContentResolver().query(
- ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mNoteId), NOTE_PROJECTION, null,
- null, null);
-
- if (cursor != null) {
- if (cursor.moveToFirst()) {
- mFolderId = cursor.getLong(NOTE_PARENT_ID_COLUMN);
- mBgColorId = cursor.getInt(NOTE_BG_COLOR_ID_COLUMN);
- mWidgetId = cursor.getInt(NOTE_WIDGET_ID_COLUMN);
- mWidgetType = cursor.getInt(NOTE_WIDGET_TYPE_COLUMN);
- mAlertDate = cursor.getLong(NOTE_ALERTED_DATE_COLUMN);
- mModifiedDate = cursor.getLong(NOTE_MODIFIED_DATE_COLUMN);
- }
- cursor.close();
- } else {
- Log.e(TAG, "No note with id:" + mNoteId);
- throw new IllegalArgumentException("Unable to find note with id " + mNoteId);
- }
- loadNoteData();
- }
-
- private void loadNoteData() {
- Cursor cursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI, DATA_PROJECTION,
- DataColumns.NOTE_ID + "=?", new String[] {
- String.valueOf(mNoteId)
- }, null);
-
- if (cursor != null) {
- if (cursor.moveToFirst()) {
- do {
- String type = cursor.getString(DATA_MIME_TYPE_COLUMN);
- if (DataConstants.NOTE.equals(type)) {
- mContent = cursor.getString(DATA_CONTENT_COLUMN);
- mMode = cursor.getInt(DATA_MODE_COLUMN);
- mNote.setTextDataId(cursor.getLong(DATA_ID_COLUMN));
- } else if (DataConstants.CALL_NOTE.equals(type)) {
- mNote.setCallDataId(cursor.getLong(DATA_ID_COLUMN));
- } else {
- Log.d(TAG, "Wrong note type with type:" + type);
- }
- } while (cursor.moveToNext());
- }
- cursor.close();
- } else {
- Log.e(TAG, "No data with id:" + mNoteId);
- throw new IllegalArgumentException("Unable to find note's data with id " + mNoteId);
- }
- }
-
- public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId,
- int widgetType, int defaultBgColorId) {
- WorkingNote note = new WorkingNote(context, folderId);
- note.setBgColorId(defaultBgColorId);
- note.setWidgetId(widgetId);
- note.setWidgetType(widgetType);
- return note;
- }
-
- public static WorkingNote load(Context context, long id) {
- return new WorkingNote(context, id, 0);
- }
-
- public synchronized boolean saveNote() {
- if (isWorthSaving()) {
- if (!existInDatabase()) {
- if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) {
- Log.e(TAG, "Create new note fail with id:" + mNoteId);
- return false;
- }
- }
-
- mNote.syncNote(mContext, mNoteId);
-
- /**
- * Update widget content if there exist any widget of this note
- */
- if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID
- && mWidgetType != Notes.TYPE_WIDGET_INVALIDE
- && mNoteSettingStatusListener != null) {
- mNoteSettingStatusListener.onWidgetChanged();
- }
- return true;
- } else {
- return false;
- }
- }
-
- public boolean existInDatabase() {
- return mNoteId > 0;
- }
-
- private boolean isWorthSaving() {
- if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent))
- || (existInDatabase() && !mNote.isLocalModified())) {
- return false;
- } else {
- return true;
- }
- }
-
- public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) {
- mNoteSettingStatusListener = l;
- }
-
- public void setAlertDate(long date, boolean set) {
- if (date != mAlertDate) {
- mAlertDate = date;
- mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate));
- }
- if (mNoteSettingStatusListener != null) {
- mNoteSettingStatusListener.onClockAlertChanged(date, set);
- }
- }
-
- public void markDeleted(boolean mark) {
- mIsDeleted = mark;
- if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID
- && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) {
- mNoteSettingStatusListener.onWidgetChanged();
- }
- }
-
- public void setBgColorId(int id) {
- if (id != mBgColorId) {
- mBgColorId = id;
- if (mNoteSettingStatusListener != null) {
- mNoteSettingStatusListener.onBackgroundColorChanged();
- }
- mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id));
- }
- }
-
- public void setCheckListMode(int mode) {
- if (mMode != mode) {
- if (mNoteSettingStatusListener != null) {
- mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode);
- }
- mMode = mode;
- mNote.setTextData(TextNote.MODE, String.valueOf(mMode));
- }
- }
-
- public void setWidgetType(int type) {
- if (type != mWidgetType) {
- mWidgetType = type;
- mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType));
- }
- }
-
- public void setWidgetId(int id) {
- if (id != mWidgetId) {
- mWidgetId = id;
- mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId));
- }
- }
-
- public void setWorkingText(String text) {
- if (!TextUtils.equals(mContent, text)) {
- mContent = text;
- mNote.setTextData(DataColumns.CONTENT, mContent);
- }
- }
-
- public void convertToCallNote(String phoneNumber, long callDate) {
- mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate));
- mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber);
- mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER));
- }
-
- public boolean hasClockAlert() {
- return (mAlertDate > 0 ? true : false);
- }
-
- public String getContent() {
- return mContent;
- }
-
- public long getAlertDate() {
- return mAlertDate;
- }
-
- public long getModifiedDate() {
- return mModifiedDate;
- }
-
- public int getBgColorResId() {
- return NoteBgResources.getNoteBgResource(mBgColorId);
- }
-
- public int getBgColorId() {
- return mBgColorId;
- }
-
- public int getTitleBgResId() {
- return NoteBgResources.getNoteTitleBgResource(mBgColorId);
- }
-
- public int getCheckListMode() {
- return mMode;
- }
-
- public long getNoteId() {
- return mNoteId;
- }
-
- public long getFolderId() {
- return mFolderId;
- }
-
- public int getWidgetId() {
- return mWidgetId;
- }
-
- public int getWidgetType() {
- return mWidgetType;
- }
-
- public interface NoteSettingChangedListener {
- /**
- * Called when the background color of current note has just changed
- */
- void onBackgroundColorChanged();
-
- /**
- * Called when user set clock
- */
- void onClockAlertChanged(long date, boolean set);
-
- /**
- * Call when user create note from widget
- */
- void onWidgetChanged();
-
- /**
- * Call when switch between check list mode and normal mode
- * @param oldMode is previous mode before change
- * @param newMode is new mode
- */
- void onCheckListModeChanged(int oldMode, int newMode);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/tool/BackupUtils.java b/Notes-master/src/net/micode/notes/tool/BackupUtils.java
deleted file mode 100644
index 39f6ec4..0000000
--- a/Notes-master/src/net/micode/notes/tool/BackupUtils.java
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.tool;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.os.Environment;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.util.Log;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.DataColumns;
-import net.micode.notes.data.Notes.DataConstants;
-import net.micode.notes.data.Notes.NoteColumns;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-
-
-public class BackupUtils {
- private static final String TAG = "BackupUtils";
- // Singleton stuff
- private static BackupUtils sInstance;
-
- public static synchronized BackupUtils getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new BackupUtils(context);
- }
- return sInstance;
- }
-
- /**
- * Following states are signs to represents backup or restore
- * status
- */
- // Currently, the sdcard is not mounted
- public static final int STATE_SD_CARD_UNMOUONTED = 0;
- // The backup file not exist
- public static final int STATE_BACKUP_FILE_NOT_EXIST = 1;
- // The data is not well formated, may be changed by other programs
- public static final int STATE_DATA_DESTROIED = 2;
- // Some run-time exception which causes restore or backup fails
- public static final int STATE_SYSTEM_ERROR = 3;
- // Backup or restore success
- public static final int STATE_SUCCESS = 4;
-
- private TextExport mTextExport;
-
- private BackupUtils(Context context) {
- mTextExport = new TextExport(context);
- }
-
- private static boolean externalStorageAvailable() {
- return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
- }
-
- public int exportToText() {
- return mTextExport.exportToText();
- }
-
- public String getExportedTextFileName() {
- return mTextExport.mFileName;
- }
-
- public String getExportedTextFileDir() {
- return mTextExport.mFileDirectory;
- }
-
- private static class TextExport {
- private static final String[] NOTE_PROJECTION = {
- NoteColumns.ID,
- NoteColumns.MODIFIED_DATE,
- NoteColumns.SNIPPET,
- NoteColumns.TYPE
- };
-
- private static final int NOTE_COLUMN_ID = 0;
-
- private static final int NOTE_COLUMN_MODIFIED_DATE = 1;
-
- private static final int NOTE_COLUMN_SNIPPET = 2;
-
- private static final String[] DATA_PROJECTION = {
- DataColumns.CONTENT,
- DataColumns.MIME_TYPE,
- DataColumns.DATA1,
- DataColumns.DATA2,
- DataColumns.DATA3,
- DataColumns.DATA4,
- };
-
- private static final int DATA_COLUMN_CONTENT = 0;
-
- private static final int DATA_COLUMN_MIME_TYPE = 1;
-
- private static final int DATA_COLUMN_CALL_DATE = 2;
-
- private static final int DATA_COLUMN_PHONE_NUMBER = 4;
-
- private final String [] TEXT_FORMAT;
- private static final int FORMAT_FOLDER_NAME = 0;
- private static final int FORMAT_NOTE_DATE = 1;
- private static final int FORMAT_NOTE_CONTENT = 2;
-
- private Context mContext;
- private String mFileName;
- private String mFileDirectory;
-
- public TextExport(Context context) {
- TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note);
- mContext = context;
- mFileName = "";
- mFileDirectory = "";
- }
-
- private String getFormat(int id) {
- return TEXT_FORMAT[id];
- }
-
- /**
- * Export the folder identified by folder id to text
- */
- private void exportFolderToText(String folderId, PrintStream ps) {
- // Query notes belong to this folder
- Cursor notesCursor = mContext.getContentResolver().query(Notes.CONTENT_NOTE_URI,
- NOTE_PROJECTION, NoteColumns.PARENT_ID + "=?", new String[] {
- folderId
- }, null);
-
- if (notesCursor != null) {
- if (notesCursor.moveToFirst()) {
- do {
- // Print note's last modified date
- ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format(
- mContext.getString(R.string.format_datetime_mdhm),
- notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE))));
- // Query data belong to this note
- String noteId = notesCursor.getString(NOTE_COLUMN_ID);
- exportNoteToText(noteId, ps);
- } while (notesCursor.moveToNext());
- }
- notesCursor.close();
- }
- }
-
- /**
- * Export note identified by id to a print stream
- */
- private void exportNoteToText(String noteId, PrintStream ps) {
- Cursor dataCursor = mContext.getContentResolver().query(Notes.CONTENT_DATA_URI,
- DATA_PROJECTION, DataColumns.NOTE_ID + "=?", new String[] {
- noteId
- }, null);
-
- if (dataCursor != null) {
- if (dataCursor.moveToFirst()) {
- do {
- String mimeType = dataCursor.getString(DATA_COLUMN_MIME_TYPE);
- if (DataConstants.CALL_NOTE.equals(mimeType)) {
- // Print phone number
- String phoneNumber = dataCursor.getString(DATA_COLUMN_PHONE_NUMBER);
- long callDate = dataCursor.getLong(DATA_COLUMN_CALL_DATE);
- String location = dataCursor.getString(DATA_COLUMN_CONTENT);
-
- if (!TextUtils.isEmpty(phoneNumber)) {
- ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
- phoneNumber));
- }
- // Print call date
- ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat
- .format(mContext.getString(R.string.format_datetime_mdhm),
- callDate)));
- // Print call attachment location
- if (!TextUtils.isEmpty(location)) {
- ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
- location));
- }
- } else if (DataConstants.NOTE.equals(mimeType)) {
- String content = dataCursor.getString(DATA_COLUMN_CONTENT);
- if (!TextUtils.isEmpty(content)) {
- ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT),
- content));
- }
- }
- } while (dataCursor.moveToNext());
- }
- dataCursor.close();
- }
- // print a line separator between note
- try {
- ps.write(new byte[] {
- Character.LINE_SEPARATOR, Character.LETTER_NUMBER
- });
- } catch (IOException e) {
- Log.e(TAG, e.toString());
- }
- }
-
- /**
- * Note will be exported as text which is user readable
- */
- public int exportToText() {
- if (!externalStorageAvailable()) {
- Log.d(TAG, "Media was not mounted");
- return STATE_SD_CARD_UNMOUONTED;
- }
-
- PrintStream ps = getExportToTextPrintStream();
- if (ps == null) {
- Log.e(TAG, "get print stream error");
- return STATE_SYSTEM_ERROR;
- }
- // First export folder and its notes
- Cursor folderCursor = mContext.getContentResolver().query(
- Notes.CONTENT_NOTE_URI,
- NOTE_PROJECTION,
- "(" + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + " AND "
- + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER + ") OR "
- + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER, null, null);
-
- if (folderCursor != null) {
- if (folderCursor.moveToFirst()) {
- do {
- // Print folder's name
- String folderName = "";
- if(folderCursor.getLong(NOTE_COLUMN_ID) == Notes.ID_CALL_RECORD_FOLDER) {
- folderName = mContext.getString(R.string.call_record_folder_name);
- } else {
- folderName = folderCursor.getString(NOTE_COLUMN_SNIPPET);
- }
- if (!TextUtils.isEmpty(folderName)) {
- ps.println(String.format(getFormat(FORMAT_FOLDER_NAME), folderName));
- }
- String folderId = folderCursor.getString(NOTE_COLUMN_ID);
- exportFolderToText(folderId, ps);
- } while (folderCursor.moveToNext());
- }
- folderCursor.close();
- }
-
- // Export notes in root's folder
- Cursor noteCursor = mContext.getContentResolver().query(
- Notes.CONTENT_NOTE_URI,
- NOTE_PROJECTION,
- NoteColumns.TYPE + "=" + +Notes.TYPE_NOTE + " AND " + NoteColumns.PARENT_ID
- + "=0", null, null);
-
- if (noteCursor != null) {
- if (noteCursor.moveToFirst()) {
- do {
- ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format(
- mContext.getString(R.string.format_datetime_mdhm),
- noteCursor.getLong(NOTE_COLUMN_MODIFIED_DATE))));
- // Query data belong to this note
- String noteId = noteCursor.getString(NOTE_COLUMN_ID);
- exportNoteToText(noteId, ps);
- } while (noteCursor.moveToNext());
- }
- noteCursor.close();
- }
- ps.close();
-
- return STATE_SUCCESS;
- }
-
- /**
- * Get a print stream pointed to the file {@generateExportedTextFile}
- */
- private PrintStream getExportToTextPrintStream() {
- File file = generateFileMountedOnSDcard(mContext, R.string.file_path,
- R.string.file_name_txt_format);
- if (file == null) {
- Log.e(TAG, "create file to exported failed");
- return null;
- }
- mFileName = file.getName();
- mFileDirectory = mContext.getString(R.string.file_path);
- PrintStream ps = null;
- try {
- FileOutputStream fos = new FileOutputStream(file);
- ps = new PrintStream(fos);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- return null;
- } catch (NullPointerException e) {
- e.printStackTrace();
- return null;
- }
- return ps;
- }
- }
-
- /**
- * Generate the text file to store imported data
- */
- private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) {
- StringBuilder sb = new StringBuilder();
- sb.append(Environment.getExternalStorageDirectory());
- sb.append(context.getString(filePathResId));
- File filedir = new File(sb.toString());
- sb.append(context.getString(
- fileNameFormatResId,
- DateFormat.format(context.getString(R.string.format_date_ymd),
- System.currentTimeMillis())));
- File file = new File(sb.toString());
-
- try {
- if (!filedir.exists()) {
- filedir.mkdir();
- }
- if (!file.exists()) {
- file.createNewFile();
- }
- return file;
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- return null;
- }
-}
-
-
diff --git a/Notes-master/src/net/micode/notes/tool/DataUtils.java b/Notes-master/src/net/micode/notes/tool/DataUtils.java
deleted file mode 100644
index 2a14982..0000000
--- a/Notes-master/src/net/micode/notes/tool/DataUtils.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.tool;
-
-import android.content.ContentProviderOperation;
-import android.content.ContentProviderResult;
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.OperationApplicationException;
-import android.database.Cursor;
-import android.os.RemoteException;
-import android.util.Log;
-
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.CallNote;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-
-
-public class DataUtils {
- public static final String TAG = "DataUtils";
- public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) {
- if (ids == null) {
- Log.d(TAG, "the ids is null");
- return true;
- }
- if (ids.size() == 0) {
- Log.d(TAG, "no id is in the hashset");
- return true;
- }
-
- ArrayList operationList = new ArrayList();
- for (long id : ids) {
- if(id == Notes.ID_ROOT_FOLDER) {
- Log.e(TAG, "Don't delete system folder root");
- continue;
- }
- ContentProviderOperation.Builder builder = ContentProviderOperation
- .newDelete(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
- operationList.add(builder.build());
- }
- try {
- ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
- if (results == null || results.length == 0 || results[0] == null) {
- Log.d(TAG, "delete notes failed, ids:" + ids.toString());
- return false;
- }
- return true;
- } catch (RemoteException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- } catch (OperationApplicationException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- }
- return false;
- }
-
- public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) {
- ContentValues values = new ContentValues();
- values.put(NoteColumns.PARENT_ID, desFolderId);
- values.put(NoteColumns.ORIGIN_PARENT_ID, srcFolderId);
- values.put(NoteColumns.LOCAL_MODIFIED, 1);
- resolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id), values, null, null);
- }
-
- public static boolean batchMoveToFolder(ContentResolver resolver, HashSet ids,
- long folderId) {
- if (ids == null) {
- Log.d(TAG, "the ids is null");
- return true;
- }
-
- ArrayList operationList = new ArrayList();
- for (long id : ids) {
- ContentProviderOperation.Builder builder = ContentProviderOperation
- .newUpdate(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, id));
- builder.withValue(NoteColumns.PARENT_ID, folderId);
- builder.withValue(NoteColumns.LOCAL_MODIFIED, 1);
- operationList.add(builder.build());
- }
-
- try {
- ContentProviderResult[] results = resolver.applyBatch(Notes.AUTHORITY, operationList);
- if (results == null || results.length == 0 || results[0] == null) {
- Log.d(TAG, "delete notes failed, ids:" + ids.toString());
- return false;
- }
- return true;
- } catch (RemoteException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- } catch (OperationApplicationException e) {
- Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage()));
- }
- return false;
- }
-
- /**
- * Get the all folder count except system folders {@link Notes#TYPE_SYSTEM}}
- */
- public static int getUserFolderCount(ContentResolver resolver) {
- Cursor cursor =resolver.query(Notes.CONTENT_NOTE_URI,
- new String[] { "COUNT(*)" },
- NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>?",
- new String[] { String.valueOf(Notes.TYPE_FOLDER), String.valueOf(Notes.ID_TRASH_FOLER)},
- null);
-
- int count = 0;
- if(cursor != null) {
- if(cursor.moveToFirst()) {
- try {
- count = cursor.getInt(0);
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "get folder count failed:" + e.toString());
- } finally {
- cursor.close();
- }
- }
- }
- return count;
- }
-
- public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) {
- Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
- null,
- NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER,
- new String [] {String.valueOf(type)},
- null);
-
- boolean exist = false;
- if (cursor != null) {
- if (cursor.getCount() > 0) {
- exist = true;
- }
- cursor.close();
- }
- return exist;
- }
-
- public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) {
- Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId),
- null, null, null, null);
-
- boolean exist = false;
- if (cursor != null) {
- if (cursor.getCount() > 0) {
- exist = true;
- }
- cursor.close();
- }
- return exist;
- }
-
- public static boolean existInDataDatabase(ContentResolver resolver, long dataId) {
- Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId),
- null, null, null, null);
-
- boolean exist = false;
- if (cursor != null) {
- if (cursor.getCount() > 0) {
- exist = true;
- }
- cursor.close();
- }
- return exist;
- }
-
- public static boolean checkVisibleFolderName(ContentResolver resolver, String name) {
- Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null,
- NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER +
- " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER +
- " AND " + NoteColumns.SNIPPET + "=?",
- new String[] { name }, null);
- boolean exist = false;
- if(cursor != null) {
- if(cursor.getCount() > 0) {
- exist = true;
- }
- cursor.close();
- }
- return exist;
- }
-
- public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) {
- Cursor c = resolver.query(Notes.CONTENT_NOTE_URI,
- new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE },
- NoteColumns.PARENT_ID + "=?",
- new String[] { String.valueOf(folderId) },
- null);
-
- HashSet set = null;
- if (c != null) {
- if (c.moveToFirst()) {
- set = new HashSet();
- do {
- try {
- AppWidgetAttribute widget = new AppWidgetAttribute();
- widget.widgetId = c.getInt(0);
- widget.widgetType = c.getInt(1);
- set.add(widget);
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, e.toString());
- }
- } while (c.moveToNext());
- }
- c.close();
- }
- return set;
- }
-
- public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) {
- Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
- new String [] { CallNote.PHONE_NUMBER },
- CallNote.NOTE_ID + "=? AND " + CallNote.MIME_TYPE + "=?",
- new String [] { String.valueOf(noteId), CallNote.CONTENT_ITEM_TYPE },
- null);
-
- if (cursor != null && cursor.moveToFirst()) {
- try {
- return cursor.getString(0);
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "Get call number fails " + e.toString());
- } finally {
- cursor.close();
- }
- }
- return "";
- }
-
- public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) {
- Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI,
- new String [] { CallNote.NOTE_ID },
- CallNote.CALL_DATE + "=? AND " + CallNote.MIME_TYPE + "=? AND PHONE_NUMBERS_EQUAL("
- + CallNote.PHONE_NUMBER + ",?)",
- new String [] { String.valueOf(callDate), CallNote.CONTENT_ITEM_TYPE, phoneNumber },
- null);
-
- if (cursor != null) {
- if (cursor.moveToFirst()) {
- try {
- return cursor.getLong(0);
- } catch (IndexOutOfBoundsException e) {
- Log.e(TAG, "Get call note id fails " + e.toString());
- }
- }
- cursor.close();
- }
- return 0;
- }
-
- public static String getSnippetById(ContentResolver resolver, long noteId) {
- Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI,
- new String [] { NoteColumns.SNIPPET },
- NoteColumns.ID + "=?",
- new String [] { String.valueOf(noteId)},
- null);
-
- if (cursor != null) {
- String snippet = "";
- if (cursor.moveToFirst()) {
- snippet = cursor.getString(0);
- }
- cursor.close();
- return snippet;
- }
- throw new IllegalArgumentException("Note is not found with id: " + noteId);
- }
-
- public static String getFormattedSnippet(String snippet) {
- if (snippet != null) {
- snippet = snippet.trim();
- int index = snippet.indexOf('\n');
- if (index != -1) {
- snippet = snippet.substring(0, index);
- }
- }
- return snippet;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java b/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java
deleted file mode 100644
index 666b729..0000000
--- a/Notes-master/src/net/micode/notes/tool/GTaskStringUtils.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.tool;
-
-public class GTaskStringUtils {
-
- public final static String GTASK_JSON_ACTION_ID = "action_id";
-
- public final static String GTASK_JSON_ACTION_LIST = "action_list";
-
- public final static String GTASK_JSON_ACTION_TYPE = "action_type";
-
- public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create";
-
- public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all";
-
- public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move";
-
- public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update";
-
- public final static String GTASK_JSON_CREATOR_ID = "creator_id";
-
- public final static String GTASK_JSON_CHILD_ENTITY = "child_entity";
-
- public final static String GTASK_JSON_CLIENT_VERSION = "client_version";
-
- public final static String GTASK_JSON_COMPLETED = "completed";
-
- public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id";
-
- public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id";
-
- public final static String GTASK_JSON_DELETED = "deleted";
-
- public final static String GTASK_JSON_DEST_LIST = "dest_list";
-
- public final static String GTASK_JSON_DEST_PARENT = "dest_parent";
-
- public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type";
-
- public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta";
-
- public final static String GTASK_JSON_ENTITY_TYPE = "entity_type";
-
- public final static String GTASK_JSON_GET_DELETED = "get_deleted";
-
- public final static String GTASK_JSON_ID = "id";
-
- public final static String GTASK_JSON_INDEX = "index";
-
- public final static String GTASK_JSON_LAST_MODIFIED = "last_modified";
-
- public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point";
-
- public final static String GTASK_JSON_LIST_ID = "list_id";
-
- public final static String GTASK_JSON_LISTS = "lists";
-
- public final static String GTASK_JSON_NAME = "name";
-
- public final static String GTASK_JSON_NEW_ID = "new_id";
-
- public final static String GTASK_JSON_NOTES = "notes";
-
- public final static String GTASK_JSON_PARENT_ID = "parent_id";
-
- public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id";
-
- public final static String GTASK_JSON_RESULTS = "results";
-
- public final static String GTASK_JSON_SOURCE_LIST = "source_list";
-
- public final static String GTASK_JSON_TASKS = "tasks";
-
- public final static String GTASK_JSON_TYPE = "type";
-
- public final static String GTASK_JSON_TYPE_GROUP = "GROUP";
-
- public final static String GTASK_JSON_TYPE_TASK = "TASK";
-
- public final static String GTASK_JSON_USER = "user";
-
- public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]";
-
- public final static String FOLDER_DEFAULT = "Default";
-
- public final static String FOLDER_CALL_NOTE = "Call_Note";
-
- public final static String FOLDER_META = "METADATA";
-
- public final static String META_HEAD_GTASK_ID = "meta_gid";
-
- public final static String META_HEAD_NOTE = "meta_note";
-
- public final static String META_HEAD_DATA = "meta_data";
-
- public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE";
-
-}
diff --git a/Notes-master/src/net/micode/notes/tool/ResourceParser.java b/Notes-master/src/net/micode/notes/tool/ResourceParser.java
deleted file mode 100644
index 1ad3ad6..0000000
--- a/Notes-master/src/net/micode/notes/tool/ResourceParser.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.tool;
-
-import android.content.Context;
-import android.preference.PreferenceManager;
-
-import net.micode.notes.R;
-import net.micode.notes.ui.NotesPreferenceActivity;
-
-public class ResourceParser {
-
- public static final int YELLOW = 0;
- public static final int BLUE = 1;
- public static final int WHITE = 2;
- public static final int GREEN = 3;
- public static final int RED = 4;
-
- public static final int BG_DEFAULT_COLOR = YELLOW;
-
- public static final int TEXT_SMALL = 0;
- public static final int TEXT_MEDIUM = 1;
- public static final int TEXT_LARGE = 2;
- public static final int TEXT_SUPER = 3;
-
- public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM;
-
- public static class NoteBgResources {
- private final static int [] BG_EDIT_RESOURCES = new int [] {
- R.drawable.edit_yellow,
- R.drawable.edit_blue,
- R.drawable.edit_white,
- R.drawable.edit_green,
- R.drawable.edit_red
- };
-
- private final static int [] BG_EDIT_TITLE_RESOURCES = new int [] {
- R.drawable.edit_title_yellow,
- R.drawable.edit_title_blue,
- R.drawable.edit_title_white,
- R.drawable.edit_title_green,
- R.drawable.edit_title_red
- };
-
- public static int getNoteBgResource(int id) {
- return BG_EDIT_RESOURCES[id];
- }
-
- public static int getNoteTitleBgResource(int id) {
- return BG_EDIT_TITLE_RESOURCES[id];
- }
- }
-
- public static int getDefaultBgId(Context context) {
- if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(
- NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) {
- return (int) (Math.random() * NoteBgResources.BG_EDIT_RESOURCES.length);
- } else {
- return BG_DEFAULT_COLOR;
- }
- }
-
- public static class NoteItemBgResources {
- private final static int [] BG_FIRST_RESOURCES = new int [] {
- R.drawable.list_yellow_up,
- R.drawable.list_blue_up,
- R.drawable.list_white_up,
- R.drawable.list_green_up,
- R.drawable.list_red_up
- };
-
- private final static int [] BG_NORMAL_RESOURCES = new int [] {
- R.drawable.list_yellow_middle,
- R.drawable.list_blue_middle,
- R.drawable.list_white_middle,
- R.drawable.list_green_middle,
- R.drawable.list_red_middle
- };
-
- private final static int [] BG_LAST_RESOURCES = new int [] {
- R.drawable.list_yellow_down,
- R.drawable.list_blue_down,
- R.drawable.list_white_down,
- R.drawable.list_green_down,
- R.drawable.list_red_down,
- };
-
- private final static int [] BG_SINGLE_RESOURCES = new int [] {
- R.drawable.list_yellow_single,
- R.drawable.list_blue_single,
- R.drawable.list_white_single,
- R.drawable.list_green_single,
- R.drawable.list_red_single
- };
-
- public static int getNoteBgFirstRes(int id) {
- return BG_FIRST_RESOURCES[id];
- }
-
- public static int getNoteBgLastRes(int id) {
- return BG_LAST_RESOURCES[id];
- }
-
- public static int getNoteBgSingleRes(int id) {
- return BG_SINGLE_RESOURCES[id];
- }
-
- public static int getNoteBgNormalRes(int id) {
- return BG_NORMAL_RESOURCES[id];
- }
-
- public static int getFolderBgRes() {
- return R.drawable.list_folder;
- }
- }
-
- public static class WidgetBgResources {
- private final static int [] BG_2X_RESOURCES = new int [] {
- R.drawable.widget_2x_yellow,
- R.drawable.widget_2x_blue,
- R.drawable.widget_2x_white,
- R.drawable.widget_2x_green,
- R.drawable.widget_2x_red,
- };
-
- public static int getWidget2xBgResource(int id) {
- return BG_2X_RESOURCES[id];
- }
-
- private final static int [] BG_4X_RESOURCES = new int [] {
- R.drawable.widget_4x_yellow,
- R.drawable.widget_4x_blue,
- R.drawable.widget_4x_white,
- R.drawable.widget_4x_green,
- R.drawable.widget_4x_red
- };
-
- public static int getWidget4xBgResource(int id) {
- return BG_4X_RESOURCES[id];
- }
- }
-
- public static class TextAppearanceResources {
- private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] {
- R.style.TextAppearanceNormal,
- R.style.TextAppearanceMedium,
- R.style.TextAppearanceLarge,
- R.style.TextAppearanceSuper
- };
-
- public static int getTexAppearanceResource(int id) {
- /**
- * HACKME: Fix bug of store the resource id in shared preference.
- * The id may larger than the length of resources, in this case,
- * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE}
- */
- if (id >= TEXTAPPEARANCE_RESOURCES.length) {
- return BG_DEFAULT_FONT_SIZE;
- }
- return TEXTAPPEARANCE_RESOURCES[id];
- }
-
- public static int getResourcesSize() {
- return TEXTAPPEARANCE_RESOURCES.length;
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java b/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java
deleted file mode 100644
index 85723be..0000000
--- a/Notes-master/src/net/micode/notes/ui/AlarmAlertActivity.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.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 {
- private long mNoteId;
- private String mSnippet;
- private static final int SNIPPET_PREW_MAX_LEN = 60;
- MediaPlayer mPlayer;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
-
- final Window win = getWindow();
- win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
-
- if (!isScreenOn()) {
- win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
- }
-
- Intent intent = getIntent();
-
- try {
- mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
- mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
- mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
- SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)
- : mSnippet;
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- return;
- }
-
- mPlayer = new MediaPlayer();
- if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
- showActionDialog();
- playAlarmSound();
- } else {
- 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();
- } catch (SecurityException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalStateException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- private void showActionDialog() {
- AlertDialog.Builder dialog = new AlertDialog.Builder(this);
- dialog.setTitle(R.string.app_name);
- dialog.setMessage(mSnippet);
- dialog.setPositiveButton(R.string.notealert_ok, this);
- if (isScreenOn()) {
- dialog.setNegativeButton(R.string.notealert_enter, this);
- }
- dialog.show().setOnDismissListener(this);
- }
-
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_NEGATIVE:
- Intent intent = new Intent(this, NoteEditActivity.class);
- intent.setAction(Intent.ACTION_VIEW);
- intent.putExtra(Intent.EXTRA_UID, mNoteId);
- startActivity(intent);
- break;
- default:
- break;
- }
- }
-
- public void onDismiss(DialogInterface dialog) {
- stopAlarmSound();
- finish();
- }
-
- private void stopAlarmSound() {
- if (mPlayer != null) {
- mPlayer.stop();
- mPlayer.release();
- mPlayer = null;
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java b/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java
deleted file mode 100644
index f221202..0000000
--- a/Notes-master/src/net/micode/notes/ui/AlarmInitReceiver.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.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 {
-
- 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;
-
- @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();
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java b/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java
deleted file mode 100644
index 54e503b..0000000
--- a/Notes-master/src/net/micode/notes/ui/AlarmReceiver.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-public class AlarmReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- intent.setClass(context, AlarmAlertActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/DateTimePicker.java b/Notes-master/src/net/micode/notes/ui/DateTimePicker.java
deleted file mode 100644
index 496b0cd..0000000
--- a/Notes-master/src/net/micode/notes/ui/DateTimePicker.java
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import java.text.DateFormatSymbols;
-import java.util.Calendar;
-
-import net.micode.notes.R;
-
-
-import android.content.Context;
-import android.text.format.DateFormat;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.NumberPicker;
-
-public class DateTimePicker extends FrameLayout {
-
- private static final boolean DEFAULT_ENABLE_STATE = true;
-
- private static final int HOURS_IN_HALF_DAY = 12;
- private static final int HOURS_IN_ALL_DAY = 24;
- private static final int DAYS_IN_ALL_WEEK = 7;
- private static final int DATE_SPINNER_MIN_VAL = 0;
- private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1;
- private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0;
- private static final int HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW = 23;
- private static final int HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW = 1;
- private static final int HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW = 12;
- private static final int MINUT_SPINNER_MIN_VAL = 0;
- private static final int MINUT_SPINNER_MAX_VAL = 59;
- private static final int AMPM_SPINNER_MIN_VAL = 0;
- private static final int AMPM_SPINNER_MAX_VAL = 1;
-
- private final NumberPicker mDateSpinner;
- private final NumberPicker mHourSpinner;
- private final NumberPicker mMinuteSpinner;
- private final NumberPicker mAmPmSpinner;
- private Calendar mDate;
-
- private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK];
-
- private boolean mIsAm;
-
- private boolean mIs24HourView;
-
- private boolean mIsEnabled = DEFAULT_ENABLE_STATE;
-
- private boolean mInitialising;
-
- private OnDateTimeChangedListener mOnDateTimeChangedListener;
-
- private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal);
- updateDateControl();
- onDateTimeChanged();
- }
- };
-
- private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- boolean isDateChanged = false;
- Calendar cal = Calendar.getInstance();
- if (!mIs24HourView) {
- if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) {
- cal.setTimeInMillis(mDate.getTimeInMillis());
- cal.add(Calendar.DAY_OF_YEAR, 1);
- isDateChanged = true;
- } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
- cal.setTimeInMillis(mDate.getTimeInMillis());
- cal.add(Calendar.DAY_OF_YEAR, -1);
- isDateChanged = true;
- }
- if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY ||
- oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) {
- mIsAm = !mIsAm;
- updateAmPmControl();
- }
- } else {
- if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) {
- cal.setTimeInMillis(mDate.getTimeInMillis());
- cal.add(Calendar.DAY_OF_YEAR, 1);
- isDateChanged = true;
- } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) {
- cal.setTimeInMillis(mDate.getTimeInMillis());
- cal.add(Calendar.DAY_OF_YEAR, -1);
- isDateChanged = true;
- }
- }
- int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY);
- mDate.set(Calendar.HOUR_OF_DAY, newHour);
- onDateTimeChanged();
- if (isDateChanged) {
- setCurrentYear(cal.get(Calendar.YEAR));
- setCurrentMonth(cal.get(Calendar.MONTH));
- setCurrentDay(cal.get(Calendar.DAY_OF_MONTH));
- }
- }
- };
-
- private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- int minValue = mMinuteSpinner.getMinValue();
- int maxValue = mMinuteSpinner.getMaxValue();
- int offset = 0;
- if (oldVal == maxValue && newVal == minValue) {
- offset += 1;
- } else if (oldVal == minValue && newVal == maxValue) {
- offset -= 1;
- }
- if (offset != 0) {
- mDate.add(Calendar.HOUR_OF_DAY, offset);
- mHourSpinner.setValue(getCurrentHour());
- updateDateControl();
- int newHour = getCurrentHourOfDay();
- if (newHour >= HOURS_IN_HALF_DAY) {
- mIsAm = false;
- updateAmPmControl();
- } else {
- mIsAm = true;
- updateAmPmControl();
- }
- }
- mDate.set(Calendar.MINUTE, newVal);
- onDateTimeChanged();
- }
- };
-
- private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- mIsAm = !mIsAm;
- if (mIsAm) {
- mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY);
- } else {
- mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY);
- }
- updateAmPmControl();
- onDateTimeChanged();
- }
- };
-
- public interface OnDateTimeChangedListener {
- void onDateTimeChanged(DateTimePicker view, int year, int month,
- int dayOfMonth, int hourOfDay, int minute);
- }
-
- public DateTimePicker(Context context) {
- this(context, System.currentTimeMillis());
- }
-
- public DateTimePicker(Context context, long date) {
- this(context, date, DateFormat.is24HourFormat(context));
- }
-
- public DateTimePicker(Context context, long date, boolean is24HourView) {
- super(context);
- mDate = Calendar.getInstance();
- mInitialising = true;
- mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY;
- inflate(context, R.layout.datetime_picker, this);
-
- mDateSpinner = (NumberPicker) findViewById(R.id.date);
- mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL);
- mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL);
- mDateSpinner.setOnValueChangedListener(mOnDateChangedListener);
-
- mHourSpinner = (NumberPicker) findViewById(R.id.hour);
- mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);
- mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
- mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL);
- mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL);
- mMinuteSpinner.setOnLongPressUpdateInterval(100);
- mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);
-
- String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings();
- mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm);
- mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL);
- mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL);
- mAmPmSpinner.setDisplayedValues(stringsForAmPm);
- mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener);
-
- // update controls to initial state
- updateDateControl();
- updateHourControl();
- updateAmPmControl();
-
- set24HourView(is24HourView);
-
- // set to current time
- setCurrentDate(date);
-
- setEnabled(isEnabled());
-
- // set the content descriptions
- mInitialising = false;
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- if (mIsEnabled == enabled) {
- return;
- }
- super.setEnabled(enabled);
- mDateSpinner.setEnabled(enabled);
- mMinuteSpinner.setEnabled(enabled);
- mHourSpinner.setEnabled(enabled);
- mAmPmSpinner.setEnabled(enabled);
- mIsEnabled = enabled;
- }
-
- @Override
- public boolean isEnabled() {
- return mIsEnabled;
- }
-
- /**
- * Get the current date in millis
- *
- * @return the current date in millis
- */
- public long getCurrentDateInTimeMillis() {
- return mDate.getTimeInMillis();
- }
-
- /**
- * Set the current date
- *
- * @param date The current date in millis
- */
- public void setCurrentDate(long date) {
- Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(date);
- setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
- cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));
- }
-
- /**
- * Set the current date
- *
- * @param year The current year
- * @param month The current month
- * @param dayOfMonth The current dayOfMonth
- * @param hourOfDay The current hourOfDay
- * @param minute The current minute
- */
- public void setCurrentDate(int year, int month,
- int dayOfMonth, int hourOfDay, int minute) {
- setCurrentYear(year);
- setCurrentMonth(month);
- setCurrentDay(dayOfMonth);
- setCurrentHour(hourOfDay);
- setCurrentMinute(minute);
- }
-
- /**
- * Get current year
- *
- * @return The current year
- */
- public int getCurrentYear() {
- return mDate.get(Calendar.YEAR);
- }
-
- /**
- * Set current year
- *
- * @param year The current year
- */
- public void setCurrentYear(int year) {
- if (!mInitialising && year == getCurrentYear()) {
- return;
- }
- mDate.set(Calendar.YEAR, year);
- updateDateControl();
- onDateTimeChanged();
- }
-
- /**
- * Get current month in the year
- *
- * @return The current month in the year
- */
- public int getCurrentMonth() {
- return mDate.get(Calendar.MONTH);
- }
-
- /**
- * Set current month in the year
- *
- * @param month The month in the year
- */
- public void setCurrentMonth(int month) {
- if (!mInitialising && month == getCurrentMonth()) {
- return;
- }
- mDate.set(Calendar.MONTH, month);
- updateDateControl();
- onDateTimeChanged();
- }
-
- /**
- * Get current day of the month
- *
- * @return The day of the month
- */
- public int getCurrentDay() {
- return mDate.get(Calendar.DAY_OF_MONTH);
- }
-
- /**
- * Set current day of the month
- *
- * @param dayOfMonth The day of the month
- */
- public void setCurrentDay(int dayOfMonth) {
- if (!mInitialising && dayOfMonth == getCurrentDay()) {
- return;
- }
- mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
- updateDateControl();
- onDateTimeChanged();
- }
-
- /**
- * Get current hour in 24 hour mode, in the range (0~23)
- * @return The current hour in 24 hour mode
- */
- public int getCurrentHourOfDay() {
- return mDate.get(Calendar.HOUR_OF_DAY);
- }
-
- private int getCurrentHour() {
- if (mIs24HourView){
- return getCurrentHourOfDay();
- } else {
- int hour = getCurrentHourOfDay();
- if (hour > HOURS_IN_HALF_DAY) {
- return hour - HOURS_IN_HALF_DAY;
- } else {
- return hour == 0 ? HOURS_IN_HALF_DAY : hour;
- }
- }
- }
-
- /**
- * Set current hour in 24 hour mode, in the range (0~23)
- *
- * @param hourOfDay
- */
- public void setCurrentHour(int hourOfDay) {
- if (!mInitialising && hourOfDay == getCurrentHourOfDay()) {
- return;
- }
- mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
- if (!mIs24HourView) {
- if (hourOfDay >= HOURS_IN_HALF_DAY) {
- mIsAm = false;
- if (hourOfDay > HOURS_IN_HALF_DAY) {
- hourOfDay -= HOURS_IN_HALF_DAY;
- }
- } else {
- mIsAm = true;
- if (hourOfDay == 0) {
- hourOfDay = HOURS_IN_HALF_DAY;
- }
- }
- updateAmPmControl();
- }
- mHourSpinner.setValue(hourOfDay);
- onDateTimeChanged();
- }
-
- /**
- * Get currentMinute
- *
- * @return The Current Minute
- */
- public int getCurrentMinute() {
- return mDate.get(Calendar.MINUTE);
- }
-
- /**
- * Set current minute
- */
- public void setCurrentMinute(int minute) {
- if (!mInitialising && minute == getCurrentMinute()) {
- return;
- }
- mMinuteSpinner.setValue(minute);
- mDate.set(Calendar.MINUTE, minute);
- onDateTimeChanged();
- }
-
- /**
- * @return true if this is in 24 hour view else false.
- */
- public boolean is24HourView () {
- return mIs24HourView;
- }
-
- /**
- * Set whether in 24 hour or AM/PM mode.
- *
- * @param is24HourView True for 24 hour mode. False for AM/PM mode.
- */
- public void set24HourView(boolean is24HourView) {
- if (mIs24HourView == is24HourView) {
- return;
- }
- mIs24HourView = is24HourView;
- mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE);
- int hour = getCurrentHourOfDay();
- updateHourControl();
- setCurrentHour(hour);
- updateAmPmControl();
- }
-
- private void updateDateControl() {
- Calendar cal = Calendar.getInstance();
- cal.setTimeInMillis(mDate.getTimeInMillis());
- cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1);
- mDateSpinner.setDisplayedValues(null);
- for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) {
- cal.add(Calendar.DAY_OF_YEAR, 1);
- mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);
- }
- mDateSpinner.setDisplayedValues(mDateDisplayValues);
- mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2);
- mDateSpinner.invalidate();
- }
-
- private void updateAmPmControl() {
- if (mIs24HourView) {
- mAmPmSpinner.setVisibility(View.GONE);
- } else {
- int index = mIsAm ? Calendar.AM : Calendar.PM;
- mAmPmSpinner.setValue(index);
- mAmPmSpinner.setVisibility(View.VISIBLE);
- }
- }
-
- private void updateHourControl() {
- if (mIs24HourView) {
- mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW);
- mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW);
- } else {
- mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW);
- mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW);
- }
- }
-
- /**
- * Set the callback that indicates the 'Set' button has been pressed.
- * @param callback the callback, if null will do nothing
- */
- public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) {
- mOnDateTimeChangedListener = callback;
- }
-
- private void onDateTimeChanged() {
- if (mOnDateTimeChangedListener != null) {
- mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(),
- getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute());
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java b/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java
deleted file mode 100644
index 2c47ba4..0000000
--- a/Notes-master/src/net/micode/notes/ui/DateTimePickerDialog.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import java.util.Calendar;
-
-import net.micode.notes.R;
-import net.micode.notes.ui.DateTimePicker;
-import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.text.format.DateFormat;
-import android.text.format.DateUtils;
-
-public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
-
- private Calendar mDate = Calendar.getInstance();
- private boolean mIs24HourView;
- private OnDateTimeSetListener mOnDateTimeSetListener;
- private DateTimePicker mDateTimePicker;
-
- public interface OnDateTimeSetListener {
- void OnDateTimeSet(AlertDialog dialog, long date);
- }
-
- public DateTimePickerDialog(Context context, long date) {
- super(context);
- mDateTimePicker = new DateTimePicker(context);
- setView(mDateTimePicker);
- mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
- public void onDateTimeChanged(DateTimePicker view, int year, int month,
- int dayOfMonth, int hourOfDay, int minute) {
- mDate.set(Calendar.YEAR, year);
- mDate.set(Calendar.MONTH, month);
- mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
- mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
- mDate.set(Calendar.MINUTE, minute);
- updateTitle(mDate.getTimeInMillis());
- }
- });
- mDate.setTimeInMillis(date);
- mDate.set(Calendar.SECOND, 0);
- mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
- setButton(context.getString(R.string.datetime_dialog_ok), this);
- setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
- set24HourView(DateFormat.is24HourFormat(this.getContext()));
- updateTitle(mDate.getTimeInMillis());
- }
-
- public void set24HourView(boolean is24HourView) {
- mIs24HourView = is24HourView;
- }
-
- public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
- mOnDateTimeSetListener = callBack;
- }
-
- private void updateTitle(long date) {
- int flag =
- DateUtils.FORMAT_SHOW_YEAR |
- DateUtils.FORMAT_SHOW_DATE |
- DateUtils.FORMAT_SHOW_TIME;
- flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;
- setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
- }
-
- public void onClick(DialogInterface arg0, int arg1) {
- if (mOnDateTimeSetListener != null) {
- mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
- }
- }
-
-}
\ No newline at end of file
diff --git a/Notes-master/src/net/micode/notes/ui/DropdownMenu.java b/Notes-master/src/net/micode/notes/ui/DropdownMenu.java
deleted file mode 100644
index 613dc74..0000000
--- a/Notes-master/src/net/micode/notes/ui/DropdownMenu.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.PopupMenu;
-import android.widget.PopupMenu.OnMenuItemClickListener;
-
-import net.micode.notes.R;
-
-public class DropdownMenu {
- private Button mButton;
- private PopupMenu mPopupMenu;
- private Menu mMenu;
-
- public DropdownMenu(Context context, Button button, int menuId) {
- mButton = button;
- mButton.setBackgroundResource(R.drawable.dropdown_icon);
- mPopupMenu = new PopupMenu(context, mButton);
- mMenu = mPopupMenu.getMenu();
- mPopupMenu.getMenuInflater().inflate(menuId, mMenu);
- mButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mPopupMenu.show();
- }
- });
- }
-
- public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) {
- if (mPopupMenu != null) {
- mPopupMenu.setOnMenuItemClickListener(listener);
- }
- }
-
- public MenuItem findItem(int id) {
- return mMenu.findItem(id);
- }
-
- public void setTitle(CharSequence title) {
- mButton.setText(title);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java b/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java
deleted file mode 100644
index 96b77da..0000000
--- a/Notes-master/src/net/micode/notes/ui/FoldersListAdapter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.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;
-
-
-public class FoldersListAdapter extends CursorAdapter {
- 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);
- }
-
- @Override
- public void bindView(View view, Context context, Cursor cursor) {
- if (view instanceof FolderListItem) {
- String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
- .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
- ((FolderListItem) view).bind(folderName);
- }
- }
-
- public String getFolderName(Context context, int position) {
- Cursor cursor = (Cursor) getItem(position);
- return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
- .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
- }
-
- private class FolderListItem extends LinearLayout {
- private TextView mName;
-
- public FolderListItem(Context context) {
- super(context);
- inflate(context, R.layout.folder_list_item, this);
- mName = (TextView) findViewById(R.id.tv_folder_name);
- }
-
- public void bind(String name) {
- mName.setText(name);
- }
- }
-
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java b/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java
deleted file mode 100644
index 96a9ff8..0000000
--- a/Notes-master/src/net/micode/notes/ui/NoteEditActivity.java
+++ /dev/null
@@ -1,873 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.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;
- }
-
- private static final Map sBgSelectorBtnsMap = new HashMap();
- static {
- sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW);
- sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED);
- sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE);
- sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN);
- sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);
- }
-
- private static final Map sBgSelectorSelectionMap = new HashMap();
- static {
- sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select);
- sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select);
- sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select);
- sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select);
- sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);
- }
-
- private static final Map sFontSizeBtnsMap = new HashMap();
- static {
- sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE);
- sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL);
- sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM);
- sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);
- }
-
- private static final Map sFontSelectorSelectionMap = new HashMap();
- static {
- sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select);
- sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select);
- sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select);
- sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
- }
-
- private static final String TAG = "NoteEditActivity";
-
- private HeadViewHolder mNoteHeaderHolder;
-
- private View mHeadViewPanel;
-
- private View mNoteBgColorSelector;
-
- private View mFontSizeSelector;
-
- private EditText mNoteEditor;
-
- private View mNoteEditorPanel;
-
- 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);
-
- if (savedInstanceState == null && !initActivityState(getIntent())) {
- finish();
- return;
- }
- initResources();
- }
-
- /**
- * Current activity may be killed when the memory is low. Once it is killed, for another time
- * user load this activity, we should restore the former state
- */
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {
- Intent intent = new Intent(Intent.ACTION_VIEW);
- intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));
- if (!initActivityState(intent)) {
- finish();
- return;
- }
- Log.d(TAG, "Restoring from killed activity");
- }
- }
-
- private boolean initActivityState(Intent intent) {
- /**
- * If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
- * then jump to the NotesListActivity
- */
- mWorkingNote = null;
- if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
- long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
- mUserQuery = "";
-
- /**
- * Starting from the searched result
- */
- if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
- noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
- mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
- }
-
- if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
- Intent jump = new Intent(this, NotesListActivity.class);
- startActivity(jump);
- showToast(R.string.error_note_not_exist);
- finish();
- return false;
- } else {
- mWorkingNote = WorkingNote.load(this, noteId);
- if (mWorkingNote == null) {
- Log.e(TAG, "load note failed with note id" + noteId);
- finish();
- return false;
- }
- }
- getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
- | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
- // 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() {
- mNoteEditor.setTextAppearance(this, TextAppearanceResources
- .getTexAppearanceResource(mFontSizeId));
- if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
- switchToListMode(mWorkingNote.getContent());
- } else {
- mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
- mNoteEditor.setSelection(mNoteEditor.getText().length());
- }
- for (Integer id : sBgSelectorSelectionMap.keySet()) {
- findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);
- }
- mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
- mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
-
- mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this,
- mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE
- | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME
- | DateUtils.FORMAT_SHOW_YEAR));
-
- /**
- * TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker
- * is not ready
- */
- showAlertHeader();
- }
-
- private void showAlertHeader() {
- if (mWorkingNote.hasClockAlert()) {
- long time = System.currentTimeMillis();
- if (time > mWorkingNote.getAlertDate()) {
- mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
- } else {
- mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
- mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
- }
- mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);
- mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);
- } else {
- mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE);
- mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE);
- };
- }
-
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- initActivityState(intent);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- /**
- * For new note without note id, we should firstly save it to
- * generate a id. If the editing note is not worth saving, there
- * is no id which is equivalent to create new note
- */
- if (!mWorkingNote.existInDatabase()) {
- saveNote();
- }
- outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());
- Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
- }
-
- @Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- if (mNoteBgColorSelector.getVisibility() == View.VISIBLE
- && !inRangeOfView(mNoteBgColorSelector, ev)) {
- mNoteBgColorSelector.setVisibility(View.GONE);
- return true;
- }
-
- if (mFontSizeSelector.getVisibility() == View.VISIBLE
- && !inRangeOfView(mFontSizeSelector, ev)) {
- mFontSizeSelector.setVisibility(View.GONE);
- return true;
- }
- return super.dispatchTouchEvent(ev);
- }
-
- private boolean inRangeOfView(View view, MotionEvent ev) {
- int []location = new int[2];
- view.getLocationOnScreen(location);
- int x = location[0];
- int y = location[1];
- if (ev.getX() < x
- || ev.getX() > (x + view.getWidth())
- || ev.getY() < y
- || ev.getY() > (y + view.getHeight())) {
- return false;
- }
- return true;
- }
-
- private void initResources() {
- mHeadViewPanel = findViewById(R.id.note_title);
- mNoteHeaderHolder = new HeadViewHolder();
- mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
- mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);
- mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);
- mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);
- mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
- mNoteEditor = (EditText) findViewById(R.id.note_edit_view);
- mNoteEditorPanel = findViewById(R.id.sv_note_edit);
- mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
- for (int id : sBgSelectorBtnsMap.keySet()) {
- ImageView iv = (ImageView) findViewById(id);
- iv.setOnClickListener(this);
- }
-
- mFontSizeSelector = findViewById(R.id.font_size_selector);
- for (int id : sFontSizeBtnsMap.keySet()) {
- View view = findViewById(id);
- view.setOnClickListener(this);
- };
- mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
- mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE);
- /**
- * HACKME: Fix bug of store the resource id in shared preference.
- * The id may larger than the length of resources, in this case,
- * return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE}
- */
- if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) {
- mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
- }
- mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- if(saveNote()) {
- Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length());
- }
- clearSettingState();
- }
-
- private void updateWidget() {
- Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
- if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
- intent.setClass(this, NoteWidgetProvider_2x.class);
- } else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) {
- intent.setClass(this, NoteWidgetProvider_4x.class);
- } else {
- Log.e(TAG, "Unspported widget type");
- return;
- }
-
- intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
- mWorkingNote.getWidgetId()
- });
-
- sendBroadcast(intent);
- setResult(RESULT_OK, intent);
- }
-
- public void onClick(View v) {
- int id = v.getId();
- if (id == R.id.btn_set_bg_color) {
- mNoteBgColorSelector.setVisibility(View.VISIBLE);
- findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- - View.VISIBLE);
- } else if (sBgSelectorBtnsMap.containsKey(id)) {
- findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- View.GONE);
- mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));
- mNoteBgColorSelector.setVisibility(View.GONE);
- } else if (sFontSizeBtnsMap.containsKey(id)) {
- findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);
- mFontSizeId = sFontSizeBtnsMap.get(id);
- mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();
- findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
- if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
- getWorkingText();
- switchToListMode(mWorkingNote.getContent());
- } else {
- mNoteEditor.setTextAppearance(this,
- TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
- }
- mFontSizeSelector.setVisibility(View.GONE);
- }
- }
-
- @Override
- public void onBackPressed() {
- if(clearSettingState()) {
- return;
- }
-
- saveNote();
- super.onBackPressed();
- }
-
- private boolean clearSettingState() {
- if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) {
- mNoteBgColorSelector.setVisibility(View.GONE);
- return true;
- } else if (mFontSizeSelector.getVisibility() == View.VISIBLE) {
- mFontSizeSelector.setVisibility(View.GONE);
- return true;
- }
- return false;
- }
-
- public void onBackgroundColorChanged() {
- findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- View.VISIBLE);
- mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
- mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- if (isFinishing()) {
- return true;
- }
- clearSettingState();
- menu.clear();
- if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {
- getMenuInflater().inflate(R.menu.call_note_edit, menu);
- } else {
- getMenuInflater().inflate(R.menu.note_edit, menu);
- }
- if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
- menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);
- } else {
- menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
- }
- if (mWorkingNote.hasClockAlert()) {
- menu.findItem(R.id.menu_alert).setVisible(false);
- } else {
- menu.findItem(R.id.menu_delete_remind).setVisible(false);
- }
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- 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:
- 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 ids = new HashSet();
- long id = mWorkingNote.getNoteId();
- if (id != Notes.ID_ROOT_FOLDER) {
- ids.add(id);
- } else {
- Log.d(TAG, "Wrong note id, should not happen");
- }
- if (!isSyncMode()) {
- if (!DataUtils.batchDeleteNotes(getContentResolver(), ids)) {
- Log.e(TAG, "Delete Note error");
- }
- } else {
- if (!DataUtils.batchMoveToFolder(getContentResolver(), ids, Notes.ID_TRASH_FOLER)) {
- Log.e(TAG, "Move notes to trash folder error, should not happens");
- }
- }
- }
- mWorkingNote.markDeleted(true);
- }
-
- private boolean isSyncMode() {
- return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
- }
-
- public void onClockAlertChanged(long date, boolean set) {
- /**
- * User could set clock to an unsaved note, so before setting the
- * alert clock, we should save the note first
- */
- if (!mWorkingNote.existInDatabase()) {
- saveNote();
- }
- if (mWorkingNote.getNoteId() > 0) {
- Intent intent = new Intent(this, AlarmReceiver.class);
- intent.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, mWorkingNote.getNoteId()));
- PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
- AlarmManager alarmManager = ((AlarmManager) getSystemService(ALARM_SERVICE));
- showAlertHeader();
- if(!set) {
- alarmManager.cancel(pendingIntent);
- } else {
- alarmManager.set(AlarmManager.RTC_WAKEUP, date, pendingIntent);
- }
- } else {
- /**
- * There is the condition that user has input nothing (the note is
- * not worthy saving), we have no note id, remind the user that he
- * should input something
- */
- Log.e(TAG, "Clock alert setting error");
- showToast(R.string.error_note_empty_for_clock);
- }
- }
-
- public void onWidgetChanged() {
- updateWidget();
- }
-
- public void onEditTextDelete(int index, String text) {
- int childCount = mEditTextList.getChildCount();
- if (childCount == 1) {
- return;
- }
-
- for (int i = index + 1; i < childCount; i++) {
- ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))
- .setIndex(i - 1);
- }
-
- mEditTextList.removeViewAt(index);
- NoteEditText edit = null;
- if(index == 0) {
- edit = (NoteEditText) mEditTextList.getChildAt(0).findViewById(
- R.id.et_edit_text);
- } else {
- edit = (NoteEditText) mEditTextList.getChildAt(index - 1).findViewById(
- R.id.et_edit_text);
- }
- int length = edit.length();
- edit.append(text);
- edit.requestFocus();
- edit.setSelection(length);
- }
-
- public void onEditTextEnter(int index, String text) {
- /**
- * Should not happen, check for debug
- */
- if(index > mEditTextList.getChildCount()) {
- Log.e(TAG, "Index out of mEditTextList boundrary, should not happen");
- }
-
- View view = getListItem(text, index);
- mEditTextList.addView(view, index);
- NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
- edit.requestFocus();
- edit.setSelection(0);
- for (int i = index + 1; i < mEditTextList.getChildCount(); i++) {
- ((NoteEditText) mEditTextList.getChildAt(i).findViewById(R.id.et_edit_text))
- .setIndex(i);
- }
- }
-
- private void switchToListMode(String text) {
- mEditTextList.removeAllViews();
- String[] items = text.split("\n");
- int index = 0;
- for (String item : items) {
- if(!TextUtils.isEmpty(item)) {
- mEditTextList.addView(getListItem(item, index));
- index++;
- }
- }
- mEditTextList.addView(getListItem("", index));
- mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();
-
- mNoteEditor.setVisibility(View.GONE);
- mEditTextList.setVisibility(View.VISIBLE);
- }
-
- private Spannable getHighlightQueryResult(String fullText, String userQuery) {
- SpannableString spannable = new SpannableString(fullText == null ? "" : fullText);
- if (!TextUtils.isEmpty(userQuery)) {
- mPattern = Pattern.compile(userQuery);
- Matcher m = mPattern.matcher(fullText);
- int start = 0;
- while (m.find(start)) {
- spannable.setSpan(
- new BackgroundColorSpan(this.getResources().getColor(
- R.color.user_query_highlight)), m.start(), m.end(),
- Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
- start = m.end();
- }
- }
- return spannable;
- }
-
- private View getListItem(String item, int index) {
- View view = LayoutInflater.from(this).inflate(R.layout.note_edit_list_item, null);
- final NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text);
- edit.setTextAppearance(this, TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
- CheckBox cb = ((CheckBox) view.findViewById(R.id.cb_edit_item));
- cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if (isChecked) {
- edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- } else {
- edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
- }
- }
- });
-
- if (item.startsWith(TAG_CHECKED)) {
- cb.setChecked(true);
- edit.setPaintFlags(edit.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
- item = item.substring(TAG_CHECKED.length(), item.length()).trim();
- } else if (item.startsWith(TAG_UNCHECKED)) {
- cb.setChecked(false);
- edit.setPaintFlags(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);
- item = item.substring(TAG_UNCHECKED.length(), item.length()).trim();
- }
-
- edit.setOnTextViewChangeListener(this);
- edit.setIndex(index);
- edit.setText(getHighlightQueryResult(item, mUserQuery));
- return view;
- }
-
- public void onTextChange(int index, boolean hasText) {
- if (index >= mEditTextList.getChildCount()) {
- Log.e(TAG, "Wrong index, should not happen");
- return;
- }
- if(hasText) {
- mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.VISIBLE);
- } else {
- mEditTextList.getChildAt(index).findViewById(R.id.cb_edit_item).setVisibility(View.GONE);
- }
- }
-
- public void onCheckListModeChanged(int oldMode, int newMode) {
- if (newMode == TextNote.MODE_CHECK_LIST) {
- switchToListMode(mNoteEditor.getText().toString());
- } else {
- if (!getWorkingText()) {
- mWorkingNote.setWorkingText(mWorkingNote.getContent().replace(TAG_UNCHECKED + " ",
- ""));
- }
- mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
- mEditTextList.setVisibility(View.GONE);
- mNoteEditor.setVisibility(View.VISIBLE);
- }
- }
-
- private boolean getWorkingText() {
- boolean hasChecked = false;
- 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();
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NoteEditText.java b/Notes-master/src/net/micode/notes/ui/NoteEditText.java
deleted file mode 100644
index 2afe2a8..0000000
--- a/Notes-master/src/net/micode/notes/ui/NoteEditText.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.text.Layout;
-import android.text.Selection;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.style.URLSpan;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.KeyEvent;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.MotionEvent;
-import android.widget.EditText;
-
-import net.micode.notes.R;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class NoteEditText extends EditText {
- private static final String TAG = "NoteEditText";
- private int mIndex;
- private int mSelectionStartBeforeDelete;
-
- private static final String SCHEME_TEL = "tel:" ;
- private static final String SCHEME_HTTP = "http:" ;
- private static final String SCHEME_EMAIL = "mailto:" ;
-
- private static final Map sSchemaActionResMap = new HashMap();
- static {
- sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel);
- sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web);
- sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email);
- }
-
- /**
- * Call by the {@link NoteEditActivity} to delete or add edit text
- */
- public interface OnTextViewChangeListener {
- /**
- * Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens
- * and the text is null
- */
- void onEditTextDelete(int index, String text);
-
- /**
- * Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER}
- * happen
- */
- void onEditTextEnter(int index, String text);
-
- /**
- * Hide or show item option when text change
- */
- void onTextChange(int index, boolean hasText);
- }
-
- private OnTextViewChangeListener mOnTextViewChangeListener;
-
- public NoteEditText(Context context) {
- super(context, null);
- mIndex = 0;
- }
-
- public void setIndex(int index) {
- mIndex = index;
- }
-
- public void setOnTextViewChangeListener(OnTextViewChangeListener listener) {
- mOnTextViewChangeListener = listener;
- }
-
- 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);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NoteItemData.java b/Notes-master/src/net/micode/notes/ui/NoteItemData.java
deleted file mode 100644
index 0f5a878..0000000
--- a/Notes-master/src/net/micode/notes/ui/NoteItemData.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.text.TextUtils;
-
-import net.micode.notes.data.Contact;
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.tool.DataUtils;
-
-
-public class NoteItemData {
- static final String [] PROJECTION = new String [] {
- NoteColumns.ID,
- NoteColumns.ALERTED_DATE,
- NoteColumns.BG_COLOR_ID,
- NoteColumns.CREATED_DATE,
- NoteColumns.HAS_ATTACHMENT,
- NoteColumns.MODIFIED_DATE,
- NoteColumns.NOTES_COUNT,
- NoteColumns.PARENT_ID,
- NoteColumns.SNIPPET,
- NoteColumns.TYPE,
- NoteColumns.WIDGET_ID,
- NoteColumns.WIDGET_TYPE,
- };
-
- private static final int ID_COLUMN = 0;
- private static final int ALERTED_DATE_COLUMN = 1;
- private static final int BG_COLOR_ID_COLUMN = 2;
- private static final int CREATED_DATE_COLUMN = 3;
- private static final int HAS_ATTACHMENT_COLUMN = 4;
- private static final int MODIFIED_DATE_COLUMN = 5;
- private static final int NOTES_COUNT_COLUMN = 6;
- private static final int PARENT_ID_COLUMN = 7;
- private static final int SNIPPET_COLUMN = 8;
- private static final int TYPE_COLUMN = 9;
- private static final int WIDGET_ID_COLUMN = 10;
- private static final int WIDGET_TYPE_COLUMN = 11;
-
- private long mId;
- private long mAlertDate;
- private int mBgColorId;
- private long mCreatedDate;
- private boolean mHasAttachment;
- private long mModifiedDate;
- private int mNotesCount;
- private long mParentId;
- private String mSnippet;
- private int mType;
- private int mWidgetId;
- private int mWidgetType;
- private String mName;
- private String mPhoneNumber;
-
- private boolean mIsLastItem;
- private boolean mIsFirstItem;
- private boolean mIsOnlyOneItem;
- private boolean mIsOneNoteFollowingFolder;
- private boolean mIsMultiNotesFollowingFolder;
-
- public NoteItemData(Context context, Cursor cursor) {
- mId = cursor.getLong(ID_COLUMN);
- mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN);
- mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);
- mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN);
- mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false;
- mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN);
- mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);
- mParentId = cursor.getLong(PARENT_ID_COLUMN);
- mSnippet = cursor.getString(SNIPPET_COLUMN);
- mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace(
- NoteEditActivity.TAG_UNCHECKED, "");
- mType = cursor.getInt(TYPE_COLUMN);
- mWidgetId = cursor.getInt(WIDGET_ID_COLUMN);
- mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN);
-
- mPhoneNumber = "";
- if (mParentId == Notes.ID_CALL_RECORD_FOLDER) {
- mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId);
- if (!TextUtils.isEmpty(mPhoneNumber)) {
- mName = Contact.getContact(context, mPhoneNumber);
- if (mName == null) {
- mName = mPhoneNumber;
- }
- }
- }
-
- if (mName == null) {
- mName = "";
- }
- checkPostion(cursor);
- }
-
- private void checkPostion(Cursor cursor) {
- mIsLastItem = cursor.isLast() ? true : false;
- mIsFirstItem = cursor.isFirst() ? true : false;
- mIsOnlyOneItem = (cursor.getCount() == 1);
- mIsMultiNotesFollowingFolder = false;
- mIsOneNoteFollowingFolder = false;
-
- if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {
- int position = cursor.getPosition();
- if (cursor.moveToPrevious()) {
- if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER
- || cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {
- if (cursor.getCount() > (position + 1)) {
- mIsMultiNotesFollowingFolder = true;
- } else {
- mIsOneNoteFollowingFolder = true;
- }
- }
- if (!cursor.moveToNext()) {
- throw new IllegalStateException("cursor move to previous but can't move back");
- }
- }
- }
- }
-
- public boolean isOneFollowingFolder() {
- return mIsOneNoteFollowingFolder;
- }
-
- public boolean isMultiFollowingFolder() {
- return mIsMultiNotesFollowingFolder;
- }
-
- public boolean isLast() {
- return mIsLastItem;
- }
-
- public String getCallName() {
- return mName;
- }
-
- public boolean isFirst() {
- return mIsFirstItem;
- }
-
- public boolean isSingle() {
- return mIsOnlyOneItem;
- }
-
- public long getId() {
- return mId;
- }
-
- public long getAlertDate() {
- return mAlertDate;
- }
-
- public long getCreatedDate() {
- return mCreatedDate;
- }
-
- public boolean hasAttachment() {
- return mHasAttachment;
- }
-
- public long getModifiedDate() {
- return mModifiedDate;
- }
-
- public int getBgColorId() {
- return mBgColorId;
- }
-
- public long getParentId() {
- return mParentId;
- }
-
- public int getNotesCount() {
- return mNotesCount;
- }
-
- public long getFolderId () {
- return mParentId;
- }
-
- public int getType() {
- return mType;
- }
-
- public int getWidgetType() {
- return mWidgetType;
- }
-
- public int getWidgetId() {
- return mWidgetId;
- }
-
- public String getSnippet() {
- return mSnippet;
- }
-
- public boolean hasAlert() {
- return (mAlertDate > 0);
- }
-
- public boolean isCallRecord() {
- return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber));
- }
-
- public static int getNoteType(Cursor cursor) {
- return cursor.getInt(TYPE_COLUMN);
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NotesListActivity.java b/Notes-master/src/net/micode/notes/ui/NotesListActivity.java
deleted file mode 100644
index e843aec..0000000
--- a/Notes-master/src/net/micode/notes/ui/NotesListActivity.java
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.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;
-
- 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();
- break;
- default:
- return false;
- }
- return true;
- }
- }
-
- private class NewNoteOnTouchListener implements OnTouchListener {
-
- public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN: {
- Display display = getWindowManager().getDefaultDisplay();
- int screenHeight = display.getHeight();
- int newNoteViewHeight = mAddNewNote.getHeight();
- int start = screenHeight - newNoteViewHeight;
- int eventY = start + (int) event.getY();
- /**
- * Minus TitleBar's height
- */
- if (mState == ListEditState.SUB_FOLDER) {
- eventY -= mTitleBar.getHeight();
- start -= mTitleBar.getHeight();
- }
- /**
- * HACKME:When click the transparent part of "New Note" button, dispatch
- * the event to the list view behind this button. The transparent part of
- * "New Note" button could be expressed by formula y=-0.12x+94(Unit:pixel)
- * and the line top of the button. The coordinate based on left of the "New
- * Note" button. The 94 represents maximum height of the transparent part.
- * Notice that, if the background of the button changes, the formula should
- * also change. This is very bad, just for the UI designer's strong requirement.
- */
- if (event.getY() < (event.getX() * (-0.12) + 94)) {
- View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1
- - mNotesListView.getFooterViewsCount());
- if (view != null && view.getBottom() > start
- && (view.getTop() < (start + 94))) {
- mOriginY = (int) event.getY();
- mDispatchY = eventY;
- event.setLocation(event.getX(), mDispatchY);
- mDispatch = true;
- return mNotesListView.dispatchTouchEvent(event);
- }
- }
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- if (mDispatch) {
- mDispatchY += (int) event.getY() - mOriginY;
- event.setLocation(event.getX(), mDispatchY);
- return mNotesListView.dispatchTouchEvent(event);
- }
- break;
- }
- default: {
- if (mDispatch) {
- event.setLocation(event.getX(), mDispatchY);
- mDispatch = false;
- return mNotesListView.dispatchTouchEvent(event);
- }
- break;
- }
- }
- return false;
- }
-
- };
-
- private void startAsyncNotesListQuery() {
- String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
- : NORMAL_SELECTION;
- mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
- Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] {
- String.valueOf(mCurrentFolderId)
- }, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
- }
-
- private final class BackgroundQueryHandler extends AsyncQueryHandler {
- public BackgroundQueryHandler(ContentResolver contentResolver) {
- super(contentResolver);
- }
-
- @Override
- protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
- switch (token) {
- case FOLDER_NOTE_LIST_QUERY_TOKEN:
- mNotesListAdapter.changeCursor(cursor);
- break;
- case FOLDER_LIST_QUERY_TOKEN:
- if (cursor != null && cursor.getCount() > 0) {
- showFolderListMenu(cursor);
- } else {
- Log.e(TAG, "Query folder failed");
- }
- break;
- default:
- return;
- }
- }
- }
-
- private void showFolderListMenu(Cursor cursor) {
- AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(R.string.menu_title_select_folder);
- final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor);
- builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
-
- public void onClick(DialogInterface dialog, int which) {
- DataUtils.batchMoveToFolder(mContentResolver,
- mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which));
- Toast.makeText(
- NotesListActivity.this,
- getString(R.string.format_move_notes_to_folder,
- mNotesListAdapter.getSelectedCount(),
- adapter.getFolderName(NotesListActivity.this, which)),
- Toast.LENGTH_SHORT).show();
- mModeCallBack.finishActionMode();
- }
- });
- builder.show();
- }
-
- private void createNewNote() {
- Intent intent = new Intent(this, NoteEditActivity.class);
- intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
- intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId);
- this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
- }
-
- private void batchDelete() {
- new AsyncTask>() {
- protected HashSet doInBackground(Void... unused) {
- HashSet widgets = mNotesListAdapter.getSelectedWidget();
- if (!isSyncMode()) {
- // if not synced, delete notes directly
- if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
- .getSelectedItemIds())) {
- } else {
- Log.e(TAG, "Delete notes error, should not happens");
- }
- } else {
- // in sync mode, we'll move the deleted note into the trash
- // folder
- if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
- .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
- Log.e(TAG, "Move notes to trash folder error, should not happens");
- }
- }
- return widgets;
- }
-
- @Override
- protected void onPostExecute(HashSet widgets) {
- if (widgets != null) {
- for (AppWidgetAttribute widget : widgets) {
- if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
- && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
- updateWidget(widget.widgetId, widget.widgetType);
- }
- }
- }
- mModeCallBack.finishActionMode();
- }
- }.execute();
- }
-
- private void deleteFolder(long folderId) {
- if (folderId == Notes.ID_ROOT_FOLDER) {
- Log.e(TAG, "Wrong folder id, should not happen " + folderId);
- return;
- }
-
- HashSet ids = new HashSet();
- ids.add(folderId);
- HashSet widgets = DataUtils.getFolderNoteWidget(mContentResolver,
- folderId);
- if (!isSyncMode()) {
- // if not synced, delete folder directly
- DataUtils.batchDeleteNotes(mContentResolver, ids);
- } else {
- // in sync mode, we'll move the deleted folder into the trash folder
- DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
- }
- if (widgets != null) {
- for (AppWidgetAttribute widget : widgets) {
- if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
- && widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
- updateWidget(widget.widgetId, widget.widgetType);
- }
- }
- }
- }
-
- private void openNode(NoteItemData data) {
- Intent intent = new Intent(this, NoteEditActivity.class);
- intent.setAction(Intent.ACTION_VIEW);
- intent.putExtra(Intent.EXTRA_UID, data.getId());
- this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE);
- }
-
- private void openFolder(NoteItemData data) {
- mCurrentFolderId = data.getId();
- startAsyncNotesListQuery();
- if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
- mState = ListEditState.CALL_RECORD_FOLDER;
- mAddNewNote.setVisibility(View.GONE);
- } else {
- mState = ListEditState.SUB_FOLDER;
- }
- if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
- mTitleBar.setText(R.string.call_record_folder_name);
- } else {
- mTitleBar.setText(data.getSnippet());
- }
- mTitleBar.setVisibility(View.VISIBLE);
- }
-
- public void onClick(View v) {
- 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) {
- 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() {
- final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this);
- new AsyncTask() {
-
- @Override
- protected Integer doInBackground(Void... unused) {
- return backup.exportToText();
- }
-
- @Override
- protected void onPostExecute(Integer result) {
- if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
- AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.failed_sdcard_export));
- builder.setMessage(NotesListActivity.this
- .getString(R.string.error_sdcard_unmounted));
- builder.setPositiveButton(android.R.string.ok, null);
- builder.show();
- } else if (result == BackupUtils.STATE_SUCCESS) {
- AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.success_sdcard_export));
- builder.setMessage(NotesListActivity.this.getString(
- R.string.format_exported_file_location, backup
- .getExportedTextFileName(), backup.getExportedTextFileDir()));
- builder.setPositiveButton(android.R.string.ok, null);
- builder.show();
- } else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
- AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
- builder.setTitle(NotesListActivity.this
- .getString(R.string.failed_sdcard_export));
- builder.setMessage(NotesListActivity.this
- .getString(R.string.error_sdcard_export));
- builder.setPositiveButton(android.R.string.ok, null);
- builder.show();
- }
- }
-
- }.execute();
- }
-
- 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;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java b/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java
deleted file mode 100644
index 51c9cb9..0000000
--- a/Notes-master/src/net/micode/notes/ui/NotesListAdapter.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.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 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();
- 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;
- }
-
- public void selectAll(boolean checked) {
- Cursor cursor = getCursor();
- for (int i = 0; i < getCount(); i++) {
- if (cursor.moveToPosition(i)) {
- if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) {
- setCheckedItem(i, checked);
- }
- }
- }
- }
-
- public HashSet getSelectedItemIds() {
- HashSet itemSet = new HashSet();
- 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;
- }
-
- public HashSet getSelectedWidget() {
- HashSet itemSet = new HashSet();
- 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 values = mSelectedIndex.values();
- if (null == values) {
- return 0;
- }
- Iterator 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;
- }
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NotesListItem.java b/Notes-master/src/net/micode/notes/ui/NotesListItem.java
deleted file mode 100644
index 1221e80..0000000
--- a/Notes-master/src/net/micode/notes/ui/NotesListItem.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.content.Context;
-import android.text.format.DateUtils;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.tool.DataUtils;
-import net.micode.notes.tool.ResourceParser.NoteItemBgResources;
-
-
-public class NotesListItem extends LinearLayout {
- private ImageView mAlert;
- private TextView mTitle;
- private TextView mTime;
- private TextView mCallName;
- private NoteItemData mItemData;
- private CheckBox mCheckBox;
-
- public NotesListItem(Context context) {
- super(context);
- inflate(context, R.layout.note_item, this);
- mAlert = (ImageView) findViewById(R.id.iv_alert_icon);
- mTitle = (TextView) findViewById(R.id.tv_title);
- mTime = (TextView) findViewById(R.id.tv_time);
- mCallName = (TextView) findViewById(R.id.tv_name);
- mCheckBox = (CheckBox) findViewById(android.R.id.checkbox);
- }
-
- public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) {
- if (choiceMode && data.getType() == Notes.TYPE_NOTE) {
- mCheckBox.setVisibility(View.VISIBLE);
- mCheckBox.setChecked(checked);
- } else {
- mCheckBox.setVisibility(View.GONE);
- }
-
- mItemData = data;
- if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
- mCallName.setVisibility(View.GONE);
- mAlert.setVisibility(View.VISIBLE);
- mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
- mTitle.setText(context.getString(R.string.call_record_folder_name)
- + context.getString(R.string.format_folder_files_count, data.getNotesCount()));
- mAlert.setImageResource(R.drawable.call_record);
- } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
- mCallName.setVisibility(View.VISIBLE);
- mCallName.setText(data.getCallName());
- mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);
- mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
- if (data.hasAlert()) {
- mAlert.setImageResource(R.drawable.clock);
- mAlert.setVisibility(View.VISIBLE);
- } else {
- mAlert.setVisibility(View.GONE);
- }
- } else {
- mCallName.setVisibility(View.GONE);
- mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
-
- if (data.getType() == Notes.TYPE_FOLDER) {
- mTitle.setText(data.getSnippet()
- + context.getString(R.string.format_folder_files_count,
- data.getNotesCount()));
- mAlert.setVisibility(View.GONE);
- } else {
- mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
- if (data.hasAlert()) {
- mAlert.setImageResource(R.drawable.clock);
- mAlert.setVisibility(View.VISIBLE);
- } else {
- mAlert.setVisibility(View.GONE);
- }
- }
- }
- mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
-
- setBackground(data);
- }
-
- private void setBackground(NoteItemData data) {
- int id = data.getBgColorId();
- if (data.getType() == Notes.TYPE_NOTE) {
- if (data.isSingle() || data.isOneFollowingFolder()) {
- setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
- } else if (data.isLast()) {
- setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
- } else if (data.isFirst() || data.isMultiFollowingFolder()) {
- setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
- } else {
- setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
- }
- } else {
- setBackgroundResource(NoteItemBgResources.getFolderBgRes());
- }
- }
-
- public NoteItemData getItemData() {
- return mItemData;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java b/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java
deleted file mode 100644
index 07c5f7e..0000000
--- a/Notes-master/src/net/micode/notes/ui/NotesPreferenceActivity.java
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.ui;
-
-import android.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);
-
- addPreferencesFromResource(R.xml.preferences);
- mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY);
- mReceiver = new GTaskReceiver();
- IntentFilter filter = new IntentFilter();
- filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME);
- registerReceiver(mReceiver, filter);
-
- mOriAccounts = null;
- View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null);
- getListView().addHeaderView(header, null, true);
- }
-
- @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;
- }
- }
-}
diff --git a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java b/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java
deleted file mode 100644
index ec6f819..0000000
--- a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.widget;
-import android.app.PendingIntent;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProvider;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.util.Log;
-import android.widget.RemoteViews;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.data.Notes.NoteColumns;
-import net.micode.notes.tool.ResourceParser;
-import net.micode.notes.ui.NoteEditActivity;
-import net.micode.notes.ui.NotesListActivity;
-
-public abstract class NoteWidgetProvider extends AppWidgetProvider {
- public static final String [] PROJECTION = new String [] {
- NoteColumns.ID,
- NoteColumns.BG_COLOR_ID,
- NoteColumns.SNIPPET
- };
-
- public static final int COLUMN_ID = 0;
- public static final int COLUMN_BG_COLOR_ID = 1;
- public static final int COLUMN_SNIPPET = 2;
-
- private static final String TAG = "NoteWidgetProvider";
-
- @Override
- public void onDeleted(Context context, int[] appWidgetIds) {
- ContentValues values = new ContentValues();
- values.put(NoteColumns.WIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
- for (int i = 0; i < appWidgetIds.length; i++) {
- context.getContentResolver().update(Notes.CONTENT_NOTE_URI,
- values,
- NoteColumns.WIDGET_ID + "=?",
- new String[] { String.valueOf(appWidgetIds[i])});
- }
- }
-
- private Cursor getNoteWidgetInfo(Context context, int widgetId) {
- return context.getContentResolver().query(Notes.CONTENT_NOTE_URI,
- PROJECTION,
- NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?",
- new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) },
- null);
- }
-
- protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- update(context, appWidgetManager, appWidgetIds, false);
- }
-
- private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds,
- boolean privacyMode) {
- for (int i = 0; i < appWidgetIds.length; i++) {
- if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) {
- int bgId = ResourceParser.getDefaultBgId(context);
- String snippet = "";
- Intent intent = new Intent(context, NoteEditActivity.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
- intent.putExtra(Notes.INTENT_EXTRA_WIDGET_ID, appWidgetIds[i]);
- intent.putExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, getWidgetType());
-
- Cursor c = getNoteWidgetInfo(context, appWidgetIds[i]);
- if (c != null && c.moveToFirst()) {
- if (c.getCount() > 1) {
- Log.e(TAG, "Multiple message with same widget id:" + appWidgetIds[i]);
- c.close();
- return;
- }
- snippet = c.getString(COLUMN_SNIPPET);
- bgId = c.getInt(COLUMN_BG_COLOR_ID);
- intent.putExtra(Intent.EXTRA_UID, c.getLong(COLUMN_ID));
- intent.setAction(Intent.ACTION_VIEW);
- } else {
- snippet = context.getResources().getString(R.string.widget_havenot_content);
- intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
- }
-
- if (c != null) {
- c.close();
- }
-
- RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId());
- rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId));
- intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId);
- /**
- * Generate the pending intent to start host for the widget
- */
- PendingIntent pendingIntent = null;
- if (privacyMode) {
- rv.setTextViewText(R.id.widget_text,
- context.getString(R.string.widget_under_visit_mode));
- pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent(
- context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
- } else {
- rv.setTextViewText(R.id.widget_text, snippet);
- pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- }
-
- rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent);
- appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
- }
- }
- }
-
- protected abstract int getBgResourceId(int bgId);
-
- protected abstract int getLayoutId();
-
- protected abstract int getWidgetType();
-}
diff --git a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java b/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java
deleted file mode 100644
index adcb2f7..0000000
--- a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_2x.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.widget;
-
-import android.appwidget.AppWidgetManager;
-import android.content.Context;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.tool.ResourceParser;
-
-
-public class NoteWidgetProvider_2x extends NoteWidgetProvider {
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- super.update(context, appWidgetManager, appWidgetIds);
- }
-
- @Override
- protected int getLayoutId() {
- return R.layout.widget_2x;
- }
-
- @Override
- protected int getBgResourceId(int bgId) {
- return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId);
- }
-
- @Override
- protected int getWidgetType() {
- return Notes.TYPE_WIDGET_2X;
- }
-}
diff --git a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java b/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java
deleted file mode 100644
index c12a02e..0000000
--- a/Notes-master/src/net/micode/notes/widget/NoteWidgetProvider_4x.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package net.micode.notes.widget;
-
-import android.appwidget.AppWidgetManager;
-import android.content.Context;
-
-import net.micode.notes.R;
-import net.micode.notes.data.Notes;
-import net.micode.notes.tool.ResourceParser;
-
-
-public class NoteWidgetProvider_4x extends NoteWidgetProvider {
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- super.update(context, appWidgetManager, appWidgetIds);
- }
-
- protected int getLayoutId() {
- return R.layout.widget_4x;
- }
-
- @Override
- protected int getBgResourceId(int bgId) {
- return ResourceParser.WidgetBgResources.getWidget4xBgResource(bgId);
- }
-
- @Override
- protected int getWidgetType() {
- return Notes.TYPE_WIDGET_4X;
- }
-}
diff --git a/README.md b/README.md
index a9429da..fd5910b 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1 @@
-# hjh.gitpractice
-1
\ No newline at end of file
+# hjh.gitpractice
\ No newline at end of file
diff --git a/XNote/.gitignore b/XNote/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/XNote/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/XNote/.idea/.gitignore b/XNote/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/XNote/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/XNote/.idea/AndroidProjectSystem.xml b/XNote/.idea/AndroidProjectSystem.xml
new file mode 100644
index 0000000..4a53bee
--- /dev/null
+++ b/XNote/.idea/AndroidProjectSystem.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/.idea/gradle.xml b/XNote/.idea/gradle.xml
new file mode 100644
index 0000000..9d8ba93
--- /dev/null
+++ b/XNote/.idea/gradle.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/.idea/migrations.xml b/XNote/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/XNote/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/.idea/misc.xml b/XNote/.idea/misc.xml
new file mode 100644
index 0000000..c2b3ddc
--- /dev/null
+++ b/XNote/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/.idea/runConfigurations.xml b/XNote/.idea/runConfigurations.xml
new file mode 100644
index 0000000..16660f1
--- /dev/null
+++ b/XNote/.idea/runConfigurations.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/.idea/vcs.xml b/XNote/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/XNote/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/.classpath b/XNote/XNote/.classpath
new file mode 100644
index 0000000..a4763d1
--- /dev/null
+++ b/XNote/XNote/.classpath
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/XNote/XNote/.project b/XNote/XNote/.project
new file mode 100644
index 0000000..a7f78c0
--- /dev/null
+++ b/XNote/XNote/.project
@@ -0,0 +1,33 @@
+
+
+ XNote
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/XNote/XNote/.settings/org.eclipse.core.resources.prefs b/XNote/XNote/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..97fc47e
--- /dev/null
+++ b/XNote/XNote/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sun Sep 11 16:35:20 CST 2011
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/XNote/XNote/.settings/org.eclipse.jdt.core.prefs b/XNote/XNote/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..4dec2de
--- /dev/null
+++ b/XNote/XNote/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Sat Jan 07 20:29:42 CST 2012
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/XNote/XNote/AndroidManifest.xml b/XNote/XNote/AndroidManifest.xml
new file mode 100644
index 0000000..6bc5aa3
--- /dev/null
+++ b/XNote/XNote/AndroidManifest.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/bin/AndroidManifest.xml b/XNote/XNote/bin/AndroidManifest.xml
new file mode 100644
index 0000000..6bc5aa3
--- /dev/null
+++ b/XNote/XNote/bin/AndroidManifest.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/BuildConfig.class b/XNote/XNote/bin/classes/com/xnote/activity/BuildConfig.class
new file mode 100644
index 0000000..fbbeab6
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/BuildConfig.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$1.class
new file mode 100644
index 0000000..275c7e9
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$2.class
new file mode 100644
index 0000000..f2e956b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity.class
new file mode 100644
index 0000000..f4b5513
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/DeleteRecordsActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$1.class
new file mode 100644
index 0000000..f4ef969
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$2.class
new file mode 100644
index 0000000..d2133dd
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$3.class b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$3.class
new file mode 100644
index 0000000..829efa8
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$3.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$4.class b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$4.class
new file mode 100644
index 0000000..452c106
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity$4.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity.class
new file mode 100644
index 0000000..eebd68b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/FolderNotesActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$1.class
new file mode 100644
index 0000000..ee00c48
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$2.class
new file mode 100644
index 0000000..dd47a7e
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$3.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$3.class
new file mode 100644
index 0000000..973a8ed
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$3.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$4.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$4.class
new file mode 100644
index 0000000..b62dbd6
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$4.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$5.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$5.class
new file mode 100644
index 0000000..9ddb60c
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$5.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$6.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$6.class
new file mode 100644
index 0000000..b9f05e8
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$6.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$7.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$7.class
new file mode 100644
index 0000000..a2b97af
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$7.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$8.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$8.class
new file mode 100644
index 0000000..5dfbb60
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$8.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$9.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$9.class
new file mode 100644
index 0000000..376fa5f
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity$9.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MainActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity.class
new file mode 100644
index 0000000..220c17e
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MainActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$1.class
new file mode 100644
index 0000000..d74a80a
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$2.class
new file mode 100644
index 0000000..5497ca3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity.class
new file mode 100644
index 0000000..7dd0e18
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveOutOfFolderActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$1.class
new file mode 100644
index 0000000..5db39c3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$2.class
new file mode 100644
index 0000000..06e3b07
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$3.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$3.class
new file mode 100644
index 0000000..f7210e4
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity$3.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity.class
new file mode 100644
index 0000000..891df4c
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/MoveToFolderActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1$1.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1$1.class
new file mode 100644
index 0000000..baa3160
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1.class
new file mode 100644
index 0000000..e3a6477
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$10.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$10.class
new file mode 100644
index 0000000..d6c952b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$10.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2$1.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2$1.class
new file mode 100644
index 0000000..cf74344
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2.class
new file mode 100644
index 0000000..0172306
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3$1.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3$1.class
new file mode 100644
index 0000000..265d4fe
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3.class
new file mode 100644
index 0000000..78e5991
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$3.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$4.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$4.class
new file mode 100644
index 0000000..57fcd19
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$4.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$5.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$5.class
new file mode 100644
index 0000000..e643f17
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$5.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$6.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$6.class
new file mode 100644
index 0000000..123515f
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$6.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$7.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$7.class
new file mode 100644
index 0000000..950c7d5
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$7.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$8.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$8.class
new file mode 100644
index 0000000..6afb3e7
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$8.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$9.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$9.class
new file mode 100644
index 0000000..48ce8e3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity$9.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity.class b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity.class
new file mode 100644
index 0000000..6f5573e
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/NoteActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$attr.class b/XNote/XNote/bin/classes/com/xnote/activity/R$attr.class
new file mode 100644
index 0000000..9486e99
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$attr.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$color.class b/XNote/XNote/bin/classes/com/xnote/activity/R$color.class
new file mode 100644
index 0000000..9f50dd3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$color.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$dimen.class b/XNote/XNote/bin/classes/com/xnote/activity/R$dimen.class
new file mode 100644
index 0000000..3939d69
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$dimen.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$drawable.class b/XNote/XNote/bin/classes/com/xnote/activity/R$drawable.class
new file mode 100644
index 0000000..5842096
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$drawable.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$id.class b/XNote/XNote/bin/classes/com/xnote/activity/R$id.class
new file mode 100644
index 0000000..a9c2493
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$id.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$layout.class b/XNote/XNote/bin/classes/com/xnote/activity/R$layout.class
new file mode 100644
index 0000000..4e7f70b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$layout.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$raw.class b/XNote/XNote/bin/classes/com/xnote/activity/R$raw.class
new file mode 100644
index 0000000..438b6fa
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$raw.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$string.class b/XNote/XNote/bin/classes/com/xnote/activity/R$string.class
new file mode 100644
index 0000000..8de7f2e
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$string.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$style.class b/XNote/XNote/bin/classes/com/xnote/activity/R$style.class
new file mode 100644
index 0000000..e941aeb
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$style.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R$xml.class b/XNote/XNote/bin/classes/com/xnote/activity/R$xml.class
new file mode 100644
index 0000000..0bf49e7
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R$xml.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/activity/R.class b/XNote/XNote/bin/classes/com/xnote/activity/R.class
new file mode 100644
index 0000000..602285c
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/activity/R.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/adapter/ListItemView.class b/XNote/XNote/bin/classes/com/xnote/adapter/ListItemView.class
new file mode 100644
index 0000000..387ded3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/adapter/ListItemView.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/adapter/MyCursorAdapter.class b/XNote/XNote/bin/classes/com/xnote/adapter/MyCursorAdapter.class
new file mode 100644
index 0000000..71963de
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/adapter/MyCursorAdapter.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/alarm/AlarmReceiver.class b/XNote/XNote/bin/classes/com/xnote/alarm/AlarmReceiver.class
new file mode 100644
index 0000000..35eb12c
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/alarm/AlarmReceiver.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/alarm/WakeLockOpration.class b/XNote/XNote/bin/classes/com/xnote/alarm/WakeLockOpration.class
new file mode 100644
index 0000000..3ae488c
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/alarm/WakeLockOpration.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DateTimeUtil.class b/XNote/XNote/bin/classes/com/xnote/database/DateTimeUtil.class
new file mode 100644
index 0000000..1c572b7
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DateTimeUtil.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DbInfo$AppwidgetItems.class b/XNote/XNote/bin/classes/com/xnote/database/DbInfo$AppwidgetItems.class
new file mode 100644
index 0000000..14608a7
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DbInfo$AppwidgetItems.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DbInfo$NoteItems.class b/XNote/XNote/bin/classes/com/xnote/database/DbInfo$NoteItems.class
new file mode 100644
index 0000000..1c2a326
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DbInfo$NoteItems.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DbInfo.class b/XNote/XNote/bin/classes/com/xnote/database/DbInfo.class
new file mode 100644
index 0000000..377b9eb
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DbInfo.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider$DatabaseHelper.class b/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider$DatabaseHelper.class
new file mode 100644
index 0000000..6a2d465
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider$DatabaseHelper.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider.class b/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider.class
new file mode 100644
index 0000000..9204c86
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/database/DbInfoProvider.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/log/MyLog.class b/XNote/XNote/bin/classes/com/xnote/log/MyLog.class
new file mode 100644
index 0000000..863fc68
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/log/MyLog.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1$1.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1$1.class
new file mode 100644
index 0000000..38ad4d1
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1.class
new file mode 100644
index 0000000..a395c4b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2.class
new file mode 100644
index 0000000..a697273
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_2X2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1$1.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1$1.class
new file mode 100644
index 0000000..17697f3
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1.class
new file mode 100644
index 0000000..4370ccf
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4.class b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4.class
new file mode 100644
index 0000000..ac95724
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/ConfigurationActivity_4X4.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1$1.class b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1$1.class
new file mode 100644
index 0000000..3b5f8c0
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1.class b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1.class
new file mode 100644
index 0000000..2d92210
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity$1.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity.class b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity.class
new file mode 100644
index 0000000..2f2931b
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/EditWidgetNoteActivity.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_2X2.class b/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_2X2.class
new file mode 100644
index 0000000..d774245
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_2X2.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_4X4.class b/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_4X4.class
new file mode 100644
index 0000000..a6c06eb
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/widget/NoteWidget_4X4.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/xml_txt/MyDefaultHandler.class b/XNote/XNote/bin/classes/com/xnote/xml_txt/MyDefaultHandler.class
new file mode 100644
index 0000000..39e86c4
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/xml_txt/MyDefaultHandler.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/xml_txt/Note.class b/XNote/XNote/bin/classes/com/xnote/xml_txt/Note.class
new file mode 100644
index 0000000..0e2f564
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/xml_txt/Note.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/xml_txt/RestoreDataFromXml.class b/XNote/XNote/bin/classes/com/xnote/xml_txt/RestoreDataFromXml.class
new file mode 100644
index 0000000..027950d
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/xml_txt/RestoreDataFromXml.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteTxt.class b/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteTxt.class
new file mode 100644
index 0000000..8c8774d
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteTxt.class differ
diff --git a/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteXml.class b/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteXml.class
new file mode 100644
index 0000000..6a2362a
Binary files /dev/null and b/XNote/XNote/bin/classes/com/xnote/xml_txt/WriteXml.class differ
diff --git a/XNote/XNote/bin/jarlist.cache b/XNote/XNote/bin/jarlist.cache
new file mode 100644
index 0000000..1b5ec3f
--- /dev/null
+++ b/XNote/XNote/bin/jarlist.cache
@@ -0,0 +1,3 @@
+# cache for current jar dependecy. DO NOT EDIT.
+# format is
+# Encoding is UTF-8
diff --git a/XNote/XNote/gen/com/xnote/activity/BuildConfig.java b/XNote/XNote/gen/com/xnote/activity/BuildConfig.java
new file mode 100644
index 0000000..b847af0
--- /dev/null
+++ b/XNote/XNote/gen/com/xnote/activity/BuildConfig.java
@@ -0,0 +1,6 @@
+/** Automatically generated file. DO NOT MODIFY */
+package com.xnote.activity;
+
+public final class BuildConfig {
+ public final static boolean DEBUG = true;
+}
\ No newline at end of file
diff --git a/XNote/XNote/gen/com/xnote/activity/R.java b/XNote/XNote/gen/com/xnote/activity/R.java
new file mode 100644
index 0000000..492b246
--- /dev/null
+++ b/XNote/XNote/gen/com/xnote/activity/R.java
@@ -0,0 +1,231 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package com.xnote.activity;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class color {
+ public static final int black=0x7f060000;
+ public static final int transparent=0x7f060001;
+ }
+ public static final class dimen {
+ /** app widgets should define padding between the widget frame and the app widget's bounding box to provide better alignment with other widgets and icons on the user's home screen.
+ As of Android 4.0, app widgets are automatically given padding between the widget frame and the app widget's bounding box to provide better alignment with other widgets and icons on the user's home screen.
+ */
+ public static final int widget_margin=0x7f070000;
+ }
+ public static final class drawable {
+ public static final int add_shortcut_to_home=0x7f020000;
+ public static final int alarm_time=0x7f020001;
+ public static final int bg_color=0x7f020002;
+ public static final int buttons_background=0x7f020003;
+ public static final int delete=0x7f020004;
+ public static final int delete_records_cancel=0x7f020005;
+ public static final int delete_records_cancel_2=0x7f020006;
+ public static final int delete_records_cancel_xml=0x7f020007;
+ public static final int delete_records_ok_xml=0x7f020008;
+ public static final int deleterecords_ok=0x7f020009;
+ public static final int deleterecords_ok_2=0x7f02000a;
+ public static final int edit_folder_title=0x7f02000b;
+ public static final int export_to_text=0x7f02000c;
+ public static final int folder_background=0x7f02000d;
+ public static final int icon=0x7f02000e;
+ public static final int imagebutton_background=0x7f02000f;
+ public static final int imagebutton_background_2=0x7f020010;
+ public static final int item_light_blue=0x7f020011;
+ public static final int item_light_green=0x7f020012;
+ public static final int item_light_pink=0x7f020013;
+ public static final int item_light_white=0x7f020014;
+ public static final int item_light_yellow=0x7f020015;
+ public static final int main_background=0x7f020016;
+ public static final int move_out_of_folder=0x7f020017;
+ public static final int move_to_folder=0x7f020018;
+ public static final int new_folder=0x7f020019;
+ public static final int new_note=0x7f02001a;
+ public static final int notes_bg_blue=0x7f02001b;
+ public static final int notes_bg_gray=0x7f02001c;
+ public static final int notes_bg_green=0x7f02001d;
+ public static final int notes_bg_pink=0x7f02001e;
+ public static final int notes_header_blue=0x7f02001f;
+ public static final int notes_header_gray=0x7f020020;
+ public static final int notes_header_green=0x7f020021;
+ public static final int notes_header_pink=0x7f020022;
+ public static final int notes_header_yellow=0x7f020023;
+ public static final int share=0x7f020024;
+ public static final int shortcut_folder=0x7f020025;
+ public static final int title_background=0x7f020026;
+ public static final int title_bar_imagebutton_add_note=0x7f020027;
+ public static final int widget_big_blue=0x7f020028;
+ public static final int widget_big_gray=0x7f020029;
+ public static final int widget_big_green=0x7f02002a;
+ public static final int widget_big_red=0x7f02002b;
+ public static final int widget_big_yellow=0x7f02002c;
+ public static final int widget_small_blue=0x7f02002d;
+ public static final int widget_small_gray=0x7f02002e;
+ public static final int widget_small_green=0x7f02002f;
+ public static final int widget_small_red=0x7f020030;
+ public static final int widget_small_yellow=0x7f020031;
+ }
+ public static final class id {
+ public static final int btnAlarmDate=0x7f0a0023;
+ public static final int btnAlarmTime=0x7f0a0024;
+ public static final int btnCancelDel=0x7f0a001d;
+ public static final int btnOK=0x7f0a001c;
+ public static final int cb_right=0x7f0a0015;
+ public static final int dialog_input_psd_root=0x7f0a0000;
+ public static final int dialog_layout_new_folder_root=0x7f0a0002;
+ public static final int dialog_layout_set_password_root=0x7f0a0004;
+ public static final int et_confirm_Password=0x7f0a0009;
+ public static final int et_content=0x7f0a0022;
+ public static final int et_dialog_new_folder=0x7f0a0003;
+ public static final int et_input_password=0x7f0a0001;
+ public static final int et_password=0x7f0a0007;
+ public static final int gestureOverlayView=0x7f0a0011;
+ public static final int green=0x7f0a000b;
+ public static final int ib_move_to_folder=0x7f0a001a;
+ public static final int imageButton=0x7f0a0010;
+ public static final int imagebutton_bgcolor=0x7f0a0021;
+ public static final int list=0x7f0a0012;
+ public static final int listview=0x7f0a001b;
+ public static final int listview_linearlayout=0x7f0a0013;
+ public static final int note_detail_header=0x7f0a001f;
+ public static final int pink=0x7f0a000a;
+ public static final int tvTitle=0x7f0a000f;
+ public static final int tvTitle_move_to_folder=0x7f0a0019;
+ public static final int tv_left=0x7f0a0014;
+ public static final int tv_note_date_time=0x7f0a0020;
+ public static final int tv_password=0x7f0a0006;
+ public static final int tv_right=0x7f0a0016;
+ public static final int tv_widget_date_time=0x7f0a002c;
+ public static final int white=0x7f0a000d;
+ public static final int widget32=0x7f0a0005;
+ public static final int widget35=0x7f0a0008;
+ public static final int widget3535=0x7f0a0018;
+ public static final int widget40=0x7f0a001e;
+ public static final int widget46=0x7f0a000e;
+ public static final int widget4646=0x7f0a0017;
+ public static final int widget_2x2=0x7f0a0025;
+ public static final int widget_2x2_imageView=0x7f0a0026;
+ public static final int widget_2x2_textView=0x7f0a0027;
+ public static final int widget_4x4=0x7f0a0028;
+ public static final int widget_4x4_imageView=0x7f0a0029;
+ public static final int widget_4x4_textView=0x7f0a002a;
+ public static final int widget_detail_header=0x7f0a002b;
+ public static final int yellow=0x7f0a000c;
+ }
+ public static final class layout {
+ public static final int dialog_input_psd=0x7f030000;
+ public static final int dialog_layout_new_folder=0x7f030001;
+ public static final int dialog_layout_set_password=0x7f030002;
+ public static final int dialog_note_bg_color=0x7f030003;
+ public static final int index_page=0x7f030004;
+ public static final int listview_del_or_move_item_layout=0x7f030005;
+ public static final int listview_item_layout=0x7f030006;
+ public static final int listview_layout_del_or_move_records=0x7f030007;
+ public static final int note_detail=0x7f030008;
+ public static final int set_alarm=0x7f030009;
+ public static final int widget_2x2_layout=0x7f03000a;
+ public static final int widget_4x4_layout=0x7f03000b;
+ public static final int widget_note_layout=0x7f03000c;
+ }
+ public static final class raw {
+ public static final int gestures=0x7f050000;
+ }
+ public static final class string {
+ public static final int Cancel=0x7f08001a;
+ /** Button组件显示 的字符串
+ Button组件显示 的字符串
+ */
+ public static final int Ok=0x7f080019;
+ public static final int about=0x7f08000f;
+ public static final int add_shortcut_to_home=0x7f080008;
+ /** 便签界面下的菜单
+ 便签界面下的菜单
+ */
+ public static final int alarm_time=0x7f080012;
+ public static final int app_name=0x7f080001;
+ public static final int app_widget2x2=0x7f080002;
+ public static final int app_widget4x4=0x7f080003;
+ /** 备份数据(XML文件)失败时用到的字符串
+ 备份数据(XML文件)失败时用到的字符串
+ */
+ public static final int backupDataFailed=0x7f08001d;
+ public static final int backupDataSuc=0x7f08001e;
+ public static final int backup_data=0x7f08000c;
+ public static final int change_font_size=0x7f080013;
+ /** 密码相关
+ 密码相关
+ */
+ public static final int change_password=0x7f08001f;
+ public static final int change_password_failed=0x7f080023;
+ public static final int change_password_succ=0x7f080024;
+ public static final int clear_password=0x7f080020;
+ public static final int confirm_psd=0x7f080022;
+ public static final int delete=0x7f080006;
+ public static final int delete_note=0x7f080007;
+ /** 文件夹界面下的菜单
+ 文件夹界面下的菜单
+ */
+ public static final int edit_folder_title=0x7f080010;
+ public static final int edit_note=0x7f080005;
+ /** 输出TXT文本需要用到的字符串
+ 输出TXT文本需要用到的字符串
+ */
+ public static final int exportTXTFailed=0x7f08001b;
+ public static final int exportTXTSuc=0x7f08001c;
+ public static final int export_to_text=0x7f08000b;
+ public static final int hello=0x7f080000;
+ public static final int move_out_of_folder=0x7f080011;
+ public static final int move_to_folder=0x7f08000a;
+ /** 主界面的菜单
+ 主界面的菜单
+ */
+ public static final int new_folder=0x7f080009;
+ /** 比较通用的字段
+ 比较通用的字段
+ */
+ public static final int new_note=0x7f080004;
+ public static final int password=0x7f080021;
+ /** 从SDCard还原
+ 从SDCard还原
+ */
+ public static final int restoreDataFailed=0x7f080027;
+ public static final int restoreDataSuc=0x7f080028;
+ public static final int restore_data=0x7f08000d;
+ /** Dialog中使用到的字符串
+ Dialog中使用到的字符串
+ */
+ public static final int set_alarm_date=0x7f080017;
+ public static final int set_alarm_time=0x7f080018;
+ public static final int set_password=0x7f08000e;
+ public static final int set_password_failde=0x7f080026;
+ public static final int set_password_succ=0x7f080025;
+ public static final int share_sms_or_email=0x7f080014;
+ public static final int share_with_email=0x7f080016;
+ public static final int share_with_sms=0x7f080015;
+ }
+ public static final class style {
+ /** 这个Style用于修饰创建文件夹和输入密码时的EditText
+ */
+ public static final int EditTextStyle=0x7f090000;
+ /** 首页及文件夹下标题栏的ImageButton的Style
+ */
+ public static final int TitleBarImageButton=0x7f090003;
+ /** 首页以及文件夹下标题栏的LinearLayout的Style
+ */
+ public static final int TitleBarLinearLayout=0x7f090001;
+ /** 首页及文件夹下标题栏的TextView的Style
+ */
+ public static final int TitleBarTextView=0x7f090002;
+ }
+ public static final class xml {
+ public static final int widget_2x2_layout_info=0x7f040000;
+ public static final int widget_4x4_layout_info=0x7f040001;
+ }
+}
diff --git a/XNote/XNote/project.properties b/XNote/XNote/project.properties
new file mode 100644
index 0000000..ea89160
--- /dev/null
+++ b/XNote/XNote/project.properties
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-8
diff --git a/XNote/XNote/res/drawable-hdpi/add_shortcut_to_home.png b/XNote/XNote/res/drawable-hdpi/add_shortcut_to_home.png
new file mode 100644
index 0000000..24c12b3
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/add_shortcut_to_home.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/alarm_time.png b/XNote/XNote/res/drawable-hdpi/alarm_time.png
new file mode 100644
index 0000000..8a21ef4
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/alarm_time.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/bg_color.png b/XNote/XNote/res/drawable-hdpi/bg_color.png
new file mode 100644
index 0000000..6f6c45c
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/bg_color.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/buttons_background.png b/XNote/XNote/res/drawable-hdpi/buttons_background.png
new file mode 100644
index 0000000..27c0b74
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/buttons_background.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/delete.png b/XNote/XNote/res/drawable-hdpi/delete.png
new file mode 100644
index 0000000..b419d51
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/delete.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/delete_records_cancel.png b/XNote/XNote/res/drawable-hdpi/delete_records_cancel.png
new file mode 100644
index 0000000..4a1f07a
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/delete_records_cancel.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/delete_records_cancel_2.png b/XNote/XNote/res/drawable-hdpi/delete_records_cancel_2.png
new file mode 100644
index 0000000..64408ba
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/delete_records_cancel_2.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/delete_records_cancel_xml.xml b/XNote/XNote/res/drawable-hdpi/delete_records_cancel_xml.xml
new file mode 100644
index 0000000..d6eb844
--- /dev/null
+++ b/XNote/XNote/res/drawable-hdpi/delete_records_cancel_xml.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/drawable-hdpi/delete_records_ok_xml.xml b/XNote/XNote/res/drawable-hdpi/delete_records_ok_xml.xml
new file mode 100644
index 0000000..82545b4
--- /dev/null
+++ b/XNote/XNote/res/drawable-hdpi/delete_records_ok_xml.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/drawable-hdpi/deleterecords_ok.png b/XNote/XNote/res/drawable-hdpi/deleterecords_ok.png
new file mode 100644
index 0000000..ed6dac3
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/deleterecords_ok.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/deleterecords_ok_2.png b/XNote/XNote/res/drawable-hdpi/deleterecords_ok_2.png
new file mode 100644
index 0000000..9853408
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/deleterecords_ok_2.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/edit_folder_title.png b/XNote/XNote/res/drawable-hdpi/edit_folder_title.png
new file mode 100644
index 0000000..94ac5bc
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/edit_folder_title.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/export_to_text.png b/XNote/XNote/res/drawable-hdpi/export_to_text.png
new file mode 100644
index 0000000..cad4a0b
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/export_to_text.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/folder_background.png b/XNote/XNote/res/drawable-hdpi/folder_background.png
new file mode 100644
index 0000000..31320be
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/folder_background.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/icon.png b/XNote/XNote/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000..3491823
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/icon.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/imagebutton_background.png b/XNote/XNote/res/drawable-hdpi/imagebutton_background.png
new file mode 100644
index 0000000..91b6125
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/imagebutton_background.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/imagebutton_background_2.png b/XNote/XNote/res/drawable-hdpi/imagebutton_background_2.png
new file mode 100644
index 0000000..31fc87c
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/imagebutton_background_2.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/item_light_blue.png b/XNote/XNote/res/drawable-hdpi/item_light_blue.png
new file mode 100644
index 0000000..839a097
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/item_light_blue.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/item_light_green.png b/XNote/XNote/res/drawable-hdpi/item_light_green.png
new file mode 100644
index 0000000..934001f
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/item_light_green.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/item_light_pink.png b/XNote/XNote/res/drawable-hdpi/item_light_pink.png
new file mode 100644
index 0000000..e393263
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/item_light_pink.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/item_light_white.png b/XNote/XNote/res/drawable-hdpi/item_light_white.png
new file mode 100644
index 0000000..d122425
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/item_light_white.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/item_light_yellow.png b/XNote/XNote/res/drawable-hdpi/item_light_yellow.png
new file mode 100644
index 0000000..1e4595d
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/item_light_yellow.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/main_background.jpg b/XNote/XNote/res/drawable-hdpi/main_background.jpg
new file mode 100644
index 0000000..2614eaa
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/main_background.jpg differ
diff --git a/XNote/XNote/res/drawable-hdpi/move_out_of_folder.png b/XNote/XNote/res/drawable-hdpi/move_out_of_folder.png
new file mode 100644
index 0000000..705d22f
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/move_out_of_folder.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/move_to_folder.png b/XNote/XNote/res/drawable-hdpi/move_to_folder.png
new file mode 100644
index 0000000..705d22f
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/move_to_folder.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/new_folder.png b/XNote/XNote/res/drawable-hdpi/new_folder.png
new file mode 100644
index 0000000..b06ecc0
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/new_folder.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/new_note.png b/XNote/XNote/res/drawable-hdpi/new_note.png
new file mode 100644
index 0000000..e33a4c4
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/new_note.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_bg_blue.9.png b/XNote/XNote/res/drawable-hdpi/notes_bg_blue.9.png
new file mode 100644
index 0000000..fe69aaf
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_bg_blue.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_bg_gray.9.png b/XNote/XNote/res/drawable-hdpi/notes_bg_gray.9.png
new file mode 100644
index 0000000..e3f89d7
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_bg_gray.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_bg_green.9.png b/XNote/XNote/res/drawable-hdpi/notes_bg_green.9.png
new file mode 100644
index 0000000..e414a0c
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_bg_green.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_bg_pink.9.png b/XNote/XNote/res/drawable-hdpi/notes_bg_pink.9.png
new file mode 100644
index 0000000..73e68c5
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_bg_pink.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_header_blue.9.png b/XNote/XNote/res/drawable-hdpi/notes_header_blue.9.png
new file mode 100644
index 0000000..90e897b
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_header_blue.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_header_gray.9.png b/XNote/XNote/res/drawable-hdpi/notes_header_gray.9.png
new file mode 100644
index 0000000..b00d507
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_header_gray.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_header_green.9.png b/XNote/XNote/res/drawable-hdpi/notes_header_green.9.png
new file mode 100644
index 0000000..2657366
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_header_green.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_header_pink.9.png b/XNote/XNote/res/drawable-hdpi/notes_header_pink.9.png
new file mode 100644
index 0000000..5150857
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_header_pink.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/notes_header_yellow.9.png b/XNote/XNote/res/drawable-hdpi/notes_header_yellow.9.png
new file mode 100644
index 0000000..d08ba29
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/notes_header_yellow.9.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/share.png b/XNote/XNote/res/drawable-hdpi/share.png
new file mode 100644
index 0000000..cf24c2b
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/share.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/shortcut_folder.png b/XNote/XNote/res/drawable-hdpi/shortcut_folder.png
new file mode 100644
index 0000000..c6d26f5
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/shortcut_folder.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/title_background.png b/XNote/XNote/res/drawable-hdpi/title_background.png
new file mode 100644
index 0000000..c779540
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/title_background.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/title_bar_imagebutton_add_note.xml b/XNote/XNote/res/drawable-hdpi/title_bar_imagebutton_add_note.xml
new file mode 100644
index 0000000..a491db5
--- /dev/null
+++ b/XNote/XNote/res/drawable-hdpi/title_bar_imagebutton_add_note.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/XNote/XNote/res/drawable-hdpi/widget_big_blue.png b/XNote/XNote/res/drawable-hdpi/widget_big_blue.png
new file mode 100644
index 0000000..2cb4f8b
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_big_blue.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_big_gray.png b/XNote/XNote/res/drawable-hdpi/widget_big_gray.png
new file mode 100644
index 0000000..7d6f801
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_big_gray.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_big_green.png b/XNote/XNote/res/drawable-hdpi/widget_big_green.png
new file mode 100644
index 0000000..4c75b87
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_big_green.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_big_red.png b/XNote/XNote/res/drawable-hdpi/widget_big_red.png
new file mode 100644
index 0000000..a6f6b8a
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_big_red.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_big_yellow.png b/XNote/XNote/res/drawable-hdpi/widget_big_yellow.png
new file mode 100644
index 0000000..adc28fd
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_big_yellow.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_small_blue.png b/XNote/XNote/res/drawable-hdpi/widget_small_blue.png
new file mode 100644
index 0000000..b2e812e
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_small_blue.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_small_gray.png b/XNote/XNote/res/drawable-hdpi/widget_small_gray.png
new file mode 100644
index 0000000..4746b69
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_small_gray.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_small_green.png b/XNote/XNote/res/drawable-hdpi/widget_small_green.png
new file mode 100644
index 0000000..ecd0d12
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_small_green.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_small_red.png b/XNote/XNote/res/drawable-hdpi/widget_small_red.png
new file mode 100644
index 0000000..8b609c8
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_small_red.png differ
diff --git a/XNote/XNote/res/drawable-hdpi/widget_small_yellow.png b/XNote/XNote/res/drawable-hdpi/widget_small_yellow.png
new file mode 100644
index 0000000..461af6a
Binary files /dev/null and b/XNote/XNote/res/drawable-hdpi/widget_small_yellow.png differ
diff --git a/XNote/XNote/res/layout/dialog_input_psd.xml b/XNote/XNote/res/layout/dialog_input_psd.xml
new file mode 100644
index 0000000..9552793
--- /dev/null
+++ b/XNote/XNote/res/layout/dialog_input_psd.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/dialog_layout_new_folder.xml b/XNote/XNote/res/layout/dialog_layout_new_folder.xml
new file mode 100644
index 0000000..ca269db
--- /dev/null
+++ b/XNote/XNote/res/layout/dialog_layout_new_folder.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/dialog_layout_set_password.xml b/XNote/XNote/res/layout/dialog_layout_set_password.xml
new file mode 100644
index 0000000..2cc5a65
--- /dev/null
+++ b/XNote/XNote/res/layout/dialog_layout_set_password.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/dialog_note_bg_color.xml b/XNote/XNote/res/layout/dialog_note_bg_color.xml
new file mode 100644
index 0000000..4704fa6
--- /dev/null
+++ b/XNote/XNote/res/layout/dialog_note_bg_color.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/index_page.xml b/XNote/XNote/res/layout/index_page.xml
new file mode 100644
index 0000000..cfc395e
--- /dev/null
+++ b/XNote/XNote/res/layout/index_page.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/listview_del_or_move_item_layout.xml b/XNote/XNote/res/layout/listview_del_or_move_item_layout.xml
new file mode 100644
index 0000000..9e7a233
--- /dev/null
+++ b/XNote/XNote/res/layout/listview_del_or_move_item_layout.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/listview_item_layout.xml b/XNote/XNote/res/layout/listview_item_layout.xml
new file mode 100644
index 0000000..2562811
--- /dev/null
+++ b/XNote/XNote/res/layout/listview_item_layout.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/listview_layout_del_or_move_records.xml b/XNote/XNote/res/layout/listview_layout_del_or_move_records.xml
new file mode 100644
index 0000000..d55faa7
--- /dev/null
+++ b/XNote/XNote/res/layout/listview_layout_del_or_move_records.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/note_detail.xml b/XNote/XNote/res/layout/note_detail.xml
new file mode 100644
index 0000000..6837c0c
--- /dev/null
+++ b/XNote/XNote/res/layout/note_detail.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/set_alarm.xml b/XNote/XNote/res/layout/set_alarm.xml
new file mode 100644
index 0000000..09cc59d
--- /dev/null
+++ b/XNote/XNote/res/layout/set_alarm.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/widget_2x2_layout.xml b/XNote/XNote/res/layout/widget_2x2_layout.xml
new file mode 100644
index 0000000..c6e9ec2
--- /dev/null
+++ b/XNote/XNote/res/layout/widget_2x2_layout.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/widget_4x4_layout.xml b/XNote/XNote/res/layout/widget_4x4_layout.xml
new file mode 100644
index 0000000..2030ab1
--- /dev/null
+++ b/XNote/XNote/res/layout/widget_4x4_layout.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/layout/widget_note_layout.xml b/XNote/XNote/res/layout/widget_note_layout.xml
new file mode 100644
index 0000000..23460d1
--- /dev/null
+++ b/XNote/XNote/res/layout/widget_note_layout.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/raw/gestures b/XNote/XNote/res/raw/gestures
new file mode 100644
index 0000000..98704e3
Binary files /dev/null and b/XNote/XNote/res/raw/gestures differ
diff --git a/XNote/XNote/res/values-v14/dimens.xml b/XNote/XNote/res/values-v14/dimens.xml
new file mode 100644
index 0000000..47e1f0a
--- /dev/null
+++ b/XNote/XNote/res/values-v14/dimens.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ 0dp
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/values-zh-rCN/strings.xml b/XNote/XNote/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..1d7d83e
--- /dev/null
+++ b/XNote/XNote/res/values-zh-rCN/strings.xml
@@ -0,0 +1,57 @@
+
+
+
+
+ 我的便签
+ XNote
+ XNote 2x2
+ XNote 4x4
+
+ 新建便签
+ 编辑便签
+ 删除
+ 确定删除便签?
+ 添加到桌面
+
+ 新建文件夹
+ 移进文件夹
+ 输出TXT文本
+ 备份数据
+ 从SD卡还原
+ 设置密码
+ 关于
+
+ 修改文件夹名称
+ 移出文件夹
+
+ 设置闹钟
+ 字体大小
+ 分享
+ 短信
+ 邮箱
+
+ 设置提醒日期
+ 设置提醒时间
+
+ 完成
+ 取消
+
+ 输出TXT文本失败!
+ 输出TXT文本成功!
+
+ 备份数据失败!
+ 备份数据成功!
+
+ 修改密码
+ 清除密码
+ 密码
+ 确认
+ 修改密码失败!
+ 修改密码成功!
+ 设置密码成功!
+ 设置密码失败!
+
+ 还原数据失败!
+ 还原数据成功!
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/values/colors.xml b/XNote/XNote/res/values/colors.xml
new file mode 100644
index 0000000..7b69d55
--- /dev/null
+++ b/XNote/XNote/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+
+ #ff000000
+ #0000ff00
+
\ No newline at end of file
diff --git a/XNote/XNote/res/values/dimens.xml b/XNote/XNote/res/values/dimens.xml
new file mode 100644
index 0000000..e64162c
--- /dev/null
+++ b/XNote/XNote/res/values/dimens.xml
@@ -0,0 +1,6 @@
+
+
+
+ 15dp
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/values/strings.xml b/XNote/XNote/res/values/strings.xml
new file mode 100644
index 0000000..316e332
--- /dev/null
+++ b/XNote/XNote/res/values/strings.xml
@@ -0,0 +1,57 @@
+
+
+
+
+ My Notes
+ XNote
+ XNote 2x2
+ XNote 4x4
+
+ New Note
+ Edit Note
+ Delete
+ Confirm to delete this notes?
+ Add shortcut to Home
+
+ New Folder
+ Move into folder
+ Export TXT file
+ Backup to SD card
+ Restore from SD card
+ Set password
+ About
+
+ Edit folder name
+ Move out of folder
+
+ Set alarm
+ Change font size
+ Share
+ SMS
+ Email
+
+ Set alarm date
+ Set alarm time
+
+ OK
+ Cancel
+
+ Export failed!
+ Export successfully!
+
+ Backup failed!
+ Backup successfully!
+
+ Change password
+ Clear password
+ Password
+ Confirm
+ Change password failed!
+ Change password successfully!
+ Set password succesfully!
+ Set password failed!
+
+ Restore failed!
+ Restore successfully!
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/values/styles.xml b/XNote/XNote/res/values/styles.xml
new file mode 100644
index 0000000..3ce100e
--- /dev/null
+++ b/XNote/XNote/res/values/styles.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/xml/widget_2x2_layout_info.xml b/XNote/XNote/res/xml/widget_2x2_layout_info.xml
new file mode 100644
index 0000000..e71576e
--- /dev/null
+++ b/XNote/XNote/res/xml/widget_2x2_layout_info.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/res/xml/widget_4x4_layout_info.xml b/XNote/XNote/res/xml/widget_4x4_layout_info.xml
new file mode 100644
index 0000000..36087ef
--- /dev/null
+++ b/XNote/XNote/res/xml/widget_4x4_layout_info.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/DeleteRecordsActivity.java b/XNote/XNote/src/com/xnote/activity/DeleteRecordsActivity.java
new file mode 100644
index 0000000..bf95b7b
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/DeleteRecordsActivity.java
@@ -0,0 +1,122 @@
+package com.xnote.activity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.app.Activity;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.ListView;
+
+import com.xnote.adapter.ListItemView;
+import com.xnote.adapter.MyCursorAdapter;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 删除记录页面
+ */
+public class DeleteRecordsActivity extends Activity {
+ private MyCursorAdapter mAdapter;
+ private ListView mListView;
+ private Button btnOK, btnCancel;
+
+ // 用于收集被选中的item的id.以形式存放
+ private Map mIds;
+ private Cursor mCursor;
+
+ private OnClickListener listener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btnOK:
+ int count = mCursor.getCount();
+ if (count > 0) {// 有记录被选中
+ for (int i = 0; i < count; i++) {
+ String strTmp = String.valueOf(mIds.get(i));
+ if (!TextUtils.isEmpty(strTmp)) {// 如果不为空,则可删除
+ // 使用构建的Uri删除数据(如果是文件夹,则会删除文件夹下的所有数据)
+ String id = String.valueOf(mIds.get(i));
+ getContentResolver().delete(
+ NoteItems.CONTENT_URI,
+ " _id = ? or " + NoteItems.PARENT_FOLDER
+ + " = ? ", new String[] { id, id });
+ }
+ }
+ }
+ finish();
+ break;
+ case R.id.btnCancelDel:
+ finish();
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.listview_layout_del_or_move_records);
+
+ btnOK = (Button) findViewById(R.id.btnOK);
+ btnCancel = (Button) findViewById(R.id.btnCancelDel);
+ mListView = (ListView) findViewById(R.id.listview);
+
+ mIds = new HashMap();
+
+ // 判断删除主页的记录还是文件夹下的记录
+ int folderId = getIntent().getIntExtra("folderId", -1);
+ if (folderId == -1) {// 要删除主页上的记录,因此查询主页上的记录
+ String selection = NoteItems.IS_FOLDER + " = '" + "yes" + "' or "
+ + NoteItems.PARENT_FOLDER + " = " + "-1";
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, null, null);
+
+ } else {// 删除文件夹下的记录,因为我们得到了文件夹的_id
+ // 查询ID为folderId的文件夹下的记录
+ String selection = NoteItems.PARENT_FOLDER + " = ? ";
+ String[] selectionArgs = new String[] { String.valueOf(folderId) };
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, selectionArgs, null);
+ }
+ startManagingCursor(mCursor);
+ mAdapter = new MyCursorAdapter(getApplicationContext(), mCursor, false);
+ mListView.setAdapter(mAdapter);
+ mListView.setItemsCanFocus(false);
+ mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+ mListView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ ListItemView listItems = (ListItemView) view.getTag();
+ listItems.cb_right.toggle();
+ MyCursorAdapter.isSelected.put(position,
+ listItems.cb_right.isChecked());
+ mCursor.moveToPosition(position);
+ int itemId = mCursor.getInt(mCursor
+ .getColumnIndex(NoteItems._ID));
+ if (MyCursorAdapter.isSelected.get(position)) {
+ mIds.put(position, itemId);
+ MyLog.d(MainActivity.TAG,
+ "DeleteRecordsActivity==>被点击的记录的id : " + itemId
+ + "\t" + position);
+ } else {
+ mIds.remove(position);
+ }
+ }
+ });
+ btnOK.setOnClickListener(listener);
+ btnCancel.setOnClickListener(listener);
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/FolderNotesActivity.java b/XNote/XNote/src/com/xnote/activity/FolderNotesActivity.java
new file mode 100644
index 0000000..cb1f7d9
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/FolderNotesActivity.java
@@ -0,0 +1,308 @@
+package com.xnote.activity;
+
+import java.util.ArrayList;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.gesture.Gesture;
+import android.gesture.GestureLibraries;
+import android.gesture.GestureLibrary;
+import android.gesture.GestureOverlayView;
+import android.gesture.Prediction;
+import android.gesture.GestureOverlayView.OnGesturePerformedListener;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+
+import com.xnote.activity.R;
+import com.xnote.adapter.MyCursorAdapter;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 显示某一文件夹下的所有便签
+ */
+public class FolderNotesActivity extends Activity implements
+ OnGesturePerformedListener {
+ private ImageButton imageButton;
+ private TextView tvTitle;
+ private ListView mListview;
+ // 手势相关
+ private GestureOverlayView mGestureOverlayView;
+ private GestureLibrary mGestureLibrary;
+ private String GestureName_Add = "add_Record";
+
+ private MyCursorAdapter mAdapter;
+
+ private Cursor mCursor;
+ // 得到点击修改文件夹名称Menu以前的名称
+ private String oldFolderName;
+ // 添加快捷方式时使用
+ private final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
+
+ // 菜单
+ private static final int MENU_NEW_NOTE = Menu.FIRST;
+ // 修改文件夹名称
+ private static final int MENU_UPDATE_FOLDER = Menu.FIRST + 1;
+ private static final int MENU_MOVE_OUTOF_FOLDER = Menu.FIRST + 2;
+ private static final int MENU_DELETE = Menu.FIRST + 3;
+ // 创建桌面快捷方式
+ private static final int MENU_SEND_HOME = Menu.FIRST + 4;
+
+ // 文件夹的ID
+ private int _id;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.index_page);
+
+ // 读取GestureLibrary
+ mGestureLibrary = GestureLibraries
+ .fromRawResource(this, R.raw.gestures);
+ if (mGestureLibrary.load()) {
+ mGestureOverlayView = (GestureOverlayView) findViewById(R.id.gestureOverlayView);
+ mGestureOverlayView.addOnGesturePerformedListener(this);
+ }
+ Intent i = getIntent();
+ // 如果没有传递Intent对象,则返回主页(MainActivity)
+ if (i.equals(null)) {
+ startActivity(new Intent(FolderNotesActivity.this,
+ MainActivity.class));
+ }
+ _id = i.getIntExtra(NoteItems._ID, -1);
+ // 查询该文件夹记录.内容保存到Cursor对象中
+ Uri tmpUri = ContentUris.withAppendedId(NoteItems.CONTENT_URI, _id);
+ Cursor c2 = getContentResolver().query(tmpUri, null, null, null, null);
+ c2.moveToFirst();
+ oldFolderName = c2.getString(c2.getColumnIndex(NoteItems.CONTENT));
+ c2.close();
+ initViews();
+ mListview.setOnItemClickListener(new OnItemClickListener() {
+ // 点击文件夹下的便签执行该回调函数
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ Intent intent = new Intent();
+
+ mCursor.moveToPosition(position);
+ // 传递被选中记录的ID
+ intent.putExtra(NoteItems._ID,
+ mCursor.getInt(mCursor.getColumnIndex(NoteItems._ID)));
+ // 传递当前文件夹的ID
+ intent.putExtra("FolderId", _id);
+ MyLog.d(MainActivity.TAG, "FolderNotesActivity==>进入id为: " + _id
+ + " 的文件夹");
+ // 传递被编辑便签的内容
+ intent.putExtra(NoteItems.CONTENT, mCursor.getString(mCursor
+ .getColumnIndex(NoteItems.CONTENT)));
+ // 编辑便签的方式
+ intent.putExtra("Open_Type", "editFolderNote");
+ // 跳转到NoteActivity
+ intent.setClass(FolderNotesActivity.this, NoteActivity.class);
+ startActivity(intent);
+ }
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // 新建便签
+ menu.add(Menu.NONE, MENU_NEW_NOTE, 1, R.string.new_note).setIcon(
+ R.drawable.new_note);
+ // 修改文件夹名称
+ menu.add(Menu.NONE, MENU_UPDATE_FOLDER, 2, R.string.edit_folder_title)
+ .setIcon(R.drawable.edit_folder_title);
+ // 移出文件夹
+ menu.add(Menu.NONE, MENU_MOVE_OUTOF_FOLDER, 3,
+ R.string.move_out_of_folder).setIcon(
+ R.drawable.move_out_of_folder);
+ // 删除
+ menu.add(Menu.NONE, MENU_DELETE, 4, R.string.delete).setIcon(
+ R.drawable.delete);
+ // 添加到桌面(shortcut)
+ menu.add(Menu.NONE, MENU_SEND_HOME, 5, R.string.add_shortcut_to_home)
+ .setIcon(R.drawable.add_shortcut_to_home);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_NEW_NOTE:
+ newFolderNote();
+ break;
+ case MENU_UPDATE_FOLDER:
+ updateFolderName();
+ break;
+ case MENU_MOVE_OUTOF_FOLDER:
+ moveOutOfFolder();
+ break;
+ case MENU_DELETE:
+ delete();
+ break;
+ case MENU_SEND_HOME:
+ // 添加快捷方式
+ Intent addShortCut = new Intent(ACTION_ADD_SHORTCUT);
+ // 快捷方式的图标
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+ Intent.ShortcutIconResource.fromContext(this,
+ R.drawable.shortcut_folder));
+ // 快捷方式的名称是文件夹的名称.即oldFolderName变量的值
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, oldFolderName);
+ addShortCut.putExtra("duplicate", false);// 不允许重复创建快捷方式
+ // 设置点击快捷方式后执行的Intent对象
+ Intent shortCutIntent = new Intent(FolderNotesActivity.this,
+ FolderNotesActivity.class);
+ // 传递被选中文件夹的ID
+ shortCutIntent.putExtra(NoteItems._ID, _id);
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortCutIntent);
+ sendBroadcast(addShortCut);
+ break;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ // 初始化组件
+ private void initViews() {
+ imageButton = (ImageButton) findViewById(R.id.imageButton);
+ imageButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ newFolderNote();
+ }
+ });
+ mListview = (ListView) findViewById(R.id.list);
+ tvTitle = (TextView) findViewById(R.id.tvTitle);
+
+ updateDisplay(oldFolderName);
+ }
+
+ // 新建便签函数
+ private void newFolderNote() {
+ Intent i = new Intent();
+ // 传递打开NoteActivity的方式
+ i.putExtra("Open_Type", "newFolderNote");
+ // 传递文件夹ID
+ i.putExtra("FolderId", _id);
+ i.setClass(FolderNotesActivity.this, NoteActivity.class);
+ startActivity(i);
+ }
+
+ // 修改文件夹名称
+ private void updateFolderName() {
+ Context mContext = FolderNotesActivity.this;
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle(R.string.edit_folder_title);
+
+ LayoutInflater inflater = (LayoutInflater) mContext
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ final View layout = inflater.inflate(R.layout.dialog_layout_new_folder,
+ (ViewGroup) findViewById(R.id.dialog_layout_new_folder_root));
+ builder.setView(layout);
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ EditText et_folder_name = (EditText) layout
+ .findViewById(R.id.et_dialog_new_folder);
+ String newFolderName = et_folder_name.getText()
+ .toString();
+ if ((!TextUtils.isEmpty(newFolderName))
+ && newFolderName != oldFolderName) {
+ // 新文件夹名称不为空,且不等于原有的名称,则更新
+ Uri tmpUri = ContentUris.withAppendedId(
+ NoteItems.CONTENT_URI, _id);
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, newFolderName);
+ values.put(NoteItems.UPDATE_DATE,
+ DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME,
+ DateTimeUtil.getTime());
+ getContentResolver().update(tmpUri, values, null,
+ null);
+ oldFolderName = newFolderName;
+ tvTitle.setText(newFolderName + "文件夹下");
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 点击取消按钮,撤销修改文件夹名称对话框
+ dialog.dismiss();
+ }
+ });
+ AlertDialog ad = builder.create();
+ ad.show();
+ }
+
+ // 移出文件夹
+ private void moveOutOfFolder() {
+ Intent i = new Intent();
+ i.setClass(FolderNotesActivity.this, MoveOutOfFolderActivity.class);
+ // 传递文件夹的ID
+ i.putExtra("folderId", _id);
+ startActivity(i);
+ }
+
+ // 删除函数,选择删除文件夹下的便签
+ private void delete() {
+ Intent i = new Intent(getApplicationContext(),
+ DeleteRecordsActivity.class);
+ // 传递文件夹的ID
+ i.putExtra("folderId", _id);
+ startActivity(i);
+ }
+
+ // 负责更新数据
+ private void updateDisplay(String folderName) {
+ // 查询所属文件夹Id为_id的记录
+ String selection = NoteItems.PARENT_FOLDER + " = ? ";
+ String[] selectionArgs = new String[] { String.valueOf(_id) };
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, selectionArgs, null);
+ startManagingCursor(mCursor);
+ mAdapter = new MyCursorAdapter(this, mCursor, true);
+ mListview.setAdapter(mAdapter);
+
+ tvTitle.setText(folderName + "文件夹下");
+ }
+
+ @Override
+ public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
+ ArrayList predictions = mGestureLibrary.recognize(gesture);
+ for (Prediction pre : predictions) {
+ MyLog.d(MainActivity.TAG,
+ "FolderNotesActivity===>>onGesturePerformed-->手势匹配度: "
+ + pre.score);
+ if (pre.name.equals(this.GestureName_Add) && pre.score > 2.0) {
+ newFolderNote();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/MainActivity.java b/XNote/XNote/src/com/xnote/activity/MainActivity.java
new file mode 100644
index 0000000..249bc7d
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/MainActivity.java
@@ -0,0 +1,574 @@
+package com.xnote.activity;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+import android.database.Cursor;
+import android.gesture.Gesture;
+import android.gesture.GestureLibraries;
+import android.gesture.GestureLibrary;
+import android.gesture.GestureOverlayView;
+import android.gesture.GestureOverlayView.OnGesturePerformedListener;
+import android.gesture.Prediction;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.xnote.adapter.MyCursorAdapter;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+import com.xnote.xml_txt.RestoreDataFromXml;
+import com.xnote.xml_txt.WriteTxt;
+import com.xnote.xml_txt.WriteXml;
+
+/*
+ * 显示所有的文件夹和没有父文件夹的便签
+ */
+public class MainActivity extends Activity implements
+ OnGesturePerformedListener {
+ /** Called when the activity is first created. */
+ private static final String SETTINGS = "user_configurations";
+ // 手势相关
+ private GestureOverlayView mGestureOverlayView;
+ private GestureLibrary mGestureLibrary;
+ private String GestureName_Add = "add_Record";
+
+ private ImageButton imageButton;
+ private ListView mListview;
+
+ private MyCursorAdapter mAdapter;
+ private Cursor mCursor;
+ // 菜单
+ private static final int MENU_NEW_NOTE = Menu.FIRST;
+ private static final int MENU_NEW_FOLDER = Menu.FIRST + 1;
+ private static final int MENU_MOVE_TO_FOLDER = Menu.FIRST + 2;
+ private static final int MENU_DELETE = Menu.FIRST + 3;
+ private static final int MENU_EXPORT_TO_TEXT = Menu.FIRST + 4;
+ private static final int MENU_BACKUP_DATA = Menu.FIRST + 5;
+ private static final int MENU_RESTORE_DATA_FROM_SDCARD = Menu.FIRST + 6;
+ private static final int MENU_SET_PASSWORD = Menu.FIRST + 7;
+ private static final int MENU_ABOUT = Menu.FIRST + 8;
+
+ public static final String TAG = "Note";
+
+ // 如果用户输入的密码错误,使用该变量记录错误次数
+ private int count = 0;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.index_page);
+ // 判断有无密码,如果有,检测输入的密码是否正确
+ this.inputPsd();
+
+ // 加载手势库文件
+ mGestureLibrary = GestureLibraries
+ .fromRawResource(this, R.raw.gestures);
+ if (mGestureLibrary.load()) {
+ mGestureOverlayView = (GestureOverlayView) findViewById(R.id.gestureOverlayView);
+ mGestureOverlayView.addOnGesturePerformedListener(this);
+ }
+
+ mListview = (ListView) findViewById(R.id.list);
+ // 更新ListView数据
+ this.updateDisplay();
+ mListview.setOnItemClickListener(new OnItemClickListener() {
+ // 点击文件夹或者便签执行该回调函数
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ Intent intent = new Intent();
+ // mCursor在updateDisplay函数中进行初始化
+ mCursor.moveToPosition(position);
+ MyLog.d(TAG, "MainActivity==>被点击的记录的Position : " + position);
+ // 传递被选中记录的ID
+ intent.putExtra(NoteItems._ID,
+ mCursor.getInt(mCursor.getColumnIndex(NoteItems._ID)));
+ // 取得此记录的IS_FOLDER字段的值,用以判断选中文件夹还是便签
+ String is_Folder = mCursor.getString(mCursor
+ .getColumnIndex(NoteItems.IS_FOLDER));
+ if (is_Folder.equals("no")) {
+ // 不是文件夹
+ // 跳转到详细内容页面
+ // 传递此记录的CONTENT字段的值
+ intent.putExtra(NoteItems.CONTENT, mCursor
+ .getString(mCursor
+ .getColumnIndex(NoteItems.CONTENT)));
+ // 告诉NoteActivity打开它是为了编辑便签
+ intent.putExtra("Open_Type", "editNote");
+ intent.setClass(MainActivity.this, NoteActivity.class);
+ } else if (is_Folder.equals("yes")) {
+ // 是文件夹
+ // 跳转到FileNotesActivity,显示选中的文件夹下所有的便签
+ intent.setClass(MainActivity.this,
+ FolderNotesActivity.class);
+ }
+ startActivity(intent);
+ }
+ });
+ // 调用该函数,执行一些初始化的操作
+ initViews();
+ }
+
+ // 创建菜单
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // 新建便签
+ menu.add(Menu.NONE, MENU_NEW_NOTE, 1, R.string.new_note).setIcon(
+ R.drawable.new_note);
+ // 新建文件夹
+ menu.add(Menu.NONE, MENU_NEW_FOLDER, 2, R.string.new_folder).setIcon(
+ R.drawable.new_folder);
+ // 移进文件夹
+ menu.add(Menu.NONE, MENU_MOVE_TO_FOLDER, 3, R.string.move_to_folder)
+ .setIcon(R.drawable.move_to_folder);
+ // 删除
+ menu.add(Menu.NONE, MENU_DELETE, 4, R.string.delete).setIcon(
+ R.drawable.delete);
+ // 输出TXT文本
+ menu.add(Menu.NONE, MENU_EXPORT_TO_TEXT, 5, R.string.export_to_text)
+ .setIcon(R.drawable.export_to_text);
+ // 备份数据
+ menu.add(Menu.NONE, MENU_BACKUP_DATA, 6, R.string.backup_data);
+ // 从SD卡还原
+ menu.add(Menu.NONE, MENU_RESTORE_DATA_FROM_SDCARD, 7,
+ R.string.restore_data);
+ // 设置密码
+ menu.add(Menu.NONE, MENU_SET_PASSWORD, 8, R.string.set_password);
+ // 关于
+ menu.add(Menu.NONE, MENU_ABOUT, 9, R.string.about);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ // 菜单选中事件处理函数
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_NEW_NOTE:
+ newNote();
+ break;
+ case MENU_NEW_FOLDER:
+ newFolder();
+ break;
+ case MENU_MOVE_TO_FOLDER:
+ moveToFolder();
+ break;
+ case MENU_DELETE:
+ delete();
+ break;
+ case MENU_EXPORT_TO_TEXT:
+ this.exportToTxt();
+ break;
+ case MENU_BACKUP_DATA:
+ this.backupData();
+ break;
+ case MENU_RESTORE_DATA_FROM_SDCARD:
+ this.restoreDataFromSDCard();
+ break;
+ case MENU_SET_PASSWORD:
+ psdDialog();
+ break;
+ case MENU_ABOUT:
+ // 不做了
+ break;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ // 新建便签函数
+ private void newNote() {
+ Intent i = new Intent();
+ i.putExtra("Open_Type", "newNote");
+ i.setClass(MainActivity.this, NoteActivity.class);
+ startActivity(i);
+ }
+
+ // 新建文件夹函数
+ private void newFolder() {
+ Context mContext = MainActivity.this;
+ // 使用AlertDialog来处理新建文件夹的动作
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle(R.string.new_folder);
+ builder.setIcon(null);
+ // 自定义AlertDialog的布局
+ LayoutInflater inflater = (LayoutInflater) mContext
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ final View layout = inflater.inflate(R.layout.dialog_layout_new_folder,
+ (ViewGroup) findViewById(R.id.dialog_layout_new_folder_root));
+ builder.setView(layout);
+ // 设置一个类似确定的按钮
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 实例化AlertDialog中的EditText对象
+ EditText et_folder_name = (EditText) layout
+ .findViewById(R.id.et_dialog_new_folder);
+ // 取得EditText对象的值
+ String newFolderName = et_folder_name.getText()
+ .toString();
+ // 判断文件夹名称是否为空
+ if (!TextUtils.isEmpty(newFolderName)) {
+ // 名称符合条件则插入数据库
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, newFolderName);
+ values.put(NoteItems.UPDATE_DATE,
+ DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME,
+ DateTimeUtil.getTime());
+ values.put(NoteItems.IS_FOLDER, "yes");
+ values.put(NoteItems.PARENT_FOLDER, -1);
+ getContentResolver().insert(NoteItems.CONTENT_URI,
+ values);
+ // 更新ListView的数据源
+ mAdapter.notifyDataSetChanged();
+ }
+ }
+ });
+ // 设置一个类似取消的按钮
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 点击取消按钮,撤销新建文件夹对话框
+ dialog.dismiss();
+ }
+ });
+ AlertDialog ad = builder.create();
+ ad.show();
+ }
+
+ // 移进文件夹函数
+ private void moveToFolder() {
+ Intent intent = new Intent();
+ intent.setClass(MainActivity.this, MoveToFolderActivity.class);
+ startActivity(intent);
+ }
+
+ // 删除函数
+ private void delete() {
+ Intent i = new Intent(getApplicationContext(),
+ DeleteRecordsActivity.class);
+ startActivity(i);
+ }
+
+ // 输出TXT文本函数
+ private void exportToTxt() {
+ // 通过WriteTxt类实现TXT文本输出
+ WriteTxt wt = new WriteTxt(this);
+ try {
+ // 如果写入失败,则用Toast提醒用户
+ if (!wt.writeTxt()) {
+ Toast.makeText(this, R.string.exportTXTFailed,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(this, R.string.exportTXTSuc, Toast.LENGTH_SHORT)
+ .show();
+ }
+ } catch (IOException e) {
+ // 有待改进,以改善UE
+ MyLog.d(TAG,
+ "MainActivity==>exportToTxt get Exception : "
+ + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ // 备份数据函数(备份到XML文件中)
+ private void backupData() {
+ WriteXml wx = new WriteXml(this);
+ try {
+ // 如果写入失败,则用Toast提醒用户
+ if (!wx.writeXml()) {
+ Toast.makeText(this, R.string.backupDataFailed,
+ Toast.LENGTH_SHORT).show();
+ MyLog.d(TAG, "MainActivity==>backup to SDCard failed");
+ } else {
+ Toast.makeText(this, R.string.backupDataSuc, Toast.LENGTH_SHORT)
+ .show();
+ MyLog.d(TAG, "MainActivity==>backup to SDCard successfully");
+ }
+ } catch (Exception e) {
+ // 有待改进,以改善UE
+ MyLog.d(TAG,
+ "MainActivity==>backupData get Exception : "
+ + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ // 从SD卡恢复数据函数
+ private void restoreDataFromSDCard() {
+ RestoreDataFromXml rsd = new RestoreDataFromXml(getContentResolver());
+ try {
+ rsd.restoreData();
+ mAdapter.notifyDataSetChanged();
+ Toast.makeText(this, R.string.restoreDataSuc, Toast.LENGTH_SHORT)
+ .show();
+ } catch (Exception e) {
+ Toast.makeText(this, R.string.restoreDataFailed, Toast.LENGTH_SHORT)
+ .show();
+ MyLog.d(TAG,
+ "MainActivity==>restoreDataFromSDCard Failed Exception : "
+ + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ // 设置密码、修改密码或清除密码对话框
+ private void psdDialog() {
+ // 创建SharedPreferences对象,使用它保存用户的密码
+ SharedPreferences settings = getSharedPreferences(SETTINGS,
+ MODE_PRIVATE);
+ String psd = settings.getString("psd", "");
+ if (psd.length() > 0) {
+ // 有密码,点击设置密码后应该弹出有清除密码和修改密码两个选项的Dialog
+ final CharSequence[] items = {
+ getResources().getString(R.string.change_password),
+ getResources().getString(R.string.clear_password) };
+ // 使用AlertDialog来实现
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ // 设置AlertDialog要显示的item
+ builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ switch (item) {
+ case 0:
+ // 选中修改密码,调用设置密码的函数
+ setPassword(R.string.change_password);
+ break;
+ case 1:
+ // 选中清除密码
+ SharedPreferences settings = getSharedPreferences(
+ SETTINGS, MODE_PRIVATE);
+ Editor editor = settings.edit();
+ // 清空SharedPreferences中的密码
+ editor.putString("psd", "");
+ editor.commit();
+ Toast.makeText(
+ MainActivity.this,
+ getResources().getString(
+ R.string.change_password)
+ + "成功!", Toast.LENGTH_SHORT).show();
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ } else {
+ // 没有密码,直接弹出设置密码对话框
+ this.setPassword(R.string.set_password);
+ }
+ }
+
+ // 设置密码函数,传递字符串在R.java中的int值
+ private void setPassword(int resId) {
+ final int name = resId;
+ Context mContext = MainActivity.this;
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ // 自定义AlertDialog的布局方式
+ LayoutInflater inflater = (LayoutInflater) mContext
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ final View layout = inflater.inflate(
+ R.layout.dialog_layout_set_password,
+ (ViewGroup) findViewById(R.id.dialog_layout_set_password_root));
+ builder.setView(layout);
+ builder.setTitle(name);
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ EditText et_psw1 = (EditText) layout
+ .findViewById(R.id.et_password);
+ String psw1 = et_psw1.getText().toString();
+ EditText et_psw2 = (EditText) layout
+ .findViewById(R.id.et_confirm_Password);
+ String psw2 = et_psw2.getText().toString();
+ // 判断密码是否一致,且不为空
+ if (!TextUtils.isEmpty(psw1) && (psw1.equals(psw2))) {
+ // 密码一致,写入SharedPreference
+ SharedPreferences settings = getSharedPreferences(
+ SETTINGS, MODE_PRIVATE);
+ Editor editor = settings.edit();
+ editor.putString("psd", psw1);
+ editor.commit();
+ switch (name) {
+ case R.string.change_password:
+ Toast.makeText(
+ MainActivity.this,
+ getResources().getString(
+ R.string.change_password_succ),
+ Toast.LENGTH_SHORT).show();
+ break;
+ case R.string.set_password:
+ Toast.makeText(
+ MainActivity.this,
+ getResources().getString(
+ R.string.set_password_succ),
+ Toast.LENGTH_SHORT).show();
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (name) {
+ case R.string.change_password:
+ Toast.makeText(
+ MainActivity.this,
+ getResources()
+ .getString(
+ R.string.change_password_failed),
+ Toast.LENGTH_SHORT).show();
+ break;
+ case R.string.set_password:
+ Toast.makeText(
+ MainActivity.this,
+ getResources().getString(
+ R.string.set_password_failde),
+ Toast.LENGTH_SHORT).show();
+ break;
+ default:
+ break;
+ }
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ setPassword(name);
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 点击取消按钮,撤销设置密码对话框
+ dialog.dismiss();
+ }
+ });
+ AlertDialog ad = builder.create();
+ ad.show();
+ }
+
+ // 如果有密码,程序运行时先让用户输入密码
+ private void inputPsd() {
+ // 用于统计输入密码的次数
+ count++;
+ SharedPreferences settings = getSharedPreferences(SETTINGS,
+ MODE_PRIVATE);
+ final String psd = settings.getString("psd", "");
+ // 判断是否有密码
+ if (psd.length() > 0) {
+ // 有密码
+ Context mContext = MainActivity.this;
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle("输入密码");
+ LayoutInflater inflater = (LayoutInflater) mContext
+ .getSystemService(LAYOUT_INFLATER_SERVICE);
+ final View layout = inflater.inflate(R.layout.dialog_input_psd,
+ (ViewGroup) findViewById(R.id.dialog_input_psd_root));
+ builder.setView(layout);
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ EditText et_psd = (EditText) layout
+ .findViewById(R.id.et_input_password);
+ String psd_inputted = et_psd.getText().toString();
+ if (!psd.equals(psd_inputted)) {
+ Toast.makeText(MainActivity.this, "密码不正确!",
+ Toast.LENGTH_SHORT).show();
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ // 只允许填错密码3次
+ if (count < 3) {
+ inputPsd();
+ } else {
+ MainActivity.this.finish();
+ }
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ MainActivity.this.finish();// 结束程序
+ }
+ });
+ // 设置对话框不可取消.可以修正用户设置了密码,在弹出输入密码对话框时点返回键取消了输入密码对话框的BUG
+ builder.setCancelable(false);
+ AlertDialog ad = builder.create();
+ ad.show();
+ }
+ }
+
+ // 负责更新ListView中的数据
+ private void updateDisplay() {
+ // 查询条件,查询所有文件夹记录及显示在主页的便签记录
+ String selection = NoteItems.IS_FOLDER + " = '" + "yes" + "' or "
+ + NoteItems.PARENT_FOLDER + " = " + "-1";
+
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, null, null);
+ // This method allows the activity to take care of managing the given
+ // Cursor's lifecycle for you based on the activity's lifecycle.
+ startManagingCursor(mCursor);
+ mAdapter = new MyCursorAdapter(this, mCursor, true);
+ mListview.setAdapter(mAdapter);
+ MyLog.d(TAG, "MainActivity==>Update Display finished...");
+ }
+
+ // 初始化组件
+ private void initViews() {
+ imageButton = (ImageButton) findViewById(R.id.imageButton);
+ imageButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ newNote();
+ }
+ });
+ }
+
+ @Override
+ public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
+ ArrayList predictions = mGestureLibrary.recognize(gesture);
+ for (Prediction pre : predictions) {
+ MyLog.d(TAG, "MainActivity===>>onGesturePerformed-->手势相似度: "
+ + pre.score);
+ if (pre.score > 2.0 && pre.name.equals(this.GestureName_Add)) {// 认为手势合理
+ newFolder();// 创建文件夹
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/MoveOutOfFolderActivity.java b/XNote/XNote/src/com/xnote/activity/MoveOutOfFolderActivity.java
new file mode 100644
index 0000000..a25e07a
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/MoveOutOfFolderActivity.java
@@ -0,0 +1,140 @@
+package com.xnote.activity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.app.Activity;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.xnote.adapter.ListItemView;
+import com.xnote.adapter.MyCursorAdapter;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+public class MoveOutOfFolderActivity extends Activity {
+ private MyCursorAdapter mAdapter;
+ private ListView mListview;
+ private Button btnOK, btnCancel;
+
+ // 数组,用于收集被选中的item的id
+ private Map mIds = new HashMap();
+ private Cursor mCursor;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.listview_layout_del_or_move_records);
+
+ btnOK = (Button) findViewById(R.id.btnOK);
+ btnCancel = (Button) findViewById(R.id.btnCancelDel);
+ mListview = (ListView) findViewById(R.id.listview);
+
+ // 查询文件夹下的便签
+ Intent intent = getIntent();
+ int folderId = intent.getIntExtra("folderId", -1);
+ MyLog.d(MainActivity.TAG, "MoveOutOfFolderActivity==>被操作的文件夹的ID : "
+ + folderId);
+ String selection = NoteItems.PARENT_FOLDER + " = ? ";
+ String[] selectionArgs = new String[] { String.valueOf(folderId) };
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, selectionArgs, null);
+ startManagingCursor(mCursor);
+ mAdapter = new MyCursorAdapter(getApplicationContext(), mCursor, false);
+ mListview.setAdapter(mAdapter);
+ mListview.setItemsCanFocus(false);
+ mListview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+ mListview.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ ListItemView listItems = (ListItemView) view.getTag();
+ // 改变CheckBox的状态
+ listItems.cb_right.toggle();
+ MyCursorAdapter.isSelected.put(position,
+ listItems.cb_right.isChecked());
+ mCursor.moveToPosition(position);
+
+ if (MyCursorAdapter.isSelected.get(position)) {
+ // 获取对应位置上的记录的ID
+ int itemId = mCursor.getInt(mCursor
+ .getColumnIndex(NoteItems._ID));
+ mIds.put(position, itemId);
+ MyLog.d(MainActivity.TAG,
+ "MoveOutOfFolderActivity==>被点击的记录的id : " + itemId
+ + "\t" + position);
+ } else {
+ mIds.remove(position);
+ }
+ }
+ });
+ btnOK.setOnClickListener(listener);
+ btnCancel.setOnClickListener(listener);
+ }
+
+ private OnClickListener listener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btnOK:
+ // 更新记录
+ moveOutOfFolder();
+ break;
+ case R.id.btnCancelDel:
+ finish();
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ private void moveOutOfFolder() {
+ // 先判断是否选择了记录
+ final int noteCount = mIds.size();
+ if (noteCount > 0) {// 选择了要移出文件夹的便签
+ MyLog.d(MainActivity.TAG, "MoveOutOfFolderActivity==>被选中的便签数量:"
+ + noteCount);
+ // 文件夹下的记录数
+ int count = mCursor.getCount();
+ for (int i = 0; i < count; i++) {
+ String strTmp = String.valueOf(mIds.get(i));
+ if (!(strTmp == "null")) {// 如果不为空,则可更新
+ // 得到被选择的记录的ID
+ int noteId = mIds.get(i);
+ Uri tmpUri = ContentUris.withAppendedId(
+ NoteItems.CONTENT_URI, noteId);
+ Cursor oneNote = getContentResolver().query(tmpUri, null,
+ null, null, null);
+ startManagingCursor(oneNote);
+ oneNote.moveToFirst();
+ // 更新记录,即设置该记录的ParentFolder值为-1
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.PARENT_FOLDER, -1);
+ getContentResolver().update(tmpUri, values, null, null);
+ MyLog.d(MainActivity.TAG,
+ "MoveOutOfFolderActivity==>最后选择的要移出文件夹的记录的id : "
+ + mIds.get(i));
+ }
+ }
+ finish();
+ } else {// 用户未曾选择任何便签
+ Toast.makeText(getApplicationContext(), "您未选择要移出文件夹的便签!",
+ Toast.LENGTH_LONG).show();
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/MoveToFolderActivity.java b/XNote/XNote/src/com/xnote/activity/MoveToFolderActivity.java
new file mode 100644
index 0000000..6c02938
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/MoveToFolderActivity.java
@@ -0,0 +1,174 @@
+package com.xnote.activity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.DialogInterface;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.Toast;
+
+import com.xnote.adapter.ListItemView;
+import com.xnote.adapter.MyCursorAdapter;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 移进文件夹页面
+ */
+public class MoveToFolderActivity extends Activity {
+ private MyCursorAdapter mAdapter;
+ private ListView mListview;
+ private Button btnOK, btnCancel;
+
+ // 数组,用于收集被选中的item的id
+ private Map mIds;
+ private Cursor mCursor;
+
+ private OnClickListener listener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btnOK:
+ // 弹出对话框,供用户选择目标文件夹
+ chooseFolder();
+ break;
+ case R.id.btnCancelDel:
+ finish();
+ break;
+ default:
+ break;
+ }
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.listview_layout_del_or_move_records);
+
+ btnOK = (Button) findViewById(R.id.btnOK);
+ btnCancel = (Button) findViewById(R.id.btnCancelDel);
+ mListview = (ListView) findViewById(R.id.listview);
+
+ mIds = new HashMap();
+
+ // 查询主页上的便签记录(不查询文件夹记录,因为我们只允许便签被移动到文件夹下)
+ String selection = NoteItems.IS_FOLDER + " = '" + "no" + "' and "
+ + NoteItems.PARENT_FOLDER + " = " + "-1";
+ mCursor = getContentResolver().query(NoteItems.CONTENT_URI, null,
+ selection, null, null);
+ startManagingCursor(mCursor);
+ mAdapter = new MyCursorAdapter(getApplicationContext(), mCursor, false);
+ mListview.setAdapter(mAdapter);
+ mListview.setItemsCanFocus(false);
+ mListview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
+ mListview.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view,
+ int position, long id) {
+ ListItemView listItems = (ListItemView) view.getTag();
+ listItems.cb_right.toggle();
+ MyCursorAdapter.isSelected.put(position,
+ listItems.cb_right.isChecked());
+ mCursor.moveToPosition(position);
+ // 获取对应位置上的记录的ID
+ int itemId = mCursor.getInt(mCursor
+ .getColumnIndex(NoteItems._ID));
+ if (MyCursorAdapter.isSelected.get(position)) {
+ mIds.put(position, itemId);
+ MyLog.d(MainActivity.TAG,
+ "MoveToFolderActivity==>被点击的记录的id : " + itemId
+ + "\t" + position);
+ } else {
+ mIds.remove(position);
+ }
+ }
+ });
+ btnOK.setOnClickListener(listener);
+ btnCancel.setOnClickListener(listener);
+ }
+
+ // 选择目标文件夹
+ private void chooseFolder() {
+ // 先判断是否选择了记录,如果没有选择记录则不弹出选择文件夹的对话框
+ final int noteCount = mIds.size();
+ MyLog.d(MainActivity.TAG, "MoveToFolderActivity==>被选择的记录的数量:"
+ + noteCount);
+ if (noteCount > 0) {// 选择了要移进文件夹的便签
+ // 查询所有的文件夹记录
+ String selection = NoteItems.IS_FOLDER + " = ? ";
+ String[] selectionArgs = new String[] { "yes" };
+ final Cursor folderCursor = getContentResolver()
+ .query(NoteItems.CONTENT_URI, null, selection,
+ selectionArgs, null);
+ // 文件夹的数量
+ int count = folderCursor.getCount();
+ MyLog.d(MainActivity.TAG, "MoveToFolderActivity==>文件夹的数量:" + count);
+ if (count > 0) {// 有文件夹
+ // 将从数据库中查询到的文件夹的名称放入字符串数组
+ String[] folders = new String[count];
+ startManagingCursor(folderCursor);
+ for (int i = 0; i < count; i++) {
+ folderCursor.moveToPosition(i);
+ folders[i] = folderCursor.getString(folderCursor
+ .getColumnIndex(NoteItems.CONTENT));
+ }
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setItems(folders,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ folderCursor.moveToPosition(item);
+ // 取得被选中的文件夹的ID
+ int folderId = folderCursor.getInt(folderCursor
+ .getColumnIndex(NoteItems._ID));
+ // 更新记录
+ int count = mCursor.getCount();
+ for (int i = 0; i < count; i++) {
+ String strTmp = String.valueOf(mIds.get(i));
+ if (!(strTmp == "null")) {// 如果不为"null",则可更新
+ // 得到被选择的记录的ID
+ int noteId = mIds.get(i);
+ Uri tmpUri = ContentUris
+ .withAppendedId(
+ NoteItems.CONTENT_URI,
+ noteId);
+ // 更新记录
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.PARENT_FOLDER,
+ folderId);
+ getContentResolver().update(tmpUri,
+ values, null, null);
+ MyLog.d(MainActivity.TAG,
+ "MoveToFolderActivity==>要将选中的记录移进id为 : "
+ + folderId + " 的文件夹");
+ }
+ }
+ finish();
+ }
+ });
+ builder.create().show();
+ } else {// 用户未曾创建文件夹
+ Toast.makeText(getApplicationContext(), "不存在文件夹!",
+ Toast.LENGTH_LONG).show();
+ }
+ } else {// 用户没有选择任何要移进文件夹的便签
+ Toast.makeText(getApplicationContext(), "您没有选中任何便签!",
+ Toast.LENGTH_LONG).show();
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/activity/NoteActivity.java b/XNote/XNote/src/com/xnote/activity/NoteActivity.java
new file mode 100644
index 0000000..724a18a
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/activity/NoteActivity.java
@@ -0,0 +1,674 @@
+package com.xnote.activity;
+
+import java.util.Calendar;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.AlertDialog;
+import android.app.DatePickerDialog;
+import android.app.DatePickerDialog.OnDateSetListener;
+import android.app.KeyguardManager;
+import android.app.KeyguardManager.KeyguardLock;
+import android.app.PendingIntent;
+import android.app.TimePickerDialog;
+import android.app.TimePickerDialog.OnTimeSetListener;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.DatePicker;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.TimePicker;
+import android.widget.Toast;
+
+import com.xnote.alarm.AlarmReceiver;
+import com.xnote.alarm.WakeLockOpration;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 一条便签的详细信息页面。
+ */
+public class NoteActivity extends Activity {
+ private LinearLayout mLinearLayout_Header;
+ private ImageButton ib_bgcolor;
+ private TextView tv_note_title;
+ private EditText et_content;
+ // 存储便签的背景图片在R.java中的值
+ private int mBackgroud_Color;
+ // 用户创建或更新便签的日期/时间
+ private String updateDate;
+ private String updateTime;
+ private int mYear;// 提醒时间的年份
+ private int mMonth;// 提醒时间的月份
+ private int mDay;// 提醒时间的日(dayOfMonth)
+ private int mHour;// 提醒时间的小时
+ private int mMinute;// 提醒时间的分钟
+ private boolean hasSetAlartTime = false;// 用于标识用户是否设置Alarm
+ // 用于判断是新建便签还是更新便签
+ private String openType;
+ // 数据库中原有的便签的内容
+ private String oldContent;
+ // 接受传递过来的Intent对象
+ private Intent intent;
+ // 被编辑的便签的ID
+ private int _id;
+ // 被编辑便签所在的文件夹的ID
+ private int folderId;
+ // 设置shortcut时使用该字段
+ private final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
+
+ // 菜单
+ private static final int MENU_DELETE = Menu.FIRST;
+ private static final int MENU_REMIND = Menu.FIRST + 1;
+ private static final int MENU_SEND_HOME = Menu.FIRST + 2;
+ private static final int MENU_SHARE = Menu.FIRST + 3;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // 取消标题栏
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.note_detail);
+ // 得到有前一个Activity传递过来的Intent对象
+ intent = getIntent();
+ // 如果没有传递Intent对象,则返回主页(MainActivity)
+ if (intent.equals(null)) {
+ startActivity(new Intent(NoteActivity.this, MainActivity.class));
+ }
+ // 取得Open_Type的值,判断是新建便签还是更新便签
+ openType = intent.getStringExtra("Open_Type");
+ MyLog.d(MainActivity.TAG, "NoteActivity==>" + String.valueOf(openType));
+ // 被编辑的便签的ID
+ _id = intent.getIntExtra(NoteItems._ID, -1);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>被编辑的便签的id:" + _id);
+ // 得到文件夹的ID(如果从文件夹页面内新建或编辑便签则要求传递文件夹的ID)
+ folderId = intent.getIntExtra("FolderId", -1);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>要操作的文件夹的 id :" + folderId);
+ // 在AlarmReceiver中定义
+ if (intent.getIntExtra("alarm", -1) == 3080905) {
+ // 显示提醒
+ noteAlarm(_id);
+ }
+ initViews();
+ }
+
+ @Override
+ protected void onResume() {
+ // 恢复Keyguard
+ KeyguardManager km = (KeyguardManager) this
+ .getSystemService(Context.KEYGUARD_SERVICE);
+ KeyguardLock kl = km.newKeyguardLock(MainActivity.TAG);
+ kl.reenableKeyguard();
+ super.onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ // 释放 wakelock
+ WakeLockOpration.release();
+ super.onPause();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // 删除
+ menu.add(Menu.NONE, MENU_DELETE, 1, R.string.delete).setIcon(
+ R.drawable.delete);
+ // 设置闹铃
+ menu.add(Menu.NONE, MENU_REMIND, 2, R.string.alarm_time).setIcon(
+ R.drawable.alarm_time);
+ // 添加到桌面
+ menu.add(Menu.NONE, MENU_SEND_HOME, 3, R.string.add_shortcut_to_home)
+ .setIcon(R.drawable.add_shortcut_to_home);
+ // 修改文件夹
+ menu.add(Menu.NONE, MENU_SHARE, 4, R.string.share_sms_or_email)
+ .setIcon(R.drawable.share);
+
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_DELETE:
+ deleteNote();
+ break;
+ case MENU_REMIND:
+ setAlarm();
+ break;
+ case MENU_SEND_HOME:
+ addShortCut();
+ break;
+ case MENU_SHARE:
+ shareNote();
+ break;
+ default:
+ break;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ // 初始化组件
+ private void initViews() {
+ mLinearLayout_Header = (LinearLayout) findViewById(R.id.note_detail_header);
+ // ImageButton,点击改变便签背景颜色
+ ib_bgcolor = (ImageButton) findViewById(R.id.imagebutton_bgcolor);
+ tv_note_title = (TextView) findViewById(R.id.tv_note_date_time);
+ et_content = (EditText) findViewById(R.id.et_content);
+ if (_id != -1) {// 正常得到_id,编辑主页或文件夹下的便签
+ // 根据便签的ID查询该便签的详细内容
+ Cursor c = getContentResolver().query(
+ ContentUris.withAppendedId(NoteItems.CONTENT_URI, _id),
+ null, null, null, null);
+ c.moveToFirst();
+ // 最后更新便签的日期时间及其内容
+ oldContent = c.getString(c.getColumnIndex(NoteItems.CONTENT));
+ updateDate = c.getString(c.getColumnIndex(NoteItems.UPDATE_DATE));
+ updateTime = c.getString(c.getColumnIndex(NoteItems.UPDATE_TIME));
+
+ // 根据数据库中的值设定背景颜色
+ mBackgroud_Color = c.getInt(c
+ .getColumnIndex(NoteItems.BACKGROUND_COLOR));
+ c.close();
+ }
+ // 判断打开方式
+ if (openType.equals("newNote")) {// 新建"顶级便签",即没有放在文件夹内的便签
+ // 初始化新建便签的日期时间
+ updateDate = DateTimeUtil.getDate();
+ updateTime = DateTimeUtil.getTime();
+ // 使用默认的背景颜色
+ et_content.setBackgroundResource(R.drawable.item_light_blue);
+ } else if (openType.equals("editNote")) {// 编辑顶级便签(不在文件夹内的便签)
+ et_content.setText(oldContent);
+ // 根据数据库中的值设定背景颜色
+ if (mBackgroud_Color != 0) {
+ et_content.setBackgroundResource(mBackgroud_Color);
+ mLinearLayout_Header
+ .setBackgroundResource(headerBackground(mBackgroud_Color));
+ }
+ } else if (openType.equals("newFolderNote")) {// 在某文件夹下新建便签
+ // 初始化新建便签的日期时间
+ updateDate = DateTimeUtil.getDate();
+ updateTime = DateTimeUtil.getTime();
+ // 使用默认的背景颜色
+ et_content.setBackgroundResource(R.drawable.item_light_blue);
+ } else if (openType.equals("editFolderNote")) {// 编辑某文件夹下的便签
+ et_content.setText(oldContent);
+ if (mBackgroud_Color != 0) {
+ et_content.setBackgroundResource(mBackgroud_Color);
+ mLinearLayout_Header
+ .setBackgroundResource(headerBackground(mBackgroud_Color));
+ }
+ }
+ // 设置便签背景颜色的按钮
+ ib_bgcolor.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 弹出一个自定义的Dialog,供用户选择便签的背景颜色
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ NoteActivity.this);
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.dialog_note_bg_color,
+ null);
+ final AlertDialog dialog = builder.create();
+ dialog.setView(view, 0, 0, 0, 0);
+ // 初始化布局文件中的ImageButton对象
+ ImageButton pink = (ImageButton) view.findViewById(R.id.pink);
+ ImageButton green = (ImageButton) view.findViewById(R.id.green);
+ ImageButton yellow = (ImageButton) view
+ .findViewById(R.id.yellow);
+ ImageButton white = (ImageButton) view.findViewById(R.id.white);
+ // 自定义ImageButton的点击事件监听器
+ Button.OnClickListener listener = new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ MyLog.d(MainActivity.TAG, "NoteActivity==>选择背景颜色...");
+ switch (v.getId()) {
+ case R.id.green:
+ mBackgroud_Color = R.drawable.item_light_green;
+ et_content.setBackgroundResource(mBackgroud_Color);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_green);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>选择了绿色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.pink:
+ mBackgroud_Color = R.drawable.item_light_pink;
+ et_content.setBackgroundResource(mBackgroud_Color);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_pink);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>选择了粉红色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.yellow:
+ mBackgroud_Color = R.drawable.item_light_yellow;
+ et_content.setBackgroundResource(mBackgroud_Color);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_yellow);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>选择了黄色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.white:
+ mBackgroud_Color = R.drawable.item_light_white;
+ et_content.setBackgroundResource(mBackgroud_Color);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_gray);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>选择了白色:"
+ + mBackgroud_Color);
+ break;
+ }
+ // 结束对话框
+ dialog.dismiss();
+ }
+ };
+ // 注册点击事件监听器
+ pink.setOnClickListener(listener);
+ green.setOnClickListener(listener);
+ yellow.setOnClickListener(listener);
+ white.setOnClickListener(listener);
+ dialog.show();
+ }
+ });
+ // 以2011-09-09 9:10的样式显示日期时间
+ tv_note_title.setText(updateDate + "\t" + updateTime.substring(0, 5));
+ }
+
+ // 判断Header的背景图片
+ private int headerBackground(int resId) {
+ switch (resId) {
+ case R.drawable.item_light_blue:
+ return R.drawable.notes_header_blue;
+ case R.drawable.item_light_green:
+ return R.drawable.notes_header_green;
+ case R.drawable.item_light_pink:
+ return R.drawable.notes_header_pink;
+ case R.drawable.item_light_white:
+ return R.drawable.notes_header_gray;
+ case R.drawable.item_light_yellow:
+ return R.drawable.notes_header_yellow;
+ default:
+ break;
+ }
+ return R.drawable.notes_bg_blue;
+ }
+
+ // 设置便签的提醒时间
+ private void setAlarm() {
+ MyLog.d(MainActivity.TAG, "NoteActivity==>Set Alarm");
+ // 获得AlarmManager
+ final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
+ final Calendar c = Calendar.getInstance();
+ mYear = c.get(Calendar.YEAR);
+ mMonth = c.get(Calendar.MONTH);
+ mDay = c.get(Calendar.DAY_OF_MONTH);
+ mHour = c.get(Calendar.HOUR_OF_DAY);
+ mMinute = c.get(Calendar.MINUTE);
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle(R.string.alarm_time);
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.set_alarm, null);
+ builder.setView(view);
+ // 点击设置闹钟日期
+ final Button btnAlarmDate = (Button) view
+ .findViewById(R.id.btnAlarmDate);
+ btnAlarmDate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ DatePickerDialog dpd = new DatePickerDialog(NoteActivity.this,
+ new OnDateSetListener() {
+ @Override
+ public void onDateSet(DatePicker view, int year,
+ int monthOfYear, int dayOfMonth) {
+ mYear = year;
+ mMonth = monthOfYear;
+ mDay = dayOfMonth;
+ String alarmDate = mYear + "-" + mMonth + "-"
+ + mDay;
+ btnAlarmDate.setText(alarmDate);
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>设置的闹钟日期: " + alarmDate);
+ }
+ }, mYear, mMonth, mDay);
+ dpd.show();
+ }
+ });
+ // 点击设置闹钟时间
+ final Button btnAlarmTime = (Button) view
+ .findViewById(R.id.btnAlarmTime);
+ btnAlarmTime.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ TimePickerDialog tpd = new TimePickerDialog(NoteActivity.this,
+ new OnTimeSetListener() {
+ @Override
+ public void onTimeSet(TimePicker view,
+ int hourOfDay, int minute) {
+ mHour = hourOfDay;
+ mMinute = minute;
+ String alarmTime = hourOfDay + ":" + minute;
+ btnAlarmTime.setText(alarmTime);
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>设置的闹钟时间" + alarmTime);
+ }
+ }, mHour, mMinute, true);
+ tpd.show();
+ }
+ });
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 检测时间是否合理,如:不能早于现在
+ if (checkAlarmTime(am)) {
+ hasSetAlartTime = true;
+ dialog.dismiss();
+ Toast.makeText(getApplicationContext(), "设置提醒时间成功",
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(getApplicationContext(), "设置提醒时间失败",
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ hasSetAlartTime = false;
+ dialog.dismiss();
+ }
+ });
+ builder.create().show();
+ }
+
+ private boolean checkAlarmTime(AlarmManager am) {
+ MyLog.d(MainActivity.TAG, "NoteActivity==>checkAlarmTime()");
+ Calendar alarmCalendar = Calendar.getInstance();
+ alarmCalendar.set(mYear, mMonth, mDay, mHour, mMinute, 0);
+ // 使用传递过来的intent,因为它包含了打开NoteActivity所需的一切参数
+ Intent i = new Intent();
+ i.setClass(NoteActivity.this, AlarmReceiver.class);
+ i.putExtra("Open_Type", openType);
+ i.putExtra(NoteItems._ID, _id);
+ i.putExtra("FolderId", folderId);
+ PendingIntent pi = PendingIntent.getBroadcast(NoteActivity.this, _id,
+ i, PendingIntent.FLAG_UPDATE_CURRENT);
+ if (!alarmCalendar.before(Calendar.getInstance())) {// 判断时间设置是否合理
+ am.set(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pi);
+ return true;
+ }
+ return false;
+ }
+
+ // 到了用户设定的提醒时间后,调用该函数弹出Dialog提醒用户
+ private void noteAlarm(long noteId) {
+ MyLog.d(MainActivity.TAG, "NoteActivity==>闹钟时间到达,要显示的记录的 id: " + noteId);
+ // 传递note的id,在Dialog中显示出来
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setTitle("提醒");
+ // 根据便签的ID查询该便签的详细内容
+ Cursor c = getContentResolver().query(
+ ContentUris.withAppendedId(NoteItems.CONTENT_URI, noteId),
+ null, null, null, null);
+ c.moveToFirst();
+ // 最后更新便签 的日期时间及其内容
+ String content = c.getString(c.getColumnIndex(NoteItems.CONTENT));
+ MyLog.d(MainActivity.TAG, "NoteActivity==>闹钟显示时显示的内容: " + content);
+ c.close();
+ // dialog中显示便签的内容
+ builder.setMessage(content);
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>release wakelock");
+ WakeLockOpration.release();
+ dialog.dismiss();
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>release wakelock");
+ WakeLockOpration.release();
+ NoteActivity.this.finish();
+ }
+ });
+ builder.create().show();
+ }
+
+ @Override
+ public void onBackPressed() {
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>onBackPressed()-->用户选择的背景颜色 : "
+ + mBackgroud_Color);
+ if (mBackgroud_Color == 0) {// 如果mBackgroud_Color==0,我们使用蓝色作为默认背景
+ mBackgroud_Color = R.drawable.item_light_blue;
+ }
+ // 得到EditText中当前的内容
+ String content = et_content.getText().toString();
+ // 判断是更新还是新建便签
+ if (openType.equals("newNote")) {
+ // 创建主页上的便签(顶级便签)
+ if (!TextUtils.isEmpty(content)) {
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, content);
+ values.put(NoteItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME, DateTimeUtil.getTime());
+ values.put(NoteItems.BACKGROUND_COLOR, mBackgroud_Color);
+ values.put(NoteItems.IS_FOLDER, "no");
+ values.put(NoteItems.PARENT_FOLDER, -1);
+ getContentResolver().insert(NoteItems.CONTENT_URI, values);
+ }
+ } else if (openType.equals("newFolderNote")) {
+ // 创建文件夹下的便签
+ if (!TextUtils.isEmpty(content)) {
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, content);
+ values.put(NoteItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME, DateTimeUtil.getTime());
+ values.put(NoteItems.BACKGROUND_COLOR, mBackgroud_Color);
+ values.put(NoteItems.IS_FOLDER, "no");
+ values.put(NoteItems.PARENT_FOLDER, folderId);
+ getContentResolver().insert(NoteItems.CONTENT_URI, values);
+ }
+ } else if (openType.equals("editNote")) {
+ // 编辑主页上的便签
+ if (!TextUtils.isEmpty(content)) {
+ // 内容不为空,更新记录
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, content);
+ values.put(NoteItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME, DateTimeUtil.getTime());
+ if (hasSetAlartTime) {// 如果用户设置了Alarm,则更新
+ values.put(NoteItems.ALARM_TIME, mYear + "-" + mMonth + "-"
+ + mDay + " " + mHour + ":" + mMinute);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>提醒时间:" + mYear
+ + "-" + mMonth + "-" + mDay + " " + mHour + ":"
+ + mMinute);
+ }
+ values.put(NoteItems.BACKGROUND_COLOR, mBackgroud_Color);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>用户最终使用的背景颜色: "
+ + mBackgroud_Color);
+ getContentResolver().update(
+ ContentUris.withAppendedId(NoteItems.CONTENT_URI, _id),
+ values, null, null);
+ }
+ } else if (openType.equals("editFolderNote")) {
+ // 更新文件夹下的便签
+ if (!TextUtils.isEmpty(content)) {
+ // 更新记录
+ ContentValues values = new ContentValues();
+ values.put(NoteItems.CONTENT, content);
+ values.put(NoteItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(NoteItems.UPDATE_TIME, DateTimeUtil.getTime());
+ if (hasSetAlartTime) {
+ values.put(NoteItems.ALARM_TIME, mYear + "-" + mMonth + "-"
+ + mDay + " " + mHour + ":" + mMinute);
+ MyLog.d(MainActivity.TAG, "提醒时间:" + mYear + "-" + mMonth
+ + "-" + mDay + " " + mHour + ":" + mMinute);
+ }
+ values.put(NoteItems.BACKGROUND_COLOR, mBackgroud_Color);
+ values.put(NoteItems.IS_FOLDER, "no");
+ values.put(NoteItems.PARENT_FOLDER, folderId);
+ getContentResolver().update(
+ ContentUris.withAppendedId(NoteItems.CONTENT_URI, _id),
+ values, null, null);
+ MyLog.d(MainActivity.TAG, "NoteActivity==>编辑文件夹下的记录时,文件夹的id : "
+ + folderId);
+ }
+ }
+ if (!TextUtils.isEmpty(content)) {
+ oldContent = content;
+ }
+ super.onBackPressed();
+ }
+
+ // 添加桌面快捷方式
+ private void addShortCut() {
+ Intent addShortCut = new Intent(ACTION_ADD_SHORTCUT);
+ // 设置快捷方式的图标
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
+ Intent.ShortcutIconResource.fromContext(this, R.drawable.icon));
+ // 快捷方式的名称使用文件夹的名称.即oldFolderName变量的值
+ // 不考虑文件夹名称太长的情况
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, oldContent);
+ addShortCut.putExtra("duplicate", false);// 不允许重复创建快捷方式
+ // 设置点击快捷方式后执行的Intent对象
+ Intent shortCutIntent = new Intent(NoteActivity.this,
+ NoteActivity.class);
+ // 传递便签的ID
+ shortCutIntent.putExtra(NoteItems._ID, _id);
+ if (openType.equals("editNote")) {
+ // 编辑主页上的便签
+ shortCutIntent.putExtra("Open_Type", "editNote");
+ } else if (openType.equals("editFolderNote")) {
+ // 更新文件夹下的便签
+ shortCutIntent.putExtra("Open_Type", "editFolderNote");
+ // 传递文件夹ID
+ shortCutIntent.putExtra("FolderId", folderId);
+ }
+ addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortCutIntent);
+ // 发送广播,添加快捷方式
+ sendBroadcast(addShortCut);
+ }
+
+ // 删除便签
+ private void deleteNote() {
+ Context mContext = NoteActivity.this;
+ AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+ builder.setTitle(R.string.delete_note);
+ builder.setPositiveButton(R.string.Ok,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 构造Uri
+ Uri deleUri = ContentUris.withAppendedId(
+ NoteItems.CONTENT_URI, _id);
+ getContentResolver().delete(deleUri, null, null);
+ MyLog.d(MainActivity.TAG,
+ "NoteActivity==>deleteNote() via ContentResolver");
+ // 返回上一级
+ Intent intent = new Intent();
+ if (openType.equals("editNote")) {
+ // 显示主页
+ intent.setClass(NoteActivity.this,
+ MainActivity.class);
+ } else if (openType.equals("editFolderNote")) {
+ // 显示便签所属文件夹下页面
+ intent.putExtra(NoteItems._ID, folderId);
+ intent.setClass(NoteActivity.this,
+ FolderNotesActivity.class);
+ }
+ startActivity(intent);
+ }
+ });
+ builder.setNegativeButton(R.string.Cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // 点击取消按钮,撤销删除便签对话框
+ dialog.dismiss();
+ }
+ });
+ AlertDialog ad = builder.create();
+ ad.show();
+ }
+
+ // 用短信或或邮件分享便签内容
+ private void shareNote() {
+ final CharSequence[] items = {
+ getResources().getString(R.string.share_with_sms),
+ getResources().getString(R.string.share_with_email) };
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ // 当前便签的内容
+ String strContent = et_content.getText().toString();
+ switch (item) {
+ case 0:
+ // 使用短信分享
+ Uri smsToUri = Uri.parse("smsto:");// 联系人地址
+ Intent mIntent = new Intent(
+ android.content.Intent.ACTION_SENDTO, smsToUri);
+ // 短信的内容
+ mIntent.putExtra("sms_body", strContent);// 短信的内容
+ startActivity(mIntent);
+ Toast.makeText(NoteActivity.this,
+ "启动" + items[item] + "程序中...", Toast.LENGTH_SHORT)
+ .show();
+ break;
+ case 1:
+ // 使用邮件分享
+ Intent emailIntent = new Intent(
+ android.content.Intent.ACTION_SEND);
+ // 设置文本格式
+ emailIntent.setType("text/plain");
+ // 设置对方邮件地址
+ emailIntent
+ .putExtra(android.content.Intent.EXTRA_EMAIL, "");
+ // 设置标题内容
+ emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
+ "通过XNote分享信息");
+ // 设置邮件文本内容
+ emailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
+ strContent);
+ startActivity(Intent.createChooser(emailIntent,
+ "Choose Email Client"));
+ Toast.makeText(NoteActivity.this,
+ "启动" + items[item] + "程序中...", Toast.LENGTH_SHORT)
+ .show();
+ break;
+ default:
+ break;
+ }
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/adapter/ListItemView.java b/XNote/XNote/src/com/xnote/adapter/ListItemView.java
new file mode 100644
index 0000000..96c4b2b
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/adapter/ListItemView.java
@@ -0,0 +1,16 @@
+package com.xnote.adapter;
+
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/*
+ * ListView中每一行中包含的组件
+ * 这个类把ListView中的每一行都包装成一个ListItemView对象
+ */
+public final class ListItemView {
+ public LinearLayout linearlayout;
+ public TextView tv_left;
+ public TextView tv_right;
+ public CheckBox cb_right;
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/adapter/MyCursorAdapter.java b/XNote/XNote/src/com/xnote/adapter/MyCursorAdapter.java
new file mode 100644
index 0000000..ce3757a
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/adapter/MyCursorAdapter.java
@@ -0,0 +1,126 @@
+package com.xnote.adapter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.CursorAdapter;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 自定义Adapter,在移动、删除、显示记录时使用
+ */
+public class MyCursorAdapter extends CursorAdapter {
+ // This class is used to instantiate layout XML file into its corresponding
+ // View objects.
+ private LayoutInflater mListContainer; // 视图容器
+ // 存储CheckBox的状态,即是否被选中
+ public static Map isSelected;
+ // 删除记录、移动记录还是显示记录
+ private boolean isShowingRecords = true;
+ // 自定义视图
+ private ListItemView listItemView = null;
+
+ // 构造器
+ public MyCursorAdapter(Context context, Cursor c, boolean isShowingRecords) {
+ super(context, c);
+ this.isShowingRecords = isShowingRecords;
+ mListContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文
+ isSelected = new HashMap();
+ // 初始化多选框的状态
+ int count = c.getCount();
+ for (int i = 0; i < count; i++) {
+ isSelected.put(i, false);
+ }
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View convertView = null;
+ listItemView = new ListItemView();
+ if (!isShowingRecords) {// 删除或移动记录
+ // 获取listview中每个item的布局文件的视图
+ convertView = mListContainer.inflate(
+ R.layout.listview_del_or_move_item_layout, null);
+ // 获取控件对象
+ listItemView.tv_left = (TextView) convertView
+ .findViewById(R.id.tv_left);
+ listItemView.cb_right = (CheckBox) convertView
+ .findViewById(R.id.cb_right);
+ } else { // 显示记录
+ // 获取listview中每个item的布局文件的视图
+ convertView = mListContainer.inflate(R.layout.listview_item_layout,
+ null);
+ // 获取控件对象
+ listItemView.tv_left = (TextView) convertView
+ .findViewById(R.id.tv_left);
+ listItemView.tv_right = (TextView) convertView
+ .findViewById(R.id.tv_right);
+ }
+ // 初始化ListView中每一行布局中的LinearLayout
+ listItemView.linearlayout = (LinearLayout) convertView
+ .findViewById(R.id.listview_linearlayout);
+ // 设置控件集到convertView
+ convertView.setTag(listItemView);
+ return convertView;
+ }
+
+ // view newView函数的返回值
+ // Cursor cursor记录的位置有系统管理,使用的时候将它当作只含有一个记录的对象。用户只需要直接用。
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ listItemView = (ListItemView) view.getTag();
+ int position = cursor.getPosition();
+ // 取出字段的值,判断该记录是否为文件夹
+ String is_Folder = cursor.getString(cursor
+ .getColumnIndex(NoteItems.IS_FOLDER));
+ if (is_Folder.equals("no")) {
+ // 不是文件夹
+ int bg_color = cursor.getInt(cursor
+ .getColumnIndex(NoteItems.BACKGROUND_COLOR));
+ MyLog.d(MainActivity.TAG, "MyCursorAdapter==>数据库中存储的记录的背景颜色: "
+ + bg_color);
+ // 因为我们在数据库中存储资源文件的ID,所以在这儿直接使用数据库中该字段的值
+ listItemView.linearlayout.setBackgroundResource(bg_color);
+ } else if (is_Folder.equals("yes")) {
+ // 是文件夹,直接设置它的背景图片
+ listItemView.linearlayout
+ .setBackgroundResource(R.drawable.folder_background);
+ }
+ // 设置标题(或内容)
+ String content = cursor.getString(cursor
+ .getColumnIndex(NoteItems.CONTENT));
+ // 如果内容太长或出现了换行符,则采用如下方式显示
+ int count = content.indexOf("\n");
+ MyLog.d(MainActivity.TAG, "MyCursorAdapter==>第一个换行符的位置:" + count);
+ if (count > -1 && count < 17) {
+ listItemView.tv_left.setText(content.substring(0, count) + "...");
+ } else if (content.length() > 17) {
+ listItemView.tv_left.setText(content.substring(0, 17) + "...");
+ } else {
+ listItemView.tv_left.setText(content);
+ }
+ if (!isShowingRecords) { // 移动或删除记录,使用CheckBox来供用户选择要操作的记录
+ listItemView.cb_right.setChecked(isSelected.get(position));
+ } else {// 显示记录,使用TextView来显示记录的最后更新时间
+ // 显示创建(最后更新)记录的日期时间
+ listItemView.tv_right.setText(cursor.getString(cursor
+ .getColumnIndex(NoteItems.UPDATE_DATE))
+ + "\t"
+ + cursor.getString(
+ cursor.getColumnIndex(NoteItems.UPDATE_TIME))
+ .substring(0, 5));
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/alarm/AlarmReceiver.java b/XNote/XNote/src/com/xnote/alarm/AlarmReceiver.java
new file mode 100644
index 0000000..0aa4a94
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/alarm/AlarmReceiver.java
@@ -0,0 +1,44 @@
+package com.xnote.alarm;
+
+import android.app.KeyguardManager;
+import android.app.KeyguardManager.KeyguardLock;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.NoteActivity;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+public class AlarmReceiver extends BroadcastReceiver {
+ private int _id;
+ private String openType;
+ private int folderId;
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ MyLog.d(MainActivity.TAG, "AlarmReceiver==>acquire wakelock");
+ WakeLockOpration.acquire(context);
+ KeyguardManager km = (KeyguardManager) context
+ .getSystemService(Context.KEYGUARD_SERVICE);
+ KeyguardLock kl = km.newKeyguardLock(MainActivity.TAG);
+ kl.disableKeyguard();
+ // 取得Open_Type的值,判断是新建便签还是更新便签
+ openType = intent.getStringExtra("Open_Type");
+ // 被编辑的便签的ID
+ _id = intent.getIntExtra(NoteItems._ID, -1);
+ MyLog.d(MainActivity.TAG, "AlarmReceiver==>要提醒的记录的id: " + _id);
+ // 得到文件夹的ID(如果从文件夹页面内新建或编辑便签则要求传递文件夹的ID)
+ folderId = intent.getIntExtra("FolderId", -1);
+
+ Intent i = new Intent();
+ i.setClass(context, NoteActivity.class);
+ i.putExtra("Open_Type", openType);
+ i.putExtra(NoteItems._ID, _id);
+ i.putExtra("FolderId", folderId);
+ i.putExtra("alarm", 3080905);
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(i);
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/alarm/WakeLockOpration.java b/XNote/XNote/src/com/xnote/alarm/WakeLockOpration.java
new file mode 100644
index 0000000..3f61278
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/alarm/WakeLockOpration.java
@@ -0,0 +1,31 @@
+package com.xnote.alarm;
+
+import com.xnote.activity.MainActivity;
+
+import android.content.Context;
+import android.os.PowerManager;
+
+// 当到了用户设置的闹钟时间时,如果屏幕关闭,我们可以通过使用WakeLock和KeyguardLock来解锁屏幕并弹出我们自己的Dialog
+public final class WakeLockOpration {
+ private static PowerManager.WakeLock wakeLock;
+
+ // 获得wakelock
+ public static void acquire(Context context) {
+ if (wakeLock != null) {
+ wakeLock.release();
+ }
+ PowerManager pm = (PowerManager) context
+ .getSystemService(Context.POWER_SERVICE);
+ wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
+ | PowerManager.ACQUIRE_CAUSES_WAKEUP
+ | PowerManager.ON_AFTER_RELEASE, MainActivity.TAG);
+ wakeLock.acquire();
+ }
+
+ // 释放wakelock
+ public static void release() {
+ if (wakeLock != null)
+ wakeLock.release();
+ wakeLock = null;
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/database/DateTimeUtil.java b/XNote/XNote/src/com/xnote/database/DateTimeUtil.java
new file mode 100644
index 0000000..94cda2f
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/database/DateTimeUtil.java
@@ -0,0 +1,25 @@
+package com.xnote.database;
+
+import java.sql.Date;
+import java.sql.Time;
+import java.util.Calendar;
+
+public final class DateTimeUtil {
+ // 日期操作
+ public static String getDate() {
+ Calendar c = Calendar.getInstance();
+ int theYear = c.get(Calendar.YEAR) - 1900;
+ int theMonth = c.get(Calendar.MONTH);
+ int theDay = c.get(Calendar.DAY_OF_MONTH);
+ return (new Date(theYear, theMonth, theDay)).toString();
+ }
+
+ // 时间操作
+ public static String getTime() {
+ Calendar c = Calendar.getInstance();
+ int theHour = c.get(Calendar.HOUR_OF_DAY);
+ int theMinute = c.get(Calendar.MINUTE);
+ int theSecond = c.get(Calendar.SECOND);
+ return (new Time(theHour, theMinute, theSecond)).toString();
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/database/DbInfo.java b/XNote/XNote/src/com/xnote/database/DbInfo.java
new file mode 100644
index 0000000..ba59822
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/database/DbInfo.java
@@ -0,0 +1,75 @@
+package com.xnote.database;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+// 描述数据库、表的信息
+public final class DbInfo {
+
+ public static final String AUTHORITY = "com.xnote.provider.DbInfo";
+
+ // This class cannot be instantiated
+ private DbInfo() {
+ }
+
+ // 数据库表:NoteItems
+ public static final class NoteItems implements BaseColumns {
+ // This class cannot be instantiated
+ private NoteItems() {
+ }
+
+ // The content:// style URL for this table
+ public static final Uri CONTENT_URI = Uri.parse("content://"
+ + AUTHORITY + "/noteitems");
+ // The MIME type of CONTENT_URI providing a directory of NoteItems.
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.xnote.noteitem";
+
+ // The MIME type of a CONTENT_URI sub-directory of a single NoteItem.
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.xnote.noteitem";
+
+ // 便签内容(text类型)
+ public static final String CONTENT = "content";
+ // 最后更新的日期(date类型),由于ContentValues的原因,我们把Date类型的数据转为String类型
+ public static final String UPDATE_DATE = "update_date";
+ // 最后更新的时间(time类型),由于ContentValues的原因,我们把Time类型的数据转为String类型
+ public static final String UPDATE_TIME = "update_time";
+ // 闹钟提醒时间(datetime类型:YYYY-MM-DD
+ // HH:MM:SS)由于ContentValues的原因,我们把类型转为String类型
+ public static final String ALARM_TIME = "alarm_time";
+ // 便签的背景颜色(integer类型,直接存储资源文件的id)
+ public static final String BACKGROUND_COLOR = "background_color";
+ // 标识是否为文件夹(text类型,yes和no来区分)
+ public static final String IS_FOLDER = "is_folder";
+ // 如果是文件夹下的便签,本字段存储其所属文件夹(Integer类型(存储被标记为文件夹的记录的_id字段的值))
+ // 如果是顶级便签,该字段用-1代替
+ public static final String PARENT_FOLDER = "parent_folder";
+ // 默认的排序方式。
+ public static final String DEFAULT_SORT_ORDER = IS_FOLDER + " DESC , "
+ + UPDATE_DATE + " DESC ," + UPDATE_TIME + " DESC";
+ }
+
+ // 用于存放Appwidget记录的表
+ public static final class AppwidgetItems implements BaseColumns {
+ // This class cannot be instantiated
+ private AppwidgetItems() {
+ }
+
+ // The content:// style URL for this table
+ public static final Uri CONTENT_URI = Uri.parse("content://"
+ + AUTHORITY + "/appwidgetitems");
+ // The MIME type of CONTENT_URI providing a directory of AppwidgetItems.
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.xnote.appwidgetitem";
+
+ // The MIME type of a CONTENT_URI sub-directory of a single NoteItem.
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.xnote.appwidgetitem";
+
+ // 便签内容(text类型)
+ public static final String CONTENT = "content";
+ // 最后更新的日期(date类型),由于ContentValues的原因,我们把Date类型的数据转为String类型
+ public static final String UPDATE_DATE = "update_date";
+ // 最后更新的时间(time类型),由于ContentValues的原因,我们把Time类型的数据转为String类型
+ public static final String UPDATE_TIME = "update_time";
+ // 便签的背景颜色(integer类型)
+ public static final String BACKGROUND_COLOR = "background_color";
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/database/DbInfoProvider.java b/XNote/XNote/src/com/xnote/database/DbInfoProvider.java
new file mode 100644
index 0000000..e62fd1a
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/database/DbInfoProvider.java
@@ -0,0 +1,316 @@
+package com.xnote.database;
+
+import java.util.HashMap;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.text.TextUtils;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+public class DbInfoProvider extends ContentProvider {
+ // 数据库名
+ private static final String DATABASE_NAME = "note.db";
+ // 数据库版本号
+ private static final int DATABASE_VERSION = 1;
+ // 数据库中表名
+ private static final String TABLE_NOTEITEMS = "noteitems";
+ private static final String TABLE_APPWIDGETITEMS = "appwidgetitems";
+ private DatabaseHelper mOpenHelper;
+ private static UriMatcher mUriMatcher;
+
+ // Uri指定到NoteItems表
+ private static final int NOTEITEMS = 1;
+ // Uri指定到NoteItems表中的一条数据
+ private static final int NOTEITEMS_ITEM = 2;
+ private static final int APPWIDGETITEMS = 3;
+ private static final int APPWIDGETITEMS_ITEM = 4;
+ // 查询表(NoteItems)时要查询的列
+ private static HashMap mProjectionMap_NoteItems;
+ private static HashMap mProjectionMap_AppwidgetItems;
+ // 静态初始化UriMatcher对象,以及所要使用的ProjectionMap
+ static {
+ mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ // NoteItems表
+ mUriMatcher.addURI(DbInfo.AUTHORITY, "noteitems", NOTEITEMS);
+ mUriMatcher.addURI(DbInfo.AUTHORITY, "noteitems/#", NOTEITEMS_ITEM);
+ // AppwidgetItems表
+ mUriMatcher.addURI(DbInfo.AUTHORITY, "appwidgetitems", APPWIDGETITEMS);
+ mUriMatcher.addURI(DbInfo.AUTHORITY, "appwidgetitems/#",
+ APPWIDGETITEMS_ITEM);
+ // 初始化查询列
+ mProjectionMap_NoteItems = new HashMap();
+ mProjectionMap_NoteItems.put(NoteItems._ID, NoteItems._ID);
+ mProjectionMap_NoteItems.put(NoteItems.CONTENT, NoteItems.CONTENT);
+ mProjectionMap_NoteItems.put(NoteItems.UPDATE_DATE,
+ NoteItems.UPDATE_DATE);
+ mProjectionMap_NoteItems.put(NoteItems.UPDATE_TIME,
+ NoteItems.UPDATE_TIME);
+ mProjectionMap_NoteItems
+ .put(NoteItems.ALARM_TIME, NoteItems.ALARM_TIME);
+ mProjectionMap_NoteItems.put(NoteItems.BACKGROUND_COLOR,
+ NoteItems.BACKGROUND_COLOR);
+ mProjectionMap_NoteItems.put(NoteItems.IS_FOLDER, NoteItems.IS_FOLDER);
+ mProjectionMap_NoteItems.put(NoteItems.PARENT_FOLDER,
+ NoteItems.PARENT_FOLDER);
+
+ mProjectionMap_AppwidgetItems = new HashMap();
+ mProjectionMap_AppwidgetItems.put(AppwidgetItems._ID,
+ AppwidgetItems._ID);
+ mProjectionMap_AppwidgetItems.put(AppwidgetItems.CONTENT,
+ AppwidgetItems.CONTENT);
+ mProjectionMap_AppwidgetItems.put(AppwidgetItems.UPDATE_DATE,
+ AppwidgetItems.UPDATE_DATE);
+ mProjectionMap_AppwidgetItems.put(AppwidgetItems.UPDATE_TIME,
+ AppwidgetItems.UPDATE_TIME);
+ mProjectionMap_AppwidgetItems.put(AppwidgetItems.BACKGROUND_COLOR,
+ AppwidgetItems.BACKGROUND_COLOR);
+ }
+
+ // This class helps open, create, and upgrade the database file.
+ private static class DatabaseHelper extends SQLiteOpenHelper {
+
+ DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ // 创建表noteitems
+ String sql_noteitems = "CREATE TABLE " + TABLE_NOTEITEMS + " ("
+ + NoteItems._ID + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
+ + NoteItems.CONTENT + " TEXT," + NoteItems.UPDATE_DATE
+ + " TEXT," + NoteItems.UPDATE_TIME + " TEXT,"
+ + NoteItems.ALARM_TIME + " TEXT,"
+ + NoteItems.BACKGROUND_COLOR + " INTEGER,"
+ + NoteItems.IS_FOLDER + " TEXT," + NoteItems.PARENT_FOLDER
+ + " INTEGER" + ");";
+ MyLog.w(MainActivity.TAG, "创建表 " + TABLE_NOTEITEMS + " 的SQL语句:"
+ + sql_noteitems);
+ // 创建表appwidgetitems
+ String sql_appwidgetitems = "CREATE TABLE " + TABLE_APPWIDGETITEMS
+ + " (" + AppwidgetItems._ID
+ + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
+ + AppwidgetItems.CONTENT + " TEXT,"
+ + AppwidgetItems.UPDATE_DATE + " TEXT,"
+ + AppwidgetItems.UPDATE_TIME + " TEXT,"
+ + NoteItems.BACKGROUND_COLOR + " INTEGER" + ");";
+ MyLog.w(MainActivity.TAG, "创建表 " + TABLE_APPWIDGETITEMS
+ + " 的SQL语句:" + sql_appwidgetitems);
+ db.execSQL(sql_noteitems);
+ db.execSQL(sql_appwidgetitems);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ MyLog.w(MainActivity.TAG, "Upgrading database from version "
+ + oldVersion + " to " + newVersion
+ + ", which will destroy all old data");
+ // 删除原有的表
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTEITEMS);
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_APPWIDGETITEMS);
+ // 重新创建表
+ onCreate(db);
+ }
+ }
+
+ @Override
+ public boolean onCreate() {
+ mOpenHelper = new DatabaseHelper(getContext());
+ return true;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ // 只能通过NoteItems表中的CONTENT_URI来插入数据
+ SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ String table;
+ long id;
+ Uri tmpUri;
+ switch (mUriMatcher.match(uri)) {
+ case NOTEITEMS:// Uri匹配到NoteItems表
+ table = TABLE_NOTEITEMS;
+ id = db.insert(table, NoteItems.CONTENT, values);
+ if (id > 0) {
+ tmpUri = ContentUris.withAppendedId(NoteItems.CONTENT_URI, id);
+ getContext().getContentResolver().notifyChange(tmpUri, null);
+ MyLog.d(MainActivity.TAG, "ContentProvider==>insert()");
+ return tmpUri;
+ }
+ break;
+ case APPWIDGETITEMS:
+ table = TABLE_APPWIDGETITEMS;
+ id = db.insert(table, AppwidgetItems.CONTENT, values);
+ if (id > 0) {
+ tmpUri = ContentUris.withAppendedId(AppwidgetItems.CONTENT_URI,
+ id);
+ getContext().getContentResolver().notifyChange(tmpUri, null);
+ MyLog.d(MainActivity.TAG, "ContentProvider==>insert()");
+ return tmpUri;
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ throw new SQLException("Failed to insert row into " + uri);
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ // 记录被删除记录条数
+ int count = 0;
+ String tmpId;
+ switch (mUriMatcher.match(uri)) {
+ case NOTEITEMS:
+ count = db.delete(TABLE_NOTEITEMS, selection, selectionArgs);
+ break;
+ case NOTEITEMS_ITEM:
+ tmpId = uri.getPathSegments().get(1);
+ count = db.delete(TABLE_NOTEITEMS, NoteItems._ID
+ + "="
+ + tmpId
+ + (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ + ')' : ""), selectionArgs);
+ break;
+
+ case APPWIDGETITEMS:
+ count = db.delete(TABLE_APPWIDGETITEMS, selection, selectionArgs);
+ break;
+ case APPWIDGETITEMS_ITEM:
+ tmpId = uri.getPathSegments().get(1);
+ count = db.delete(TABLE_APPWIDGETITEMS, AppwidgetItems._ID
+ + "="
+ + tmpId
+ + (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ + ')' : ""), selectionArgs);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ MyLog.d(MainActivity.TAG, "ContentProvider==>delete()");
+ return count;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection,
+ String[] selectionArgs) {
+ SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+ // 记录被修改记录条数
+ int count = 0;
+ String tmpId;
+ switch (mUriMatcher.match(uri)) {
+ case NOTEITEMS:
+ count = db
+ .update(TABLE_NOTEITEMS, values, selection, selectionArgs);
+ break;
+ case NOTEITEMS_ITEM:
+ tmpId = uri.getPathSegments().get(1);
+ count = db.update(TABLE_NOTEITEMS, values, NoteItems._ID
+ + "="
+ + tmpId
+ + (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ + ')' : ""), selectionArgs);
+ break;
+
+ case APPWIDGETITEMS:
+ count = db.update(TABLE_APPWIDGETITEMS, values, selection,
+ selectionArgs);
+ break;
+ case APPWIDGETITEMS_ITEM:
+ tmpId = uri.getPathSegments().get(1);
+ count = db.update(TABLE_APPWIDGETITEMS, values, AppwidgetItems._ID
+ + "="
+ + tmpId
+ + (!TextUtils.isEmpty(selection) ? " AND (" + selection
+ + ')' : ""), selectionArgs);
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ getContext().getContentResolver().notifyChange(uri, null);
+ MyLog.d(MainActivity.TAG, "ContentProvider==>update()");
+ return count;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ // SQL查询构造器
+ SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
+ // If no sort order is specified use the default
+ String orderBy = "";
+ switch (mUriMatcher.match(uri)) {
+ case NOTEITEMS_ITEM:// 注意:没有使用break,我们让它使用后面一条case语句的break
+ // 组建SQL的where
+ queryBuilder.appendWhere(NoteItems._ID + " = "
+ + uri.getPathSegments().get(1));
+ case NOTEITEMS:
+ // 设置待查询的表
+ queryBuilder.setTables(TABLE_NOTEITEMS);
+ // 设置要查询的列
+ queryBuilder.setProjectionMap(mProjectionMap_NoteItems);
+ // 设置排序
+ if (TextUtils.isEmpty(sortOrder)) {
+ orderBy = NoteItems.DEFAULT_SORT_ORDER;
+ } else {
+ orderBy = sortOrder;
+ }
+ break;
+
+ case APPWIDGETITEMS_ITEM:// 注意:没有使用break,我们让它使用后面一条case语句的break
+ // 组建SQL的where
+ queryBuilder.appendWhere(AppwidgetItems._ID + " = "
+ + uri.getPathSegments().get(1));
+ case APPWIDGETITEMS:
+ // 设置待查询的表
+ queryBuilder.setTables(TABLE_APPWIDGETITEMS);
+ // 设置要查询的列
+ queryBuilder.setProjectionMap(mProjectionMap_AppwidgetItems);
+ // 设置排序
+ if (!TextUtils.isEmpty(sortOrder)) {
+ orderBy = sortOrder;
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+ Cursor c = queryBuilder.query(db, projection, selection, selectionArgs,
+ null, null, orderBy);
+ // Tell the cursor what uri to watch, so it knows when its source data
+ // changes
+ c.setNotificationUri(getContext().getContentResolver(), uri);
+ MyLog.d(MainActivity.TAG, "ContentProvider==>query()");
+ return c;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ switch (mUriMatcher.match(uri)) {
+ case NOTEITEMS:
+ return NoteItems.CONTENT_TYPE;
+ case NOTEITEMS_ITEM:
+ return NoteItems.CONTENT_ITEM_TYPE;
+ case APPWIDGETITEMS:
+ return AppwidgetItems.CONTENT_TYPE;
+ case APPWIDGETITEMS_ITEM:
+ return AppwidgetItems.CONTENT_ITEM_TYPE;
+ default:
+ throw new IllegalArgumentException("Unknown URI " + uri);
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/log/MyLog.java b/XNote/XNote/src/com/xnote/log/MyLog.java
new file mode 100644
index 0000000..9fd16e2
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/log/MyLog.java
@@ -0,0 +1,27 @@
+package com.xnote.log;
+
+import android.util.Log;
+
+// 简单的封装Log类,便于控制是否打印Log信息
+public final class MyLog {
+ // 控制是否打印Log信息
+ private static boolean openLog = true;
+
+ public static void d(String tag, String msg) {
+ if (openLog) {
+ Log.d(tag, msg);
+ }
+ }
+
+ public static void w(String tag, String msg) {
+ if (openLog) {
+ Log.w(tag, msg);
+ }
+ }
+
+ public static void e(String tag, String msg) {
+ if (openLog) {
+ Log.e(tag, msg);
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_2X2.java b/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_2X2.java
new file mode 100644
index 0000000..029dfc0
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_2X2.java
@@ -0,0 +1,197 @@
+package com.xnote.widget;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.log.MyLog;
+
+/*
+ * Widget的Configuration Activity,负责Widget的初始化
+ */
+public class ConfigurationActivity_2X2 extends Activity {
+ private LinearLayout mLinearLayout_Header;
+ private ImageButton ib_bgcolor;
+ private TextView tv_widget_title;
+ private EditText et_widget_content;
+ // 存储便签的背景图片在R.java中的值
+ private int mBackgroud_Color;
+ // 新建AppWidget便签的日期、时间
+ private String createDate;
+ private String createTime;
+ // 被插入便签的ID
+ private int _id;
+ // Widget的ID
+ private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+ // 更改背景颜色事件监听器
+ private View.OnClickListener listener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 弹出一个自定义的Dialog,供用户选择便签的背景颜色
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ ConfigurationActivity_2X2.this);
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.dialog_note_bg_color, null);
+ final AlertDialog dialog = builder.create();
+ dialog.setView(view, 0, 0, 0, 0);
+ // 初始化布局文件中的ImageButton对象
+ ImageButton pink = (ImageButton) view.findViewById(R.id.pink);
+ ImageButton green = (ImageButton) view.findViewById(R.id.green);
+ ImageButton yellow = (ImageButton) view.findViewById(R.id.yellow);
+ ImageButton white = (ImageButton) view.findViewById(R.id.white);
+ // 自定义ImageButton的点击事件监听器
+ Button.OnClickListener listener = new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.green:
+ mBackgroud_Color = R.drawable.widget_small_green;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_green);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_green);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>选择了绿色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.pink:
+ mBackgroud_Color = R.drawable.widget_small_red;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_pink);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_pink);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>选择了粉红色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.yellow:
+ mBackgroud_Color = R.drawable.widget_small_yellow;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_yellow);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_yellow);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>选择了黄色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.white:
+ mBackgroud_Color = R.drawable.widget_small_gray;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_white);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_gray);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>选择了白色:"
+ + mBackgroud_Color);
+ break;
+ }
+ // 结束对话框
+ dialog.dismiss();
+ }
+ };
+ // 注册点击事件监听器
+ pink.setOnClickListener(listener);
+ green.setOnClickListener(listener);
+ yellow.setOnClickListener(listener);
+ white.setOnClickListener(listener);
+ dialog.show();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ MyLog.d(MainActivity.TAG, "ConfigurationActivity_2X2==>***onCreate***");
+ requestWindowFeature(Window.FEATURE_NO_TITLE);// 取消标题栏
+ setContentView(R.layout.widget_note_layout);
+ // 防止用户未完成配置就直接退出
+ setResult(RESULT_CANCELED);
+ // 取得Widget的ID
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+ // If they gave us an intent without the widget id, just bail.
+ if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ }
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>onCreate-->AppWidget ID : "
+ + mAppWidgetId);
+ mLinearLayout_Header = (LinearLayout) findViewById(R.id.widget_detail_header);
+ tv_widget_title = (TextView) findViewById(R.id.tv_widget_date_time);
+
+ et_widget_content = (EditText) findViewById(R.id.et_content);
+ // 使用默认的背景颜色
+ et_widget_content.setBackgroundResource(R.drawable.item_light_blue);
+
+ // ImageButton,点击改变便签背景颜色
+ ib_bgcolor = (ImageButton) findViewById(R.id.imagebutton_bgcolor);
+ // 设置便签背景颜色的按钮
+ ib_bgcolor.setOnClickListener(listener);
+ // 初始化新建便签的日期时间
+ createDate = DateTimeUtil.getDate();
+ createTime = DateTimeUtil.getTime();
+ tv_widget_title.setText(createDate + "\t" + createTime.substring(0, 5));
+ }
+
+ @Override
+ public void onBackPressed() {
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_2X2==>***onBackPressed***");
+ if (mBackgroud_Color == 0) {// 如果mBackgroud_Color==0,我们使用蓝色作为默认背景
+ mBackgroud_Color = R.drawable.widget_small_blue;
+ }
+ // 取得便签的内容
+ String newContent = et_widget_content.getText().toString();
+ if (!TextUtils.isEmpty(newContent)) {
+ // 用insert将记录插入数据库
+ ContentValues values = new ContentValues();
+ values.put(AppwidgetItems.CONTENT, newContent);
+ values.put(AppwidgetItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(AppwidgetItems.UPDATE_TIME, DateTimeUtil.getTime());
+ values.put(AppwidgetItems.BACKGROUND_COLOR, mBackgroud_Color);
+ _id = (int) ContentUris.parseId(getContentResolver().insert(
+ AppwidgetItems.CONTENT_URI, values));
+ }
+ // 将新插入的记录的ID写到文本文件中
+ SharedPreferences.Editor editor = this.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, MODE_WORLD_READABLE).edit();
+ editor.putLong(EditWidgetNoteActivity.SHAREDPREF + mAppWidgetId, _id);
+ editor.commit();
+ // Push widget update to surface with newly set text
+ AppWidgetManager appWidgetManager = AppWidgetManager
+ .getInstance(ConfigurationActivity_2X2.this);
+ NoteWidget_2X2.updateAppwidget(ConfigurationActivity_2X2.this,
+ appWidgetManager, mAppWidgetId);
+ // Make sure we pass back the original appWidgetId
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
+ setResult(RESULT_OK, resultValue);
+ super.onBackPressed();
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_4X4.java b/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_4X4.java
new file mode 100644
index 0000000..fdb55c0
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/widget/ConfigurationActivity_4X4.java
@@ -0,0 +1,198 @@
+package com.xnote.widget;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.log.MyLog;
+
+/*
+ * Widget的Configuration Activity,负责Widget的初始化
+ */
+public class ConfigurationActivity_4X4 extends Activity {
+
+ private LinearLayout mLinearLayout_Header;
+ private ImageButton ib_bgcolor;
+ private TextView tv_widget_title;
+ private EditText et_widget_content;
+ // 存储便签的背景图片在R.java中的值
+ private int mBackgroud_Color;
+ // 新建Widget便签的日期、时间
+ private String createDate;
+ private String createTime;
+ // 被插入便签的ID
+ private int _id;
+ // Widget的ID
+ private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+ // 更改背景颜色事件监听器
+ private View.OnClickListener listener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 弹出一个自定义的Dialog,供用户选择便签的背景颜色
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ ConfigurationActivity_4X4.this);
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.dialog_note_bg_color, null);
+ final AlertDialog dialog = builder.create();
+ dialog.setView(view, 0, 0, 0, 0);
+ // 初始化布局文件中的ImageButton对象
+ ImageButton pink = (ImageButton) view.findViewById(R.id.pink);
+ ImageButton green = (ImageButton) view.findViewById(R.id.green);
+ ImageButton yellow = (ImageButton) view.findViewById(R.id.yellow);
+ ImageButton white = (ImageButton) view.findViewById(R.id.white);
+ // 自定义ImageButton的点击事件监听器
+ Button.OnClickListener listener = new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.green:
+ mBackgroud_Color = R.drawable.widget_big_green;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_green);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_green);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>选择了绿色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.pink:
+ mBackgroud_Color = R.drawable.widget_big_red;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_pink);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_pink);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>选择了粉红色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.yellow:
+ mBackgroud_Color = R.drawable.widget_big_yellow;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_yellow);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_yellow);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>选择了黄色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.white:
+ mBackgroud_Color = R.drawable.widget_big_gray;
+ et_widget_content
+ .setBackgroundResource(R.drawable.item_light_white);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_gray);
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>选择了白色:"
+ + mBackgroud_Color);
+ break;
+ }
+ // 结束对话框
+ dialog.dismiss();
+ }
+ };
+ // 注册点击事件监听器
+ pink.setOnClickListener(listener);
+ green.setOnClickListener(listener);
+ yellow.setOnClickListener(listener);
+ white.setOnClickListener(listener);
+ dialog.show();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ MyLog.d(MainActivity.TAG, "ConfigurationActivity_4X4==>***onCreate***");
+ requestWindowFeature(Window.FEATURE_NO_TITLE);// 取消标题栏
+ setContentView(R.layout.widget_note_layout);
+ // 防止用户未完成配置就直接退出
+ setResult(RESULT_CANCELED);
+ // 取得Widget的ID
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+ // If they gave us an intent without the widget id, just bail.
+ if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ }
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>onCreate-->AppWidget ID : "
+ + mAppWidgetId);
+ mLinearLayout_Header = (LinearLayout) findViewById(R.id.widget_detail_header);
+ tv_widget_title = (TextView) findViewById(R.id.tv_widget_date_time);
+
+ et_widget_content = (EditText) findViewById(R.id.et_content);
+ // 使用默认的背景颜色
+ et_widget_content.setBackgroundResource(R.drawable.item_light_blue);
+
+ // ImageButton,点击改变便签背景颜色
+ ib_bgcolor = (ImageButton) findViewById(R.id.imagebutton_bgcolor);
+ // 设置便签背景颜色的按钮
+ ib_bgcolor.setOnClickListener(listener);
+ // 初始化新建便签的日期时间
+ createDate = DateTimeUtil.getDate();
+ createTime = DateTimeUtil.getTime();
+ tv_widget_title.setText(createDate + "\t" + createTime.substring(0, 5));
+ }
+
+ @Override
+ public void onBackPressed() {
+ MyLog.d(MainActivity.TAG,
+ "ConfigurationActivity_4X4==>***onBackPressed***");
+ if (mBackgroud_Color == 0) {// 如果mBackgroud_Color==0,我们使用蓝色作为默认背景
+ mBackgroud_Color = R.drawable.widget_big_blue;
+ }
+ // 取得便签的内容
+ String newContent = et_widget_content.getText().toString();
+ if (!TextUtils.isEmpty(newContent)) {
+ // 用insert将记录插入数据库
+ ContentValues values = new ContentValues();
+ values.put(AppwidgetItems.CONTENT, newContent);
+ values.put(AppwidgetItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(AppwidgetItems.UPDATE_TIME, DateTimeUtil.getTime());
+ values.put(AppwidgetItems.BACKGROUND_COLOR, mBackgroud_Color);
+ _id = (int) ContentUris.parseId(getContentResolver().insert(
+ AppwidgetItems.CONTENT_URI, values));
+ }
+ // 将新插入的记录的ID写到文本文件中
+ SharedPreferences.Editor editor = this.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, MODE_PRIVATE).edit();
+ editor.putLong(EditWidgetNoteActivity.SHAREDPREF + mAppWidgetId, _id);
+ editor.commit();
+ // Push widget update to surface with newly set text
+ AppWidgetManager appWidgetManager = AppWidgetManager
+ .getInstance(ConfigurationActivity_4X4.this);
+ NoteWidget_4X4.updateAppwidget(ConfigurationActivity_4X4.this,
+ appWidgetManager, mAppWidgetId);
+ // Make sure we pass back the original appWidgetId
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
+ setResult(RESULT_OK, resultValue);
+ super.onBackPressed();
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/widget/EditWidgetNoteActivity.java b/XNote/XNote/src/com/xnote/widget/EditWidgetNoteActivity.java
new file mode 100644
index 0000000..5384a5c
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/widget/EditWidgetNoteActivity.java
@@ -0,0 +1,251 @@
+package com.xnote.widget;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.appwidget.AppWidgetManager;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.Window;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.log.MyLog;
+
+public class EditWidgetNoteActivity extends Activity {
+ // 用SharedPreference存放AppWidget显示的便签的_id
+ public static final String SHAREDPREF = "widget_note_id";
+ private LinearLayout mLinearLayout_Header;
+ private ImageButton ib_bgcolor;
+ private TextView tv_widget_title;
+ private EditText et_content;
+ // 存储便签的背景图片在R.java中的值
+ private int mBackgroud_Color;
+ // 更新2X2还是4X4
+ private boolean is4X4 = false;
+ // 最后一次更新Widget便签的日期、时间
+ private String updateDate;
+ private String updateTime;
+ // 被插入便签的ID
+ private int _id;
+ // widget的id
+ private int mAppWidgetId;
+ // 更改背景颜色事件监听器
+ private View.OnClickListener listener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 弹出一个自定义的Dialog,供用户选择便签的背景颜色
+ AlertDialog.Builder builder = new AlertDialog.Builder(
+ EditWidgetNoteActivity.this);
+ LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.dialog_note_bg_color, null);
+ final AlertDialog dialog = builder.create();
+ dialog.setView(view, 0, 0, 0, 0);
+ // 初始化布局文件中的ImageButton对象
+ ImageButton pink = (ImageButton) view.findViewById(R.id.pink);
+ ImageButton green = (ImageButton) view.findViewById(R.id.green);
+ ImageButton yellow = (ImageButton) view.findViewById(R.id.yellow);
+ ImageButton white = (ImageButton) view.findViewById(R.id.white);
+ // 自定义ImageButton的点击事件监听器
+ Button.OnClickListener listener = new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.green:
+ mBackgroud_Color = R.drawable.widget_small_green;
+ et_content
+ .setBackgroundResource(R.drawable.item_light_green);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_green);
+ MyLog.d(MainActivity.TAG,
+ "EditWidgetNoteActivity==>选择了绿色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.pink:
+ mBackgroud_Color = R.drawable.widget_small_red;
+ et_content
+ .setBackgroundResource(R.drawable.item_light_pink);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_pink);
+ MyLog.d(MainActivity.TAG,
+ "EditWidgetNoteActivity==>选择了粉红色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.yellow:
+ mBackgroud_Color = R.drawable.widget_small_yellow;
+ et_content
+ .setBackgroundResource(R.drawable.item_light_yellow);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_yellow);
+ MyLog.d(MainActivity.TAG,
+ "EditWidgetNoteActivity==>选择了黄色:"
+ + mBackgroud_Color);
+ break;
+ case R.id.white:
+ mBackgroud_Color = R.drawable.widget_small_gray;
+ et_content
+ .setBackgroundResource(R.drawable.item_light_white);
+ // 设置标题栏的背景图片
+ mLinearLayout_Header
+ .setBackgroundResource(R.drawable.notes_header_gray);
+ MyLog.d(MainActivity.TAG,
+ "EditWidgetNoteActivity==>选择了白色:"
+ + mBackgroud_Color);
+ break;
+ }
+ // 结束对话框
+ dialog.dismiss();
+ }
+ };
+ // 注册点击事件监听器
+ pink.setOnClickListener(listener);
+ green.setOnClickListener(listener);
+ yellow.setOnClickListener(listener);
+ white.setOnClickListener(listener);
+ dialog.show();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ setContentView(R.layout.widget_note_layout);
+ Intent intent = getIntent();
+ // 取得Appwidget的Id
+ mAppWidgetId = intent.getIntExtra("widget_id", -1);
+ // 是否更新4X4类型的Appwidget
+ is4X4 = intent.getBooleanExtra("is4X4", false);
+ MyLog.d(MainActivity.TAG, "EditWidgetNoteActivity==>点击的Appwidget的id : "
+ + mAppWidgetId);
+ if (mAppWidgetId == -1) {// 没有正常获得ID
+ finish();
+ }
+ SharedPreferences prefs = this.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, Context.MODE_WORLD_READABLE);
+ // 保存方式:prefix+AppwidgetId
+ _id = (int) prefs.getLong(EditWidgetNoteActivity.SHAREDPREF
+ + mAppWidgetId, -1);
+ MyLog.d(MainActivity.TAG,
+ "EditWidgetNoteActivity==>从SharedPreferences中读到的AppWidget的id: "
+ + _id);
+ mLinearLayout_Header = (LinearLayout) findViewById(R.id.widget_detail_header);
+ et_content = (EditText) findViewById(R.id.et_content);
+ // ImageButton,点击改变便签背景颜色
+ ib_bgcolor = (ImageButton) findViewById(R.id.imagebutton_bgcolor);
+ tv_widget_title = (TextView) findViewById(R.id.tv_widget_date_time);
+ if (_id != -1) {// 正常得到_id,编辑主页或文件夹下的便签
+ // 根据便签的ID查询该便签的详细内容
+ Cursor c = getContentResolver()
+ .query(ContentUris.withAppendedId(
+ AppwidgetItems.CONTENT_URI, _id), null, null, null,
+ null);
+ c.moveToFirst();
+ // 最后更新便签的日期时间及其内容
+ String content = c.getString(c
+ .getColumnIndex(AppwidgetItems.CONTENT));
+ et_content.setText(content);
+ // 根据数据库中的值设定背景颜色(该值是桌面widget背景图片的值)
+ mBackgroud_Color = c.getInt(c
+ .getColumnIndex(AppwidgetItems.BACKGROUND_COLOR));
+ updateDate = c.getString(c
+ .getColumnIndex(AppwidgetItems.UPDATE_DATE));
+ updateTime = c.getString(c
+ .getColumnIndex(AppwidgetItems.UPDATE_TIME));
+ // 以2011-09-09 9:10的样式显示日期时间
+ tv_widget_title.setText(updateDate + "\t"
+ + updateTime.substring(0, 5));
+ c.close();
+ }
+ et_content
+ .setBackgroundResource(getContentBackground(mBackgroud_Color));
+ mLinearLayout_Header
+ .setBackgroundResource(getHeaderBackground(mBackgroud_Color));
+ // 设置便签背景颜色的按钮
+ ib_bgcolor.setOnClickListener(listener);
+ }
+
+ // 判断Header的背景图片
+ private int getHeaderBackground(int resId) {
+ switch (resId) {
+ case R.drawable.widget_small_blue:
+ return R.drawable.notes_header_blue;
+ case R.drawable.widget_small_green:
+ return R.drawable.notes_header_green;
+ case R.drawable.widget_small_red:
+ return R.drawable.notes_header_pink;
+ case R.drawable.widget_small_gray:
+ return R.drawable.notes_header_gray;
+ case R.drawable.widget_small_yellow:
+ return R.drawable.notes_header_yellow;
+ default:
+ break;
+ }
+ return R.drawable.notes_header_blue;
+ }
+
+ // 判断EditText的背景
+ private int getContentBackground(int resId) {
+ switch (resId) {
+ case R.drawable.widget_small_blue:
+ return R.drawable.item_light_blue;
+ case R.drawable.widget_small_green:
+ return R.drawable.item_light_green;
+ case R.drawable.widget_small_red:
+ return R.drawable.item_light_pink;
+ case R.drawable.widget_small_gray:
+ return R.drawable.item_light_white;
+ case R.drawable.widget_small_yellow:
+ return R.drawable.item_light_yellow;
+ default:
+ break;
+ }
+ return R.drawable.item_light_blue;
+ }
+
+ @Override
+ public void onBackPressed() {
+ // 取得便签的内容
+ String newContent = et_content.getText().toString();
+ if (!TextUtils.isEmpty(newContent)) {
+ // 用update更新数据库中的记录
+ ContentValues values = new ContentValues();
+ values.put(AppwidgetItems.CONTENT, newContent);
+ values.put(AppwidgetItems.UPDATE_DATE, DateTimeUtil.getDate());
+ values.put(AppwidgetItems.UPDATE_TIME, DateTimeUtil.getTime());
+ values.put(AppwidgetItems.BACKGROUND_COLOR, mBackgroud_Color);
+ getContentResolver()
+ .update(ContentUris.withAppendedId(
+ AppwidgetItems.CONTENT_URI, _id), values, null,
+ null);
+ // Push widget update to surface with newly set text
+ AppWidgetManager appWidgetManager = AppWidgetManager
+ .getInstance(getApplicationContext());
+ if (is4X4) {
+ NoteWidget_4X4.updateAppwidget(getApplicationContext(),
+ appWidgetManager, mAppWidgetId);
+ } else {
+ NoteWidget_2X2.updateAppwidget(getApplicationContext(),
+ appWidgetManager, mAppWidgetId);
+ }
+ super.onBackPressed();
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/widget/NoteWidget_2X2.java b/XNote/XNote/src/com/xnote/widget/NoteWidget_2X2.java
new file mode 100644
index 0000000..3ca7e7c
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/widget/NoteWidget_2X2.java
@@ -0,0 +1,129 @@
+package com.xnote.widget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.net.Uri;
+import android.widget.RemoteViews;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.log.MyLog;
+
+public class NoteWidget_2X2 extends AppWidgetProvider {
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager,
+ int[] appWidgetIds) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>onUpdate()");
+ int c = appWidgetIds.length;
+ if (c > 0) {
+ for (int i = 0; i < c; i++) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>要更新的AppWidget的Id: "
+ + appWidgetIds[i]);
+ NoteWidget_2X2.updateAppwidget(context, appWidgetManager,
+ appWidgetIds[i]);
+ }
+ }
+ }
+
+ @Override
+ public void onDeleted(Context context, int[] appWidgetIds) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>onDeleted()");
+ // 移除Appwidget时,删除数据库中的记录
+ int count = appWidgetIds.length;// 得到要移除的Appwidget的数量
+ Uri deleUri = null;// 存放待删除的记录的Uri
+ SharedPreferences sp = context.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, Context.MODE_PRIVATE);
+ long id = 0;// Appwidget中显示的内容在数据库中的_id
+ for (int i = 0; i < count; i++) {
+ id = sp.getLong(
+ EditWidgetNoteActivity.SHAREDPREF + appWidgetIds[i], -1);
+ if (id != -1) {
+ MyLog.d(MainActivity.TAG,
+ "NoteWidget_2X2==>onDelete()-->被删除记录的id : " + id);
+ deleUri = ContentUris.withAppendedId(
+ AppwidgetItems.CONTENT_URI, id);
+ context.getContentResolver().delete(deleUri, null, null);
+ }
+ }
+ super.onDeleted(context, appWidgetIds);
+ }
+
+ public static void updateAppwidget(Context context,
+ AppWidgetManager appWidgetManager, int appWidgetId) {
+ int mBackground = 0;
+ String mContent = null;
+ RemoteViews views = null;
+ // 读取由ConfigurationActivity保存的ID
+ SharedPreferences prefs = context.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, Context.MODE_PRIVATE);
+ int id = (int) prefs.getLong(EditWidgetNoteActivity.SHAREDPREF
+ + appWidgetId, -1);
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>AppWidget中的记录在数据库中的id: "
+ + id);
+ if (id != -1) {// 读取的id正常
+ // 查询该记录的所有内容
+ Cursor cursor = context.getContentResolver().query(
+ ContentUris.withAppendedId(AppwidgetItems.CONTENT_URI, id),
+ null, null, null, null);
+ if (cursor.getCount() > 0) {
+ cursor.moveToFirst();
+ mBackground = cursor.getInt(cursor
+ .getColumnIndex(AppwidgetItems.BACKGROUND_COLOR));
+ mContent = cursor.getString(cursor
+ .getColumnIndex(AppwidgetItems.CONTENT));
+ }
+ cursor.close();// 关闭Cursor对象
+
+ // 用户点击widget会跳转至EditWidgetNoteActivity
+ Intent widgetIntent = new Intent(context,
+ EditWidgetNoteActivity.class);
+ // 传递被点击的Appwidget的Id
+ widgetIntent.putExtra("widget_id", appWidgetId);
+ // 传递标识来判断是2X2还是4X4
+ widgetIntent.putExtra("is4X4", false);
+ // 第二个、第四个参数很重要
+ // context: The Context in which this PendingIntent should start the
+ // activity.
+
+ // requestCode: Private request code for the sender (currently not
+ // used).
+
+ // intent: Intent of the activity to be launched.
+
+ // flags: May be FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT,
+ // FLAG_UPDATE_CURRENT, or any of the flags as supported by
+ // Intent.fillIn() to control which unspecified parts
+ // of the intent that can be supplied when the actual send happens.
+
+ PendingIntent pendingIntent = PendingIntent.getActivity(context,
+ appWidgetId, widgetIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ views = new RemoteViews(context.getPackageName(),
+ R.layout.widget_2x2_layout);
+ MyLog.d(MainActivity.TAG,
+ "NoteWidget_2X2==>context.getPackageName(): "
+ + context.getPackageName());
+ // 设置widget的内容及其单击事件
+ views.setTextViewText(R.id.widget_2x2_textView, mContent);
+
+ views.setImageViewResource(R.id.widget_2x2_imageView, mBackground);
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>要显示的内容 : " + mContent);
+ views.setOnClickPendingIntent(R.id.widget_2x2_imageView,
+ pendingIntent);
+ if (views != null) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_2X2==>RemoteViews不为空!");
+ // Push update for this widget to the home screen
+ appWidgetManager.updateAppWidget(appWidgetId, views);// 执行更新
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/widget/NoteWidget_4X4.java b/XNote/XNote/src/com/xnote/widget/NoteWidget_4X4.java
new file mode 100644
index 0000000..a5c5e0b
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/widget/NoteWidget_4X4.java
@@ -0,0 +1,115 @@
+package com.xnote.widget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.net.Uri;
+import android.widget.RemoteViews;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.activity.R;
+import com.xnote.database.DbInfo.AppwidgetItems;
+import com.xnote.log.MyLog;
+
+public class NoteWidget_4X4 extends AppWidgetProvider {
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager,
+ int[] appWidgetIds) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_4X4==>onUpdate()");
+ int c = appWidgetIds.length;
+ if (c > 0) {
+ for (int i = 0; i < c; i++) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_4X4==>要更新的AppWidget的Id: "
+ + appWidgetIds[i]);
+ NoteWidget_4X4.updateAppwidget(context, appWidgetManager,
+ appWidgetIds[i]);
+ }
+ }
+ }
+
+ @Override
+ public void onDeleted(Context context, int[] appWidgetIds) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_4X4==>onDeleted()");
+ // 移除Appwidget时,删除数据库中的记录
+ int count = appWidgetIds.length;// 得到要移除的Appwidget的数量
+ Uri deleUri = null;// 存放待删除的记录的Uri
+ SharedPreferences sp = context.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, Context.MODE_PRIVATE);
+ long id = 0;// Appwidget中显示的内容在数据库中的_id
+ for (int i = 0; i < count; i++) {
+ id = sp.getLong(
+ EditWidgetNoteActivity.SHAREDPREF + appWidgetIds[i], -1);
+ if (id != -1) {
+ deleUri = ContentUris.withAppendedId(
+ AppwidgetItems.CONTENT_URI, id);
+ MyLog.d(MainActivity.TAG,
+ "NoteWidget_4X4==>onDelete()-->被删除记录的id : " + id);
+ context.getContentResolver().delete(deleUri, null, null);
+ }
+ }
+ super.onDeleted(context, appWidgetIds);
+ }
+
+ public static void updateAppwidget(Context context,
+ AppWidgetManager appWidgetManager, int appWidgetId) {
+ int mBackground = 0;
+ String mContent = null;
+ RemoteViews views = null;
+ // 读取由ConfigurationActivity保存的ID
+ SharedPreferences prefs = context.getSharedPreferences(
+ EditWidgetNoteActivity.SHAREDPREF, Context.MODE_PRIVATE);
+ int id = (int) prefs.getLong(EditWidgetNoteActivity.SHAREDPREF
+ + appWidgetId, -1);
+ MyLog.d(MainActivity.TAG, "NoteWidget_4X4==>AppWidget中的记录在数据库中的id: "
+ + id);
+ if (id != -1) {// 读取的id正常
+ // 查询该记录的所有内容
+ Cursor cursor = context.getContentResolver().query(
+ ContentUris.withAppendedId(AppwidgetItems.CONTENT_URI, id),
+ null, null, null, null);
+ if (cursor.getCount() > 0) {
+ cursor.moveToFirst();
+ mBackground = cursor.getInt(cursor
+ .getColumnIndex(AppwidgetItems.BACKGROUND_COLOR));
+ mContent = cursor.getString(cursor
+ .getColumnIndex(AppwidgetItems.CONTENT));
+ }
+ cursor.close();// 关闭Cursor对象
+
+ // 用户点击widget会跳转至EditWidgetNoteActivity
+ Intent widgetIntent = new Intent(context,
+ EditWidgetNoteActivity.class);
+ // 传递被点击的Appwidget的Id
+ widgetIntent.putExtra("widget_id", appWidgetId);
+ // 传递标识来判断是2X2还是4X4
+ widgetIntent.putExtra("is4X4", true);
+
+ PendingIntent pendingIntent = PendingIntent.getActivity(context,
+ appWidgetId, widgetIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ views = new RemoteViews(context.getPackageName(),
+ R.layout.widget_4x4_layout);
+ MyLog.d(MainActivity.TAG,
+ "NoteWidget_4X4==>context.getPackageName(): "
+ + context.getPackageName());
+ // 设置widget的内容及其单击事件
+ views.setTextViewText(R.id.widget_4x4_textView, mContent);
+
+ views.setImageViewResource(R.id.widget_4x4_imageView, mBackground);
+ MyLog.d(MainActivity.TAG, "显示的内容 : " + mContent);
+ views.setOnClickPendingIntent(R.id.widget_4x4_imageView,
+ pendingIntent);
+ if (views != null) {
+ MyLog.d(MainActivity.TAG, "NoteWidget_4X4==>RemoteViews不为空!");
+ // Push update for this widget to the home screen
+ appWidgetManager.updateAppWidget(appWidgetId, views);// 执行更新
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/xml_txt/MyDefaultHandler.java b/XNote/XNote/src/com/xnote/xml_txt/MyDefaultHandler.java
new file mode 100644
index 0000000..27fe8c8
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/xml_txt/MyDefaultHandler.java
@@ -0,0 +1,100 @@
+package com.xnote.xml_txt;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import android.text.TextUtils;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.log.MyLog;
+
+public class MyDefaultHandler extends DefaultHandler {
+ // 用List存储读取到的记录
+ private List mRecords;
+ private Note mNote;
+ // 节点标识,保存上一个节点的名称(localName)
+ private String preTag = null;
+ // 因为当字符串中包含\n时,characters()函数不能一次读取完毕,所以我们定义改变量来保存被分割的数据
+ private String strElementData = "";
+
+ @Override
+ public void startDocument() throws SAXException {
+ super.startDocument();
+ // 做一些初始化的操作
+ mRecords = new ArrayList();
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException {
+ if (localName.equals("record")) {
+ mNote = new Note();
+ }
+ if (!TextUtils.isEmpty(strElementData)) {
+ strElementData = "";
+ }
+ preTag = localName;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length)
+ throws SAXException {
+ MyLog.e(MainActivity.TAG, "^^^当节点中有换行符时,characters()函数不止执行一次^^^ "
+ + System.currentTimeMillis());
+ if (mNote != null) {
+ String strContent = new String(ch, start, length);
+ if (preTag.equals("id")) {
+ mNote.setId(Integer.parseInt(strContent));
+ } else if (preTag.equals("content")) {
+ // 考虑到用户换行的问题,我们先使用strElementData来保存内容,在endElement函数中
+ // 调用mNote的setContent方法来保存数据
+ strElementData += strContent;
+ MyLog.d(MainActivity.TAG, "读取XML文件时==>characters()函数中的数据: "
+ + strContent);
+ } else if (preTag.equals("update_date")) {
+ mNote.setUpdate_date(strContent);
+ } else if (preTag.equals("update_time")) {
+ mNote.setUpdate_time(strContent);
+ } else if (preTag.equals("alarm_time")) {
+ mNote.setAlarm_time(strContent);
+ } else if (preTag.equals("background_color")) {
+ mNote.setBackground_color(Integer.parseInt(strContent));
+ } else if (preTag.equals("is_folder")) {
+ mNote.setIsfolder(strContent);
+ } else if (preTag.equals("parent_folder")) {
+ mNote.setParentfolder(Integer.parseInt(strContent));
+ }
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName)
+ throws SAXException {
+ if (!TextUtils.isEmpty(strElementData)) {
+ MyLog.d(MainActivity.TAG, "从XML文件中读取到的完整的content节点的内容: "
+ + strElementData);
+ MyLog.d(MainActivity.TAG, "从XML文件中读取到的完整的content节点的内容打印完毕!");
+ // 保存Content到Note对象中
+ mNote.setContent(strElementData);
+ }
+ if (localName.equals("record") && mNote != null) {
+ mRecords.add(mNote);
+ mNote = null;
+ }
+ preTag = null;
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ super.endDocument();
+ }
+
+ // 返回得到的所有记录
+ public List getNotes() {
+ return mRecords;
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/xml_txt/Note.java b/XNote/XNote/src/com/xnote/xml_txt/Note.java
new file mode 100644
index 0000000..502ac80
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/xml_txt/Note.java
@@ -0,0 +1,96 @@
+package com.xnote.xml_txt;
+
+/*
+ * 从XML文件读数据时,以该类的对象进行存储
+ */
+public class Note {
+ private int id;
+ private String content;
+ private String update_date;
+ private String update_time;
+ private String alarm_time;
+ private int background_color;
+ private String isfolder;
+ private int parentfolder;
+
+ public Note() {
+ super();
+ }
+
+ public Note(int id, String con, String update_date, String update_time,
+ String alarm_time, int background_color, String isfolder,
+ int parentfolder) {
+ this.id = id;
+ this.content = con;
+ this.update_date = update_date;
+ this.update_time = update_time;
+ this.alarm_time = alarm_time;
+ this.background_color = background_color;
+ this.isfolder = isfolder;
+ this.parentfolder = parentfolder;
+ }
+
+ public String getUpdate_date() {
+ return update_date;
+ }
+
+ public void setUpdate_date(String update_date) {
+ this.update_date = update_date;
+ }
+
+ public String getUpdate_time() {
+ return update_time;
+ }
+
+ public void setUpdate_time(String update_time) {
+ this.update_time = update_time;
+ }
+
+ public String getAlarm_time() {
+ return alarm_time;
+ }
+
+ public void setAlarm_time(String alarm_time) {
+ this.alarm_time = alarm_time;
+ }
+
+ public int getBackground_color() {
+ return background_color;
+ }
+
+ public void setBackground_color(int background_color) {
+ this.background_color = background_color;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getIsfolder() {
+ return isfolder;
+ }
+
+ public void setIsfolder(String isfolder) {
+ this.isfolder = isfolder;
+ }
+
+ public int getParentfolder() {
+ return parentfolder;
+ }
+
+ public void setParentfolder(int parentfolder) {
+ this.parentfolder = parentfolder;
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/xml_txt/RestoreDataFromXml.java b/XNote/XNote/src/com/xnote/xml_txt/RestoreDataFromXml.java
new file mode 100644
index 0000000..96c612e
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/xml_txt/RestoreDataFromXml.java
@@ -0,0 +1,97 @@
+package com.xnote.xml_txt;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.List;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 从Xml文件中读取数据,并插入数据库
+ */
+public class RestoreDataFromXml {
+ private ContentResolver mContentResolver;
+ private String BASE_DIR = "/sdcard";
+ private String MID_DIR = "XNote";
+ private String FILE_NAME = "notes_backup.xml";
+
+ public RestoreDataFromXml(ContentResolver mContentResolver) {
+ this.mContentResolver = mContentResolver;
+ }
+
+ // 读取XML文件中的记录,保存到List对象中
+ public List readXml(InputStream is) throws Exception {
+ SAXParserFactory pf = SAXParserFactory.newInstance();
+ SAXParser saxp = pf.newSAXParser();
+ MyDefaultHandler mdh = new MyDefaultHandler();
+ saxp.parse(is, mdh);
+ is.close();
+ return mdh.getNotes();
+ }
+
+ // 从List对象导入数据库
+ public void restoreData() throws Exception {
+ MyLog.d(MainActivity.TAG,
+ "RestoreDataFromXml==>start to restore data from SDCard");
+ String path = BASE_DIR + File.separator + MID_DIR + File.separator
+ + FILE_NAME;
+ File file = new File(path);
+ FileInputStream fis = new FileInputStream(file);
+ List records = this.readXml(fis);
+ MyLog.d(MainActivity.TAG, "RestoreDataFromXml==>XML文件中Note Item 的数量:"
+ + records.size());
+ int id = -1;
+ for (Note tmpNote : records) {
+ // 我们恢复数据使用insert而非update
+ String content = tmpNote.getContent();
+ String updateDate = tmpNote.getUpdate_date();
+ String updateTime = tmpNote.getUpdate_time();
+ String alarmTime = tmpNote.getAlarm_time();
+ int bgColor = tmpNote.getBackground_color();
+ String isFolder = tmpNote.getIsfolder();
+ MyLog.d(MainActivity.TAG, "RestoreDataFromXml==>isfolder:"
+ + isFolder);
+ int parentFolder = tmpNote.getParentfolder();
+ MyLog.d(MainActivity.TAG, "RestoreDataFromXml==>原来的parentfolder:"
+ + parentFolder);
+ // 恢复记录
+ ContentValues cv = new ContentValues();
+ cv.put(NoteItems.CONTENT, content);
+ cv.put(NoteItems.UPDATE_DATE, updateDate);
+ cv.put(NoteItems.UPDATE_TIME, updateTime);
+ cv.put(NoteItems.ALARM_TIME, alarmTime);
+ cv.put(NoteItems.BACKGROUND_COLOR, bgColor);
+ cv.put(NoteItems.IS_FOLDER, isFolder);
+ // 如果记录既不是文件夹,也不是主页上的便签,那我们就把他存在上一个插入到数据库的文件夹中
+ if (isFolder.equals("no") && id != -1 && parentFolder != -1) {
+ cv.put(NoteItems.PARENT_FOLDER, id);
+ MyLog.d(MainActivity.TAG,
+ "RestoreDataFromXml==>恢复数据后的parentfolder:" + id);
+ } else {// 如果是文件夹或主页便签,则PARENT_FOLDER字段为-1
+ cv.put(NoteItems.PARENT_FOLDER, -1);
+ }
+ MyLog.d(MainActivity.TAG,
+ "RestoreDataFromXml==>insert one record...");
+ if (isFolder.equals("yes")) {// 如果是文件夹,我们记录它被插入到数据库时的id
+ String strId = (mContentResolver.insert(NoteItems.CONTENT_URI,
+ cv)).getPathSegments().get(1);
+ // 记录文件夹被插入到数据库后的id,该文件夹下的便签的PARENT_FOLDER字段将被设置为该值
+ id = Integer.parseInt(strId);
+ MyLog.d(MainActivity.TAG,
+ "RestoreDataFromXml==>文件夹被插入到数据库后的id: " + strId);
+ } else {// 不是文件夹,我们就不需要记录它的id
+ mContentResolver.insert(NoteItems.CONTENT_URI, cv);
+ }
+ }
+ MyLog.d(MainActivity.TAG, "RestoreDataFromXml==>Restore finished...");
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/xml_txt/WriteTxt.java b/XNote/XNote/src/com/xnote/xml_txt/WriteTxt.java
new file mode 100644
index 0000000..c263def
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/xml_txt/WriteTxt.java
@@ -0,0 +1,185 @@
+package com.xnote.xml_txt;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Environment;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.database.DateTimeUtil;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 输出TXT文本菜单项对应的类,
+ * 该类实现了对数据库中所有文件夹和便签内容的输出(写入TXT文本文件)
+ */
+public class WriteTxt {
+ private Context context;
+ private FileWriter nwriter;
+ private String BASE_DIR = "/sdcard";
+ private String MID_DIR = "XNote";
+ private String FILE_NAME = "notes_backup.txt";
+
+ public WriteTxt(Context context) {
+ this.context = context;
+ }
+
+ // 输出TXT文本函数
+ public boolean writeTxt() throws IOException {
+ // 查询条件,查询文件夹记录和主页便签记录
+ String selection = NoteItems.IS_FOLDER + " = '" + "yes" + "' or "
+ + NoteItems.PARENT_FOLDER + " = " + "-1";
+
+ Cursor mCursor = context.getContentResolver().query(
+ NoteItems.CONTENT_URI, null, selection, null, null);
+ int totalCount = mCursor.getCount();
+ mCursor.close();
+ // 判断SDCard的状态是否可用
+ if (Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ if (totalCount > 0) {// 有数据,则写文件
+ // 注意目录位置的定义。File.separator
+ File dir = new File(BASE_DIR + File.separator + MID_DIR);
+ if (!dir.exists()) {
+ dir.mkdir();
+ MyLog.d(MainActivity.TAG, "WriteTxt==>" + dir
+ + " is created successfully!");
+ } else {
+ MyLog.d(MainActivity.TAG, "WriteTxt==>" + dir
+ + " has been created");
+ }
+ String path = BASE_DIR + File.separator + MID_DIR
+ + File.separator + FILE_NAME;
+
+ File file = new File(path);
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ // 以覆盖的方式写文件
+ nwriter = new FileWriter(file, false);
+
+ Cursor folderCursor = context.getContentResolver().query(
+ NoteItems.CONTENT_URI, null,
+ NoteItems.IS_FOLDER + " = ? ", new String[] { "yes" },
+ null);
+ // 文件夹数量
+ int countOfFolders = folderCursor.getCount();
+ // 总的便签数量(只要不是文件夹就查询)
+ Cursor allNotes = context.getContentResolver().query(
+ NoteItems.CONTENT_URI, null,
+ NoteItems.IS_FOLDER + " = ? ", new String[] { "no" },
+ null);
+ int countOfAllNotes = allNotes.getCount();
+ allNotes.close();
+ nwriter.write("XNote" + "\t" + DateTimeUtil.getDate() + "\t"
+ + DateTimeUtil.getTime() + "\n");
+ nwriter.write("共输出" + countOfFolders + "个文件夹和"
+ + countOfAllNotes + "条便签" + "\n");
+ // 先输出所有文件夹的内容
+ if (countOfFolders > 0) {
+ // 循环输出所有文件夹及其包含的便签的内容
+ folderCursor.moveToFirst();
+ for (int i = 0; i < countOfFolders; i++) {
+ // 写文件夹名称
+ String name = folderCursor.getString(folderCursor
+ .getColumnIndex(NoteItems.CONTENT));
+ writeFolderName("文件夹名称:", name);
+ // 写文件夹下的便签内容
+ // 文件夹ID
+ int _id = folderCursor.getInt(folderCursor
+ .getColumnIndex(NoteItems._ID));
+ // 保存有某文件夹下所有便签数据的Cursor对象
+ Cursor notesInOneFolder = context.getContentResolver()
+ .query(NoteItems.CONTENT_URI, null,
+ NoteItems.PARENT_FOLDER + " = ? ",
+ new String[] { String.valueOf(_id) },
+ null);
+ // 某文件夹下便签的数量
+ int noteCountInOneFolder = notesInOneFolder.getCount();
+ if (noteCountInOneFolder > 0) {
+ notesInOneFolder.moveToFirst();
+ for (int j = 0; j < noteCountInOneFolder; j++) {
+ // 用户最后更新便签的日期(date)
+ String date = notesInOneFolder
+ .getString(notesInOneFolder
+ .getColumnIndex(NoteItems.UPDATE_DATE));
+ // 用户最后更新便签的时间(time)
+ String time = notesInOneFolder
+ .getString(notesInOneFolder
+ .getColumnIndex(NoteItems.UPDATE_TIME));
+ // 用户最后更新的便签的内容
+ String content = notesInOneFolder
+ .getString(notesInOneFolder
+ .getColumnIndex(NoteItems.CONTENT));
+ // 写便签内容
+ writeNoteInfo(date, time, content);
+ // 指向该文件夹下的下一条便签
+ notesInOneFolder.moveToNext();
+ }
+ }
+ notesInOneFolder.close();
+ // 指向下一个文件夹
+ folderCursor.moveToNext();
+ }
+ }
+ folderCursor.close();
+ // 文件夹处理完以后,写顶级便签的内容
+ writeFolderName("", "XNote");
+ nwriter.write("\n" + "\n");
+ // Cursor对象保存顶级便签的内容
+ Cursor rootNotes = context.getContentResolver().query(
+ NoteItems.CONTENT_URI,
+ null,
+ NoteItems.IS_FOLDER + " = '" + "no" + "' and "
+ + NoteItems.PARENT_FOLDER + " = " + "-1", null,
+ null);
+ // 顶级便签的数量
+ int countOfRootNotes = rootNotes.getCount();
+ if (countOfRootNotes > 0) {
+ rootNotes.moveToFirst();
+ for (int i = 0; i < countOfRootNotes; i++) {
+ // 用户最后更新便签的日期(date)
+ String date = rootNotes.getString(rootNotes
+ .getColumnIndex(NoteItems.UPDATE_DATE));
+ // 用户最后更新便签的时间(time)
+ String time = rootNotes.getString(rootNotes
+ .getColumnIndex(NoteItems.UPDATE_TIME));
+ // 用户最后更新的便签的内容
+ String content = rootNotes.getString(rootNotes
+ .getColumnIndex(NoteItems.CONTENT));
+ // 写便签内容
+ writeNoteInfo(date, time, content);
+ // 指向该下一条便签
+ rootNotes.moveToNext();
+ }
+ }
+ rootNotes.close();
+ nwriter.flush();
+ nwriter.close();
+ } else {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+
+ // 写文件夹名称
+ private void writeFolderName(String prefix, String name) throws IOException {
+ nwriter.write("............" + "\n");
+ nwriter.write(" " + prefix + " " + name + "\n");
+ nwriter.write("............" + "\n");
+ nwriter.write(" " + "\n");
+ }
+
+ // 写入便签的日期时间及内容
+ private void writeNoteInfo(String date, String time, String content)
+ throws IOException {
+ nwriter.write(date + "\t" + time + "\n");
+ nwriter.write(content + "\n" + "\n");
+ }
+}
\ No newline at end of file
diff --git a/XNote/XNote/src/com/xnote/xml_txt/WriteXml.java b/XNote/XNote/src/com/xnote/xml_txt/WriteXml.java
new file mode 100644
index 0000000..13ac97a
--- /dev/null
+++ b/XNote/XNote/src/com/xnote/xml_txt/WriteXml.java
@@ -0,0 +1,215 @@
+package com.xnote.xml_txt;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import org.xmlpull.v1.XmlSerializer;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Environment;
+import android.util.Xml;
+
+import com.xnote.activity.MainActivity;
+import com.xnote.database.DbInfo.NoteItems;
+import com.xnote.log.MyLog;
+
+/*
+ * 以XML格式备份数据
+ */
+public class WriteXml {
+ private Context context;
+ private FileWriter nwriter;
+ private String BASE_DIR = "/sdcard";
+ private String MID_DIR = "XNote";
+ private String FILE_NAME = "notes_backup.xml";
+
+ public WriteXml(Context context) {
+ this.context = context;
+ }
+
+ public boolean writeXml() throws Exception {
+ // 判断SDCard的状态是否可用
+ if (Environment.getExternalStorageState().equals(
+ Environment.MEDIA_MOUNTED)) {
+ // 注意目录位置的定义。File.separator
+ File dir = new File(BASE_DIR + File.separator + MID_DIR);
+ if (!dir.exists()) {
+ dir.mkdir();
+ MyLog.d(MainActivity.TAG, "WriteXml==>" + dir
+ + " is created successfully!");
+ } else {
+ MyLog.d(MainActivity.TAG, "WriteXml==>" + dir
+ + " has been created");
+ }
+ String path = BASE_DIR + File.separator + MID_DIR + File.separator
+ + FILE_NAME;
+
+ File file = new File(path);
+ if (file.exists()) {
+ if (file.delete()) {// delete the old .xml file
+ file.createNewFile();
+ }
+ }
+ // 以覆盖的方式写文件
+ nwriter = new FileWriter(file, false);
+ if (!writeNote(nwriter)) {
+ return false;
+ }
+ return true;
+ } else {
+ MyLog.d(MainActivity.TAG, "WriteXml==>can not access SDCard");
+ return false;
+ }
+ }
+
+ // 把Cursor中的数据输出到XML文件中
+ private boolean writeNote(FileWriter nwriter) throws Exception {
+ MyLog.d(MainActivity.TAG, "WriteXml==>begin to write XML...");
+ XmlSerializer serializer = Xml.newSerializer();
+ serializer.setOutput(nwriter);
+ //
+ serializer.startDocument("UTF-8", true);
+ //
+ serializer.startTag(null, "records");
+ Cursor cursorAllRecords = context.getContentResolver().query(
+ NoteItems.CONTENT_URI, null, null, null, null);
+ int itemCount = cursorAllRecords.getCount();
+ cursorAllRecords.close();
+ if (itemCount > 0) {
+ // 如果有文件夹,则写文件夹以及该文件夹下的便签
+ Cursor folderCursor = context.getContentResolver().query(
+ NoteItems.CONTENT_URI, null,
+ NoteItems.IS_FOLDER + " = ? ", new String[] { "yes" },
+ null);
+ // 文件夹数量
+ int countOfFolders = folderCursor.getCount();
+ if (countOfFolders > 0) {// 有文件夹
+ // 循环输出所有文件夹及其包含的便签的内容
+ folderCursor.moveToFirst();
+ for (int i = 0; i < countOfFolders; i++) {
+ int id = writeRecord(serializer, folderCursor);// 向XML写一条文件夹的记录
+ // 根据返回的id,查询保存在该文件夹下所有的便签
+ Cursor notesInOneFolder = context.getContentResolver()
+ .query(NoteItems.CONTENT_URI, null,
+ NoteItems.PARENT_FOLDER + " = ? ",
+ new String[] { String.valueOf(id) }, null);
+ // 文件夹下便签的数量
+ int noteCountInOneFolder = notesInOneFolder.getCount();
+ if (noteCountInOneFolder > 0) {// 判断文件夹下是否有便签
+ notesInOneFolder.moveToFirst();
+ for (int j = 0; j < noteCountInOneFolder; j++) {
+ writeRecord(serializer, notesInOneFolder);
+ // 指向该文件夹下的下一条便签
+ notesInOneFolder.moveToNext();
+ }
+ }
+ notesInOneFolder.close();
+ // 指向下一条
+ folderCursor.moveToNext();
+ }
+ }
+ folderCursor.close();
+ // 如果有顶级便签,即主页便签,则写记录
+ // 查询顶级便签的内容
+ Cursor rootNotes = context.getContentResolver().query(
+ NoteItems.CONTENT_URI,
+ null,
+ NoteItems.IS_FOLDER + " = '" + "no" + "' and "
+ + NoteItems.PARENT_FOLDER + " = " + "-1", null,
+ null);
+ // 顶级便签的数量
+ int countOfRootNotes = rootNotes.getCount();
+ if (countOfRootNotes > 0) {
+ rootNotes.moveToFirst();
+ for (int i = 0; i < countOfRootNotes; i++) {
+ writeRecord(serializer, rootNotes);
+ // 指向该文件夹下的下一条便签
+ rootNotes.moveToNext();
+ }
+ }
+ rootNotes.close();
+ //
+ serializer.endTag(null, "records");
+ serializer.endDocument();
+ nwriter.flush();
+ nwriter.close();
+ return true;
+ } else {
+ nwriter.close();
+ return false;
+ }
+ }
+
+ // 根据传递的Cursor对象写xml文件.使用该函数时一定要注意Cursor对象的position
+ // 返回记录的id
+ private int writeRecord(XmlSerializer serializer, Cursor cursor)
+ throws IOException {
+ // 记录的_id字段
+ int id = cursor.getInt(cursor.getColumnIndex(NoteItems._ID));
+ // 记录的content字段
+ String content = cursor.getString(cursor
+ .getColumnIndex(NoteItems.CONTENT));
+ // 记录的update_date字段
+ String update_date = cursor.getString(cursor
+ .getColumnIndex(NoteItems.UPDATE_DATE));
+ // 记录的update_time字段
+ String update_time = cursor.getString(cursor
+ .getColumnIndex(NoteItems.UPDATE_TIME));
+ // 记录的alarm_time字段
+ String alarm_time = cursor.getString(cursor
+ .getColumnIndex(NoteItems.ALARM_TIME));
+ // 记录的background_color字段
+ int background_color = cursor.getInt(cursor
+ .getColumnIndex(NoteItems.BACKGROUND_COLOR));
+ // 记录的is_folder字段
+ String is_folder = cursor.getString(cursor
+ .getColumnIndex(NoteItems.IS_FOLDER));
+ // 记录的parent_folder字段
+ int parent_folder = cursor.getInt(cursor
+ .getColumnIndex(NoteItems.PARENT_FOLDER));
+
+ //
+ serializer.startTag(null, "record");
+ // ...
+ serializer.startTag(null, "id");
+ serializer.text(String.valueOf(id));
+ serializer.endTag(null, "id");
+ // ...
+ serializer.startTag(null, "content");
+ serializer.text(content);
+ serializer.endTag(null, "content");
+ // ...
+ serializer.startTag(null, "update_date");
+ if (update_date != null)
+ serializer.text(update_date);
+ serializer.endTag(null, "update_date");
+ // ...
+ serializer.startTag(null, "update_time");
+ if (update_time != null)
+ serializer.text(update_time);
+ serializer.endTag(null, "update_time");
+ // ...
+ serializer.startTag(null, "alarm_time");
+ if (alarm_time != null)
+ serializer.text(alarm_time.toString());
+ serializer.endTag(null, "alarm_time");
+ // ...
+ serializer.startTag(null, "background_color");
+ serializer.text(String.valueOf(background_color));
+ serializer.endTag(null, "background_color");
+ // ...
+ serializer.startTag(null, "is_folder");
+ if (is_folder != null)
+ serializer.text(is_folder);
+ serializer.endTag(null, "is_folder");
+ // ...
+ serializer.startTag(null, "parent_folder");
+ serializer.text(String.valueOf(parent_folder));
+ serializer.endTag(null, "parent_folder");
+ //
+ serializer.endTag(null, "record");
+ return id;
+ }
+}
\ No newline at end of file
diff --git a/XNote/app/.gitignore b/XNote/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/XNote/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/XNote/app/build.gradle.kts b/XNote/app/build.gradle.kts
new file mode 100644
index 0000000..2723617
--- /dev/null
+++ b/XNote/app/build.gradle.kts
@@ -0,0 +1,43 @@
+plugins {
+ alias(libs.plugins.android.application)
+}
+
+android {
+ namespace = "net.micode.notes"
+ compileSdk = 35
+
+ defaultConfig {
+ applicationId = "net.micode.notes"
+ minSdk = 24
+ targetSdk = 35
+ versionCode = 1
+ versionName = "1.0"
+
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ isMinifyEnabled = false
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+ }
+ }
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+}
+
+dependencies {
+
+ implementation(libs.appcompat)
+ implementation(libs.material)
+ implementation(libs.activity)
+ implementation(libs.constraintlayout)
+ testImplementation(libs.junit)
+ androidTestImplementation(libs.ext.junit)
+ androidTestImplementation(libs.espresso.core)
+}
\ No newline at end of file
diff --git a/XNote/app/proguard-rules.pro b/XNote/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/XNote/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/XNote/app/src/androidTest/java/net/micode/notes/ExampleInstrumentedTest.java b/XNote/app/src/androidTest/java/net/micode/notes/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..a889a75
--- /dev/null
+++ b/XNote/app/src/androidTest/java/net/micode/notes/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package net.micode.notes;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("net.micode.notes", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/XNote/app/src/main/AndroidManifest.xml b/XNote/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..0bd3023
--- /dev/null
+++ b/XNote/app/src/main/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/java/net/micode/notes/MainActivity.java b/XNote/app/src/main/java/net/micode/notes/MainActivity.java
new file mode 100644
index 0000000..8091753
--- /dev/null
+++ b/XNote/app/src/main/java/net/micode/notes/MainActivity.java
@@ -0,0 +1,24 @@
+package net.micode.notes;
+
+import android.os.Bundle;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_main);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ }
+}
\ No newline at end of file
diff --git a/XNote/app/src/main/res/drawable/ic_launcher_background.xml b/XNote/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/XNote/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/XNote/app/src/main/res/drawable/ic_launcher_foreground.xml b/XNote/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/XNote/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/layout/activity_main.xml b/XNote/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..86a5d97
--- /dev/null
+++ b/XNote/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/XNote/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/XNote/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000..c209e78
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/XNote/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/XNote/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..b2dfe3d
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/XNote/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/XNote/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000..4f0f1d6
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/XNote/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/XNote/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..62b611d
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000..948a307
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..1b9a695
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..28d4b77
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9287f50
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000..aa7d642
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000..9126ae3
Binary files /dev/null and b/XNote/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/XNote/app/src/main/res/values-night/themes.xml b/XNote/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..0f4f83d
--- /dev/null
+++ b/XNote/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/values/colors.xml b/XNote/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..c8524cd
--- /dev/null
+++ b/XNote/app/src/main/res/values/colors.xml
@@ -0,0 +1,5 @@
+
+
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/values/strings.xml b/XNote/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..676b828
--- /dev/null
+++ b/XNote/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ XNote
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/values/themes.xml b/XNote/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..c74fd86
--- /dev/null
+++ b/XNote/app/src/main/res/values/themes.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/xml/backup_rules.xml b/XNote/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..4df9255
--- /dev/null
+++ b/XNote/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/main/res/xml/data_extraction_rules.xml b/XNote/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/XNote/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/XNote/app/src/test/java/net/micode/notes/ExampleUnitTest.java b/XNote/app/src/test/java/net/micode/notes/ExampleUnitTest.java
new file mode 100644
index 0000000..296adc2
--- /dev/null
+++ b/XNote/app/src/test/java/net/micode/notes/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package net.micode.notes;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/XNote/build.gradle.kts b/XNote/build.gradle.kts
new file mode 100644
index 0000000..3756278
--- /dev/null
+++ b/XNote/build.gradle.kts
@@ -0,0 +1,4 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ alias(libs.plugins.android.application) apply false
+}
\ No newline at end of file
diff --git a/XNote/gradle.properties b/XNote/gradle.properties
new file mode 100644
index 0000000..4387edc
--- /dev/null
+++ b/XNote/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/XNote/gradle/libs.versions.toml b/XNote/gradle/libs.versions.toml
new file mode 100644
index 0000000..646e6cb
--- /dev/null
+++ b/XNote/gradle/libs.versions.toml
@@ -0,0 +1,22 @@
+[versions]
+agp = "8.9.1"
+junit = "4.13.2"
+junitVersion = "1.1.5"
+espressoCore = "3.5.1"
+appcompat = "1.6.1"
+material = "1.10.0"
+activity = "1.8.0"
+constraintlayout = "2.1.4"
+
+[libraries]
+junit = { group = "junit", name = "junit", version.ref = "junit" }
+ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
+espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
+appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
+material = { group = "com.google.android.material", name = "material", version.ref = "material" }
+activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
+constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
+
+[plugins]
+android-application = { id = "com.android.application", version.ref = "agp" }
+
diff --git a/XNote/gradle/wrapper/gradle-wrapper.jar b/XNote/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/XNote/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/XNote/gradle/wrapper/gradle-wrapper.properties b/XNote/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..6fb8be8
--- /dev/null
+++ b/XNote/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Jun 03 10:37:07 CST 2025
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/XNote/gradlew b/XNote/gradlew
new file mode 100644
index 0000000..4f906e0
--- /dev/null
+++ b/XNote/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# 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
+#
+# https://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.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/XNote/gradlew.bat b/XNote/gradlew.bat
new file mode 100644
index 0000000..107acd3
--- /dev/null
+++ b/XNote/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/XNote/settings.gradle.kts b/XNote/settings.gradle.kts
new file mode 100644
index 0000000..2485908
--- /dev/null
+++ b/XNote/settings.gradle.kts
@@ -0,0 +1,24 @@
+pluginManagement {
+ repositories {
+ google {
+ content {
+ includeGroupByRegex("com\\.android.*")
+ includeGroupByRegex("com\\.google.*")
+ includeGroupByRegex("androidx.*")
+ }
+ }
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.name = "XNote"
+include(":app")
+
\ No newline at end of file
diff --git a/test1.txt b/test1.txt
deleted file mode 100644
index 2cc9ef9..0000000
--- a/test1.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-hjh
-123
\ No newline at end of file