diff --git a/.gradle/7.5/checksums/checksums.lock b/.gradle/7.5/checksums/checksums.lock
index 5a003e3..50f4d27 100644
Binary files a/.gradle/7.5/checksums/checksums.lock and b/.gradle/7.5/checksums/checksums.lock differ
diff --git a/.gradle/7.5/checksums/md5-checksums.bin b/.gradle/7.5/checksums/md5-checksums.bin
index 754d9b6..e47e009 100644
Binary files a/.gradle/7.5/checksums/md5-checksums.bin and b/.gradle/7.5/checksums/md5-checksums.bin differ
diff --git a/.gradle/7.5/checksums/sha1-checksums.bin b/.gradle/7.5/checksums/sha1-checksums.bin
index 6cb5cc6..684f4c3 100644
Binary files a/.gradle/7.5/checksums/sha1-checksums.bin and b/.gradle/7.5/checksums/sha1-checksums.bin differ
diff --git a/.gradle/7.5/executionHistory/executionHistory.bin b/.gradle/7.5/executionHistory/executionHistory.bin
index 3b1c93c..be514e9 100644
Binary files a/.gradle/7.5/executionHistory/executionHistory.bin and b/.gradle/7.5/executionHistory/executionHistory.bin differ
diff --git a/.gradle/7.5/executionHistory/executionHistory.lock b/.gradle/7.5/executionHistory/executionHistory.lock
index ca28234..00bf098 100644
Binary files a/.gradle/7.5/executionHistory/executionHistory.lock and b/.gradle/7.5/executionHistory/executionHistory.lock differ
diff --git a/.gradle/7.5/fileHashes/fileHashes.bin b/.gradle/7.5/fileHashes/fileHashes.bin
index d4f7841..4c50cb0 100644
Binary files a/.gradle/7.5/fileHashes/fileHashes.bin and b/.gradle/7.5/fileHashes/fileHashes.bin differ
diff --git a/.gradle/7.5/fileHashes/fileHashes.lock b/.gradle/7.5/fileHashes/fileHashes.lock
index 52ed19b..66dcdbf 100644
Binary files a/.gradle/7.5/fileHashes/fileHashes.lock and b/.gradle/7.5/fileHashes/fileHashes.lock differ
diff --git a/.gradle/7.5/fileHashes/resourceHashesCache.bin b/.gradle/7.5/fileHashes/resourceHashesCache.bin
index fb59edb..e6319dd 100644
Binary files a/.gradle/7.5/fileHashes/resourceHashesCache.bin and b/.gradle/7.5/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index 57caba1..0781ce7 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
index d6b106f..4660cd4 100644
Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
index 7ac3595..c5ece43 100644
Binary files a/.gradle/file-system.probe and b/.gradle/file-system.probe differ
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
index 221f91b..9a1830f 100644
--- a/.idea/deploymentTargetDropDown.xml
+++ b/.idea/deploymentTargetDropDown.xml
@@ -23,6 +23,6 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 909fe14..c5642bf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -53,6 +53,8 @@ android {
implementation 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
implementation 'mysql:mysql-connector-java:8.0.27'
implementation("com.squareup.okhttp3:okhttp:4.9.3")
+ implementation 'com.squareup.okhttp3:okhttp-urlconnection:4.9.1'
+
}
}
diff --git a/app/build/intermediates/apk/debug/app-debug.apk b/app/build/intermediates/apk/debug/app-debug.apk
index 8a2563e..c3e365c 100644
Binary files a/app/build/intermediates/apk/debug/app-debug.apk and b/app/build/intermediates/apk/debug/app-debug.apk differ
diff --git a/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar b/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar
index 0b9af53..cabfc26 100644
Binary files a/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar and b/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar differ
diff --git a/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex b/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex
index cd6cf57..bb26b77 100644
Binary files a/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex and b/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex differ
diff --git a/app/build/intermediates/dex_archive_input_jar_hashes/debug/out b/app/build/intermediates/dex_archive_input_jar_hashes/debug/out
index 2e46ea2..da9bd68 100644
Binary files a/app/build/intermediates/dex_archive_input_jar_hashes/debug/out and b/app/build/intermediates/dex_archive_input_jar_hashes/debug/out differ
diff --git a/app/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/classes.dex b/app/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/classes.dex
index 0495f67..ff5ccfa 100644
Binary files a/app/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/classes.dex and b/app/build/intermediates/external_libs_dex/debug/mergeExtDexDebug/classes.dex differ
diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state
index ed3be3f..1f4bd61 100644
Binary files a/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state and b/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ
diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7rtPpScSVILPRSrgg9CBv_vNznw= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7rtPpScSVILPRSrgg9CBv_vNznw=
new file mode 100644
index 0000000..be5c585
Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7rtPpScSVILPRSrgg9CBv_vNznw= differ
diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JD6pnD8KSE9SGfQGmI812_St5_U= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JD6pnD8KSE9SGfQGmI812_St5_U=
new file mode 100644
index 0000000..4626be6
Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JD6pnD8KSE9SGfQGmI812_St5_U= differ
diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/RMbjDZUuJsS5IZjJpjTnECT2lug= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/RMbjDZUuJsS5IZjJpjTnECT2lug=
new file mode 100644
index 0000000..9fef6ad
Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/RMbjDZUuJsS5IZjJpjTnECT2lug= differ
diff --git a/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties b/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties
index 5df590b..109794e 100644
--- a/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties
+++ b/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties
@@ -1,4 +1,4 @@
-#Sat May 13 15:18:53 CST 2023
+#Sun May 14 15:35:59 CST 2023
net.micode.notes.app-main-7\:/drawable-hdpi/call_record.png=E\:\\andriodProj\\my_note\\gitProject\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_call_record.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_green.9.png=E\:\\andriodProj\\my_note\\gitProject\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_green.9.png.flat
net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_yellow.9.png=E\:\\andriodProj\\my_note\\gitProject\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_yellow.9.png.flat
diff --git a/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt
index eeaab90..a1adef5 100644
--- a/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt
+++ b/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt
@@ -1,4 +1,4 @@
-#Sat May 13 15:18:53 CST 2023
+#Sun May 14 19:26:17 CST 2023
base.0=E\:\\andriodProj\\my_note\\gitProject\\app\\build\\intermediates\\dex\\debug\\mergeDexDebug\\classes.dex
renamed.0=classes.dex
path.0=classes.dex
diff --git a/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources
index 29f003d..5af8082 100644
Binary files a/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources and b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/callback/NoteCallback.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/callback/NoteCallback.class
new file mode 100644
index 0000000..db14d5a
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/callback/NoteCallback.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class
index 7be3b8a..80f79cd 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$1.class
new file mode 100644
index 0000000..6ffa5f9
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$BodyType.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$BodyType.class
new file mode 100644
index 0000000..7558718
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer$BodyType.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer.class
index 0d67a78..e4b83c8 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteHttpServer.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteRemoteConfig.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteRemoteConfig.class
new file mode 100644
index 0000000..167676f
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/NoteRemoteConfig.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils$1.class
new file mode 100644
index 0000000..276b1de
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils.class
new file mode 100644
index 0000000..e8814ec
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/UIUtils.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/Validator.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/Validator.class
new file mode 100644
index 0000000..0f3a3af
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/Validator.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class
index f29a7eb..96646dc 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class
index ad0f99f..dd66e63 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class
index 2462066..1e7f3d9 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1$1.class
deleted file mode 100644
index 8f69d5a..0000000
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1$1.class and /dev/null differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1.class
index 2cd911a..e3e528c 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2$1.class
index ff24f01..fdb0481 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2$1.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2.class
index a0b0870..819a802 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$2.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3$1.class
new file mode 100644
index 0000000..ae6b129
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3.class
new file mode 100644
index 0000000..7b1acab
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity$3.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity.class
index aec53a2..3544129 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteLoginActivity.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$1.class
index 4e4c916..92ea632 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$1.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$2.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$2.class
index 75918da..0bf36ff 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$2.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$2.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$3.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$3.class
new file mode 100644
index 0000000..8ccc4ca
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$3.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$4.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$4.class
new file mode 100644
index 0000000..14e8975
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$4.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$5.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$5.class
new file mode 100644
index 0000000..18e781c
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton$5.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton.class
index 0a2df8f..1aa037a 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteMenuButton.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$1.class
new file mode 100644
index 0000000..522ff3f
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$2.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$2.class
new file mode 100644
index 0000000..f313788
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1$2.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1.class
new file mode 100644
index 0000000..35d06bb
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$1.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$2.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$2.class
new file mode 100644
index 0000000..ebfe79b
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$2.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$3.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$3.class
new file mode 100644
index 0000000..47bc86e
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton$3.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton.class
new file mode 100644
index 0000000..a8dbafc
Binary files /dev/null and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteVerificationButton.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class
index 3f9f251..4b91e3d 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class
index 20f181c..41fa36e 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class
index ff2bf37..416e9e5 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class
index c76179b..861535d 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class
index 3134798..73d4261 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class differ
diff --git a/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class b/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class
index 2eebbdd..65194f0 100644
Binary files a/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class and b/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class differ
diff --git a/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
index e8eb4f5..522040e 100644
--- a/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
+++ b/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt
@@ -53,232 +53,237 @@
34
34-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:34:5-81
34-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:34:22-78
-35
-36 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:36:5-158:19
-37 android:debuggable="true"
-38 android:icon="@drawable/icon_app"
-38-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:37:9-42
-39 android:label="@string/app_name"
-39-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:38:9-41
-40 android:testOnly="true" >
-41 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:39:9-52:20
-42 android:name="net.micode.notes.ui.NotesListActivity"
-42-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:40:13-49
-43 android:configChanges="keyboardHidden|orientation|screenSize"
-43-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:41:13-74
-44 android:label="@string/app_name"
-44-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:42:13-45
-45 android:launchMode="singleTop"
-45-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:43:13-43
-46 android:theme="@style/NoteTheme"
-46-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:44:13-45
-47 android:uiOptions="splitActionBarWhenNarrow"
-47-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:45:13-57
-48 android:windowSoftInputMode="adjustPan" >
-48-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:46:13-52
-49
-49-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:48:13-51:29
-50
-50-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:49:17-69
-50-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:49:25-66
-51
-52
-52-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:50:17-77
-52-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:50:27-74
-53
-54
-55 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:54:9-83:20
-56 android:name="net.micode.notes.ui.NoteEditActivity"
-56-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:55:13-48
-57 android:configChanges="keyboardHidden|orientation|screenSize"
-57-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:56:13-74
-58 android:launchMode="singleTop"
-58-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:57:13-43
-59 android:theme="@style/NoteTheme" >
-59-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:58:13-45
-60
-60-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:60:13-66:29
-60-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:60:28-49
-61
-61-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:62:17-69
-61-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:62:25-66
-62
-63
-63-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:17-76
-63-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:27-73
+35
+35-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:28:5-67
+35-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:28:22-64
+36
+37 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:37:5-163:19
+38 android:debuggable="true"
+39 android:icon="@drawable/icon_app"
+39-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:38:9-42
+40 android:label="@string/app_name"
+40-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:39:9-41
+41 android:networkSecurityConfig="@xml/network_security_config"
+41-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:40:9-69
+42 android:testOnly="true" >
+43 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:42:9-57:20
+44 android:name="net.micode.notes.ui.NotesListActivity"
+44-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:43:13-49
+45 android:configChanges="keyboardHidden|orientation|screenSize"
+45-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:44:13-74
+46 android:label="@string/app_name"
+46-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:45:13-45
+47 android:launchMode="singleTop"
+47-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:46:13-43
+48 android:theme="@style/NoteTheme"
+48-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:47:13-45
+49 android:uiOptions="splitActionBarWhenNarrow"
+49-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:48:13-57
+50 android:windowSoftInputMode="adjustPan" >
+50-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:49:13-52
+51
+51-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:53:13-56:29
+52
+52-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:54:17-69
+52-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:54:25-66
+53
+54
+54-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:55:17-77
+54-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:55:27-74
+55
+56
+57 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:59:9-88:20
+58 android:name="net.micode.notes.ui.NoteEditActivity"
+58-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:60:13-48
+59 android:configChanges="keyboardHidden|orientation|screenSize"
+59-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:61:13-74
+60 android:launchMode="singleTop"
+60-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:62:13-43
+61 android:theme="@style/NoteTheme" >
+61-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:13-45
+62
+62-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:65:13-71:29
+62-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:65:28-49
+63
+63-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:67:17-69
+63-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:67:25-66
64
-65
-65-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:17-78
-65-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:23-75
-66
-66-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:17-78
-66-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:23-75
-67
-68
-68-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:13-73:29
-69
-69-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:17-79
-69-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:25-76
-70
-71
-71-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:17-76
-71-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:27-73
+65
+65-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:17-76
+65-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:27-73
+66
+67
+67-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:17-78
+67-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:23-75
+68
+68-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:17-78
+68-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:23-75
+69
+70
+70-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:73:13-78:29
+71
+71-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:74:17-79
+71-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:74:25-76
72
-73
-73-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:17-78
-73-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:23-75
-74
-74-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:17-78
-74-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:64:23-75
-75
-76
-76-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:75:13-78:29
-77
-77-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:76:17-71
-77-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:76:25-68
-78
-79
-79-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:17-76
-79-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:63:27-73
-80
-81
-82 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:80:13-82:54
-83 android:name="android.app.searchable"
-83-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:81:17-54
-84 android:resource="@xml/searchable" />
-84-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:82:17-51
-85
-86 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:85:9-90:20
-87 android:name="net.micode.notes.ui.AlarmAlertActivity"
-87-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:86:17-54
-88 android:label="@string/app_name"
-88-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:87:17-49
-89 android:launchMode="singleInstance"
-89-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:88:17-52
-90 android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
-90-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:89:17-79
-91
-92 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:92:9-97:20
-93 android:name="net.micode.notes.ui.NotesPreferenceActivity"
-93-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:93:17-75
-94 android:label="@string/preferences_title"
-94-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:94:17-58
-95 android:launchMode="singleTop"
-95-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:95:17-47
-96 android:theme="@android:style/Theme.Holo.Light" >
-96-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:96:17-64
-97
-98 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:99:9-104:20
-99 android:name="net.micode.notes.ui.NoteLoginActivity"
-99-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:99:19-55
-100 android:label="@string/login_title"
-100-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:100:13-48
-101 android:launchMode="singleTop"
-101-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:101:13-43
-102 android:theme="@style/NoteTheme" >
-102-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:102:13-45
-103
-104
-105 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:106:9-109:43
-106 android:name="net.micode.notes.data.NotesProvider"
-106-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:107:13-63
-107 android:authorities="micode_notes"
-107-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:108:13-47
-108 android:multiprocess="true" />
-108-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:109:13-40
-109
-110 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:111:9-123:20
-111 android:name="net.micode.notes.widget.NoteWidgetProvider_2x"
-111-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:112:13-57
-112 android:label="@string/app_widget2x2" >
-112-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:113:13-50
-113
-113-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:114:13-118:29
-114
-114-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:115:17-84
-114-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:115:25-81
-115
-115-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:116:17-85
-115-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:116:25-82
-116
-116-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:117:17-85
-116-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:117:25-82
-117
-118
-119 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:13-122:58
-120 android:name="android.appwidget.provider"
-120-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:17-58
-121 android:resource="@xml/widget_2x_info" />
-121-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:17-55
-122
-123 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:124:9-137:20
-124 android:name="net.micode.notes.widget.NoteWidgetProvider_4x"
-124-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:125:13-57
-125 android:label="@string/app_widget4x4" >
-125-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:126:13-50
-126
-126-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:114:13-118:29
-127
-127-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:115:17-84
-127-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:115:25-81
-128
-128-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:116:17-85
-128-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:116:25-82
-129
-129-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:117:17-85
-129-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:117:25-82
-130
-131
-132 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:13-122:58
-133 android:name="android.appwidget.provider"
-133-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:17-58
-134 android:resource="@xml/widget_4x_info" />
-134-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:17-55
-135
-136
-136-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:139:9-143:20
-136-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:139:19-55
-137
-137-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:140:13-142:29
-138
-138-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:141:17-79
-138-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:141:25-76
-139
-140
-141 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:145:9-148:20
-142 android:name="net.micode.notes.ui.AlarmReceiver"
-142-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:146:13-61
-143 android:process=":remote" >
-143-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:147:13-38
-144
-145
-146 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:150:9-153:19
-147 android:name="net.micode.notes.gtask.remote.GTaskSyncService"
-147-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:151:13-74
-148 android:exported="false" >
-148-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:152:13-37
-149
-150
-151 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:155:9-157:52
-152 android:name="android.app.default_searchable"
-152-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:156:13-58
-153 android:value=".ui.NoteEditActivity" />
-153-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:157:13-49
-154
-155
-156
+73
+73-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:17-76
+73-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:27-73
+74
+75
+75-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:17-78
+75-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:23-75
+76
+76-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:17-78
+76-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:69:23-75
+77
+78
+78-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:80:13-83:29
+79
+79-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:81:17-71
+79-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:81:25-68
+80
+81
+81-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:17-76
+81-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:68:27-73
+82
+83
+84 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:85:13-87:54
+85 android:name="android.app.searchable"
+85-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:86:17-54
+86 android:resource="@xml/searchable" />
+86-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:87:17-51
+87
+88 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:90:9-95:20
+89 android:name="net.micode.notes.ui.AlarmAlertActivity"
+89-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:91:17-54
+90 android:label="@string/app_name"
+90-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:92:17-49
+91 android:launchMode="singleInstance"
+91-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:93:17-52
+92 android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
+92-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:94:17-79
+93
+94 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:97:9-102:20
+95 android:name="net.micode.notes.ui.NotesPreferenceActivity"
+95-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:98:17-75
+96 android:label="@string/preferences_title"
+96-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:99:17-58
+97 android:launchMode="singleTop"
+97-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:100:17-47
+98 android:theme="@android:style/Theme.Holo.Light" >
+98-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:101:17-64
+99
+100 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:104:9-109:20
+101 android:name="net.micode.notes.ui.NoteLoginActivity"
+101-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:104:19-55
+102 android:label="@string/login_title"
+102-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:105:13-48
+103 android:launchMode="singleTop"
+103-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:106:13-43
+104 android:theme="@style/NoteTheme" >
+104-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:107:13-45
+105
+106
+107 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:111:9-114:43
+108 android:name="net.micode.notes.data.NotesProvider"
+108-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:112:13-63
+109 android:authorities="micode_notes"
+109-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:113:13-47
+110 android:multiprocess="true" />
+110-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:114:13-40
+111
+112 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:116:9-128:20
+113 android:name="net.micode.notes.widget.NoteWidgetProvider_2x"
+113-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:117:13-57
+114 android:label="@string/app_widget2x2" >
+114-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:118:13-50
+115
+115-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:119:13-123:29
+116
+116-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:17-84
+116-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:25-81
+117
+117-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:17-85
+117-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:25-82
+118
+118-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:17-85
+118-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:25-82
+119
+120
+121 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:125:13-127:58
+122 android:name="android.appwidget.provider"
+122-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:126:17-58
+123 android:resource="@xml/widget_2x_info" />
+123-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:127:17-55
+124
+125 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:129:9-142:20
+126 android:name="net.micode.notes.widget.NoteWidgetProvider_4x"
+126-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:130:13-57
+127 android:label="@string/app_widget4x4" >
+127-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:131:13-50
+128
+128-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:119:13-123:29
+129
+129-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:17-84
+129-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:120:25-81
+130
+130-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:17-85
+130-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:121:25-82
+131
+131-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:17-85
+131-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:122:25-82
+132
+133
+134 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:125:13-127:58
+135 android:name="android.appwidget.provider"
+135-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:126:17-58
+136 android:resource="@xml/widget_4x_info" />
+136-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:127:17-55
+137
+138
+138-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:144:9-148:20
+138-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:144:19-55
+139
+139-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:145:13-147:29
+140
+140-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:146:17-79
+140-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:146:25-76
+141
+142
+143 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:150:9-153:20
+144 android:name="net.micode.notes.ui.AlarmReceiver"
+144-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:151:13-61
+145 android:process=":remote" >
+145-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:152:13-38
+146
+147
+148 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:155:9-158:19
+149 android:name="net.micode.notes.gtask.remote.GTaskSyncService"
+149-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:156:13-74
+150 android:exported="false" >
+150-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:157:13-37
+151
+152
+153 E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:160:9-162:52
+154 android:name="android.app.default_searchable"
+154-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:161:13-58
+155 android:value=".ui.NoteEditActivity" />
+155-->E:\andriodProj\my_note\gitProject\app\src\main\AndroidManifest.xml:162:13-49
+156
+157
+158
diff --git a/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml b/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml
index 468e734..2b5edce 100644
--- a/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml
+++ b/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml
@@ -32,11 +32,13 @@
+
+
+
+
+ android:label="@string/app_name"
+ android:networkSecurityConfig="@xml/network_security_config"
+ >
+ android:windowSoftInputMode="adjustPan"
+
+ >
diff --git a/app/src/main/java/net/micode/notes/callback/NoteCallback.java b/app/src/main/java/net/micode/notes/callback/NoteCallback.java
new file mode 100644
index 0000000..415e2b9
--- /dev/null
+++ b/app/src/main/java/net/micode/notes/callback/NoteCallback.java
@@ -0,0 +1,5 @@
+package net.micode.notes.callback;
+
+public interface NoteCallback {
+ public void execute();
+}
diff --git a/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java b/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
index c67dfdf..f6fec4d 100644
--- a/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
+++ b/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java
@@ -23,7 +23,6 @@ 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;
@@ -31,34 +30,13 @@ 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 okhttp3.*;
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;
+import java.util.concurrent.TimeUnit;
public class GTaskClient {
@@ -72,7 +50,7 @@ public class GTaskClient {
private static GTaskClient mInstance = null;
- private DefaultHttpClient mHttpClient;
+ private OkHttpClient okHttpClient;
private String mGetUrl;
@@ -91,7 +69,7 @@ public class GTaskClient {
private JSONArray mUpdateArray;
private GTaskClient() {
- mHttpClient = null;
+ okHttpClient = null;
mGetUrl = GTASK_GET_URL;
mPostUrl = GTASK_POST_URL;
mClientVersion = -1;
@@ -225,38 +203,31 @@ public class GTaskClient {
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 {
+ int timeoutConnection = 10;
+ int timeoutSocket = 15;
+
+
+ okHttpClient = new OkHttpClient.Builder()
+ .connectTimeout(timeoutConnection, TimeUnit.SECONDS)
+ .readTimeout(timeoutSocket, TimeUnit.SECONDS)
+ .build();
+
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) {
+ Request request = new Request.Builder()
+ .url(loginUrl)
+ .build();
+
+ Response response = okHttpClient.newCall(request).execute();
+
+ if (!response.isSuccessful()) {
Log.w(TAG, "it seems that there is no auth cookie");
+ return false;
}
- // get the client version
- String resString = getResponseContent(response.getEntity());
+ String resString = response.body().string();
String jsBegin = "_setup(";
String jsEnd = ")}";
int begin = resString.indexOf(jsBegin);
@@ -265,8 +236,11 @@ public class GTaskClient {
if (begin != -1 && end != -1 && begin < end) {
jsString = resString.substring(begin + jsBegin.length(), end);
}
+
JSONObject js = new JSONObject(jsString);
mClientVersion = js.getLong("v");
+ return true;
+
} catch (JSONException e) {
Log.e(TAG, e.toString());
e.printStackTrace();
@@ -276,75 +250,63 @@ public class GTaskClient {
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);
- }
+ private Request createHttpPost(String json) {
+ MediaType JSON = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");
+ RequestBody body = RequestBody.create(JSON, json);
- 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);
- }
+ Request request = new Request.Builder()
+ .url(mPostUrl)
+ .post(body)
+ .addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
+ .addHeader("AT", "1")
+ .build();
+ return request;
+ }
+
+
+ private String getResponseContent(Response response) throws IOException {
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);
- }
+ return response.body().string();
} finally {
- input.close();
+ response.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());
+ okHttpClient = new OkHttpClient();
+
+ MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+ RequestBody body = RequestBody.create(JSON, js.toString());
+
+ Request request = new Request.Builder()
+ .url(mPostUrl)
+ .post(body)
+ .build();
+
+ Response response = okHttpClient.newCall(request).execute();
+
+ if (!response.isSuccessful()) throw new NetworkFailureException("postRequest failed");
+
+ String jsString = response.body().string();
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();
@@ -360,6 +322,8 @@ public class GTaskClient {
}
}
+
+
public void createTask(Task task) throws NetworkFailureException {
commitUpdate();
try {
@@ -516,12 +480,14 @@ public class GTaskClient {
}
try {
- HttpGet httpGet = new HttpGet(mGetUrl);
- HttpResponse response = null;
- response = mHttpClient.execute(httpGet);
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder().url(mGetUrl).build();
+
+ Response response = client.newCall(request).execute();
+ if (!response.isSuccessful()) throw new NetworkFailureException("gettasklists: httpget failed");
// get the task list
- String resString = getResponseContent(response.getEntity());
+ String resString = response.body().string();
String jsBegin = "_setup(";
String jsEnd = ")}";
int begin = resString.indexOf(jsBegin);
@@ -532,10 +498,6 @@ public class GTaskClient {
}
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();
@@ -547,6 +509,7 @@ public class GTaskClient {
}
}
+
public JSONArray getTaskList(String listGid) throws NetworkFailureException {
commitUpdate();
try {
diff --git a/app/src/main/java/net/micode/notes/tool/NoteHttpServer.java b/app/src/main/java/net/micode/notes/tool/NoteHttpServer.java
index 3d9b192..0d5d201 100644
--- a/app/src/main/java/net/micode/notes/tool/NoteHttpServer.java
+++ b/app/src/main/java/net/micode/notes/tool/NoteHttpServer.java
@@ -1,38 +1,45 @@
package net.micode.notes.tool;
import okhttp3.*;
+import org.json.JSONException;
+import org.json.JSONObject;
import java.io.IOException;
+import java.util.Iterator;
public class NoteHttpServer {
- private final OkHttpClient client = new OkHttpClient();
+ public enum BodyType {
+ JSON, FORM_DATA
+ }
+
+ private final OkHttpClient client = new OkHttpClient();
+ public static final String FROM_DATA = "formdata";
+ public static final String JSON = "json";
/**
- * sync get
- * @param url the url to send the request to
- * @return the response body as a string
- * @throws IOException if the request fails
- *
- * */
-
- public String sendSyncGetRequest(String url) throws IOException {
+ * sync get
+ *
+ * @param url the url to send the request to
+ * @return the response body as a string
+ * @throws IOException if the request fails
+ */
+
+ public String sendSyncGetRequest(HttpUrl url) throws IOException {
Request req = new Request.Builder()
.url(url)
.build();
- try(Response res = client.newCall(req).execute()){
+ try (Response res = client.newCall(req).execute()) {
return res.body().string();
}
}
/**
- *
- * @param url the url to send the request to
- * @param callback the callback to be executed *when the request is complete
+ * @param url the url to send the request to
+ * @param callback the callback to be executed *when the request is complete
* @return the response body as a string
- *
- * */
- public void sendAsyncGetRequest(String url, Callback callback){
+ */
+ public void sendAsyncGetRequest(HttpUrl url, Callback callback) {
Request req = new Request.Builder()
.url(url)
.build();
@@ -41,28 +48,74 @@ public class NoteHttpServer {
/**
- * sync post
- *
- * @param url the url to send the request to
- * @param jsonBody the json body to send with the request
- * @return the response body as a string
- *
- * */
- public String sendSyncPostRequest(String url,String jsonBody)throws IOException{
- RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonBody);
+ * sync post
+ *
+ * @param url the url to send the request to
+ * @param body the body of the request
+ * @param bodyType the type of the body
+ * @return the response body as a string
+ */
+ public String sendSyncPostRequest(HttpUrl url, String body, BodyType bodyType) throws IOException {
+ RequestBody requestBody;
+ switch (bodyType) {
+ case JSON:
+ requestBody = RequestBody.create(MediaType.parse("application/json"), body);
+ break;
+ case FORM_DATA:
+ FormBody.Builder formBuilder = new FormBody.Builder();
+ try {
+ JSONObject jsonObject = new JSONObject(body);
+ Iterator keys = jsonObject.keys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ String value = jsonObject.getString(key);
+ formBuilder.add(key, value);
+ }
+ } catch (JSONException e) {
+ // Handle exception
+ return null;
+ }
+ requestBody = formBuilder.build();
+ default:
+ // Invalid body type
+ return null;
+ }
Request req = new Request.Builder()
.url(url)
.post(requestBody)
.build();
- try(Response res = client.newCall(req).execute()){
+ try (Response res = client.newCall(req).execute()) {
return res.body().string();
}
}
- public void sendAsyncPostRequest(String url,String jsonBody,Callback callback){
- RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonBody);
+ /**
+ * @param url the url to send the request to
+ * @param body the body of the request
+ * @param bodyType the type of the body
+ */
+ public void sendAsyncPostRequest(HttpUrl url, String body, BodyType bodyType, Callback callback) throws JSONException, IllegalArgumentException {
+ RequestBody requestBody;
+ switch (bodyType) {
+ case JSON:
+ requestBody = RequestBody.create(MediaType.parse("application/json"), body);
+ break;
+ case FORM_DATA:
+ FormBody.Builder formBuilder = new FormBody.Builder();
+ JSONObject jsonObject = new JSONObject(body);
+ Iterator keysIterator = jsonObject.keys();
+ while (keysIterator.hasNext()) {
+ String key = keysIterator.next();
+ String value = jsonObject.getString(key);
+ formBuilder.add(key, value);
+ }
+ requestBody = formBuilder.build();
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid content type: " + bodyType);
+ }
Request req = new Request.Builder()
.url(url)
@@ -72,4 +125,5 @@ public class NoteHttpServer {
client.newCall(req).enqueue(callback);
}
+
}
diff --git a/app/src/main/java/net/micode/notes/tool/NoteRemoteConfig.java b/app/src/main/java/net/micode/notes/tool/NoteRemoteConfig.java
new file mode 100644
index 0000000..eb6004d
--- /dev/null
+++ b/app/src/main/java/net/micode/notes/tool/NoteRemoteConfig.java
@@ -0,0 +1,21 @@
+package net.micode.notes.tool;
+
+public class NoteRemoteConfig {
+
+ //private
+ public static final String VERIFICATION_HOST = "192.168.13.123";
+ private static final int VERIFICATION_PORT = 3000;
+ private static final String PROTOCOL = "http";
+ private static final String GLOBAL_PREFIX = "/api";
+ private static final String verification_url = PROTOCOL + "://" + VERIFICATION_HOST + ":" + VERIFICATION_PORT+ GLOBAL_PREFIX;
+
+
+ //public
+ public static final int RESPONSE_SUCCESS = 200;
+ public static final int RESPONSE_FAIL = 400;
+
+ public static String generateUrl(String endpoint) {
+ return verification_url + endpoint;
+ }
+
+}
diff --git a/app/src/main/java/net/micode/notes/tool/UIUtils.java b/app/src/main/java/net/micode/notes/tool/UIUtils.java
new file mode 100644
index 0000000..582d0e0
--- /dev/null
+++ b/app/src/main/java/net/micode/notes/tool/UIUtils.java
@@ -0,0 +1,17 @@
+package net.micode.notes.tool;
+
+import android.app.Activity;
+import net.micode.notes.callback.NoteCallback;
+
+public class UIUtils {
+ public static void runInUI(Activity activity, NoteCallback callback){
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ callback.execute();
+ }
+ });
+ }
+
+}
+
diff --git a/app/src/main/java/net/micode/notes/tool/Validator.java b/app/src/main/java/net/micode/notes/tool/Validator.java
new file mode 100644
index 0000000..e21d45f
--- /dev/null
+++ b/app/src/main/java/net/micode/notes/tool/Validator.java
@@ -0,0 +1,11 @@
+package net.micode.notes.tool;
+
+public class Validator {
+
+ //利用正则校验手机号是否是中国大陆手机号
+ public static boolean isPhoneNum(String phoneNum) {
+ String regex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(16[6])|(17[0-8])|(18[0-9])|(19[1,8,9]))\\d{8}$";
+ return phoneNum.matches(regex);
+ }
+
+}
diff --git a/app/src/main/java/net/micode/notes/ui/NoteLoginActivity.java b/app/src/main/java/net/micode/notes/ui/NoteLoginActivity.java
index 4b3d792..9dfd33c 100644
--- a/app/src/main/java/net/micode/notes/ui/NoteLoginActivity.java
+++ b/app/src/main/java/net/micode/notes/ui/NoteLoginActivity.java
@@ -6,20 +6,39 @@ import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.util.Log;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.widget.Button;
+import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.Toast;
import net.micode.notes.R;
+import net.micode.notes.callback.NoteCallback;
+import net.micode.notes.tool.NoteHttpServer;
+import net.micode.notes.tool.NoteRemoteConfig;
+import net.micode.notes.tool.UIUtils;
+import okhttp3.*;
+import org.jetbrains.annotations.NotNull;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
public class NoteLoginActivity extends Activity {
+ //tag
+ private static final String TAG = "chenqy";
+ private NoteHttpServer server;
private NbButton btn_login;
+ private Button btn_verification;
+ private EditText note_login_phone_num;
+ private EditText note_verification_code;
private RelativeLayout rlContent;
private Handler handler;
private Animator animator;
private long lastClickTime = 0;
+ private static final String VERIFICATION_CODE_URL = "/verify/verifycode";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -30,27 +49,82 @@ public class NoteLoginActivity extends Activity {
}
- private void bindViews(){
+ private void bindViews() {
btn_login = (NbButton) findViewById(R.id.btn_login);
+ note_verification_code = (EditText) findViewById(R.id.note_verification_code);
+ note_login_phone_num = (EditText) findViewById(R.id.note_login_phone_num);
rlContent = (RelativeLayout) findViewById(R.id.btn_login_area);
-
rlContent.getBackground().setAlpha(0);
- handler=new Handler();
+ handler = new Handler();
+
+
}
- private void initResources(){
+ private void initResources() {
+ server = new NoteHttpServer();
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- btn_login.startAnim();
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
+ //check verifycode是否合法 合法就跳转
+ try {
+ checkVerifyCode();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ }
- //跳转
- gotoNew();
+ private void checkVerifyCode() throws IOException, JSONException {
+ HttpUrl url = HttpUrl.parse(NoteRemoteConfig.generateUrl(VERIFICATION_CODE_URL));
+ String phone_num = note_login_phone_num.getText().toString();
+ String verify_code = note_verification_code.getText().toString();
+ Log.e(TAG, "checkVerifyCode: " + phone_num + " " + verify_code);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("phone", phone_num);
+ jsonObject.put("verifycode", verify_code);
+ String status = "";
+ server.sendAsyncPostRequest(url, jsonObject.toString(), NoteHttpServer.BodyType.FORM_DATA, new Callback() {
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ UIUtils.runInUI(NoteLoginActivity.this, new NoteCallback() {
+ @Override
+ public void execute() {
+ Toast.makeText(getApplicationContext(), "网络错误", Toast.LENGTH_SHORT).show();
}
- },500);
+ });
+ }
+
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ JSONObject responseJson = null;
+ try {
+ responseJson = new JSONObject(response.body().string());
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ int code = -1;
+ try {
+ code = responseJson.getInt("code");
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ }
+ if(code == NoteRemoteConfig.RESPONSE_SUCCESS){
+ UIUtils.runInUI(NoteLoginActivity.this, () -> {
+ btn_login.startAnim();
+ handler.postDelayed(() -> {
+ //跳转
+ gotoNew();
+ }, 500);
+ });
+ }else{
+ UIUtils.runInUI(NoteLoginActivity.this, () -> {
+ Toast.makeText(getApplicationContext(), "验证码错误", Toast.LENGTH_SHORT).show();
+ });
+ }
+
}
});
@@ -58,12 +132,12 @@ public class NoteLoginActivity extends Activity {
private void gotoNew() {
btn_login.gotoNew();
- int xc=(btn_login.getLeft()+btn_login.getRight())/2;
- int yc=(btn_login.getTop()+btn_login.getBottom())/2;
+ int xc = (btn_login.getLeft() + btn_login.getRight()) / 2;
+ int yc = (btn_login.getTop() + btn_login.getBottom()) / 2;
float startRadius = 0;
float endRadus = 1111;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- animator= ViewAnimationUtils.createCircularReveal(rlContent,xc,yc,0,1111);
+ animator = ViewAnimationUtils.createCircularReveal(rlContent, xc, yc, 0, 1111);
}
animator.setDuration(300);
animator.addListener(new Animator.AnimatorListener() {
@@ -74,10 +148,10 @@ public class NoteLoginActivity extends Activity {
public void run() {
// startActivity(intent);
finish();
- overridePendingTransition(R.anim.anim_in,R.anim.anim_out);
+ overridePendingTransition(R.anim.anim_in, R.anim.anim_out);
}
- },200);
+ }, 200);
}
@Override
diff --git a/app/src/main/java/net/micode/notes/ui/NoteMenuButton.java b/app/src/main/java/net/micode/notes/ui/NoteMenuButton.java
index e4b275b..c78d5b9 100644
--- a/app/src/main/java/net/micode/notes/ui/NoteMenuButton.java
+++ b/app/src/main/java/net/micode/notes/ui/NoteMenuButton.java
@@ -1,5 +1,7 @@
package net.micode.notes.ui;
+import android.animation.Animator;
+import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
@@ -21,6 +23,7 @@ public class NoteMenuButton extends Button implements View.OnClickListener {
//TODO 定制menu
private PopupWindow popupWindow;
private Context context;
+ private boolean isClickable = true;
public NoteMenuButton(Context context) {
super(context);
@@ -47,12 +50,24 @@ public class NoteMenuButton extends Button implements View.OnClickListener {
setOnClickListener(this);
}
+// @Override
+// public void onClick(View v) {
+// if(!isClickable) return;
+// Log.e(TAG, "onClick");
+// initPopMenu(v);
+// }
+
@Override
public void onClick(View v) {
+ if (!isClickable) return;
Log.e(TAG, "onClick");
initPopMenu(v);
+ // 添加渐变动画效果
+ addStartAnimation();
}
+
+
private void initPopMenu(View v) {
//这一步是为了获取屏幕的宽高,便于用来设置PopupWindow的大小
DisplayMetrics dm = getResources().getDisplayMetrics();
@@ -79,10 +94,63 @@ public class NoteMenuButton extends Button implements View.OnClickListener {
@Override
public void onClick(View v) {
popupWindow.dismiss();
+ addEndAnimation();
}
});
+
popupWindow.showAtLocation(((Activity)context).getWindow().getDecorView(), Gravity.CENTER,0,0);
+ isClickable = false;
+ }
+
+ public void addStartAnimation(){
+ ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f, 0.8f);
+ valueAnimator.setDuration(300);
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float scale = (float) animation.getAnimatedValue();
+ NoteMenuButton.this.setScaleX(scale);
+ NoteMenuButton.this.setScaleY(scale);
+ }
+ });
+ valueAnimator.start();
+ }
+
+ public void addEndAnimation(){
+ // 添加渐变动画效果
+ ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.8f, 1f);
+ valueAnimator.setDuration(300);
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float scale = (float) animation.getAnimatedValue();
+ NoteMenuButton.this.setScaleX(scale);
+ NoteMenuButton.this.setScaleY(scale);
+ }
+ });
+ valueAnimator.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ isClickable = true;
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+ });
+ valueAnimator.start();
}
}
diff --git a/app/src/main/java/net/micode/notes/ui/NoteVerificationButton.java b/app/src/main/java/net/micode/notes/ui/NoteVerificationButton.java
new file mode 100644
index 0000000..00562f8
--- /dev/null
+++ b/app/src/main/java/net/micode/notes/ui/NoteVerificationButton.java
@@ -0,0 +1,149 @@
+package net.micode.notes.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.CountDownTimer;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+import net.micode.notes.R;
+import net.micode.notes.callback.NoteCallback;
+import net.micode.notes.tool.NoteHttpServer;
+import net.micode.notes.tool.NoteRemoteConfig;
+import net.micode.notes.tool.UIUtils;
+import net.micode.notes.tool.Validator;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.HttpUrl;
+import okhttp3.Response;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.Locale;
+
+
+public class NoteVerificationButton extends Button implements View.OnClickListener {
+ private static final String TAG = "chenqy";
+ private NoteHttpServer server;
+ private EditText note_login_phone_num;
+ private EditText note_verification_code;
+
+ private boolean isClickable = true; // flag to check if the button is clickable or not
+ private CountDownTimer countDownTimer; // timer to count down
+
+ private static final String VERIFICATION_ENDPOINT = "/verify/getverifycode";
+
+
+ public NoteVerificationButton(Context context) {
+ super(context);
+ }
+
+ public NoteVerificationButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public NoteVerificationButton(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ init();
+ }
+
+ private void init() {
+ note_login_phone_num = ((Activity) getContext()).findViewById(R.id.note_login_phone_num);
+ note_verification_code = ((Activity) getContext()).findViewById(R.id.note_verification_code);
+ server = new NoteHttpServer();
+ this.setOnClickListener(this);
+ }
+
+
+
+
+ @Override
+ public void onClick(View v) {
+ Log.e(TAG, "onClick: ");
+ if (isClickable) { // only execute if the button is clickable
+ HttpUrl url = HttpUrl.parse(NoteRemoteConfig.generateUrl(VERIFICATION_ENDPOINT));
+ String phone = note_login_phone_num.getText().toString();
+ //验证手机号是否合法
+ if (!Validator.isPhoneNum(phone)) {
+ UIUtils.runInUI((Activity) getContext(),() -> Toast.makeText(getContext(), "手机号不合法", Toast.LENGTH_SHORT).show());
+ return;
+ }
+ disableButton(); // disable the button and start the countdown timer
+
+ //发送验证码
+ sendVerificationCode(phone);
+ //输入框聚焦在验证码输入框
+ note_verification_code.requestFocus();
+ }
+ }
+
+ private void sendVerificationCode(String phone) {
+ HttpUrl url = HttpUrl.parse(NoteRemoteConfig.generateUrl(VERIFICATION_ENDPOINT));
+ url = url.newBuilder().addQueryParameter("phone", phone).build();
+ server.sendAsyncGetRequest(url, new Callback() {
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ enableButton(); // enable the button if the request fails
+ ((Activity) getContext()).runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(getContext(), "发送失败", Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ enableButton(); // enable the button if the request succeeds
+ ((Activity) getContext()).runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(getContext(), "发生成功", Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+ });
+ }
+
+ private void disableButton() {
+ isClickable = false;
+ countDownTimer = new CountDownTimer(5000, 1000) { // start a countdown timer for 60 seconds
+ @Override
+ public void onTick(long millisUntilFinished) {
+ long remainingSeconds = (millisUntilFinished + 999) / 1000; // round up the remaining milliseconds to seconds
+ long seconds = remainingSeconds % 60;
+ UIUtils.runInUI((Activity) getContext(), () -> {
+ setText(String.format(Locale.getDefault(), "%ds", seconds)); // set the button text to show the remaining time
+ });
+
+ }
+
+ @Override
+ public void onFinish() {
+ enableButton(); // enable the button when the timer finishes
+ }
+ }.start();
+ }
+
+ private void enableButton() {
+ isClickable = true;
+ countDownTimer.cancel(); // cancel the countdown timer if it's still running
+ UIUtils.runInUI((Activity) getContext(), new NoteCallback() {
+ @Override
+ public void execute() {
+ setText("获取验证码"); // set the button text back to its original text
+ }
+ });
+ }
+
+
+}
diff --git a/app/src/main/res/layout/note_login.xml b/app/src/main/res/layout/note_login.xml
index 9515b73..23c27f1 100644
--- a/app/src/main/res/layout/note_login.xml
+++ b/app/src/main/res/layout/note_login.xml
@@ -1,6 +1,7 @@
+
+
+ android:layout_height="match_parent"
+ >
-
-