diff --git a/src/Notes-master/.gradle/7.3.3/checksums/checksums.lock b/src/Notes-master/.gradle/7.3.3/checksums/checksums.lock new file mode 100644 index 0000000..6634778 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/checksums/checksums.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/checksums/md5-checksums.bin b/src/Notes-master/.gradle/7.3.3/checksums/md5-checksums.bin new file mode 100644 index 0000000..2f28fc4 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/checksums/md5-checksums.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/checksums/sha1-checksums.bin b/src/Notes-master/.gradle/7.3.3/checksums/sha1-checksums.bin new file mode 100644 index 0000000..f5b7504 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/checksums/sha1-checksums.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/dependencies-accessors/dependencies-accessors.lock b/src/Notes-master/.gradle/7.3.3/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000..93ba80a Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/dependencies-accessors/dependencies-accessors.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/dependencies-accessors/gc.properties b/src/Notes-master/.gradle/7.3.3/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin new file mode 100644 index 0000000..9645317 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock new file mode 100644 index 0000000..2778da9 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/executionHistory/executionHistory.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/fileChanges/last-build.bin b/src/Notes-master/.gradle/7.3.3/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/fileChanges/last-build.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin new file mode 100644 index 0000000..2b65ea0 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock new file mode 100644 index 0000000..380f61d Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/fileHashes/fileHashes.lock differ diff --git a/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin b/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..5464751 Binary files /dev/null and b/src/Notes-master/.gradle/7.3.3/fileHashes/resourceHashesCache.bin differ diff --git a/src/Notes-master/.gradle/7.3.3/gc.properties b/src/Notes-master/.gradle/7.3.3/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..ebbac47 Binary files /dev/null and b/src/Notes-master/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/src/Notes-master/.gradle/buildOutputCleanup/cache.properties b/src/Notes-master/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..8b36cd3 --- /dev/null +++ b/src/Notes-master/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Fri Nov 01 15:09:45 CST 2024 +gradle.version=7.3.3 diff --git a/src/Notes-master/.gradle/buildOutputCleanup/outputFiles.bin b/src/Notes-master/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..d462025 Binary files /dev/null and b/src/Notes-master/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/src/Notes-master/.gradle/config.properties b/src/Notes-master/.gradle/config.properties new file mode 100644 index 0000000..f37fd5a --- /dev/null +++ b/src/Notes-master/.gradle/config.properties @@ -0,0 +1,2 @@ +#Sat Nov 02 00:06:01 CST 2024 +java.home=D\:\\Android\\Android Studio\\jbr diff --git a/src/Notes-master/.gradle/file-system.probe b/src/Notes-master/.gradle/file-system.probe new file mode 100644 index 0000000..bf6994d Binary files /dev/null and b/src/Notes-master/.gradle/file-system.probe differ diff --git a/src/Notes-master/.gradle/vcs-1/gc.properties b/src/Notes-master/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/Notes-master/.idea/.gitignore b/src/Notes-master/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/src/Notes-master/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/Notes-master/.idea/Notes-master.iml b/src/Notes-master/.idea/Notes-master.iml new file mode 100644 index 0000000..4f4b64c --- /dev/null +++ b/src/Notes-master/.idea/Notes-master.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/compiler.xml b/src/Notes-master/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/src/Notes-master/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/deploymentTargetDropDown.xml b/src/Notes-master/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..ea33767 --- /dev/null +++ b/src/Notes-master/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/gradle.xml b/src/Notes-master/.idea/gradle.xml new file mode 100644 index 0000000..a0de2a1 --- /dev/null +++ b/src/Notes-master/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/jarRepositories.xml b/src/Notes-master/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/src/Notes-master/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/misc.xml b/src/Notes-master/.idea/misc.xml new file mode 100644 index 0000000..54d5acd --- /dev/null +++ b/src/Notes-master/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules.xml b/src/Notes-master/.idea/modules.xml new file mode 100644 index 0000000..a1d3884 --- /dev/null +++ b/src/Notes-master/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/Notes-master1.iml b/src/Notes-master/.idea/modules/Notes-master1.iml new file mode 100644 index 0000000..767cb4b --- /dev/null +++ b/src/Notes-master/.idea/modules/Notes-master1.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/app/Notes-master1.app.androidTest.iml b/src/Notes-master/.idea/modules/app/Notes-master1.app.androidTest.iml new file mode 100644 index 0000000..4efcab8 --- /dev/null +++ b/src/Notes-master/.idea/modules/app/Notes-master1.app.androidTest.iml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/app/Notes-master1.app.iml b/src/Notes-master/.idea/modules/app/Notes-master1.app.iml new file mode 100644 index 0000000..7c06007 --- /dev/null +++ b/src/Notes-master/.idea/modules/app/Notes-master1.app.iml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/app/Notes-master1.app.main.iml b/src/Notes-master/.idea/modules/app/Notes-master1.app.main.iml new file mode 100644 index 0000000..4333552 --- /dev/null +++ b/src/Notes-master/.idea/modules/app/Notes-master1.app.main.iml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/.idea/modules/app/Notes-master1.app.unitTest.iml b/src/Notes-master/.idea/modules/app/Notes-master1.app.unitTest.iml new file mode 100644 index 0000000..52a5ae8 --- /dev/null +++ b/src/Notes-master/.idea/modules/app/Notes-master1.app.unitTest.iml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/build.gradle b/src/Notes-master/app/build.gradle new file mode 100644 index 0000000..aba9ea7 --- /dev/null +++ b/src/Notes-master/app/build.gradle @@ -0,0 +1,20 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "33.0.0" + useLibrary 'org.apache.http.legacy' + + defaultConfig { + applicationId "net.micode.notes" + minSdkVersion 14 + targetSdkVersion 30 + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + } +} diff --git a/src/Notes-master/app/build/generated/source/buildConfig/debug/net/micode/notes/BuildConfig.java b/src/Notes-master/app/build/generated/source/buildConfig/debug/net/micode/notes/BuildConfig.java new file mode 100644 index 0000000..db17690 --- /dev/null +++ b/src/Notes-master/app/build/generated/source/buildConfig/debug/net/micode/notes/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package net.micode.notes; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "net.micode.notes"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "0.1"; +} diff --git a/src/Notes-master/app/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/src/Notes-master/app/build/intermediates/annotation_processor_list/debug/annotationProcessors.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/src/Notes-master/app/build/intermediates/annotation_processor_list/debug/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk b/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk new file mode 100644 index 0000000..8c019d8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/apk/debug/app-debug.apk differ diff --git a/src/Notes-master/app/build/intermediates/apk/debug/output-metadata.json b/src/Notes-master/app/build/intermediates/apk/debug/output-metadata.json new file mode 100644 index 0000000..b2231b9 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/apk/debug/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "net.micode.notes", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "0.1", + "outputFile": "app-debug.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/apk_ide_redirect_file/debug/redirect.txt b/src/Notes-master/app/build/intermediates/apk_ide_redirect_file/debug/redirect.txt new file mode 100644 index 0000000..46dacc6 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/apk_ide_redirect_file/debug/redirect.txt @@ -0,0 +1,2 @@ +#- File Locator - +listingFile=../../apk/debug/output-metadata.json diff --git a/src/Notes-master/app/build/intermediates/app_metadata/debug/app-metadata.properties b/src/Notes-master/app/build/intermediates/app_metadata/debug/app-metadata.properties new file mode 100644 index 0000000..0c042e3 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/app_metadata/debug/app-metadata.properties @@ -0,0 +1,2 @@ +appMetadataVersion=1.1 +androidGradlePluginVersion=7.2.2 diff --git a/src/Notes-master/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json b/src/Notes-master/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json new file mode 100644 index 0000000..714f651 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json @@ -0,0 +1,10 @@ +{ + "version": 3, + "artifactType": { + "type": "COMPATIBLE_SCREEN_MANIFEST", + "kind": "Directory" + }, + "applicationId": "net.micode.notes", + "variantName": "debug", + "elements": [] +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar b/src/Notes-master/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar new file mode 100644 index 0000000..767aac4 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_0/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_0/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_0/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_1/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_1/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_1/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_2/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_2/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_2/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_3/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_3/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/dirs_bucket_3/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_0/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_0/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_0/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_1/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_1/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_1/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_2/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_2/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_2/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_3/graph.bin b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_3/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/desugar_graph/debug/out/currentProject/jar_f06aedd671f023ca8a296f883a63d315b3628c7dd3d974da447911d6a47f948a_bucket_3/graph.bin differ diff --git a/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex b/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex new file mode 100644 index 0000000..278deb9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/dex/debug/mergeDexDebug/classes.dex differ diff --git a/src/Notes-master/app/build/intermediates/dex_archive_input_jar_hashes/debug/out b/src/Notes-master/app/build/intermediates/dex_archive_input_jar_hashes/debug/out new file mode 100644 index 0000000..e1c796c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/dex_archive_input_jar_hashes/debug/out differ diff --git a/src/Notes-master/app/build/intermediates/dex_number_of_buckets_file/debug/out b/src/Notes-master/app/build/intermediates/dex_number_of_buckets_file/debug/out new file mode 100644 index 0000000..bf0d87a --- /dev/null +++ b/src/Notes-master/app/build/intermediates/dex_number_of_buckets_file/debug/out @@ -0,0 +1 @@ +4 \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/src/Notes-master/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state new file mode 100644 index 0000000..1c983fc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ diff --git a/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties new file mode 100644 index 0000000..bbd2fa1 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties @@ -0,0 +1,96 @@ +#Thu Dec 12 21:08:46 CST 2024 +net.micode.notes.app-main-7\:/drawable-hdpi/font_super.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_super.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/call_record.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_call_record.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/new_note_normal.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_new_note_normal.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_yellow.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_yellow.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_green.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_green.9.png.flat +net.micode.notes.app-main-7\:/menu/sub_folder.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_sub_folder.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_yellow.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_yellow.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/font_small.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_small.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_white.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_white.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_white.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_white.9.png.flat +net.micode.notes.app-main-7\:/layout/account_dialog_title.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_account_dialog_title.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_green.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_green.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_down.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_down.9.png.flat +net.micode.notes.app-main-7\:/color/secondary_text_dark.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\color_secondary_text_dark.xml.flat +net.micode.notes.app-main-7\:/layout/dialog_edit_text.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_dialog_edit_text.xml.flat +net.micode.notes.app-main-7\:/layout/widget_4x.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_widget_4x.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_middle.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_middle.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/menu_delete.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_menu_delete.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/clock.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_clock.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/font_normal.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_normal.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/dropdown_icon.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_dropdown_icon.9.png.flat +net.micode.notes.app-main-7\:/layout/note_edit.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_edit.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_green.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_green.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_green_single.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_single.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_white_single.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_single.9.png.flat +net.micode.notes.app-main-7\:/raw-zh-rCN/introduction=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\raw-zh-rCN_introduction.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_green.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_green.png.flat +net.micode.notes.app-main-7\:/xml/preferences.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\xml_preferences.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_red_single.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_single.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/delete.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_delete.png.flat +net.micode.notes.app-main-7\:/menu/call_record_folder.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_call_record_folder.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_red.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_red.png.flat +net.micode.notes.app-main-7\:/layout/widget_2x.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_widget_2x.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/menu_move.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_menu_move.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_green_down.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_down.9.png.flat +net.micode.notes.app-main-7\:/layout/note_edit_list_item.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_edit_list_item.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_blue.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_blue.png.flat +net.micode.notes.app-main-7\:/layout/add_account_text.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_add_account_text.xml.flat +net.micode.notes.app-main-7\:/xml/widget_4x_info.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\xml_widget_4x_info.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/font_size_selector_bg.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_size_selector_bg.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/selected.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_selected.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/search_result.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_search_result.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_white.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_white.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_middle.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_middle.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_green_middle.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_middle.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_white_down.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_down.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_single.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_single.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/font_large.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_font_large.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_up.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_up.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_red_middle.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_middle.9.png.flat +net.micode.notes.app-main-7\:/layout/settings_header.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_settings_header.xml.flat +net.micode.notes.app-main-7\:/menu/note_list.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list.xml.flat +net.micode.notes.app-main-7\:/menu/call_note_edit.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_call_note_edit.xml.flat +net.micode.notes.app-main-7\:/drawable/new_note.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable_new_note.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_red.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_red.9.png.flat +net.micode.notes.app-main-7\:/layout/note_list.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list.xml.flat +net.micode.notes.app-main-7\:/color/primary_text_dark.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\color_primary_text_dark.xml.flat +net.micode.notes.app-main-7\:/layout/datetime_picker.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_datetime_picker.xml.flat +net.micode.notes.app-main-7\:/raw/introduction=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\raw_introduction.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_single.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_single.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_yellow.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_yellow.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_red.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_red.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/title_alert.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_title_alert.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_red_down.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_down.9.png.flat +net.micode.notes.app-main-7\:/menu/note_list_options.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list_options.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_2x_yellow.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_2x_yellow.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/icon_app.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_icon_app.png.flat +net.micode.notes.app-main-7\:/layout/note_item.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_item.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_background.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_background.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_red.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_red.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/title_bar_bg.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_title_bar_bg.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_footer_bg.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_footer_bg.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/new_note_pressed.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_new_note_pressed.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_green_up.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_green_up.9.png.flat +net.micode.notes.app-main-7\:/layout/note_list_dropdown_menu.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list_dropdown_menu.xml.flat +net.micode.notes.app-main-7\:/layout/note_list_footer.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_note_list_footer.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_red_up.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_red_up.9.png.flat +net.micode.notes.app-main-7\:/menu/note_list_dropdown.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_note_list_dropdown.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_white_up.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_up.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_blue.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_blue.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/bg_color_btn_mask.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_bg_color_btn_mask.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_blue.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_blue.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/bg_btn_set_color.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_bg_btn_set_color.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/edit_title_white.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_edit_title_white.9.png.flat +net.micode.notes.app-main-7\:/xml/searchable.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\xml_searchable.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/notification.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_notification.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_blue_up.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_blue_up.9.png.flat +net.micode.notes.app-main-7\:/xml/widget_2x_info.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\xml_widget_2x_info.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/note_edit_color_selector_panel.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_note_edit_color_selector_panel.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_white_middle.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_white_middle.9.png.flat +net.micode.notes.app-main-7\:/layout/folder_list_item.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\layout_folder_list_item.xml.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_folder.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_folder.9.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/widget_4x_blue.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_widget_4x_blue.png.flat +net.micode.notes.app-main-7\:/drawable-hdpi/list_yellow_down.9.png=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\drawable-hdpi_list_yellow_down.9.png.flat +net.micode.notes.app-main-7\:/menu/note_edit.xml=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\menu_note_edit.xml.flat diff --git a/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml new file mode 100644 index 0000000..d65e0cc --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml @@ -0,0 +1,108 @@ + + + + 短信 + 邮件 + + + %1$s 条符合“%2$s”的搜索结果 + + 确认删除文件夹及所包含的便签吗? + 确认要删除该条便签吗? + 确认要删除所选的 %d 条便签吗? + 删除 + 便签 + 便签2x2 + 便签4x4 + 删除 + 通话便签 + 取消 + 设置 + 成功删除提醒 + 不能为空便签设置闹钟提醒 + 不能将空便签发送到桌面 + 要查看的便签不存在 + 导出文本时发生错误,请检查SD卡 + SD卡被占用,不能操作 + 同步已取消 + 同步失败,发生内部错误 + 同步失败,请检查网络和帐号设置 + 导出失败 + 文件夹 %1$s 已存在,请重新命名 + yyyyMMdd + MM月dd日 kk:mm + 已将文本文件(%1$s)输出至SD卡(%2$s)目录 + 已将所选 %1$d 条便签移到 %2$s 文件夹 + 请输入名称 + 已添加到桌面 + 提醒我 + 新建文件夹 + 删除 + 取消全选 + 导出文本 + 修改文件夹名称 + 刪除文件夹 + 查看文件夹 + + 正常 + 文字大小 + + 超大 + 进入清单模式 + 移动到文件夹 + 上一级文件夹 + 退出清单模式 + 删除提醒 + 搜索 + 全选 + 没有选中项,操作无效 + 选中了 %d 项 + 发送到桌面 + 设置 + 分享 + 同步 + 取消同步 + 选择文件夹 + 已过期 + 发送邮件 + 打开地图 + 呼叫电话 + 浏览网页 + 查看 + 知道了 + 新建便签 + ... + 与google task同步便签记录 + 同步账号 + 添加账号 + 新建便签背景颜色随机 + 取消同步 + 立即同步 + 当前帐号 %1$s + 如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复 + 请选择google帐号,便签将与该帐号的google task内容同步。 + 同步便签 + 上次同步于 %1$s + 取消 + 更换账号 + 删除账号 + 设置 + 正在同步中,不能修改同步帐号 + 同步帐号已设置为%1$s + 便签 + 搜索便签 + 正在搜索便签 + 便签中的文字 + 创建提醒 + 导出成功 + 与%1$s同步成功 + 正在获取服务器便签列表... + 登录%1$s... + 正在同步本地便签... + 同步已取消 + 同步失败 + 同步成功 + 同步便签... + 没有关联内容,点击新建便签。 + 访客模式下,便签内容不可见 + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml new file mode 100644 index 0000000..226b5bc --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml @@ -0,0 +1,108 @@ + + + + 短信 + 郵件 + + + %1$s 條符合”%2$s“的搜尋結果 + + 確認刪除檔夾及所包含的便簽嗎? + 确认要删除該條便籤嗎? + 确认要刪除所選的 %d 條便籤嗎? + 刪除 + 便簽 + 便簽2x2 + 便簽4x4 + 刪除 + 通話便籤 + 取消 + 設置 + 成功刪除提醒 + 不能爲空便籤設置鬧鐘提醒 + 不能將空便籤發送到桌面 + 要查看的便籤不存在 + 導出TXT時發生錯誤,請檢查SD卡 + SD卡被佔用,不能操作 + 同步已取消 + 同步失敗,發生內部錯誤 + 同步失敗,請檢查網絡和帳號設置 + 導出失敗 + 文件夾 %1$s 已存在,請重新命名 + yyyyMMdd + MM月dd日 kk:mm + 已將文本文件(%1$s)導出至SD(%2$s)目錄 + 已將所選 %1$d 便籤移到 %2$s 文件夾 + 請輸入名稱 + 已添加到桌面 + 提醒我 + 新建文件夾 + 刪除 + 取消全選 + 導出文本 + 修改文件夾名稱 + 刪除文件夾 + 查看文件夾 + + 正常 + 文字大小 + + 超大 + 進入清單模式 + 移動到文件夾 + 上一級文件夾 + 退出清單模式 + 刪除提醒 + 搜尋 + 全選 + 沒有選中項,操作無效 + 選中了 %d 項 + 發送到桌面 + 設置 + 分享 + 同步 + 取消同步 + 選擇文件夾 + 已過期 + 發送郵件 + 打開地圖 + 呼叫電話 + 浏覽網頁 + 查看 + 知道了 + 新建便簽 + ... + 与google task同步便簽記錄 + 同步賬號 + 添加賬號 + 新建便籤背景顏色隨機 + 取消同步 + 立即同步 + 當前帳號 %1$s + 如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復 + 請選擇google帳號,便簽將與該帳號的google task內容同步。 + 同步便簽 + 上次同步于 %1$s + 取消 + 更換賬號 + 刪除賬號 + 設置 + 正在同步中,不能修改同步帳號 + 同步帳號已設置為%1$s + 便籤 + 搜索便籤 + 正在搜索便籤 + 便籤中的文字 + 創建提醒 + 導出成功 + 與%1$s同步成功 + 正在獲取服務器便籤列表... + 登陸%1$s... + 正在同步本地便籤... + 同步已取消 + 同步失敗 + 同步成功 + 同步便簽... + 沒有關聯內容,點擊新建便簽。 + 訪客模式下,便籤內容不可見 + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml new file mode 100644 index 0000000..d66f9de --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml @@ -0,0 +1,169 @@ + + + + -%s + --%s + --%s + --%s + + + Messaging + Email + + #335b5b5b + 26sp + 20sp + 17sp + 14sp + 33sp + + %1$s result for \"%2$s\" + + %1$s results for \"%2$s\" + + Confirm to delete folder and its notes? + Confirm to delete this note? + Confirm to delete the selected %d notes? + Delete selected notes + Notes + Notes 2x2 + Notes 4x4 + Delete + Call notes + cancel + set + Delete reminder successfully + Sorry, can not set clock on empty note + Sorry, can not send and empty note to home + The note is not exist + Export failed, please check SD card + SD card busy, not available now + Sync is canceled + Sync failed, internal error occurs + Sync failed, please check network and account settings + Export fail + notes_%s.txt + /MIUI/notes/ + The folder %1$s exist, please rename + yyyyMMdd + MMMd kk:mm + Export text file (%1$s) to SD (%2$s) directory + (%d) + Have moved selected %1$d notes to %2$s folder + Input name + Note added to home + Remind me + New Folder + Delete + Deselect all + Export text + Change folder name + Delete folder + View folder + Large + Medium + Font size + Small + Super + Enter check list + Move to folder + Parent folder + Leave check list + Delete reminder + Search + Select all + Nothing selected, the operation is invalid + %d selected + Send to home + Settings + Share + Sync + Cancel syncing + Select folder + Expired + Send email + Open map + Call + Browse web + Take a look + Got it + Add note + ... + Sync notes with google task + Sync account + Add account + New note background color random + Cancel syncing + Sync immediately + Current account %1$s + All sync related information will be deleted, which may result in duplicated items sometime + Please select a google account. Local notes will be synced with google task. + Sync notes + Last sync time %1$s + yyyy-MM-dd hh:mm:ss + Cancel + Change sync account + Remove sync account + Settings + Cannot change the account because sync is in progress + %1$s has been set as the sync account + Notes + Search notes + Searching Notes + Text in your notes + Set reminder + Export successful + Sync is successful with account %1$s + Getting remote note list... + Logging into %1$s... + Synchronize local notes with Google Task... + Sync is canceled + Sync is failed + Sync is successful + Syncing notes... + No associated note found, click to create associated note. + Privacy mode,can not see note content + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml new file mode 100644 index 0000000..76a0246 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml @@ -0,0 +1,56 @@ + + + -%s + --%s + --%s + --%s + + Messaging + Email + #335b5b5b33sp26sp20sp17sp14spNotesNotes 2x2Notes 4x4No associated note found, click to create associated note.Privacy mode,can not see note content...Add noteDelete reminder successfullySet reminderExpiredyyyyMMddMMMd kk:mmGot itTake a lookCallSend emailBrowse webOpen map/MIUI/notes/notes_%s.txt(%d)New FolderExport textSyncCancel syncingSettingsSearchDeleteMove to folder%d selectedNothing selected, the operation is invalidSelect allDeselect allFont sizeSmallMediumLargeSuperEnter check listLeave check listView folderDelete folderChange folder nameThe folder %1$s exist, please renameShareSend to homeRemind meDelete reminderSelect folderParent folderNote added to homeConfirm to delete folder and its notes?Delete selected notesConfirm to delete the selected %d notes?Confirm to delete this note?Have moved selected %1$d notes to %2$s folderSD card busy, not available nowExport failed, please check SD cardThe note is not existSorry, can not set clock on empty noteSorry, can not send and empty note to homeExport successfulExport failExport text file (%1$s) to SD (%2$s) directorySyncing notes...Sync is successfulSync is failedSync is canceledSync is successful with account %1$sSync failed, please check network and account settingsSync failed, internal error occursSync is canceledLogging into %1$s...Getting remote note list...Synchronize local notes with Google Task...SettingsSync accountSync notes with google taskLast sync time %1$syyyy-MM-dd hh:mm:ssAdd accountChange sync accountRemove sync accountCancelSync immediatelyCancel syncingCurrent account %1$sAll sync related information will be deleted, which may result in duplicated items sometimeSync notesPlease 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 accountNew note background color randomDeleteCall notesInput nameSearching NotesSearch notesText in your notesNotessetcancel + %1$s result for \"%2$s\" + + %1$s results for \"%2$s\" + + 短信 + 邮件 + 便签便签2x2便签4x4没有关联内容,点击新建便签。访客模式下,便签内容不可见...新建便签成功删除提醒创建提醒已过期yyyyMMddMM月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”的搜索结果 + + 短信 + 郵件 + 便簽便簽2x2便簽4x4沒有關聯內容,點擊新建便簽。訪客模式下,便籤內容不可見...新建便簽成功刪除提醒創建提醒已過期yyyyMMddMM月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“的搜尋結果 + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/mergeDebugAssets/merger.xml b/src/Notes-master/app/build/intermediates/incremental/mergeDebugAssets/merger.xml new file mode 100644 index 0000000..b631bae --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/mergeDebugAssets/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/src/Notes-master/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml new file mode 100644 index 0000000..2c64899 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/mergeDebugShaders/merger.xml b/src/Notes-master/app/build/intermediates/incremental/mergeDebugShaders/merger.xml new file mode 100644 index 0000000..f04ba98 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/mergeDebugShaders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt new file mode 100644 index 0000000..7df4fa5 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt @@ -0,0 +1,4 @@ +#Thu Dec 12 21:16:30 CST 2024 +base.0=G\:\\Android\\AndroidSDK\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeDexDebug\\classes.dex +renamed.0=classes.dex +path.0=classes.dex diff --git a/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources new file mode 100644 index 0000000..3703b08 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources differ diff --git a/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 new file mode 100644 index 0000000..945a7c5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/BuildConfig.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/BuildConfig.class new file mode 100644 index 0000000..f98637b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/BuildConfig.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Contact.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Contact.class new file mode 100644 index 0000000..2cad03c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Contact.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$CallNote.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$CallNote.class new file mode 100644 index 0000000..19164da Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$CallNote.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataColumns.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataColumns.class new file mode 100644 index 0000000..4be9a30 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataColumns.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataConstants.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataConstants.class new file mode 100644 index 0000000..25da469 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$DataConstants.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$NoteColumns.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$NoteColumns.class new file mode 100644 index 0000000..37c051d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$NoteColumns.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$TextNote.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$TextNote.class new file mode 100644 index 0000000..fd10c3e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes$TextNote.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes.class new file mode 100644 index 0000000..39006c2 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/Notes.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper$TABLE.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper$TABLE.class new file mode 100644 index 0000000..56d65f1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper$TABLE.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper.class new file mode 100644 index 0000000..6ff3e69 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesDatabaseHelper.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesProvider.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesProvider.class new file mode 100644 index 0000000..0264574 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/data/NotesProvider.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/MetaData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/MetaData.class new file mode 100644 index 0000000..0908b3b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/MetaData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Node.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Node.class new file mode 100644 index 0000000..2f5a29b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Node.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlData.class new file mode 100644 index 0000000..c61d69f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlNote.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlNote.class new file mode 100644 index 0000000..c22b3cd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/SqlNote.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Task.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Task.class new file mode 100644 index 0000000..63a1a65 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/Task.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/TaskList.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/TaskList.class new file mode 100644 index 0000000..bed06a8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/data/TaskList.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/ActionFailureException.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/ActionFailureException.class new file mode 100644 index 0000000..ee26e18 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/ActionFailureException.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/NetworkFailureException.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/NetworkFailureException.class new file mode 100644 index 0000000..317820b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/exception/NetworkFailureException.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$1.class new file mode 100644 index 0000000..2a2d7d2 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.class new file mode 100644 index 0000000..fd895e5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask.class new file mode 100644 index 0000000..6d0e67a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskASyncTask.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class new file mode 100644 index 0000000..56de558 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskClient.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskManager.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskManager.class new file mode 100644 index 0000000..fef572e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskManager.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService$1.class new file mode 100644 index 0000000..4c9e045 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService.class new file mode 100644 index 0000000..81e6eeb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/gtask/remote/GTaskSyncService.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class new file mode 100644 index 0000000..e208b56 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note$NoteData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class new file mode 100644 index 0000000..3ff5594 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/Note.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.class new file mode 100644 index 0000000..46734e7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class new file mode 100644 index 0000000..d8b615d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/model/WorkingNote.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class new file mode 100644 index 0000000..2ff09d9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils$TextExport.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class new file mode 100644 index 0000000..a005b50 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/BackupUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class new file mode 100644 index 0000000..f9bdaf3 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/DataUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class new file mode 100644 index 0000000..e4bcbfb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/GTaskStringUtils.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class new file mode 100644 index 0000000..bb46d8b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class new file mode 100644 index 0000000..a2e8914 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$NoteItemBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class new file mode 100644 index 0000000..58e43d3 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$TextAppearanceResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class new file mode 100644 index 0000000..4ba7611 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser$WidgetBgResources.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class new file mode 100644 index 0000000..b444c91 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/tool/ResourceParser.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class new file mode 100644 index 0000000..5b74240 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmAlertActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class new file mode 100644 index 0000000..12b8d5c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmInitReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class new file mode 100644 index 0000000..1eca804 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/AlarmReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class new file mode 100644 index 0000000..b185592 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class new file mode 100644 index 0000000..c49feba Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class new file mode 100644 index 0000000..599771e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class new file mode 100644 index 0000000..ab1e92c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$4.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.class new file mode 100644 index 0000000..6597282 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class new file mode 100644 index 0000000..13b5208 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePicker.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class new file mode 100644 index 0000000..0983a52 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.class new file mode 100644 index 0000000..fa573a1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class new file mode 100644 index 0000000..60edb3e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DateTimePickerDialog.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class new file mode 100644 index 0000000..7340ae3 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class new file mode 100644 index 0000000..c6ec511 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/DropdownMenu.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class new file mode 100644 index 0000000..75eea96 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter$FolderListItem.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class new file mode 100644 index 0000000..ea44e05 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/FoldersListAdapter.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class new file mode 100644 index 0000000..fa58ca9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class new file mode 100644 index 0000000..3b08620 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class new file mode 100644 index 0000000..3ad99c8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class new file mode 100644 index 0000000..30ba112 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class new file mode 100644 index 0000000..2278848 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class new file mode 100644 index 0000000..6729024 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.class new file mode 100644 index 0000000..1a3310a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class new file mode 100644 index 0000000..bc41f43 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteEditText.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class new file mode 100644 index 0000000..270779a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NoteItemData.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$1.class new file mode 100644 index 0000000..1588b99 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$2.class new file mode 100644 index 0000000..d4e78a1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$3.class new file mode 100644 index 0000000..e7ac3f6 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$4.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$4.class new file mode 100644 index 0000000..11e437f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$4.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$5.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$5.class new file mode 100644 index 0000000..df2d946 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$5.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$6.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$6.class new file mode 100644 index 0000000..dbd12f5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$6.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$7.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$7.class new file mode 100644 index 0000000..4981765 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$7.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$8.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$8.class new file mode 100644 index 0000000..64f15ff Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$8.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$9.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$9.class new file mode 100644 index 0000000..817bf17 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$9.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.class new file mode 100644 index 0000000..77d2608 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ListEditState.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ListEditState.class new file mode 100644 index 0000000..b979434 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ListEditState.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$1.class new file mode 100644 index 0000000..e8eaf4b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$2.class new file mode 100644 index 0000000..b243892 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class new file mode 100644 index 0000000..06036f1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$ModeCallback.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.class new file mode 100644 index 0000000..08ab9fa Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.class new file mode 100644 index 0000000..ff543cd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class new file mode 100644 index 0000000..d42da3c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class new file mode 100644 index 0000000..422df08 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class new file mode 100644 index 0000000..a7c35e5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListAdapter.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class new file mode 100644 index 0000000..f2ff7aa Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesListItem.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class new file mode 100644 index 0000000..448ec52 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$1.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class new file mode 100644 index 0000000..53b689d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$2.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class new file mode 100644 index 0000000..59ed4bc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$3.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class new file mode 100644 index 0000000..76286d5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$4.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class new file mode 100644 index 0000000..215d255 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$5.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class new file mode 100644 index 0000000..2b4d209 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$6.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class new file mode 100644 index 0000000..495ebe3 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$7.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class new file mode 100644 index 0000000..4fc6e67 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$8.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class new file mode 100644 index 0000000..33d5319 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class new file mode 100644 index 0000000..d1c5a8e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/ui/NotesPreferenceActivity.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class new file mode 100644 index 0000000..1c5f988 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class new file mode 100644 index 0000000..3a45c2d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_2x.class differ diff --git a/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_4x.class b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_4x.class new file mode 100644 index 0000000..e315716 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/javac/debug/classes/net/micode/notes/widget/NoteWidgetProvider_4x.class differ diff --git a/src/Notes-master/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/src/Notes-master/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt new file mode 100644 index 0000000..50e7da6 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt @@ -0,0 +1,274 @@ +1 +2 +17 +21 +22 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +23 android:minSdkVersion="14" +23-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:15-41 +24 android:targetSdkVersion="30" /> +24-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +25 +26 +26-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:26:5-81 +26-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:26:22-78 +27 +27-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:27:5-88 +27-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:27:22-85 +28 +28-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:28:5-67 +28-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:28:22-64 +29 +29-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:29:5-72 +29-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:29:22-69 +30 +30-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:30:5-74 +30-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:30:22-71 +31 +31-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:31:5-80 +31-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:31:22-77 +32 +32-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:32:5-71 +32-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:32:22-68 +33 +33-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:33:5-74 +33-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:33:22-71 +34 +34-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:34:5-81 +34-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:34:22-78 +35 +36 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:36:5-152:19 +37 android:debuggable="true" +38 android:icon="@drawable/icon_app" +38-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:37:9-42 +39 android:label="@string/app_name" +39-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:38:9-41 +40 android:testOnly="true" > +41 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:39:9-52:20 +42 android:name="net.micode.notes.ui.NotesListActivity" +42-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:40:13-49 +43 android:configChanges="keyboardHidden|orientation|screenSize" +43-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:41:13-74 +44 android:label="@string/app_name" +44-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:42:13-45 +45 android:launchMode="singleTop" +45-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:43:13-43 +46 android:theme="@style/NoteTheme" +46-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:44:13-45 +47 android:uiOptions="splitActionBarWhenNarrow" +47-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:45:13-57 +48 android:windowSoftInputMode="adjustPan" > +48-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:46:13-52 +49 +49-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:48:13-51:29 +50 +50-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:49:17-69 +50-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:49:25-66 +51 +52 +52-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:50:17-77 +52-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:50:27-74 +53 +54 +55 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:54:9-84:20 +56 android:name="net.micode.notes.ui.NoteEditActivity" +56-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:55:13-48 +57 android:configChanges="keyboardHidden|orientation|screenSize" +57-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:56:13-74 +58 android:launchMode="singleTop" +58-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:57:13-43 +59 android:theme="@style/NoteTheme" > +59-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:58:13-45 +60 +60-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:61:13-67:29 +60-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:61:28-49 +61 +61-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:62:17-63:54 +61-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:62:25-66 +62 +63 +63-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:17-76 +63-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:27-73 +64 +65 +65-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:17-78 +65-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:23-75 +66 +66-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:17-78 +66-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:23-75 +67 +68 +68-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:69:13-74:29 +69 +69-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:70:17-79 +69-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:70:25-76 +70 +71 +71-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:17-76 +71-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:27-73 +72 +73 +73-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:17-78 +73-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:23-75 +74 +74-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:17-78 +74-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:23-75 +75 +76 +76-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:76:13-79:29 +77 +77-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:77:17-71 +77-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:77:25-68 +78 +79 +79-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:17-76 +79-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:27-73 +80 +81 +82 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:81:13-83:54 +83 android:name="android.app.searchable" +83-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:82:17-54 +84 android:resource="@xml/searchable" /> +84-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:83:17-51 +85 +86 +87 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:86:9-89:43 +88 android:name="net.micode.notes.data.NotesProvider" +88-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:87:13-63 +89 android:authorities="micode_notes" +89-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:88:13-47 +90 android:multiprocess="true" /> +90-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:89:13-40 +91 +92 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:91:9-103:20 +93 android:name="net.micode.notes.widget.NoteWidgetProvider_2x" +93-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:92:13-57 +94 android:label="@string/app_widget2x2" > +94-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:93:13-50 +95 +95-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:94:13-98:29 +96 +96-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:17-84 +96-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:25-81 +97 +97-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:17-85 +97-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:25-82 +98 +98-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:17-85 +98-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:25-82 +99 +100 +101 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:100:13-102:58 +102 android:name="android.appwidget.provider" +102-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:101:17-58 +103 android:resource="@xml/widget_2x_info" /> +103-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:102:17-55 +104 +105 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:104:9-117:20 +106 android:name="net.micode.notes.widget.NoteWidgetProvider_4x" +106-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:105:13-57 +107 android:label="@string/app_widget4x4" > +107-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:106:13-50 +108 +108-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:94:13-98:29 +109 +109-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:17-84 +109-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:25-81 +110 +110-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:17-85 +110-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:25-82 +111 +111-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:17-85 +111-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:25-82 +112 +113 +114 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:100:13-102:58 +115 android:name="android.appwidget.provider" +115-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:101:17-58 +116 android:resource="@xml/widget_4x_info" /> +116-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:102:17-55 +117 +118 +118-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:119:9-123:20 +118-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:119:19-55 +119 +119-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:120:13-122:29 +120 +120-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:121:17-79 +120-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:121:25-76 +121 +122 +123 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:125:9-128:20 +124 android:name="net.micode.notes.ui.AlarmReceiver" +124-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:126:13-61 +125 android:process=":remote" > +125-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:127:13-38 +126 +127 +128 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:130:9-135:20 +129 android:name="net.micode.notes.ui.AlarmAlertActivity" +129-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:131:13-50 +130 android:label="@string/app_name" +130-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:132:13-45 +131 android:launchMode="singleInstance" +131-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:133:13-48 +132 android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" > +132-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:134:13-75 +133 +134 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:137:9-142:20 +135 android:name="net.micode.notes.ui.NotesPreferenceActivity" +135-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:138:13-71 +136 android:label="@string/preferences_title" +136-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:139:13-54 +137 android:launchMode="singleTop" +137-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:140:13-43 +138 android:theme="@android:style/Theme.Holo.Light" > +138-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:141:13-60 +139 +140 +141 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:144:9-147:19 +142 android:name="net.micode.notes.gtask.remote.GTaskSyncService" +142-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:145:13-74 +143 android:exported="false" > +143-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:146:13-37 +144 +145 +146 G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:149:9-151:52 +147 android:name="android.app.default_searchable" +147-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:150:13-58 +148 android:value=".ui.NoteEditActivity" /> +148-->G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:151:13-49 +149 +150 +151 diff --git a/src/Notes-master/app/build/intermediates/merged_java_res/debug/base.jar b/src/Notes-master/app/build/intermediates/merged_java_res/debug/base.jar new file mode 100644 index 0000000..15cb0ec Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_java_res/debug/base.jar differ diff --git a/src/Notes-master/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml b/src/Notes-master/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml new file mode 100644 index 0000000..d3236f6 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_manifest/debug/AndroidManifest.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml b/src/Notes-master/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml new file mode 100644 index 0000000..d3236f6 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_manifests/debug/output-metadata.json b/src/Notes-master/app/build/intermediates/merged_manifests/debug/output-metadata.json new file mode 100644 index 0000000..a56d03a --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_manifests/debug/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "MERGED_MANIFESTS", + "kind": "Directory" + }, + "applicationId": "net.micode.notes", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "0.1", + "outputFile": "AndroidManifest.xml" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/color_primary_text_dark.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/color_primary_text_dark.xml.flat new file mode 100644 index 0000000..1328edc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/color_primary_text_dark.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/color_secondary_text_dark.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/color_secondary_text_dark.xml.flat new file mode 100644 index 0000000..37d5d95 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/color_secondary_text_dark.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_btn_set_color.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_btn_set_color.png.flat new file mode 100644 index 0000000..a783113 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_btn_set_color.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_color_btn_mask.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_color_btn_mask.png.flat new file mode 100644 index 0000000..a9576bb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_bg_color_btn_mask.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_call_record.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_call_record.png.flat new file mode 100644 index 0000000..0692876 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_call_record.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_clock.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_clock.png.flat new file mode 100644 index 0000000..a5cd8ef Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_clock.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_delete.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_delete.png.flat new file mode 100644 index 0000000..b5e283d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_delete.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_dropdown_icon.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_dropdown_icon.9.png.flat new file mode 100644 index 0000000..74c78c0 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_dropdown_icon.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_blue.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_blue.9.png.flat new file mode 100644 index 0000000..5436926 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_blue.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_green.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_green.9.png.flat new file mode 100644 index 0000000..4d95a89 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_green.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_red.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_red.9.png.flat new file mode 100644 index 0000000..ce52bc1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_red.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_blue.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_blue.9.png.flat new file mode 100644 index 0000000..b376e80 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_blue.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_green.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_green.9.png.flat new file mode 100644 index 0000000..b8cc9ab Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_green.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_red.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_red.9.png.flat new file mode 100644 index 0000000..2af509b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_red.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_white.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_white.9.png.flat new file mode 100644 index 0000000..f3a6c60 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_white.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_yellow.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_yellow.9.png.flat new file mode 100644 index 0000000..8828ae3 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_title_yellow.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_white.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_white.9.png.flat new file mode 100644 index 0000000..8a98c38 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_white.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_yellow.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_yellow.9.png.flat new file mode 100644 index 0000000..4c9bdf9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_edit_yellow.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_large.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_large.png.flat new file mode 100644 index 0000000..1422573 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_large.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_normal.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_normal.png.flat new file mode 100644 index 0000000..704993a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_normal.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_size_selector_bg.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_size_selector_bg.9.png.flat new file mode 100644 index 0000000..9a4b989 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_size_selector_bg.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_small.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_small.png.flat new file mode 100644 index 0000000..11857a4 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_small.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_super.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_super.png.flat new file mode 100644 index 0000000..2227ab8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_font_super.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_icon_app.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_icon_app.png.flat new file mode 100644 index 0000000..27a8412 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_icon_app.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_background.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_background.png.flat new file mode 100644 index 0000000..0bda0bc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_background.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_down.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_down.9.png.flat new file mode 100644 index 0000000..75f3cd0 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_down.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_middle.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_middle.9.png.flat new file mode 100644 index 0000000..f82dd6d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_middle.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_single.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_single.9.png.flat new file mode 100644 index 0000000..d57fe3a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_single.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_up.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_up.9.png.flat new file mode 100644 index 0000000..683b6f1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_blue_up.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_folder.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_folder.9.png.flat new file mode 100644 index 0000000..e75e056 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_folder.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_footer_bg.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_footer_bg.9.png.flat new file mode 100644 index 0000000..3f89243 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_footer_bg.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_down.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_down.9.png.flat new file mode 100644 index 0000000..6b24efc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_down.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_middle.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_middle.9.png.flat new file mode 100644 index 0000000..4f7fa61 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_middle.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_single.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_single.9.png.flat new file mode 100644 index 0000000..725a39f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_single.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_up.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_up.9.png.flat new file mode 100644 index 0000000..f7b11e8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_green_up.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_down.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_down.9.png.flat new file mode 100644 index 0000000..82de739 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_down.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_middle.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_middle.9.png.flat new file mode 100644 index 0000000..224f699 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_middle.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_single.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_single.9.png.flat new file mode 100644 index 0000000..6c1bc35 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_single.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_up.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_up.9.png.flat new file mode 100644 index 0000000..d29584e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_red_up.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_down.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_down.9.png.flat new file mode 100644 index 0000000..394cf64 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_down.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_middle.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_middle.9.png.flat new file mode 100644 index 0000000..6a55c1f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_middle.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_single.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_single.9.png.flat new file mode 100644 index 0000000..d3094aa Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_single.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_up.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_up.9.png.flat new file mode 100644 index 0000000..a3558dd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_white_up.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_down.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_down.9.png.flat new file mode 100644 index 0000000..e9e827a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_down.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_middle.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_middle.9.png.flat new file mode 100644 index 0000000..812fbce Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_middle.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_single.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_single.9.png.flat new file mode 100644 index 0000000..c4a34ba Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_single.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_up.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_up.9.png.flat new file mode 100644 index 0000000..a0b2963 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_list_yellow_up.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_delete.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_delete.png.flat new file mode 100644 index 0000000..0d0a7c7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_delete.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_move.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_move.png.flat new file mode 100644 index 0000000..7b7b9c9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_menu_move.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_normal.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_normal.png.flat new file mode 100644 index 0000000..ac802ba Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_normal.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_pressed.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_pressed.png.flat new file mode 100644 index 0000000..ee82d6c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_new_note_pressed.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_note_edit_color_selector_panel.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_note_edit_color_selector_panel.png.flat new file mode 100644 index 0000000..8d48e8e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_note_edit_color_selector_panel.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_notification.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_notification.png.flat new file mode 100644 index 0000000..dbeee0b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_notification.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_search_result.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_search_result.png.flat new file mode 100644 index 0000000..e55822d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_search_result.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_selected.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_selected.png.flat new file mode 100644 index 0000000..be2aedd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_selected.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_alert.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_alert.png.flat new file mode 100644 index 0000000..8f6daec Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_alert.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_bar_bg.9.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_bar_bg.9.png.flat new file mode 100644 index 0000000..87aeb20 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_title_bar_bg.9.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_blue.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_blue.png.flat new file mode 100644 index 0000000..825e93d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_blue.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_green.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_green.png.flat new file mode 100644 index 0000000..e039b02 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_green.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_red.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_red.png.flat new file mode 100644 index 0000000..a2eb42b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_red.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_white.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_white.png.flat new file mode 100644 index 0000000..c7eff78 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_white.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_yellow.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_yellow.png.flat new file mode 100644 index 0000000..decfaad Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_2x_yellow.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_blue.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_blue.png.flat new file mode 100644 index 0000000..7c3cf3a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_blue.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_green.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_green.png.flat new file mode 100644 index 0000000..1c75d02 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_green.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_red.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_red.png.flat new file mode 100644 index 0000000..e82e879 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_red.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_white.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_white.png.flat new file mode 100644 index 0000000..366fd2c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_white.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_yellow.png.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_yellow.png.flat new file mode 100644 index 0000000..ac23b11 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable-hdpi_widget_4x_yellow.png.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/drawable_new_note.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable_new_note.xml.flat new file mode 100644 index 0000000..55213d5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/drawable_new_note.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_account_dialog_title.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_account_dialog_title.xml.flat new file mode 100644 index 0000000..34356f7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_account_dialog_title.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_add_account_text.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_add_account_text.xml.flat new file mode 100644 index 0000000..cf65565 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_add_account_text.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_datetime_picker.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_datetime_picker.xml.flat new file mode 100644 index 0000000..3e3bb12 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_datetime_picker.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_dialog_edit_text.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_dialog_edit_text.xml.flat new file mode 100644 index 0000000..1b29448 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_dialog_edit_text.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_folder_list_item.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_folder_list_item.xml.flat new file mode 100644 index 0000000..d65c3c4 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_folder_list_item.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit.xml.flat new file mode 100644 index 0000000..6cb2484 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit_list_item.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit_list_item.xml.flat new file mode 100644 index 0000000..c00b222 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_edit_list_item.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_item.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_item.xml.flat new file mode 100644 index 0000000..0c724a8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_item.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list.xml.flat new file mode 100644 index 0000000..d507a80 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_dropdown_menu.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_dropdown_menu.xml.flat new file mode 100644 index 0000000..02c67cf Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_dropdown_menu.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_footer.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_footer.xml.flat new file mode 100644 index 0000000..f22d21a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_note_list_footer.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_settings_header.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_settings_header.xml.flat new file mode 100644 index 0000000..a611e0c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_settings_header.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_2x.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_2x.xml.flat new file mode 100644 index 0000000..2ececc1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_2x.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_4x.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_4x.xml.flat new file mode 100644 index 0000000..4f68cc6 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/layout_widget_4x.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_note_edit.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_note_edit.xml.flat new file mode 100644 index 0000000..e5dbc29 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_note_edit.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_record_folder.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_record_folder.xml.flat new file mode 100644 index 0000000..be8a479 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_call_record_folder.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_edit.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_edit.xml.flat new file mode 100644 index 0000000..029d23a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_edit.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list.xml.flat new file mode 100644 index 0000000..7af0b53 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_dropdown.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_dropdown.xml.flat new file mode 100644 index 0000000..e39ddfa Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_dropdown.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_options.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_options.xml.flat new file mode 100644 index 0000000..84f9bb7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_note_list_options.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/menu_sub_folder.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_sub_folder.xml.flat new file mode 100644 index 0000000..dcede2e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/menu_sub_folder.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/raw-zh-rCN_introduction.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/raw-zh-rCN_introduction.flat new file mode 100644 index 0000000..17cb018 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/raw-zh-rCN_introduction.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/raw_introduction.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/raw_introduction.flat new file mode 100644 index 0000000..608c6fd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/raw_introduction.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rCN_values-zh-rCN.arsc.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rCN_values-zh-rCN.arsc.flat new file mode 100644 index 0000000..035ddcd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rCN_values-zh-rCN.arsc.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rTW_values-zh-rTW.arsc.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rTW_values-zh-rTW.arsc.flat new file mode 100644 index 0000000..1043ced Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/values-zh-rTW_values-zh-rTW.arsc.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/values_values.arsc.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/values_values.arsc.flat new file mode 100644 index 0000000..c0e5804 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/values_values.arsc.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/xml_preferences.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_preferences.xml.flat new file mode 100644 index 0000000..00fd574 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_preferences.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/xml_searchable.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_searchable.xml.flat new file mode 100644 index 0000000..324cefc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_searchable.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_2x_info.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_2x_info.xml.flat new file mode 100644 index 0000000..4c166dc Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_2x_info.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_4x_info.xml.flat b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_4x_info.xml.flat new file mode 100644 index 0000000..c3bc11a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/merged_res/debug/xml_widget_4x_info.xml.flat differ diff --git a/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json new file mode 100644 index 0000000..6257ab5 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json @@ -0,0 +1,186 @@ +{ + "logs": [ + { + "outputFile": "net.micode.notes.app-merged_res-5:/values-zh-rCN_values-zh-rCN.arsc.flat", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rCN\\arrays.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endLines": "21", + "endColumns": "19", + "endOffsets": "817" + }, + "to": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "105", + "endLines": "5", + "endColumns": "19", + "endOffsets": "210" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rCN\\strings.xml", + "from": { + "startLines": "121,71,70,69,68,19,20,21,112,113,120,119,26,77,78,76,75,74,90,89,88,80,60,29,30,81,72,114,67,63,38,44,49,39,59,58,57,53,52,50,51,54,55,45,66,56,64,43,48,47,46,62,42,61,40,41,65,28,34,36,33,35,32,31,25,24,97,96,99,111,104,103,105,106,108,107,98,102,100,101,95,109,110,118,116,115,117,27,79,87,92,91,93,86,85,84,83,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6532,3495,3429,3356,3306,827,867,915,6083,6128,6478,6428,1199,3861,3929,3802,3737,3674,4592,4532,4469,4061,2877,1369,1422,4115,3568,6185,3247,3034,1798,2079,2325,1851,2817,2764,2713,2518,2470,2376,2424,2564,2611,2122,3188,2661,3077,2036,2278,2222,2167,2979,1992,2937,1901,1942,3129,1318,1623,1719,1576,1672,1529,1484,1148,1095,4967,4908,5108,6009,5419,5350,5483,5561,5744,5671,5042,5295,5165,5230,4859,5848,5931,6390,6283,6235,6328,1261,4006,4410,4705,4647,4772,4362,4317,4269,4218,963,1029", + "endLines": "123,71,70,69,68,19,20,21,112,113,120,119,26,77,78,76,75,74,90,89,88,80,60,29,30,81,72,114,67,63,38,44,49,39,59,58,57,53,52,50,51,54,55,45,66,56,64,43,48,47,46,62,42,61,40,41,65,28,34,36,33,35,32,31,25,24,97,96,99,111,104,103,105,106,108,107,98,102,100,101,95,109,110,118,116,115,117,27,79,87,92,91,93,86,85,84,83,22,23", + "endColumns": "14,72,65,72,49,39,47,47,44,56,53,49,61,67,76,58,64,62,54,59,62,53,59,52,61,84,80,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "6704,3563,3490,3424,3351,862,910,958,6123,6180,6527,6473,1256,3924,4001,3856,3797,3732,4642,4587,4527,4110,2932,1417,1479,4195,3644,6230,3301,3072,1846,2117,2371,1896,2872,2812,2759,2559,2513,2419,2465,2606,2656,2162,3242,2708,3124,2074,2320,2273,2217,3029,2031,2974,1937,1987,3183,1364,1667,1763,1618,1714,1571,1524,1194,1143,5037,4962,5160,6078,5478,5414,5556,5666,5843,5739,5103,5345,5225,5290,4903,5926,6004,6423,6323,6278,6385,1313,4056,4464,4767,4700,4829,4405,4357,4312,4264,1024,1090" + }, + "to": { + "startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "215,384,457,523,596,646,686,734,782,827,884,938,988,1050,1118,1195,1254,1319,1382,1437,1497,1560,1614,1674,1727,1789,1874,1955,2005,2064,2107,2160,2203,2254,2304,2364,2417,2468,2514,2562,2610,2656,2703,2753,2798,2857,2909,2961,3004,3051,3107,3162,3217,3261,3303,3344,3394,3453,3504,3553,3602,3649,3696,3743,3788,3839,3892,3967,4026,4083,4157,4221,4290,4368,4478,4582,4655,4721,4776,4841,4906,4955,5038,5116,5154,5199,5247,5309,5366,5421,5480,5547,5605,5667,5715,5760,5808,5859,5925", + "endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "endColumns": "14,72,65,72,49,39,47,47,44,56,53,49,61,67,76,58,64,62,54,59,62,53,59,52,61,84,80,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "379,452,518,591,641,681,729,777,822,879,933,983,1045,1113,1190,1249,1314,1377,1432,1492,1555,1609,1669,1722,1784,1869,1950,2000,2059,2102,2155,2198,2249,2299,2359,2412,2463,2509,2557,2605,2651,2698,2748,2793,2852,2904,2956,2999,3046,3102,3157,3212,3256,3298,3339,3389,3448,3499,3548,3597,3644,3691,3738,3783,3834,3887,3962,4021,4078,4152,4216,4285,4363,4473,4577,4650,4716,4771,4836,4901,4950,5033,5111,5149,5194,5242,5304,5361,5416,5475,5542,5600,5662,5710,5755,5803,5854,5920,5986" + } + } + ] + }, + { + "outputFile": "net.micode.notes.app-merged_res-5:/values_values.arsc.flat", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\arrays.xml", + "from": { + "startLines": "19,26", + "startColumns": "4,4", + "startOffsets": "739,1047", + "endLines": "24,29", + "endColumns": "19,19", + "endOffsets": "1041,1162" + }, + "to": { + "startLines": "2,8", + "startColumns": "4,4", + "startOffsets": "105,300", + "endLines": "7,11", + "endColumns": "19,19", + "endOffsets": "295,415" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\styles.xml", + "from": { + "startLines": "50,55,68,60,22,26,30,35,40,18,45", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "2062,2267,2876,2479,895,1078,1263,1449,1653,712,1860", + "endLines": "53,58,71,62,25,29,33,38,43,21,48", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "2261,2473,3093,2634,1073,1258,1443,1647,1854,890,2056" + }, + "to": { + "startLines": "125,129,133,137,140,144,148,152,156,160,164", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8124,8328,8539,8712,8872,9055,9240,9425,9628,9834,10017", + "endLines": "128,132,136,139,143,147,151,155,159,163,167", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "8323,8534,8707,8867,9050,9235,9420,9623,9829,10012,10213" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\colors.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endColumns": "56", + "endOffsets": "764" + }, + "to": { + "startLines": "12", + "startColumns": "4", + "startOffsets": "420", + "endColumns": "56", + "endOffsets": "472" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\dimens.xml", + "from": { + "startLines": "19,20,21,22,18", + "startColumns": "4,4,4,4,4", + "startOffsets": "764,816,869,922,712", + "endColumns": "51,52,52,51,51", + "endOffsets": "811,864,917,969,759" + }, + "to": { + "startLines": "13,14,15,16,17", + "startColumns": "4,4,4,4,4", + "startOffsets": "477,529,582,635,687", + "endColumns": "51,52,52,51,51", + "endOffsets": "524,577,630,682,734" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\strings.xml", + "from": { + "startLines": "128,72,75,74,73,19,20,21,118,119,127,126,26,81,82,80,79,78,94,93,92,84,39,38,64,29,30,85,41,76,120,71,67,42,48,53,43,63,62,61,57,56,54,55,58,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8008,3898,4159,4063,3994,827,870,922,7506,7555,7950,7899,1282,4613,4707,4542,4458,4375,5574,5491,5389,4883,2004,1953,3397,1486,1539,4944,2097,4242,7618,3827,3582,2156,2471,2772,2214,3326,3265,3208,2986,2934,2831,2884,3036,3086,2518,3761,3146,3631,2424,2717,2629,2571,3520,2374,3475,2271,2314,3694,1431,1750,1858,1703,1805,1647,1599,1227,1174,6030,5963,6271,7409,6635,6554,6709,6798,7040,6961,6114,6189,6495,6335,6415,5908,7184,7306,7858,7731,7674,7784,1366,4815,5303,5709,5640,5789,5244,5189,5127,5067,974,1084", + "endLines": "132,72,75,74,73,19,20,21,118,119,127,126,26,81,82,80,79,78,94,93,92,84,39,38,64,29,30,85,41,76,120,71,67,42,48,53,43,63,62,61,57,56,54,55,58,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23", + "endColumns": "14,95,82,95,68,42,51,51,48,62,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,57,46,58,56,70,60,56,49,51,52,49,49,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89", + "endOffsets": "8412,3989,4237,4154,4058,865,917,969,7550,7613,8003,7945,1361,4702,4810,4608,4537,4453,5635,5569,5486,4939,2061,1999,3470,1534,1594,5044,2151,4339,7668,3893,3626,2209,2513,2826,2266,3392,3321,3260,3031,2981,2879,2929,3081,3141,2566,3822,3203,3689,2466,2767,2712,2624,3577,2419,3515,2309,2369,3756,1481,1800,1906,1745,1853,1698,1642,1277,1222,6109,6025,6330,7500,6704,6630,6793,6956,7179,7035,6184,6266,6549,6410,6490,5958,7301,7404,7894,7779,7726,7853,1426,4878,5384,5784,5704,5878,5298,5239,5184,5122,1079,1169" + }, + "to": { + "startLines": "18,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "739,1092,1188,1271,1367,1436,1479,1531,1583,1632,1695,1753,1804,1888,1982,2090,2161,2245,2328,2394,2477,2579,2640,2702,2753,2831,2884,2944,3049,3108,3210,3265,3336,3385,3443,3490,3549,3606,3677,3738,3795,3845,3897,3950,4000,4050,4110,4163,4229,4291,4354,4401,4456,4544,4602,4664,4714,4759,4802,4862,4929,4984,5039,5092,5139,5192,5248,5296,5351,5404,5488,5555,5619,5715,5789,5870,5959,6122,6266,6345,6420,6502,6561,6641,6721,6776,6898,7001,7042,7095,7152,7226,7291,7359,7445,7525,7594,7688,7747,7802,7864,7924,8034", + "endLines": "22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124", + "endColumns": "14,95,82,95,68,42,51,51,48,62,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,57,46,58,56,70,60,56,49,51,52,49,49,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89", + "endOffsets": "1087,1183,1266,1362,1431,1474,1526,1578,1627,1690,1748,1799,1883,1977,2085,2156,2240,2323,2389,2472,2574,2635,2697,2748,2826,2879,2939,3044,3103,3205,3260,3331,3380,3438,3485,3544,3601,3672,3733,3790,3840,3892,3945,3995,4045,4105,4158,4224,4286,4349,4396,4451,4539,4597,4659,4709,4754,4797,4857,4924,4979,5034,5087,5134,5187,5243,5291,5346,5399,5483,5550,5614,5710,5784,5865,5954,6117,6261,6340,6415,6497,6556,6636,6716,6771,6893,6996,7037,7090,7147,7221,7286,7354,7440,7520,7589,7683,7742,7797,7859,7919,8029,8119" + } + } + ] + }, + { + "outputFile": "net.micode.notes.app-merged_res-5:/values-zh-rTW_values-zh-rTW.arsc.flat", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rTW\\strings.xml", + "from": { + "startLines": "122,72,71,70,69,19,20,21,112,113,121,120,26,76,77,75,74,73,89,88,87,79,61,29,30,80,37,114,68,64,39,45,50,40,60,59,58,54,53,51,52,55,56,46,67,57,65,44,49,48,47,63,43,62,41,42,66,28,34,36,33,35,32,31,25,24,96,95,98,110,103,102,104,105,107,106,97,101,99,100,94,108,109,119,117,116,118,27,78,86,91,90,92,85,84,83,82,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6507,3575,3509,3436,3386,827,867,915,6057,6102,6453,6403,1199,3835,3903,3776,3710,3647,4565,4505,4442,4035,2957,1369,1422,4089,1768,6159,3327,3114,1878,2159,2405,1931,2897,2844,2793,2598,2550,2456,2504,2644,2691,2202,3268,2741,3157,2116,2358,2302,2247,3059,2072,3017,1981,2022,3209,1318,1623,1719,1576,1672,1529,1484,1148,1095,4940,4881,5081,5982,5392,5323,5456,5534,5717,5644,5015,5268,5138,5203,4832,5821,5904,6365,6258,6210,6303,1261,3980,4383,4678,4620,4745,4335,4290,4242,4191,963,1029", + "endLines": "124,72,71,70,69,19,20,21,112,113,121,120,26,76,77,75,74,73,89,88,87,79,61,29,30,80,37,114,68,64,39,45,50,40,60,59,58,54,53,51,52,55,56,46,67,57,65,44,49,48,47,63,43,62,41,42,66,28,34,36,33,35,32,31,25,24,96,95,98,110,103,102,104,105,107,106,97,101,99,100,94,108,109,119,117,116,118,27,78,86,91,90,92,85,84,83,82,22,23", + "endColumns": "14,71,65,72,49,39,47,47,44,56,53,49,61,67,76,58,65,62,54,59,62,53,59,52,61,83,79,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "6679,3642,3570,3504,3431,862,910,958,6097,6154,6502,6448,1256,3898,3975,3830,3771,3705,4615,4560,4500,4084,3012,1417,1479,4168,1843,6204,3381,3152,1926,2197,2451,1976,2952,2892,2839,2639,2593,2499,2545,2686,2736,2242,3322,2788,3204,2154,2400,2353,2297,3109,2111,3054,2017,2067,3263,1364,1667,1763,1618,1714,1571,1524,1194,1143,5010,4935,5133,6051,5451,5387,5529,5639,5816,5712,5076,5318,5198,5263,4876,5899,5977,6398,6298,6253,6360,1313,4030,4437,4740,4673,4802,4378,4330,4285,4237,1024,1090" + }, + "to": { + "startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "215,384,456,522,595,645,685,733,781,826,883,937,987,1049,1117,1194,1253,1319,1382,1437,1497,1560,1614,1674,1727,1789,1873,1953,2003,2062,2105,2158,2201,2252,2302,2362,2415,2466,2512,2560,2608,2654,2701,2751,2796,2855,2907,2959,3002,3049,3105,3160,3215,3259,3301,3342,3392,3451,3502,3551,3600,3647,3694,3741,3786,3837,3890,3965,4024,4081,4155,4219,4288,4366,4476,4580,4653,4719,4774,4839,4904,4953,5036,5114,5152,5197,5245,5307,5364,5419,5478,5545,5603,5665,5713,5758,5806,5857,5923", + "endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "endColumns": "14,71,65,72,49,39,47,47,44,56,53,49,61,67,76,58,65,62,54,59,62,53,59,52,61,83,79,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "379,451,517,590,640,680,728,776,821,878,932,982,1044,1112,1189,1248,1314,1377,1432,1492,1555,1609,1669,1722,1784,1868,1948,1998,2057,2100,2153,2196,2247,2297,2357,2410,2461,2507,2555,2603,2649,2696,2746,2791,2850,2902,2954,2997,3044,3100,3155,3210,3254,3296,3337,3387,3446,3497,3546,3595,3642,3689,3736,3781,3832,3885,3960,4019,4076,4150,4214,4283,4361,4471,4575,4648,4714,4769,4834,4899,4948,5031,5109,5147,5192,5240,5302,5359,5414,5473,5540,5598,5660,5708,5753,5801,5852,5918,5984" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rTW\\arrays.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endLines": "21", + "endColumns": "19", + "endOffsets": "817" + }, + "to": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "105", + "endLines": "5", + "endColumns": "19", + "endOffsets": "210" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json new file mode 100644 index 0000000..12807e2 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json @@ -0,0 +1,47 @@ +{ + "logs": [ + { + "outputFile": "net.micode.notes.app-mergeDebugResources-3:/values-zh-rCN/values-zh-rCN.xml", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rCN\\arrays.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endLines": "21", + "endColumns": "19", + "endOffsets": "817" + }, + "to": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "105", + "endLines": "5", + "endColumns": "19", + "endOffsets": "210" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rCN\\strings.xml", + "from": { + "startLines": "121,71,70,69,68,19,20,21,112,113,120,119,26,77,78,76,75,74,90,89,88,80,60,29,30,81,72,114,67,63,38,44,49,39,59,58,57,53,52,50,51,54,55,45,66,56,64,43,48,47,46,62,42,61,40,41,65,28,34,36,33,35,32,31,25,24,97,96,99,111,104,103,105,106,108,107,98,102,100,101,95,109,110,118,116,115,117,27,79,87,92,91,93,86,85,84,83,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6532,3495,3429,3356,3306,827,867,915,6083,6128,6478,6428,1199,3861,3929,3802,3737,3674,4592,4532,4469,4061,2877,1369,1422,4115,3568,6185,3247,3034,1798,2079,2325,1851,2817,2764,2713,2518,2470,2376,2424,2564,2611,2122,3188,2661,3077,2036,2278,2222,2167,2979,1992,2937,1901,1942,3129,1318,1623,1719,1576,1672,1529,1484,1148,1095,4967,4908,5108,6009,5419,5350,5483,5561,5744,5671,5042,5295,5165,5230,4859,5848,5931,6390,6283,6235,6328,1261,4006,4410,4705,4647,4772,4362,4317,4269,4218,963,1029", + "endLines": "123,71,70,69,68,19,20,21,112,113,120,119,26,77,78,76,75,74,90,89,88,80,60,29,30,81,72,114,67,63,38,44,49,39,59,58,57,53,52,50,51,54,55,45,66,56,64,43,48,47,46,62,42,61,40,41,65,28,34,36,33,35,32,31,25,24,97,96,99,111,104,103,105,106,108,107,98,102,100,101,95,109,110,118,116,115,117,27,79,87,92,91,93,86,85,84,83,22,23", + "endColumns": "14,72,65,72,49,39,47,47,44,56,53,49,61,67,76,58,64,62,54,59,62,53,59,52,61,84,80,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "6704,3563,3490,3424,3351,862,910,958,6123,6180,6527,6473,1256,3924,4001,3856,3797,3732,4642,4587,4527,4110,2932,1417,1479,4195,3644,6230,3301,3072,1846,2117,2371,1896,2872,2812,2759,2559,2513,2419,2465,2606,2656,2162,3242,2708,3124,2074,2320,2273,2217,3029,2031,2974,1937,1987,3183,1364,1667,1763,1618,1714,1571,1524,1194,1143,5037,4962,5160,6078,5478,5414,5556,5666,5843,5739,5103,5345,5225,5290,4903,5926,6004,6423,6323,6278,6385,1313,4056,4464,4767,4700,4829,4405,4357,4312,4264,1024,1090" + }, + "to": { + "startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "215,384,457,523,596,646,686,734,782,827,884,938,988,1050,1118,1195,1254,1319,1382,1437,1497,1560,1614,1674,1727,1789,1874,1955,2005,2064,2107,2160,2203,2254,2304,2364,2417,2468,2514,2562,2610,2656,2703,2753,2798,2857,2909,2961,3004,3051,3107,3162,3217,3261,3303,3344,3394,3453,3504,3553,3602,3649,3696,3743,3788,3839,3892,3967,4026,4083,4157,4221,4290,4368,4478,4582,4655,4721,4776,4841,4906,4955,5038,5116,5154,5199,5247,5309,5366,5421,5480,5547,5605,5667,5715,5760,5808,5859,5925", + "endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "endColumns": "14,72,65,72,49,39,47,47,44,56,53,49,61,67,76,58,64,62,54,59,62,53,59,52,61,84,80,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "379,452,518,591,641,681,729,777,822,879,933,983,1045,1113,1190,1249,1314,1377,1432,1492,1555,1609,1669,1722,1784,1869,1950,2000,2059,2102,2155,2198,2249,2299,2359,2412,2463,2509,2557,2605,2651,2698,2748,2793,2852,2904,2956,2999,3046,3102,3157,3212,3256,3298,3339,3389,3448,3499,3548,3597,3644,3691,3738,3783,3834,3887,3962,4021,4078,4152,4216,4285,4363,4473,4577,4650,4716,4771,4836,4901,4950,5033,5111,5149,5194,5242,5304,5361,5416,5475,5542,5600,5662,5710,5755,5803,5854,5920,5986" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json new file mode 100644 index 0000000..1020c39 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json @@ -0,0 +1,47 @@ +{ + "logs": [ + { + "outputFile": "net.micode.notes.app-mergeDebugResources-3:/values-zh-rTW/values-zh-rTW.xml", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rTW\\strings.xml", + "from": { + "startLines": "122,72,71,70,69,19,20,21,112,113,121,120,26,76,77,75,74,73,89,88,87,79,61,29,30,80,37,114,68,64,39,45,50,40,60,59,58,54,53,51,52,55,56,46,67,57,65,44,49,48,47,63,43,62,41,42,66,28,34,36,33,35,32,31,25,24,96,95,98,110,103,102,104,105,107,106,97,101,99,100,94,108,109,119,117,116,118,27,78,86,91,90,92,85,84,83,82,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6507,3575,3509,3436,3386,827,867,915,6057,6102,6453,6403,1199,3835,3903,3776,3710,3647,4565,4505,4442,4035,2957,1369,1422,4089,1768,6159,3327,3114,1878,2159,2405,1931,2897,2844,2793,2598,2550,2456,2504,2644,2691,2202,3268,2741,3157,2116,2358,2302,2247,3059,2072,3017,1981,2022,3209,1318,1623,1719,1576,1672,1529,1484,1148,1095,4940,4881,5081,5982,5392,5323,5456,5534,5717,5644,5015,5268,5138,5203,4832,5821,5904,6365,6258,6210,6303,1261,3980,4383,4678,4620,4745,4335,4290,4242,4191,963,1029", + "endLines": "124,72,71,70,69,19,20,21,112,113,121,120,26,76,77,75,74,73,89,88,87,79,61,29,30,80,37,114,68,64,39,45,50,40,60,59,58,54,53,51,52,55,56,46,67,57,65,44,49,48,47,63,43,62,41,42,66,28,34,36,33,35,32,31,25,24,96,95,98,110,103,102,104,105,107,106,97,101,99,100,94,108,109,119,117,116,118,27,78,86,91,90,92,85,84,83,82,22,23", + "endColumns": "14,71,65,72,49,39,47,47,44,56,53,49,61,67,76,58,65,62,54,59,62,53,59,52,61,83,79,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "6679,3642,3570,3504,3431,862,910,958,6097,6154,6502,6448,1256,3898,3975,3830,3771,3705,4615,4560,4500,4084,3012,1417,1479,4168,1843,6204,3381,3152,1926,2197,2451,1976,2952,2892,2839,2639,2593,2499,2545,2686,2736,2242,3322,2788,3204,2154,2400,2353,2297,3109,2111,3054,2017,2067,3263,1364,1667,1763,1618,1714,1571,1524,1194,1143,5010,4935,5133,6051,5451,5387,5529,5639,5816,5712,5076,5318,5198,5263,4876,5899,5977,6398,6298,6253,6360,1313,4030,4437,4740,4673,4802,4378,4330,4285,4237,1024,1090" + }, + "to": { + "startLines": "6,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "215,384,456,522,595,645,685,733,781,826,883,937,987,1049,1117,1194,1253,1319,1382,1437,1497,1560,1614,1674,1727,1789,1873,1953,2003,2062,2105,2158,2201,2252,2302,2362,2415,2466,2512,2560,2608,2654,2701,2751,2796,2855,2907,2959,3002,3049,3105,3160,3215,3259,3301,3342,3392,3451,3502,3551,3600,3647,3694,3741,3786,3837,3890,3965,4024,4081,4155,4219,4288,4366,4476,4580,4653,4719,4774,4839,4904,4953,5036,5114,5152,5197,5245,5307,5364,5419,5478,5545,5603,5665,5713,5758,5806,5857,5923", + "endLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106", + "endColumns": "14,71,65,72,49,39,47,47,44,56,53,49,61,67,76,58,65,62,54,59,62,53,59,52,61,83,79,49,58,42,52,42,50,49,59,52,50,45,47,47,45,46,49,44,58,51,51,42,46,55,54,54,43,41,40,49,58,50,48,48,46,46,46,44,50,52,74,58,56,73,63,68,77,109,103,72,65,54,64,64,48,82,77,37,44,47,61,56,54,58,66,57,61,47,44,47,50,65,65", + "endOffsets": "379,451,517,590,640,680,728,776,821,878,932,982,1044,1112,1189,1248,1314,1377,1432,1492,1555,1609,1669,1722,1784,1868,1948,1998,2057,2100,2153,2196,2247,2297,2357,2410,2461,2507,2555,2603,2649,2696,2746,2791,2850,2902,2954,2997,3044,3100,3155,3210,3254,3296,3337,3387,3446,3497,3546,3595,3642,3689,3736,3781,3832,3885,3960,4019,4076,4150,4214,4283,4361,4471,4575,4648,4714,4769,4834,4899,4948,5031,5109,5147,5192,5240,5302,5359,5414,5473,5540,5598,5660,5708,5753,5801,5852,5918,5984" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values-zh-rTW\\arrays.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endLines": "21", + "endColumns": "19", + "endOffsets": "817" + }, + "to": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "105", + "endLines": "5", + "endColumns": "19", + "endOffsets": "210" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json new file mode 100644 index 0000000..b62f451 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json @@ -0,0 +1,100 @@ +{ + "logs": [ + { + "outputFile": "net.micode.notes.app-mergeDebugResources-3:/values/values.xml", + "map": [ + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\arrays.xml", + "from": { + "startLines": "19,26", + "startColumns": "4,4", + "startOffsets": "739,1047", + "endLines": "24,29", + "endColumns": "19,19", + "endOffsets": "1041,1162" + }, + "to": { + "startLines": "2,8", + "startColumns": "4,4", + "startOffsets": "105,300", + "endLines": "7,11", + "endColumns": "19,19", + "endOffsets": "295,415" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\styles.xml", + "from": { + "startLines": "50,55,68,60,22,26,30,35,40,18,45", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "2062,2267,2876,2479,895,1078,1263,1449,1653,712,1860", + "endLines": "53,58,71,62,25,29,33,38,43,21,48", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "2261,2473,3093,2634,1073,1258,1443,1647,1854,890,2056" + }, + "to": { + "startLines": "125,129,133,137,140,144,148,152,156,160,164", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8124,8328,8539,8712,8872,9055,9240,9425,9628,9834,10017", + "endLines": "128,132,136,139,143,147,151,155,159,163,167", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "8323,8534,8707,8867,9050,9235,9420,9623,9829,10012,10213" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\colors.xml", + "from": { + "startLines": "18", + "startColumns": "4", + "startOffsets": "712", + "endColumns": "56", + "endOffsets": "764" + }, + "to": { + "startLines": "12", + "startColumns": "4", + "startOffsets": "420", + "endColumns": "56", + "endOffsets": "472" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\dimens.xml", + "from": { + "startLines": "19,20,21,22,18", + "startColumns": "4,4,4,4,4", + "startOffsets": "764,816,869,922,712", + "endColumns": "51,52,52,51,51", + "endOffsets": "811,864,917,969,759" + }, + "to": { + "startLines": "13,14,15,16,17", + "startColumns": "4,4,4,4,4", + "startOffsets": "477,529,582,635,687", + "endColumns": "51,52,52,51,51", + "endOffsets": "524,577,630,682,734" + } + }, + { + "source": "G:\\Android\\AndroidSDK\\Notes-master\\app\\src\\main\\res\\values\\strings.xml", + "from": { + "startLines": "128,72,75,74,73,19,20,21,118,119,127,126,26,81,82,80,79,78,94,93,92,84,39,38,64,29,30,85,41,76,120,71,67,42,48,53,43,63,62,61,57,56,54,55,58,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8008,3898,4159,4063,3994,827,870,922,7506,7555,7950,7899,1282,4613,4707,4542,4458,4375,5574,5491,5389,4883,2004,1953,3397,1486,1539,4944,2097,4242,7618,3827,3582,2156,2471,2772,2214,3326,3265,3208,2986,2934,2831,2884,3036,3086,2518,3761,3146,3631,2424,2717,2629,2571,3520,2374,3475,2271,2314,3694,1431,1750,1858,1703,1805,1647,1599,1227,1174,6030,5963,6271,7409,6635,6554,6709,6798,7040,6961,6114,6189,6495,6335,6415,5908,7184,7306,7858,7731,7674,7784,1366,4815,5303,5709,5640,5789,5244,5189,5127,5067,974,1084", + "endLines": "132,72,75,74,73,19,20,21,118,119,127,126,26,81,82,80,79,78,94,93,92,84,39,38,64,29,30,85,41,76,120,71,67,42,48,53,43,63,62,61,57,56,54,55,58,59,49,70,60,68,47,52,51,50,66,46,65,44,45,69,28,34,36,33,35,32,31,25,24,101,100,104,116,109,108,110,111,113,112,102,103,107,105,106,99,114,115,125,123,122,124,27,83,91,96,95,97,90,89,88,87,22,23", + "endColumns": "14,95,82,95,68,42,51,51,48,62,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,57,46,58,56,70,60,56,49,51,52,49,49,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89", + "endOffsets": "8412,3989,4237,4154,4058,865,917,969,7550,7613,8003,7945,1361,4702,4810,4608,4537,4453,5635,5569,5486,4939,2061,1999,3470,1534,1594,5044,2151,4339,7668,3893,3626,2209,2513,2826,2266,3392,3321,3260,3031,2981,2879,2929,3081,3141,2566,3822,3203,3689,2466,2767,2712,2624,3577,2419,3515,2309,2369,3756,1481,1800,1906,1745,1853,1698,1642,1277,1222,6109,6025,6330,7500,6704,6630,6793,6956,7179,7035,6184,6266,6549,6410,6490,5958,7301,7404,7894,7779,7726,7853,1426,4878,5384,5784,5704,5878,5298,5239,5184,5122,1079,1169" + }, + "to": { + "startLines": "18,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "739,1092,1188,1271,1367,1436,1479,1531,1583,1632,1695,1753,1804,1888,1982,2090,2161,2245,2328,2394,2477,2579,2640,2702,2753,2831,2884,2944,3049,3108,3210,3265,3336,3385,3443,3490,3549,3606,3677,3738,3795,3845,3897,3950,4000,4050,4110,4163,4229,4291,4354,4401,4456,4544,4602,4664,4714,4759,4802,4862,4929,4984,5039,5092,5139,5192,5248,5296,5351,5404,5488,5555,5619,5715,5789,5870,5959,6122,6266,6345,6420,6502,6561,6641,6721,6776,6898,7001,7042,7095,7152,7226,7291,7359,7445,7525,7594,7688,7747,7802,7864,7924,8034", + "endLines": "22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124", + "endColumns": "14,95,82,95,68,42,51,51,48,62,57,50,83,93,107,70,83,82,65,82,101,60,61,50,77,52,59,104,58,101,54,70,48,57,46,58,56,70,60,56,49,51,52,49,49,59,52,65,61,62,46,54,87,57,61,49,44,42,59,66,54,54,52,46,52,55,47,54,52,83,66,63,95,73,80,88,162,143,78,74,81,58,79,79,54,121,102,40,52,56,73,64,67,85,79,68,93,58,54,61,59,109,89", + "endOffsets": "1087,1183,1266,1362,1431,1474,1526,1578,1627,1690,1748,1799,1883,1977,2085,2156,2240,2323,2389,2472,2574,2635,2697,2748,2826,2879,2939,3044,3103,3205,3260,3331,3380,3438,3485,3544,3601,3672,3733,3790,3840,3892,3945,3995,4045,4105,4158,4224,4286,4349,4396,4451,4539,4597,4659,4709,4754,4797,4857,4924,4979,5034,5087,5134,5187,5243,5291,5346,5399,5483,5550,5614,5710,5784,5865,5954,6117,6261,6340,6415,6497,6556,6636,6716,6771,6893,6996,7037,7090,7147,7221,7286,7354,7440,7520,7589,7683,7742,7797,7859,7919,8029,8119" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json new file mode 100644 index 0000000..2a106a9 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json @@ -0,0 +1,382 @@ +[ + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_middle.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_middle.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_list_dropdown_menu.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_list_dropdown_menu.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_title_bar_bg.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/title_bar_bg.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_folder.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_folder.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_folder_list_item.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/folder_list_item.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_single.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_single.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_selected.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/selected.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_yellow.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_yellow.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_notification.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/notification.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_down.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_down.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_new_note_pressed.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/new_note_pressed.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_white.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_white.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_item.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_item.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_sub_folder.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/sub_folder.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_footer_bg.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_footer_bg.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_settings_header.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/settings_header.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_note_edit_color_selector_panel.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/note_edit_color_selector_panel.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_title_alert.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/title_alert.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_red.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_red.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_clock.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/clock.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_yellow.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_yellow.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/raw_introduction.flat", + "source": "net.micode.notes.app-main-7:/raw/introduction" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_large.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/font_large.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_middle.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_middle.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_blue.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_blue.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_up.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_up.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_red_up.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_red_up.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_blue.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_blue.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_white.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_white.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_green.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_green.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable_new_note.xml.flat", + "source": "net.micode.notes.app-main-7:/drawable/new_note.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_widget_2x.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/widget_2x.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_up.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_up.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/xml_widget_2x_info.xml.flat", + "source": "net.micode.notes.app-main-7:/xml/widget_2x_info.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_call_record_folder.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/call_record_folder.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_white.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_white.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/xml_preferences.xml.flat", + "source": "net.micode.notes.app-main-7:/xml/preferences.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_dialog_edit_text.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/dialog_edit_text.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_white.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_white.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_blue.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_blue.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_down.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_down.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/raw-zh-rCN_introduction.flat", + "source": "net.micode.notes.app-main-7:/raw-zh-rCN/introduction" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_single.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_single.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_background.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_background.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/color_secondary_text_dark.xml.flat", + "source": "net.micode.notes.app-main-7:/color/secondary_text_dark.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/xml_widget_4x_info.xml.flat", + "source": "net.micode.notes.app-main-7:/xml/widget_4x_info.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_up.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_up.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_middle.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_middle.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_single.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_single.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_yellow.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_yellow.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_search_result.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/search_result.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_edit.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_edit.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_4x_green.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_4x_green.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_widget_4x.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/widget_4x.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_green.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_green.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_red.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_red.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/xml_searchable.xml.flat", + "source": "net.micode.notes.app-main-7:/xml/searchable.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_middle.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_middle.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_menu_delete.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/menu_delete.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_list.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_list.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_down.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_down.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_normal.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/font_normal.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_yellow_middle.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_yellow_middle.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_icon_app.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/icon_app.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_dropdown_icon.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/dropdown_icon.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_bg_btn_set_color.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/bg_btn_set_color.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_new_note_normal.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/new_note_normal.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_note_list_dropdown.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/note_list_dropdown.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_note_list.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/note_list.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_edit_list_item.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_edit_list_item.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_note_list_footer.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/note_list_footer.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_menu_move.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/menu_move.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_bg_color_btn_mask.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/bg_color_btn_mask.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_down.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_down.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_add_account_text.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/add_account_text.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_size_selector_bg.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/font_size_selector_bg.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_datetime_picker.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/datetime_picker.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_super.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/font_super.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_title_red.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_title_red.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_blue.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_blue.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_note_list_options.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/note_list_options.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_blue_single.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_blue_single.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_call_note_edit.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/call_note_edit.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_single.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_single.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_yellow.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_yellow.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_widget_2x_red.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/widget_2x_red.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_delete.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/delete.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/color_primary_text_dark.xml.flat", + "source": "net.micode.notes.app-main-7:/color/primary_text_dark.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_edit_green.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/edit_green.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_white_down.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_white_down.9.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/menu_note_edit.xml.flat", + "source": "net.micode.notes.app-main-7:/menu/note_edit.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_font_small.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/font_small.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/layout_account_dialog_title.xml.flat", + "source": "net.micode.notes.app-main-7:/layout/account_dialog_title.xml" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_call_record.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/call_record.png" + }, + { + "merged": "net.micode.notes.app-merged_res-5:/drawable-hdpi_list_green_up.9.png.flat", + "source": "net.micode.notes.app-main-7:/drawable-hdpi/list_green_up.9.png" + } +] \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/navigation_json/debug/navigation.json b/src/Notes-master/app/build/intermediates/navigation_json/debug/navigation.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/navigation_json/debug/navigation.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml b/src/Notes-master/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml new file mode 100644 index 0000000..d3236f6 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/packaged_manifests/debug/output-metadata.json b/src/Notes-master/app/build/intermediates/packaged_manifests/debug/output-metadata.json new file mode 100644 index 0000000..eea66e3 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/packaged_manifests/debug/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "PACKAGED_MANIFESTS", + "kind": "Directory" + }, + "applicationId": "net.micode.notes", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "0.1", + "outputFile": "AndroidManifest.xml" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/processed_res/debug/out/output-metadata.json b/src/Notes-master/app/build/intermediates/processed_res/debug/out/output-metadata.json new file mode 100644 index 0000000..1eefece --- /dev/null +++ b/src/Notes-master/app/build/intermediates/processed_res/debug/out/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "PROCESSED_RES", + "kind": "Directory" + }, + "applicationId": "net.micode.notes", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "0.1", + "outputFile": "resources-debug.ap_" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ b/src/Notes-master/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ new file mode 100644 index 0000000..b468108 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/6be87a94442d2b8afadf938b2d2a05d2859a1208729216b9bf0c454c5fca49e1_1.jar b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/6be87a94442d2b8afadf938b2d2a05d2859a1208729216b9bf0c454c5fca49e1_1.jar new file mode 100644 index 0000000..fb9db60 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/6be87a94442d2b8afadf938b2d2a05d2859a1208729216b9bf0c454c5fca49e1_1.jar differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/BuildConfig.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/BuildConfig.dex new file mode 100644 index 0000000..ebf79ba Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/BuildConfig.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Contact.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Contact.dex new file mode 100644 index 0000000..b39ce93 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Contact.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$CallNote.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$CallNote.dex new file mode 100644 index 0000000..43beda7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$CallNote.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataColumns.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataColumns.dex new file mode 100644 index 0000000..2fbf54b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataColumns.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataConstants.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataConstants.dex new file mode 100644 index 0000000..25bf90d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$DataConstants.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$NoteColumns.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$NoteColumns.dex new file mode 100644 index 0000000..7302df1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$NoteColumns.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$TextNote.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$TextNote.dex new file mode 100644 index 0000000..f8459a1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes$TextNote.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes.dex new file mode 100644 index 0000000..3dcf051 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/Notes.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper$TABLE.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper$TABLE.dex new file mode 100644 index 0000000..0138acd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper$TABLE.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper.dex new file mode 100644 index 0000000..a65f5a9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesDatabaseHelper.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesProvider.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesProvider.dex new file mode 100644 index 0000000..4a5e526 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/data/NotesProvider.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/MetaData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/MetaData.dex new file mode 100644 index 0000000..ad83dc6 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/MetaData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Node.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Node.dex new file mode 100644 index 0000000..33f1c2c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Node.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlData.dex new file mode 100644 index 0000000..7043e40 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlNote.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlNote.dex new file mode 100644 index 0000000..79eb113 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/SqlNote.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Task.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Task.dex new file mode 100644 index 0000000..d0ea1ff Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/Task.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/TaskList.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/TaskList.dex new file mode 100644 index 0000000..d6b8f1a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/data/TaskList.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/ActionFailureException.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/ActionFailureException.dex new file mode 100644 index 0000000..dd9ff43 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/ActionFailureException.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/NetworkFailureException.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/NetworkFailureException.dex new file mode 100644 index 0000000..78f9c27 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/exception/NetworkFailureException.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$1.dex new file mode 100644 index 0000000..1cccb85 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.dex new file mode 100644 index 0000000..6b5778b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask$OnCompleteListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask.dex new file mode 100644 index 0000000..a1d49e5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskASyncTask.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskClient.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskClient.dex new file mode 100644 index 0000000..9befae1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskClient.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskManager.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskManager.dex new file mode 100644 index 0000000..b1e8ddb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskManager.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService$1.dex new file mode 100644 index 0000000..18fa04a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService.dex new file mode 100644 index 0000000..94ba45d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/gtask/remote/GTaskSyncService.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex new file mode 100644 index 0000000..b3a3952 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note$NoteData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex new file mode 100644 index 0000000..24a89cd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/Note.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.dex new file mode 100644 index 0000000..6f5252f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote$NoteSettingChangedListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex new file mode 100644 index 0000000..a9d7738 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/model/WorkingNote.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex new file mode 100644 index 0000000..422d467 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils$TextExport.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex new file mode 100644 index 0000000..c7def1d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/BackupUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex new file mode 100644 index 0000000..ceb2d7a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/DataUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex new file mode 100644 index 0000000..06eeba4 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/GTaskStringUtils.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex new file mode 100644 index 0000000..2bdac90 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex new file mode 100644 index 0000000..dcda433 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$NoteItemBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex new file mode 100644 index 0000000..dd23cc9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$TextAppearanceResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex new file mode 100644 index 0000000..64ae5cd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser$WidgetBgResources.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex new file mode 100644 index 0000000..4169060 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/tool/ResourceParser.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex new file mode 100644 index 0000000..728daff Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmAlertActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex new file mode 100644 index 0000000..ee9ae1e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmInitReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex new file mode 100644 index 0000000..33a02fd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/AlarmReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex new file mode 100644 index 0000000..3bd7e24 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex new file mode 100644 index 0000000..e09164b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex new file mode 100644 index 0000000..b449eca Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex new file mode 100644 index 0000000..6e66a73 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$4.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.dex new file mode 100644 index 0000000..c129c9e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker$OnDateTimeChangedListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex new file mode 100644 index 0000000..5aba177 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePicker.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex new file mode 100644 index 0000000..ba3b36b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.dex new file mode 100644 index 0000000..7201f1d Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog$OnDateTimeSetListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex new file mode 100644 index 0000000..d835428 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DateTimePickerDialog.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex new file mode 100644 index 0000000..3924d65 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex new file mode 100644 index 0000000..d4de43a Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/DropdownMenu.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex new file mode 100644 index 0000000..23f2838 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter$FolderListItem.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex new file mode 100644 index 0000000..ea1e0a6 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/FoldersListAdapter.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex new file mode 100644 index 0000000..ff25577 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex new file mode 100644 index 0000000..a936b38 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex new file mode 100644 index 0000000..4c8a937 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex new file mode 100644 index 0000000..cd99b10 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity$HeadViewHolder.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex new file mode 100644 index 0000000..7e84fc4 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex new file mode 100644 index 0000000..f521fc7 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.dex new file mode 100644 index 0000000..312fbad Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText$OnTextViewChangeListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex new file mode 100644 index 0000000..a84fc12 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteEditText.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex new file mode 100644 index 0000000..8f9540f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NoteItemData.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$1.dex new file mode 100644 index 0000000..6b44eab Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$2.dex new file mode 100644 index 0000000..9242bab Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$3.dex new file mode 100644 index 0000000..59d7247 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$4.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$4.dex new file mode 100644 index 0000000..dd7c6cb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$4.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$5.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$5.dex new file mode 100644 index 0000000..8c202a1 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$5.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$6.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$6.dex new file mode 100644 index 0000000..fb8b80e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$6.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$7.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$7.dex new file mode 100644 index 0000000..76dc737 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$7.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$8.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$8.dex new file mode 100644 index 0000000..4715f0f Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$8.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$9.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$9.dex new file mode 100644 index 0000000..97ed6fa Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$9.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.dex new file mode 100644 index 0000000..8d7e1d8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$BackgroundQueryHandler.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ListEditState.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ListEditState.dex new file mode 100644 index 0000000..600d8fb Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ListEditState.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$1.dex new file mode 100644 index 0000000..4c8920b Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$2.dex new file mode 100644 index 0000000..9dee3c8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback.dex new file mode 100644 index 0000000..44f0b00 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$ModeCallback.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.dex new file mode 100644 index 0000000..53320f0 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$NewNoteOnTouchListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.dex new file mode 100644 index 0000000..4a550f2 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity$OnListItemClickListener.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity.dex new file mode 100644 index 0000000..b9b8ffd Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex new file mode 100644 index 0000000..d6bb19c Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter$AppWidgetAttribute.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex new file mode 100644 index 0000000..339b915 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListAdapter.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex new file mode 100644 index 0000000..5050cf5 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesListItem.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex new file mode 100644 index 0000000..d270bf8 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$1.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex new file mode 100644 index 0000000..3d51994 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$2.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex new file mode 100644 index 0000000..cbb5f45 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$3.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex new file mode 100644 index 0000000..a169a62 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$4.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex new file mode 100644 index 0000000..1f31e58 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$5.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex new file mode 100644 index 0000000..62af184 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$6.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex new file mode 100644 index 0000000..fbef3ba Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$7.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex new file mode 100644 index 0000000..fd50fb9 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$8.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex new file mode 100644 index 0000000..bd73d62 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity$GTaskReceiver.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex new file mode 100644 index 0000000..ab26473 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/ui/NotesPreferenceActivity.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex new file mode 100644 index 0000000..9d1fa13 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex new file mode 100644 index 0000000..04f1c3e Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_2x.dex differ diff --git a/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_4x.dex b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_4x.dex new file mode 100644 index 0000000..affae58 Binary files /dev/null and b/src/Notes-master/app/build/intermediates/project_dex_archive/debug/out/net/micode/notes/widget/NoteWidgetProvider_4x.dex differ diff --git a/src/Notes-master/app/build/intermediates/runtime_symbol_list/debug/R.txt b/src/Notes-master/app/build/intermediates/runtime_symbol_list/debug/R.txt new file mode 100644 index 0000000..00d6e91 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/runtime_symbol_list/debug/R.txt @@ -0,0 +1,283 @@ +int array format_for_exported_note 0x7f010000 +int array menu_share_ways 0x7f010001 +int color primary_text_dark 0x7f020000 +int color secondary_text_dark 0x7f020001 +int color user_query_highlight 0x7f020002 +int dimen text_font_size_large 0x7f030000 +int dimen text_font_size_medium 0x7f030001 +int dimen text_font_size_normal 0x7f030002 +int dimen text_font_size_small 0x7f030003 +int dimen text_font_size_super 0x7f030004 +int drawable bg_btn_set_color 0x7f040000 +int drawable bg_color_btn_mask 0x7f040001 +int drawable call_record 0x7f040002 +int drawable clock 0x7f040003 +int drawable delete 0x7f040004 +int drawable dropdown_icon 0x7f040005 +int drawable edit_blue 0x7f040006 +int drawable edit_green 0x7f040007 +int drawable edit_red 0x7f040008 +int drawable edit_title_blue 0x7f040009 +int drawable edit_title_green 0x7f04000a +int drawable edit_title_red 0x7f04000b +int drawable edit_title_white 0x7f04000c +int drawable edit_title_yellow 0x7f04000d +int drawable edit_white 0x7f04000e +int drawable edit_yellow 0x7f04000f +int drawable font_large 0x7f040010 +int drawable font_normal 0x7f040011 +int drawable font_size_selector_bg 0x7f040012 +int drawable font_small 0x7f040013 +int drawable font_super 0x7f040014 +int drawable icon_app 0x7f040015 +int drawable list_background 0x7f040016 +int drawable list_blue_down 0x7f040017 +int drawable list_blue_middle 0x7f040018 +int drawable list_blue_single 0x7f040019 +int drawable list_blue_up 0x7f04001a +int drawable list_folder 0x7f04001b +int drawable list_footer_bg 0x7f04001c +int drawable list_green_down 0x7f04001d +int drawable list_green_middle 0x7f04001e +int drawable list_green_single 0x7f04001f +int drawable list_green_up 0x7f040020 +int drawable list_red_down 0x7f040021 +int drawable list_red_middle 0x7f040022 +int drawable list_red_single 0x7f040023 +int drawable list_red_up 0x7f040024 +int drawable list_white_down 0x7f040025 +int drawable list_white_middle 0x7f040026 +int drawable list_white_single 0x7f040027 +int drawable list_white_up 0x7f040028 +int drawable list_yellow_down 0x7f040029 +int drawable list_yellow_middle 0x7f04002a +int drawable list_yellow_single 0x7f04002b +int drawable list_yellow_up 0x7f04002c +int drawable menu_delete 0x7f04002d +int drawable menu_move 0x7f04002e +int drawable new_note 0x7f04002f +int drawable new_note_normal 0x7f040030 +int drawable new_note_pressed 0x7f040031 +int drawable note_edit_color_selector_panel 0x7f040032 +int drawable notification 0x7f040033 +int drawable search_result 0x7f040034 +int drawable selected 0x7f040035 +int drawable title_alert 0x7f040036 +int drawable title_bar_bg 0x7f040037 +int drawable widget_2x_blue 0x7f040038 +int drawable widget_2x_green 0x7f040039 +int drawable widget_2x_red 0x7f04003a +int drawable widget_2x_white 0x7f04003b +int drawable widget_2x_yellow 0x7f04003c +int drawable widget_4x_blue 0x7f04003d +int drawable widget_4x_green 0x7f04003e +int drawable widget_4x_red 0x7f04003f +int drawable widget_4x_white 0x7f040040 +int drawable widget_4x_yellow 0x7f040041 +int id account_dialog_subtitle 0x7f050000 +int id account_dialog_title 0x7f050001 +int id action_select_all 0x7f050002 +int id amPm 0x7f050003 +int id btn_new_note 0x7f050004 +int id btn_set_bg_color 0x7f050005 +int id cb_edit_item 0x7f050006 +int id date 0x7f050007 +int id delete 0x7f050008 +int id et_edit_text 0x7f050009 +int id et_foler_name 0x7f05000a +int id font_size_selector 0x7f05000b +int id hour 0x7f05000c +int id iv_alert_icon 0x7f05000d +int id iv_bg_blue 0x7f05000e +int id iv_bg_blue_select 0x7f05000f +int id iv_bg_green 0x7f050010 +int id iv_bg_green_select 0x7f050011 +int id iv_bg_red 0x7f050012 +int id iv_bg_red_select 0x7f050013 +int id iv_bg_white 0x7f050014 +int id iv_bg_white_select 0x7f050015 +int id iv_bg_yellow 0x7f050016 +int id iv_bg_yellow_select 0x7f050017 +int id iv_large_select 0x7f050018 +int id iv_medium_select 0x7f050019 +int id iv_small_select 0x7f05001a +int id iv_super_select 0x7f05001b +int id ll_font_large 0x7f05001c +int id ll_font_normal 0x7f05001d +int id ll_font_small 0x7f05001e +int id ll_font_super 0x7f05001f +int id menu_alert 0x7f050020 +int id menu_delete 0x7f050021 +int id menu_delete_remind 0x7f050022 +int id menu_export_text 0x7f050023 +int id menu_font_size 0x7f050024 +int id menu_list_mode 0x7f050025 +int id menu_new_folder 0x7f050026 +int id menu_new_note 0x7f050027 +int id menu_search 0x7f050028 +int id menu_send_to_desktop 0x7f050029 +int id menu_setting 0x7f05002a +int id menu_share 0x7f05002b +int id menu_sync 0x7f05002c +int id minute 0x7f05002d +int id move 0x7f05002e +int id navigation_bar 0x7f05002f +int id note_bg_color_selector 0x7f050030 +int id note_edit_list 0x7f050031 +int id note_edit_view 0x7f050032 +int id note_item 0x7f050033 +int id note_title 0x7f050034 +int id notes_list 0x7f050035 +int id prefenerece_sync_status_textview 0x7f050036 +int id preference_sync_button 0x7f050037 +int id selection_menu 0x7f050038 +int id sv_note_edit 0x7f050039 +int id tv_alert_date 0x7f05003a +int id tv_folder_name 0x7f05003b +int id tv_modified_date 0x7f05003c +int id tv_name 0x7f05003d +int id tv_time 0x7f05003e +int id tv_title 0x7f05003f +int id tv_title_bar 0x7f050040 +int id widget_bg_image 0x7f050041 +int id widget_text 0x7f050042 +int layout account_dialog_title 0x7f060000 +int layout add_account_text 0x7f060001 +int layout datetime_picker 0x7f060002 +int layout dialog_edit_text 0x7f060003 +int layout folder_list_item 0x7f060004 +int layout note_edit 0x7f060005 +int layout note_edit_list_item 0x7f060006 +int layout note_item 0x7f060007 +int layout note_list 0x7f060008 +int layout note_list_dropdown_menu 0x7f060009 +int layout note_list_footer 0x7f06000a +int layout settings_header 0x7f06000b +int layout widget_2x 0x7f06000c +int layout widget_4x 0x7f06000d +int menu call_note_edit 0x7f070000 +int menu call_record_folder 0x7f070001 +int menu note_edit 0x7f070002 +int menu note_list 0x7f070003 +int menu note_list_dropdown 0x7f070004 +int menu note_list_options 0x7f070005 +int menu sub_folder 0x7f070006 +int plurals search_results_title 0x7f080000 +int raw introduction 0x7f090000 +int string alert_message_delete_folder 0x7f0a0000 +int string alert_message_delete_note 0x7f0a0001 +int string alert_message_delete_notes 0x7f0a0002 +int string alert_title_delete 0x7f0a0003 +int string app_name 0x7f0a0004 +int string app_widget2x2 0x7f0a0005 +int string app_widget4x4 0x7f0a0006 +int string button_delete 0x7f0a0007 +int string call_record_folder_name 0x7f0a0008 +int string datetime_dialog_cancel 0x7f0a0009 +int string datetime_dialog_ok 0x7f0a000a +int string delete_remind_time_message 0x7f0a000b +int string error_note_empty_for_clock 0x7f0a000c +int string error_note_empty_for_send_to_desktop 0x7f0a000d +int string error_note_not_exist 0x7f0a000e +int string error_sdcard_export 0x7f0a000f +int string error_sdcard_unmounted 0x7f0a0010 +int string error_sync_cancelled 0x7f0a0011 +int string error_sync_internal 0x7f0a0012 +int string error_sync_network 0x7f0a0013 +int string failed_sdcard_export 0x7f0a0014 +int string file_name_txt_format 0x7f0a0015 +int string file_path 0x7f0a0016 +int string folder_exist 0x7f0a0017 +int string format_date_ymd 0x7f0a0018 +int string format_datetime_mdhm 0x7f0a0019 +int string format_exported_file_location 0x7f0a001a +int string format_folder_files_count 0x7f0a001b +int string format_move_notes_to_folder 0x7f0a001c +int string hint_foler_name 0x7f0a001d +int string info_note_enter_desktop 0x7f0a001e +int string menu_alert 0x7f0a001f +int string menu_create_folder 0x7f0a0020 +int string menu_delete 0x7f0a0021 +int string menu_deselect_all 0x7f0a0022 +int string menu_export_text 0x7f0a0023 +int string menu_folder_change_name 0x7f0a0024 +int string menu_folder_delete 0x7f0a0025 +int string menu_folder_view 0x7f0a0026 +int string menu_font_large 0x7f0a0027 +int string menu_font_normal 0x7f0a0028 +int string menu_font_size 0x7f0a0029 +int string menu_font_small 0x7f0a002a +int string menu_font_super 0x7f0a002b +int string menu_list_mode 0x7f0a002c +int string menu_move 0x7f0a002d +int string menu_move_parent_folder 0x7f0a002e +int string menu_normal_mode 0x7f0a002f +int string menu_remove_remind 0x7f0a0030 +int string menu_search 0x7f0a0031 +int string menu_select_all 0x7f0a0032 +int string menu_select_none 0x7f0a0033 +int string menu_select_title 0x7f0a0034 +int string menu_send_to_desktop 0x7f0a0035 +int string menu_setting 0x7f0a0036 +int string menu_share 0x7f0a0037 +int string menu_sync 0x7f0a0038 +int string menu_sync_cancel 0x7f0a0039 +int string menu_title_select_folder 0x7f0a003a +int string note_alert_expired 0x7f0a003b +int string note_link_email 0x7f0a003c +int string note_link_other 0x7f0a003d +int string note_link_tel 0x7f0a003e +int string note_link_web 0x7f0a003f +int string notealert_enter 0x7f0a0040 +int string notealert_ok 0x7f0a0041 +int string notelist_menu_new 0x7f0a0042 +int string notelist_string_info 0x7f0a0043 +int string preferences_account_summary 0x7f0a0044 +int string preferences_account_title 0x7f0a0045 +int string preferences_add_account 0x7f0a0046 +int string preferences_bg_random_appear_title 0x7f0a0047 +int string preferences_button_sync_cancel 0x7f0a0048 +int string preferences_button_sync_immediately 0x7f0a0049 +int string preferences_dialog_change_account_title 0x7f0a004a +int string preferences_dialog_change_account_warn_msg 0x7f0a004b +int string preferences_dialog_select_account_tips 0x7f0a004c +int string preferences_dialog_select_account_title 0x7f0a004d +int string preferences_last_sync_time 0x7f0a004e +int string preferences_last_sync_time_format 0x7f0a004f +int string preferences_menu_cancel 0x7f0a0050 +int string preferences_menu_change_account 0x7f0a0051 +int string preferences_menu_remove_account 0x7f0a0052 +int string preferences_title 0x7f0a0053 +int string preferences_toast_cannot_change_account 0x7f0a0054 +int string preferences_toast_success_set_accout 0x7f0a0055 +int string search 0x7f0a0056 +int string search_hint 0x7f0a0057 +int string search_label 0x7f0a0058 +int string search_setting_description 0x7f0a0059 +int string set_remind_time_message 0x7f0a005a +int string success_sdcard_export 0x7f0a005b +int string success_sync_account 0x7f0a005c +int string sync_progress_init_list 0x7f0a005d +int string sync_progress_login 0x7f0a005e +int string sync_progress_syncing 0x7f0a005f +int string ticker_cancel 0x7f0a0060 +int string ticker_fail 0x7f0a0061 +int string ticker_success 0x7f0a0062 +int string ticker_syncing 0x7f0a0063 +int string widget_havenot_content 0x7f0a0064 +int string widget_under_visit_mode 0x7f0a0065 +int style HighlightTextAppearancePrimary 0x7f0b0000 +int style HighlightTextAppearanceSecondary 0x7f0b0001 +int style NoteActionBarStyle 0x7f0b0002 +int style NoteTheme 0x7f0b0003 +int style TextAppearanceLarge 0x7f0b0004 +int style TextAppearanceMedium 0x7f0b0005 +int style TextAppearanceNormal 0x7f0b0006 +int style TextAppearancePrimaryItem 0x7f0b0007 +int style TextAppearanceSecondaryItem 0x7f0b0008 +int style TextAppearanceSuper 0x7f0b0009 +int style TextAppearanceUnderMenuIcon 0x7f0b000a +int xml preferences 0x7f0c0000 +int xml searchable 0x7f0c0001 +int xml widget_2x_info 0x7f0c0002 +int xml widget_4x_info 0x7f0c0003 diff --git a/src/Notes-master/app/build/intermediates/signing_config_versions/debug/signing-config-versions.json b/src/Notes-master/app/build/intermediates/signing_config_versions/debug/signing-config-versions.json new file mode 100644 index 0000000..51f6368 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/signing_config_versions/debug/signing-config-versions.json @@ -0,0 +1 @@ +{"enableV1Signing":false,"enableV2Signing":true,"enableV3Signing":false,"enableV4Signing":false} \ No newline at end of file diff --git a/src/Notes-master/app/build/intermediates/source_set_path_map/debug/file-map.txt b/src/Notes-master/app/build/intermediates/source_set_path_map/debug/file-map.txt new file mode 100644 index 0000000..919700c --- /dev/null +++ b/src/Notes-master/app/build/intermediates/source_set_path_map/debug/file-map.txt @@ -0,0 +1,8 @@ +net.micode.notes.app-pngs-0 G:\Android\AndroidSDK\Notes-master\app\build\generated\res\pngs\debug +net.micode.notes.app-resValues-1 G:\Android\AndroidSDK\Notes-master\app\build\generated\res\resValues\debug +net.micode.notes.app-rs-2 G:\Android\AndroidSDK\Notes-master\app\build\generated\res\rs\debug +net.micode.notes.app-mergeDebugResources-3 G:\Android\AndroidSDK\Notes-master\app\build\intermediates\incremental\debug\mergeDebugResources\merged.dir +net.micode.notes.app-mergeDebugResources-4 G:\Android\AndroidSDK\Notes-master\app\build\intermediates\incremental\debug\mergeDebugResources\stripped.dir +net.micode.notes.app-merged_res-5 G:\Android\AndroidSDK\Notes-master\app\build\intermediates\merged_res\debug +net.micode.notes.app-debug-6 G:\Android\AndroidSDK\Notes-master\app\src\debug\res +net.micode.notes.app-main-7 G:\Android\AndroidSDK\Notes-master\app\src\main\res diff --git a/src/Notes-master/app/build/intermediates/stable_resource_ids_file/debug/stableIds.txt b/src/Notes-master/app/build/intermediates/stable_resource_ids_file/debug/stableIds.txt new file mode 100644 index 0000000..65f17f8 --- /dev/null +++ b/src/Notes-master/app/build/intermediates/stable_resource_ids_file/debug/stableIds.txt @@ -0,0 +1,283 @@ +net.micode.notes:xml/searchable = 0x7f0c0001 +net.micode.notes:style/TextAppearanceUnderMenuIcon = 0x7f0b000a +net.micode.notes:style/TextAppearanceNormal = 0x7f0b0006 +net.micode.notes:style/TextAppearanceSuper = 0x7f0b0009 +net.micode.notes:style/TextAppearanceMedium = 0x7f0b0005 +net.micode.notes:style/TextAppearanceLarge = 0x7f0b0004 +net.micode.notes:style/NoteTheme = 0x7f0b0003 +net.micode.notes:style/HighlightTextAppearanceSecondary = 0x7f0b0001 +net.micode.notes:string/ticker_syncing = 0x7f0a0063 +net.micode.notes:string/ticker_success = 0x7f0a0062 +net.micode.notes:string/ticker_fail = 0x7f0a0061 +net.micode.notes:string/ticker_cancel = 0x7f0a0060 +net.micode.notes:string/sync_progress_login = 0x7f0a005e +net.micode.notes:string/success_sdcard_export = 0x7f0a005b +net.micode.notes:string/set_remind_time_message = 0x7f0a005a +net.micode.notes:string/search_hint = 0x7f0a0057 +net.micode.notes:string/preferences_toast_success_set_accout = 0x7f0a0055 +net.micode.notes:string/preferences_toast_cannot_change_account = 0x7f0a0054 +net.micode.notes:string/preferences_title = 0x7f0a0053 +net.micode.notes:string/preferences_menu_remove_account = 0x7f0a0052 +net.micode.notes:string/preferences_menu_change_account = 0x7f0a0051 +net.micode.notes:string/preferences_menu_cancel = 0x7f0a0050 +net.micode.notes:string/preferences_last_sync_time_format = 0x7f0a004f +net.micode.notes:string/preferences_dialog_select_account_tips = 0x7f0a004c +net.micode.notes:string/preferences_dialog_change_account_warn_msg = 0x7f0a004b +net.micode.notes:string/preferences_dialog_change_account_title = 0x7f0a004a +net.micode.notes:string/preferences_button_sync_immediately = 0x7f0a0049 +net.micode.notes:string/preferences_button_sync_cancel = 0x7f0a0048 +net.micode.notes:string/preferences_add_account = 0x7f0a0046 +net.micode.notes:string/preferences_account_title = 0x7f0a0045 +net.micode.notes:string/preferences_account_summary = 0x7f0a0044 +net.micode.notes:string/widget_havenot_content = 0x7f0a0064 +net.micode.notes:string/notelist_string_info = 0x7f0a0043 +net.micode.notes:string/notelist_menu_new = 0x7f0a0042 +net.micode.notes:string/notealert_ok = 0x7f0a0041 +net.micode.notes:string/notealert_enter = 0x7f0a0040 +net.micode.notes:string/note_link_web = 0x7f0a003f +net.micode.notes:string/sync_progress_init_list = 0x7f0a005d +net.micode.notes:string/note_link_tel = 0x7f0a003e +net.micode.notes:string/note_link_email = 0x7f0a003c +net.micode.notes:string/note_alert_expired = 0x7f0a003b +net.micode.notes:string/menu_sync = 0x7f0a0038 +net.micode.notes:string/menu_share = 0x7f0a0037 +net.micode.notes:string/menu_setting = 0x7f0a0036 +net.micode.notes:string/menu_select_title = 0x7f0a0034 +net.micode.notes:string/menu_select_none = 0x7f0a0033 +net.micode.notes:string/menu_select_all = 0x7f0a0032 +net.micode.notes:string/menu_list_mode = 0x7f0a002c +net.micode.notes:string/menu_font_super = 0x7f0a002b +net.micode.notes:string/menu_font_size = 0x7f0a0029 +net.micode.notes:string/menu_font_normal = 0x7f0a0028 +net.micode.notes:string/menu_font_large = 0x7f0a0027 +net.micode.notes:string/menu_export_text = 0x7f0a0023 +net.micode.notes:string/menu_create_folder = 0x7f0a0020 +net.micode.notes:string/menu_alert = 0x7f0a001f +net.micode.notes:string/hint_foler_name = 0x7f0a001d +net.micode.notes:string/format_folder_files_count = 0x7f0a001b +net.micode.notes:string/file_path = 0x7f0a0016 +net.micode.notes:string/error_sync_cancelled = 0x7f0a0011 +net.micode.notes:string/error_sdcard_export = 0x7f0a000f +net.micode.notes:string/datetime_dialog_ok = 0x7f0a000a +net.micode.notes:layout/settings_header = 0x7f06000b +net.micode.notes:string/button_delete = 0x7f0a0007 +net.micode.notes:string/alert_message_delete_note = 0x7f0a0001 +net.micode.notes:string/format_move_notes_to_folder = 0x7f0a001c +net.micode.notes:string/alert_message_delete_folder = 0x7f0a0000 +net.micode.notes:id/move = 0x7f05002e +net.micode.notes:raw/introduction = 0x7f090000 +net.micode.notes:drawable/list_blue_down = 0x7f040017 +net.micode.notes:id/iv_bg_red = 0x7f050012 +net.micode.notes:drawable/list_yellow_middle = 0x7f04002a +net.micode.notes:id/widget_bg_image = 0x7f050041 +net.micode.notes:menu/sub_folder = 0x7f070006 +net.micode.notes:drawable/widget_2x_yellow = 0x7f04003c +net.micode.notes:menu/note_list_options = 0x7f070005 +net.micode.notes:menu/note_list = 0x7f070003 +net.micode.notes:menu/call_note_edit = 0x7f070000 +net.micode.notes:string/app_name = 0x7f0a0004 +net.micode.notes:layout/widget_4x = 0x7f06000d +net.micode.notes:string/menu_sync_cancel = 0x7f0a0039 +net.micode.notes:string/menu_send_to_desktop = 0x7f0a0035 +net.micode.notes:string/error_sync_internal = 0x7f0a0012 +net.micode.notes:layout/folder_list_item = 0x7f060004 +net.micode.notes:menu/note_edit = 0x7f070002 +net.micode.notes:string/menu_folder_view = 0x7f0a0026 +net.micode.notes:drawable/font_super = 0x7f040014 +net.micode.notes:layout/note_list = 0x7f060008 +net.micode.notes:id/menu_share = 0x7f05002b +net.micode.notes:string/app_widget4x4 = 0x7f0a0006 +net.micode.notes:menu/call_record_folder = 0x7f070001 +net.micode.notes:id/tv_name = 0x7f05003d +net.micode.notes:layout/note_item = 0x7f060007 +net.micode.notes:dimen/text_font_size_normal = 0x7f030002 +net.micode.notes:layout/note_edit_list_item = 0x7f060006 +net.micode.notes:layout/datetime_picker = 0x7f060002 +net.micode.notes:style/TextAppearanceSecondaryItem = 0x7f0b0008 +net.micode.notes:layout/account_dialog_title = 0x7f060000 +net.micode.notes:string/preferences_dialog_select_account_title = 0x7f0a004d +net.micode.notes:drawable/list_green_up = 0x7f040020 +net.micode.notes:layout/add_account_text = 0x7f060001 +net.micode.notes:id/widget_text = 0x7f050042 +net.micode.notes:menu/note_list_dropdown = 0x7f070004 +net.micode.notes:id/iv_bg_blue_select = 0x7f05000f +net.micode.notes:id/tv_title_bar = 0x7f050040 +net.micode.notes:id/tv_folder_name = 0x7f05003b +net.micode.notes:id/tv_alert_date = 0x7f05003a +net.micode.notes:string/menu_folder_change_name = 0x7f0a0024 +net.micode.notes:id/sv_note_edit = 0x7f050039 +net.micode.notes:id/prefenerece_sync_status_textview = 0x7f050036 +net.micode.notes:layout/note_list_dropdown_menu = 0x7f060009 +net.micode.notes:id/ll_font_super = 0x7f05001f +net.micode.notes:string/format_date_ymd = 0x7f0a0018 +net.micode.notes:id/iv_bg_yellow_select = 0x7f050017 +net.micode.notes:id/note_edit_view = 0x7f050032 +net.micode.notes:string/error_note_empty_for_send_to_desktop = 0x7f0a000d +net.micode.notes:drawable/font_small = 0x7f040013 +net.micode.notes:id/note_bg_color_selector = 0x7f050030 +net.micode.notes:id/navigation_bar = 0x7f05002f +net.micode.notes:id/ll_font_normal = 0x7f05001d +net.micode.notes:id/minute = 0x7f05002d +net.micode.notes:id/menu_sync = 0x7f05002c +net.micode.notes:string/file_name_txt_format = 0x7f0a0015 +net.micode.notes:color/primary_text_dark = 0x7f020000 +net.micode.notes:id/menu_setting = 0x7f05002a +net.micode.notes:string/error_sdcard_unmounted = 0x7f0a0010 +net.micode.notes:id/menu_search = 0x7f050028 +net.micode.notes:id/menu_new_note = 0x7f050027 +net.micode.notes:id/menu_new_folder = 0x7f050026 +net.micode.notes:layout/note_list_footer = 0x7f06000a +net.micode.notes:id/iv_bg_green = 0x7f050010 +net.micode.notes:id/tv_time = 0x7f05003e +net.micode.notes:id/menu_alert = 0x7f050020 +net.micode.notes:id/et_foler_name = 0x7f05000a +net.micode.notes:id/ll_font_small = 0x7f05001e +net.micode.notes:id/iv_super_select = 0x7f05001b +net.micode.notes:drawable/widget_2x_white = 0x7f04003b +net.micode.notes:id/iv_medium_select = 0x7f050019 +net.micode.notes:id/iv_large_select = 0x7f050018 +net.micode.notes:string/sync_progress_syncing = 0x7f0a005f +net.micode.notes:drawable/list_blue_middle = 0x7f040018 +net.micode.notes:drawable/font_normal = 0x7f040011 +net.micode.notes:id/et_edit_text = 0x7f050009 +net.micode.notes:id/iv_bg_yellow = 0x7f050016 +net.micode.notes:id/iv_bg_red_select = 0x7f050013 +net.micode.notes:drawable/list_blue_up = 0x7f04001a +net.micode.notes:id/date = 0x7f050007 +net.micode.notes:id/menu_delete_remind = 0x7f050022 +net.micode.notes:string/search = 0x7f0a0056 +net.micode.notes:string/menu_deselect_all = 0x7f0a0022 +net.micode.notes:id/font_size_selector = 0x7f05000b +net.micode.notes:id/notes_list = 0x7f050035 +net.micode.notes:id/btn_set_bg_color = 0x7f050005 +net.micode.notes:drawable/list_yellow_single = 0x7f04002b +net.micode.notes:id/amPm = 0x7f050003 +net.micode.notes:string/menu_move = 0x7f0a002d +net.micode.notes:id/action_select_all = 0x7f050002 +net.micode.notes:drawable/new_note_pressed = 0x7f040031 +net.micode.notes:layout/dialog_edit_text = 0x7f060003 +net.micode.notes:style/TextAppearancePrimaryItem = 0x7f0b0007 +net.micode.notes:drawable/bg_color_btn_mask = 0x7f040001 +net.micode.notes:drawable/widget_4x_white = 0x7f040040 +net.micode.notes:id/ll_font_large = 0x7f05001c +net.micode.notes:drawable/list_red_single = 0x7f040023 +net.micode.notes:drawable/edit_blue = 0x7f040006 +net.micode.notes:drawable/widget_4x_red = 0x7f04003f +net.micode.notes:string/note_link_other = 0x7f0a003d +net.micode.notes:string/folder_exist = 0x7f0a0017 +net.micode.notes:drawable/widget_2x_green = 0x7f040039 +net.micode.notes:drawable/title_alert = 0x7f040036 +net.micode.notes:drawable/widget_2x_blue = 0x7f040038 +net.micode.notes:drawable/widget_4x_green = 0x7f04003e +net.micode.notes:string/error_note_empty_for_clock = 0x7f0a000c +net.micode.notes:drawable/list_white_down = 0x7f040025 +net.micode.notes:drawable/dropdown_icon = 0x7f040005 +net.micode.notes:string/preferences_last_sync_time = 0x7f0a004e +net.micode.notes:drawable/new_note_normal = 0x7f040030 +net.micode.notes:id/menu_send_to_desktop = 0x7f050029 +net.micode.notes:string/format_datetime_mdhm = 0x7f0a0019 +net.micode.notes:string/call_record_folder_name = 0x7f0a0008 +net.micode.notes:drawable/new_note = 0x7f04002f +net.micode.notes:drawable/edit_title_white = 0x7f04000c +net.micode.notes:drawable/menu_delete = 0x7f04002d +net.micode.notes:id/cb_edit_item = 0x7f050006 +net.micode.notes:xml/widget_4x_info = 0x7f0c0003 +net.micode.notes:drawable/list_yellow_up = 0x7f04002c +net.micode.notes:drawable/widget_2x_red = 0x7f04003a +net.micode.notes:id/note_edit_list = 0x7f050031 +net.micode.notes:drawable/list_yellow_down = 0x7f040029 +net.micode.notes:plurals/search_results_title = 0x7f080000 +net.micode.notes:drawable/selected = 0x7f040035 +net.micode.notes:drawable/list_white_middle = 0x7f040026 +net.micode.notes:drawable/edit_title_yellow = 0x7f04000d +net.micode.notes:layout/note_edit = 0x7f060005 +net.micode.notes:id/hour = 0x7f05000c +net.micode.notes:id/iv_bg_white_select = 0x7f050015 +net.micode.notes:drawable/list_red_up = 0x7f040024 +net.micode.notes:xml/preferences = 0x7f0c0000 +net.micode.notes:id/menu_export_text = 0x7f050023 +net.micode.notes:drawable/widget_4x_yellow = 0x7f040041 +net.micode.notes:drawable/list_red_down = 0x7f040021 +net.micode.notes:string/error_note_not_exist = 0x7f0a000e +net.micode.notes:array/menu_share_ways = 0x7f010001 +net.micode.notes:id/iv_bg_green_select = 0x7f050011 +net.micode.notes:id/menu_font_size = 0x7f050024 +net.micode.notes:id/iv_bg_blue = 0x7f05000e +net.micode.notes:drawable/list_green_middle = 0x7f04001e +net.micode.notes:drawable/list_footer_bg = 0x7f04001c +net.micode.notes:drawable/list_white_single = 0x7f040027 +net.micode.notes:drawable/list_white_up = 0x7f040028 +net.micode.notes:string/menu_remove_remind = 0x7f0a0030 +net.micode.notes:drawable/list_green_down = 0x7f04001d +net.micode.notes:id/preference_sync_button = 0x7f050037 +net.micode.notes:string/menu_move_parent_folder = 0x7f0a002e +net.micode.notes:string/failed_sdcard_export = 0x7f0a0014 +net.micode.notes:id/account_dialog_title = 0x7f050001 +net.micode.notes:layout/widget_2x = 0x7f06000c +net.micode.notes:id/note_item = 0x7f050033 +net.micode.notes:dimen/text_font_size_super = 0x7f030004 +net.micode.notes:string/preferences_bg_random_appear_title = 0x7f0a0047 +net.micode.notes:string/alert_message_delete_notes = 0x7f0a0002 +net.micode.notes:string/menu_title_select_folder = 0x7f0a003a +net.micode.notes:string/menu_folder_delete = 0x7f0a0025 +net.micode.notes:drawable/clock = 0x7f040003 +net.micode.notes:id/menu_delete = 0x7f050021 +net.micode.notes:drawable/icon_app = 0x7f040015 +net.micode.notes:drawable/edit_yellow = 0x7f04000f +net.micode.notes:drawable/list_blue_single = 0x7f040019 +net.micode.notes:drawable/list_red_middle = 0x7f040022 +net.micode.notes:string/menu_normal_mode = 0x7f0a002f +net.micode.notes:drawable/edit_title_blue = 0x7f040009 +net.micode.notes:string/menu_delete = 0x7f0a0021 +net.micode.notes:drawable/list_background = 0x7f040016 +net.micode.notes:drawable/title_bar_bg = 0x7f040037 +net.micode.notes:id/delete = 0x7f050008 +net.micode.notes:drawable/search_result = 0x7f040034 +net.micode.notes:string/datetime_dialog_cancel = 0x7f0a0009 +net.micode.notes:id/tv_modified_date = 0x7f05003c +net.micode.notes:string/menu_font_small = 0x7f0a002a +net.micode.notes:drawable/font_large = 0x7f040010 +net.micode.notes:id/iv_alert_icon = 0x7f05000d +net.micode.notes:drawable/list_green_single = 0x7f04001f +net.micode.notes:xml/widget_2x_info = 0x7f0c0002 +net.micode.notes:drawable/edit_white = 0x7f04000e +net.micode.notes:string/search_label = 0x7f0a0058 +net.micode.notes:string/format_exported_file_location = 0x7f0a001a +net.micode.notes:drawable/menu_move = 0x7f04002e +net.micode.notes:id/btn_new_note = 0x7f050004 +net.micode.notes:drawable/edit_title_red = 0x7f04000b +net.micode.notes:style/NoteActionBarStyle = 0x7f0b0002 +net.micode.notes:string/search_setting_description = 0x7f0a0059 +net.micode.notes:id/menu_list_mode = 0x7f050025 +net.micode.notes:dimen/text_font_size_medium = 0x7f030001 +net.micode.notes:drawable/note_edit_color_selector_panel = 0x7f040032 +net.micode.notes:drawable/list_folder = 0x7f04001b +net.micode.notes:id/iv_small_select = 0x7f05001a +net.micode.notes:string/widget_under_visit_mode = 0x7f0a0065 +net.micode.notes:color/user_query_highlight = 0x7f020002 +net.micode.notes:drawable/edit_red = 0x7f040008 +net.micode.notes:drawable/edit_green = 0x7f040007 +net.micode.notes:string/app_widget2x2 = 0x7f0a0005 +net.micode.notes:id/tv_title = 0x7f05003f +net.micode.notes:drawable/delete = 0x7f040004 +net.micode.notes:string/info_note_enter_desktop = 0x7f0a001e +net.micode.notes:string/error_sync_network = 0x7f0a0013 +net.micode.notes:drawable/edit_title_green = 0x7f04000a +net.micode.notes:drawable/widget_4x_blue = 0x7f04003d +net.micode.notes:drawable/bg_btn_set_color = 0x7f040000 +net.micode.notes:drawable/font_size_selector_bg = 0x7f040012 +net.micode.notes:dimen/text_font_size_large = 0x7f030000 +net.micode.notes:string/delete_remind_time_message = 0x7f0a000b +net.micode.notes:dimen/text_font_size_small = 0x7f030003 +net.micode.notes:id/selection_menu = 0x7f050038 +net.micode.notes:id/account_dialog_subtitle = 0x7f050000 +net.micode.notes:drawable/call_record = 0x7f040002 +net.micode.notes:drawable/notification = 0x7f040033 +net.micode.notes:color/secondary_text_dark = 0x7f020001 +net.micode.notes:string/menu_search = 0x7f0a0031 +net.micode.notes:string/alert_title_delete = 0x7f0a0003 +net.micode.notes:string/success_sync_account = 0x7f0a005c +net.micode.notes:id/iv_bg_white = 0x7f050014 +net.micode.notes:id/note_title = 0x7f050034 +net.micode.notes:style/HighlightTextAppearancePrimary = 0x7f0b0000 +net.micode.notes:array/format_for_exported_note = 0x7f010000 diff --git a/src/Notes-master/app/build/outputs/logs/manifest-merger-debug-report.txt b/src/Notes-master/app/build/outputs/logs/manifest-merger-debug-report.txt new file mode 100644 index 0000000..4eb0f31 --- /dev/null +++ b/src/Notes-master/app/build/outputs/logs/manifest-merger-debug-report.txt @@ -0,0 +1,243 @@ +-- Merging decision tree log --- +manifest +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:1-153:12 + package + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:20:5-31 + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + android:versionName + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:22:5-30 + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + xmlns:tools + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:19:5-51 + xmlns:android + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:18:11-69 + android:versionCode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:21:5-28 + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml +uses-sdk +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 +INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 + android:targetSdkVersion + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:5-44 + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + android:minSdkVersion + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:24:15-41 + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml + INJECTED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml +uses-permission#android.permission.WRITE_EXTERNAL_STORAGE +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:26:5-81 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:26:22-78 +uses-permission#com.android.launcher.permission.INSTALL_SHORTCUT +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:27:5-88 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:27:22-85 +uses-permission#android.permission.INTERNET +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:28:5-67 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:28:22-64 +uses-permission#android.permission.READ_CONTACTS +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:29:5-72 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:29:22-69 +uses-permission#android.permission.MANAGE_ACCOUNTS +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:30:5-74 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:30:22-71 +uses-permission#android.permission.AUTHENTICATE_ACCOUNTS +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:31:5-80 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:31:22-77 +uses-permission#android.permission.GET_ACCOUNTS +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:32:5-71 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:32:22-68 +uses-permission#android.permission.USE_CREDENTIALS +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:33:5-74 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:33:22-71 +uses-permission#android.permission.RECEIVE_BOOT_COMPLETED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:34:5-81 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:34:22-78 +application +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:36:5-152:19 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:38:9-41 + android:icon + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:37:9-42 +activity#net.micode.notes.ui.NotesListActivity +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:39:9-52:20 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:42:13-45 + android:launchMode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:43:13-43 + android:windowSoftInputMode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:46:13-52 + android:uiOptions + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:45:13-57 + android:configChanges + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:41:13-74 + android:theme + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:44:13-45 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:40:13-49 +intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:48:13-51:29 +action#android.intent.action.MAIN +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:49:17-69 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:49:25-66 +category#android.intent.category.LAUNCHER +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:50:17-77 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:50:27-74 +activity#net.micode.notes.ui.NoteEditActivity +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:54:9-84:20 + android:launchMode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:57:13-43 + tools:ignore + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:59:13-43 + android:configChanges + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:56:13-74 + android:theme + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:58:13-45 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:55:13-48 +intent-filter#action:name:android.intent.action.VIEW+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:61:13-67:29 + android:scheme + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:61:28-49 +action#android.intent.action.VIEW +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:62:17-63:54 + tools:ignore + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:63:21-51 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:62:25-66 +category#android.intent.category.DEFAULT +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:17-76 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:64:27-73 +data +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:17-78 + android:mimeType + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:65:23-75 +intent-filter#action:name:android.intent.action.INSERT_OR_EDIT+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:69:13-74:29 +action#android.intent.action.INSERT_OR_EDIT +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:70:17-79 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:70:25-76 +intent-filter#action:name:android.intent.action.SEARCH+category:name:android.intent.category.DEFAULT +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:76:13-79:29 +action#android.intent.action.SEARCH +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:77:17-71 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:77:25-68 +meta-data#android.app.searchable +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:81:13-83:54 + android:resource + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:83:17-51 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:82:17-54 +provider#net.micode.notes.data.NotesProvider +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:86:9-89:43 + android:authorities + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:88:13-47 + android:multiprocess + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:89:13-40 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:87:13-63 +receiver#net.micode.notes.widget.NoteWidgetProvider_2x +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:91:9-103:20 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:93:13-50 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:92:13-57 +intent-filter#action:name:android.appwidget.action.APPWIDGET_DELETED+action:name:android.appwidget.action.APPWIDGET_UPDATE+action:name:android.intent.action.PRIVACY_MODE_CHANGED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:94:13-98:29 +action#android.appwidget.action.APPWIDGET_UPDATE +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:17-84 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:95:25-81 +action#android.appwidget.action.APPWIDGET_DELETED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:17-85 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:96:25-82 +action#android.intent.action.PRIVACY_MODE_CHANGED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:17-85 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:97:25-82 +meta-data#android.appwidget.provider +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:100:13-102:58 + android:resource + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:102:17-55 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:101:17-58 +receiver#net.micode.notes.widget.NoteWidgetProvider_4x +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:104:9-117:20 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:106:13-50 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:105:13-57 +receiver#net.micode.notes.ui.AlarmInitReceiver +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:119:9-123:20 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:119:19-55 +intent-filter#action:name:android.intent.action.BOOT_COMPLETED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:120:13-122:29 +action#android.intent.action.BOOT_COMPLETED +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:121:17-79 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:121:25-76 +receiver#net.micode.notes.ui.AlarmReceiver +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:125:9-128:20 + android:process + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:127:13-38 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:126:13-61 +activity#net.micode.notes.ui.AlarmAlertActivity +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:130:9-135:20 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:132:13-45 + android:launchMode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:133:13-48 + android:theme + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:134:13-75 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:131:13-50 +activity#net.micode.notes.ui.NotesPreferenceActivity +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:137:9-142:20 + android:label + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:139:13-54 + android:launchMode + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:140:13-43 + android:theme + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:141:13-60 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:138:13-71 +service#net.micode.notes.gtask.remote.GTaskSyncService +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:144:9-147:19 + android:exported + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:146:13-37 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:145:13-74 +meta-data#android.app.default_searchable +ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:149:9-151:52 + android:value + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:151:13-49 + android:name + ADDED from G:\Android\AndroidSDK\Notes-master\app\src\main\AndroidManifest.xml:150:13-58 diff --git a/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin new file mode 100644 index 0000000..f845a77 Binary files /dev/null and b/src/Notes-master/app/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ diff --git a/src/Notes-master/app/src/main/AndroidManifest.xml b/src/Notes-master/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..83e53b9 --- /dev/null +++ b/src/Notes-master/app/src/main/AndroidManifest.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/data/Contact.java b/src/Notes-master/app/src/main/java/net/micode/notes/data/Contact.java new file mode 100644 index 0000000..b2ccb4c --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/data/Contact.java @@ -0,0 +1,99 @@ +/* + * 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"; + + /** + * 用于查询联系人的SQL语句 + * PHONE_NUMBERS_EQUAL - 比较电话号码是否相等 + * MIMETYPE - 指定数据类型为电话号码 + * RAW_CONTACT_ID - 关联phone_lookup表以获取联系人ID + */ + 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 = '+')"; + + /** + * 根据电话号码获取联系人姓名 + * @param context 上下文对象 + * @param phoneNumber 要查询的电话号码 + * @return 联系人姓名,如果未找到则返回null + */ + public static String getContact(Context context, String phoneNumber) { + // 初始化缓存Map(如果未初始化) + if(sContactCache == null) { + sContactCache = new HashMap(); + } + + // 检查缓存中是否已存在该号码对应的联系人 + if(sContactCache.containsKey(phoneNumber)) { + return sContactCache.get(phoneNumber); + } + + // 构造查询条件,将电话号码转换为标准格式 + String selection = CALLER_ID_SELECTION.replace("+", + PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + // 查询联系人数据库 + Cursor cursor = context.getContentResolver().query( + Data.CONTENT_URI, + new String [] { Phone.DISPLAY_NAME }, // 只查询联系人显示名称 + selection, + new String[] { phoneNumber }, + null); + + if (cursor != null && cursor.moveToFirst()) { + try { + // 获取联系人姓名 + String name = cursor.getString(0); + // 将结果存入缓存 + sContactCache.put(phoneNumber, name); + return name; + } catch (IndexOutOfBoundsException e) { + // 处理游标越界异常 + Log.e(TAG, " Cursor get string error " + e.toString()); + return null; + } finally { + // 确保关闭游标 + cursor.close(); + } + } else { + // 未找到匹配的联系人 + Log.d(TAG, "No contact matched with number:" + phoneNumber); + return null; + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/data/Notes.java b/src/Notes-master/app/src/main/java/net/micode/notes/data/Notes.java new file mode 100644 index 0000000..6e56c51 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/data/Notes.java @@ -0,0 +1,295 @@ +/* + * 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; // 系统文件夹 + + /** + * 系统文件夹的ID定义: + * {@link Notes#ID_ROOT_FOLDER } 是默认文件夹 + * {@link Notes#ID_TEMPARAY_FOLDER } 用于不属于任何文件夹的笔记 + * {@link Notes#ID_CALL_RECORD_FOLDER} 用于存储通话记录 + */ + 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; + + // Intent传递数据时使用的Extra键名 + 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"; + + // Widget类型常量 + public static final int TYPE_WIDGET_INVALIDE = -1; // 无效widget + public static final int TYPE_WIDGET_2X = 0; // 2x大小widget + public static final int TYPE_WIDGET_4X = 1; // 4x大小widget + + /** + * 数据类型常量类 + */ + public static class DataConstants { + public static final String NOTE = TextNote.CONTENT_ITEM_TYPE; + public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE; + } + + /** + * 用于查询所有笔记和文件夹的Uri + */ + public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note"); + + /** + * 用于查询数据的Uri + */ + public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data"); + + /** + * 笔记数据库表列名接口 + */ + public interface NoteColumns { + /** + * 行的唯一ID + *

类型: INTEGER (long)

+ */ + public static final String ID = "_id"; + + /** + * 笔记或文件夹的父ID + *

类型: INTEGER (long)

+ */ + public static final String PARENT_ID = "parent_id"; + + /** + * 创建日期 + *

类型: INTEGER (long)

+ */ + public static final String CREATED_DATE = "created_date"; + + /** + * 最后修改日期 + *

类型: INTEGER (long)

+ */ + public static final String MODIFIED_DATE = "modified_date"; + + /** + * 提醒日期 + *

类型: INTEGER (long)

+ */ + public static final String ALERTED_DATE = "alert_date"; + + /** + * 文件夹名称或笔记文本内容 + *

类型: TEXT

+ */ + public static final String SNIPPET = "snippet"; + + /** + * 笔记的widget ID + *

类型: INTEGER (long)

+ */ + public static final String WIDGET_ID = "widget_id"; + + /** + * 笔记的widget类型 + *

类型: INTEGER (long)

+ */ + public static final String WIDGET_TYPE = "widget_type"; + + /** + * 笔记的背景颜色ID + *

类型: INTEGER (long)

+ */ + public static final String BG_COLOR_ID = "bg_color_id"; + + /** + * 是否包含附件标志 + *

类型: INTEGER

+ */ + public static final String HAS_ATTACHMENT = "has_attachment"; + + /** + * 文件夹中的笔记数量 + *

类型: INTEGER (long)

+ */ + public static final String NOTES_COUNT = "notes_count"; + + /** + * 文件类型:文件夹或笔记 + *

类型: INTEGER

+ */ + public static final String TYPE = "type"; + + /** + * 最后同步ID + *

类型: INTEGER (long)

+ */ + public static final String SYNC_ID = "sync_id"; + + /** + * 本地修改标志 + *

类型: INTEGER

+ */ + public static final String LOCAL_MODIFIED = "local_modified"; + + /** + * 移入临时文件夹前的原始父ID + *

类型: INTEGER

+ */ + public static final String ORIGIN_PARENT_ID = "origin_parent_id"; + + /** + * Google任务ID + *

类型: TEXT

+ */ + public static final String GTASK_ID = "gtask_id"; + + /** + * 版本号 + *

类型: INTEGER (long)

+ */ + public static final String VERSION = "version"; + } + + /** + * 数据表列名接口 + */ + public interface DataColumns { + /** + * 行的唯一ID + *

类型: INTEGER (long)

+ */ + public static final String ID = "_id"; + + /** + * 该行表示项的MIME类型 + *

类型: Text

+ */ + public static final String MIME_TYPE = "mime_type"; + + /** + * 该数据所属笔记的引用ID + *

类型: INTEGER (long)

+ */ + public static final String NOTE_ID = "note_id"; + + /** + * 创建日期 + *

类型: INTEGER (long)

+ */ + public static final String CREATED_DATE = "created_date"; + + /** + * 最后修改日期 + *

类型: INTEGER (long)

+ */ + public static final String MODIFIED_DATE = "modified_date"; + + /** + * 数据内容 + *

类型: TEXT

+ */ + public static final String CONTENT = "content"; + + /** + * 通用数据列,具体含义由MIME类型决定 + *

类型: INTEGER

+ */ + public static final String DATA1 = "data1"; + + /** + * 通用数据列,具体含义由MIME类型决定 + *

类型: INTEGER

+ */ + public static final String DATA2 = "data2"; + + /** + * 通用数据列,具体含义由MIME类型决定 + *

类型: TEXT

+ */ + public static final String DATA3 = "data3"; + + /** + * 通用数据列,具体含义由MIME类型决定 + *

类型: TEXT

+ */ + public static final String DATA4 = "data4"; + + /** + * 通用数据列,具体含义由MIME类型决定 + *

类型: TEXT

+ */ + public static final String DATA5 = "data5"; + } + + /** + * 文本笔记相关常量类 + */ + public static final class TextNote implements DataColumns { + /** + * 文本模式标志 + *

类型: Integer 1:清单模式 0:普通模式

+ */ + 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 { + /** + * 通话日期 + *

类型: INTEGER (long)

+ */ + public static final String CALL_DATE = DATA1; + + /** + * 电话号码 + *

类型: 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/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java b/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java new file mode 100644 index 0000000..68cd38f --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesDatabaseHelper.java @@ -0,0 +1,431 @@ +/* + * 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; + + /** + * 创建笔记表的SQL语句 + * 包含笔记的基本信息:ID、父ID、提醒时间、背景色、创建时间等 + */ + 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" + + ")"; + + /** + * 创建数据表的SQL语句 + * 存储笔记的具体内容数据 + */ + 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 ''" + + ")"; + + /** + * 创建数据表NOTE_ID索引的SQL语句 + */ + private static final String CREATE_DATA_NOTE_ID_INDEX_SQL = + "CREATE INDEX IF NOT EXISTS note_id_index ON " + + TABLE.DATA + "(" + DataColumns.NOTE_ID + ");"; + + /** + * 当笔记移动到文件夹时增加文件夹笔记计数的触发器 + */ + 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"; + + /** + * 当笔记从文件夹移出时减少文件夹笔记计数的触发器 + */ + 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"; + + /** + * 当向文件夹插入新笔记时增加文件夹笔记计数的触发器 + */ + 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"; + + /** + * 当从文件夹删除笔记时减少文件夹笔记计数的触发器 + */ + private static final String NOTE_DECREASE_FOLDER_COUNT_ON_DELETE_TRIGGER = + "CREATE TRIGGER decrease_folder_count_on_delete " + + " AFTER DELETE ON " + TABLE.NOTE + + " BEGIN " + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" + + " WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID + + " AND " + NoteColumns.NOTES_COUNT + ">0;" + + " END"; + + /** + * 当插入NOTE类型的数据时更新笔记内容的触发器 + */ + private static final String DATA_UPDATE_NOTE_CONTENT_ON_INSERT_TRIGGER = + "CREATE TRIGGER update_note_content_on_insert " + + " AFTER INSERT ON " + TABLE.DATA + + " WHEN new." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + + " END"; + + /** + * 当NOTE类型的数据更新时更新笔记内容的触发器 + */ + private static final String DATA_UPDATE_NOTE_CONTENT_ON_UPDATE_TRIGGER = + "CREATE TRIGGER update_note_content_on_update " + + " AFTER UPDATE ON " + TABLE.DATA + + " WHEN old." + DataColumns.MIME_TYPE + "='" + DataConstants.NOTE + "'" + + " BEGIN" + + " UPDATE " + TABLE.NOTE + + " SET " + NoteColumns.SNIPPET + "=new." + DataColumns.CONTENT + + " WHERE " + NoteColumns.ID + "=new." + DataColumns.NOTE_ID + ";" + + " END"; + + /** + * 当NOTE类型的数据删除时更新笔记内容的触发器 + */ + 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"; + + /** + * 当笔记被删除时删除相关数据的触发器 + */ + 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"; + + /** + * 当文件夹被删除时删除其下所有笔记的触发器 + */ + 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"; + + /** + * 当文件夹被移到回收站时移动其下所有笔记的触发器 + */ + 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"; + + /** + * 构造函数 + * @param context 上下文对象 + */ + public NotesDatabaseHelper(Context context) { + super(context, DB_NAME, null, DB_VERSION); + } + + /** + * 创建笔记表 + * @param db 数据库对象 + */ + public void createNoteTable(SQLiteDatabase db) { + db.execSQL(CREATE_NOTE_TABLE_SQL); + reCreateNoteTableTriggers(db); + createSystemFolder(db); + Log.d(TAG, "note table has been created"); + } + + /** + * 重新创建笔记表的所有触发器 + * @param db 数据库对象 + */ + 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); + } + + /** + * 创建系统文件夹 + * @param db 数据库对象 + */ + private void createSystemFolder(SQLiteDatabase db) { + ContentValues values = new ContentValues(); + + /** + * 创建通话记录文件夹 + */ + values.put(NoteColumns.ID, Notes.ID_CALL_RECORD_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * 创建根文件夹(默认文件夹) + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_ROOT_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * 创建临时文件夹(用于移动笔记) + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_TEMPARAY_FOLDER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + + /** + * 创建回收站文件夹 + */ + values.clear(); + values.put(NoteColumns.ID, Notes.ID_TRASH_FOLER); + values.put(NoteColumns.TYPE, Notes.TYPE_SYSTEM); + db.insert(TABLE.NOTE, null, values); + } + + /** + * 创建数据表 + * @param db 数据库对象 + */ + 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"); + } + + /** + * 重新创建数据表的所有触发器 + * @param db 数据库对象 + */ + 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); + } + + /** + * 获取NotesDatabaseHelper的单例 + * @param context 上下文对象 + * @return NotesDatabaseHelper实例 + */ + static synchronized NotesDatabaseHelper getInstance(Context context) { + if (mInstance == null) { + mInstance = new NotesDatabaseHelper(context); + } + return mInstance; + } + + /** + * 数据库创建回调 + * @param db 数据库对象 + */ + @Override + public void onCreate(SQLiteDatabase db) { + createNoteTable(db); + createDataTable(db); + } + + /** + * 数据库升级回调 + * @param db 数据库对象 + * @param oldVersion 旧版本号 + * @param newVersion 新版本号 + */ + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + boolean reCreateTriggers = false; + boolean skipV2 = false; + + if (oldVersion == 1) { + upgradeToV2(db); + skipV2 = true; // 此升级包含从v2到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"); + } + } + + /** + * 升级到版本2 + * @param db 数据库对象 + */ + 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); + } + + /** + * 升级到版本3 + * @param db 数据库对象 + */ + private void upgradeToV3(SQLiteDatabase db) { + // 删除未使用的触发器 + 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"); + // 添加gtask_id列 + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.GTASK_ID + + " TEXT NOT NULL DEFAULT ''"); + // 添加回收站系统文件夹 + 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); + } + + /** + * 升级到版本4 + * @param db 数据库对象 + */ + private void upgradeToV4(SQLiteDatabase db) { + db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION + + " INTEGER NOT NULL DEFAULT 0"); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesProvider.java b/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesProvider.java new file mode 100644 index 0000000..8aae48c --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/data/NotesProvider.java @@ -0,0 +1,386 @@ +/* + * 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 { + // URI匹配器 + private static final UriMatcher mMatcher; + + // 数据库帮助类实例 + private NotesDatabaseHelper mHelper; + + // 日志标签 + private static final String TAG = "NotesProvider"; + + // URI匹配类型常量 + private static final int URI_NOTE = 1; // 笔记URI + private static final int URI_NOTE_ITEM = 2; // 单条笔记URI + private static final int URI_DATA = 3; // 数据URI + private static final int URI_DATA_ITEM = 4; // 单条数据URI + private static final int URI_SEARCH = 5; // 搜索URI + private static final int URI_SEARCH_SUGGEST = 6; // 搜索建议URI + + // 静态初始化URI匹配规则 + static { + // 创建URI匹配器实例 + mMatcher = new UriMatcher(UriMatcher.NO_MATCH); + // 添加各种URI匹配规则 + mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE); + mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA); + mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM); + mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST); + mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST); + } + + /** + * 搜索结果的投影列 + * x'0A'表示sqlite中的换行符'\n' + * 为了在搜索结果中显示更多信息,我们会去除标题和内容中的换行符和空格 + */ + 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; + + /** + * 笔记搜索的SQL查询语句 + */ + 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; + // 根据URI类型执行不同的查询操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 查询所有笔记 + c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null, + sortOrder); + break; + case URI_NOTE_ITEM: + // 查询单条笔记 + id = uri.getPathSegments().get(1); + c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_DATA: + // 查询所有数据 + c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null, + sortOrder); + break; + case URI_DATA_ITEM: + // 查询单条数据 + id = uri.getPathSegments().get(1); + c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id + + parseSelection(selection), selectionArgs, null, null, sortOrder); + break; + case URI_SEARCH: + case URI_SEARCH_SUGGEST: + // 检查查询参数 + if (sortOrder != null || projection != null) { + throw new IllegalArgumentException( + "do not specify sortOrder, selection, selectionArgs, or projection" + "with this query"); + } + + // 获取搜索字符串 + String searchString = null; + if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) { + if (uri.getPathSegments().size() > 1) { + searchString = uri.getPathSegments().get(1); + } + } else { + searchString = uri.getQueryParameter("pattern"); + } + + // 如果搜索字符串为空则返回null + 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); + } + // 设置通知URI + if (c != null) { + c.setNotificationUri(getContext().getContentResolver(), uri); + } + return c; + } + + /** + * 插入数据的方法 + */ + /** + * 插入数据到数据库中 + * @param uri 要插入数据的URI + * @param values 要插入的数据 + * @return 插入数据后生成的URI + */ + @Override + public Uri insert(Uri uri, ContentValues values) { + // 获取可写数据库实例 + SQLiteDatabase db = mHelper.getWritableDatabase(); + // 初始化数据ID、笔记ID和插入ID + 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)) { + // 从values中获取笔记ID + noteId = values.getAsLong(DataColumns.NOTE_ID); + } else { + // 记录错误日志:缺少笔记ID + Log.d(TAG, "Wrong data format without note id:" + values.toString()); + } + // 插入数据并获取插入ID + insertedId = dataId = db.insert(TABLE.DATA, null, values); + break; + default: + // 未知URI异常 + throw new IllegalArgumentException("Unknown URI " + uri); + } + // 通知笔记URI发生变化 + if (noteId > 0) { + getContext().getContentResolver().notifyChange( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null); + } + + // 通知数据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; + // 根据URI类型执行不同的删除操作 + switch (mMatcher.match(uri)) { + case URI_NOTE: + // 删除笔记,确保只删除ID大于0的笔记 + selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 "; + count = db.delete(TABLE.NOTE, selection, selectionArgs); + break; + case URI_NOTE_ITEM: + // 删除单条笔记 + id = uri.getPathSegments().get(1); + /** + * ID小于0的是系统文件夹,不允许删除 + */ + 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; + // 根据URI类型执行不同的更新操作 + 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) { + // 构建SQL更新语句 + StringBuilder sql = new StringBuilder(120); + sql.append("UPDATE "); + sql.append(TABLE.NOTE); + sql.append(" SET "); + sql.append(NoteColumns.VERSION); + sql.append("=" + NoteColumns.VERSION + "+1 "); + + // 添加WHERE子句 + 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); + } + + // 执行SQL语句 + mHelper.getWritableDatabase().execSQL(sql.toString()); + } + + /** + * 获取MIME类型的方法 + */ + @Override + public String getType(Uri uri) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java new file mode 100644 index 0000000..c0b2878 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/MetaData.java @@ -0,0 +1,118 @@ +/* + * 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; + +/** + * 元数据类,继承自Task类 + * 用于处理与Google Task相关的元数据 + */ +public class MetaData extends Task { + // 日志标签 + private final static String TAG = MetaData.class.getSimpleName(); + + // 关联的Google Task ID + private String mRelatedGid = null; + + /** + * 设置元数据信息 + * @param gid Google Task ID + * @param metaInfo 元数据JSON对象 + */ + 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); + } + + /** + * 获取关联的Google Task ID + * @return 关联的Google Task ID + */ + public String getRelatedGid() { + return mRelatedGid; + } + + /** + * 判断是否值得保存 + * @return 如果notes不为空则返回true + */ + @Override + public boolean isWorthSaving() { + return getNotes() != null; + } + + /** + * 通过远程JSON设置内容 + * @param js 远程JSON对象 + */ + @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; + } + } + } + + /** + * 通过本地JSON设置内容(不支持的操作) + * @param js 本地JSON对象 + * @throws IllegalAccessError 该方法不应被调用 + */ + @Override + public void setContentByLocalJSON(JSONObject js) { + // this function should not be called + throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called"); + } + + /** + * 从内容获取本地JSON(不支持的操作) + * @throws IllegalAccessError 该方法不应被调用 + */ + @Override + public JSONObject getLocalJSONFromContent() { + throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called"); + } + + /** + * 获取同步操作(不支持的操作) + * @param c 数据库游标 + * @throws IllegalAccessError 该方法不应被调用 + */ + @Override + public int getSyncAction(Cursor c) { + throw new IllegalAccessError("MetaData:getSyncAction should not be called"); + } + +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java new file mode 100644 index 0000000..386aa3c --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Node.java @@ -0,0 +1,168 @@ +/* + * 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; + +/** + * 节点抽象类,用于表示Google Task中的节点数据 + */ +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; // Google Task ID + + private String mName; // 节点名称 + + private long mLastModified; // 最后修改时间 + + private boolean mDeleted; // 删除标记 + + /** + * 构造函数,初始化节点基本属性 + */ + public Node() { + mGid = null; + mName = ""; + mLastModified = 0; + mDeleted = false; + } + + /** + * 获取创建动作的JSON对象 + * @param actionId 动作ID + * @return 创建动作的JSON对象 + */ + public abstract JSONObject getCreateAction(int actionId); + + /** + * 获取更新动作的JSON对象 + * @param actionId 动作ID + * @return 更新动作的JSON对象 + */ + public abstract JSONObject getUpdateAction(int actionId); + + /** + * 通过远程JSON设置内容 + * @param js 远程JSON对象 + */ + public abstract void setContentByRemoteJSON(JSONObject js); + + /** + * 通过本地JSON设置内容 + * @param js 本地JSON对象 + */ + public abstract void setContentByLocalJSON(JSONObject js); + + /** + * 从内容获取本地JSON + * @return 本地JSON对象 + */ + public abstract JSONObject getLocalJSONFromContent(); + + /** + * 获取同步动作 + * @param c 数据库游标 + * @return 同步动作类型 + */ + public abstract int getSyncAction(Cursor c); + + /** + * 设置Google Task ID + * @param gid Google Task ID + */ + public void setGid(String gid) { + this.mGid = gid; + } + + /** + * 设置节点名称 + * @param name 节点名称 + */ + public void setName(String name) { + this.mName = name; + } + + /** + * 设置最后修改时间 + * @param lastModified 最后修改时间 + */ + public void setLastModified(long lastModified) { + this.mLastModified = lastModified; + } + + /** + * 设置删除标记 + * @param deleted 删除标记 + */ + public void setDeleted(boolean deleted) { + this.mDeleted = deleted; + } + + /** + * 获取Google Task ID + * @return Google Task ID + */ + public String getGid() { + return this.mGid; + } + + /** + * 获取节点名称 + * @return 节点名称 + */ + public String getName() { + return this.mName; + } + + /** + * 获取最后修改时间 + * @return 最后修改时间 + */ + public long getLastModified() { + return this.mLastModified; + } + + /** + * 获取删除标记 + * @return 删除标记 + */ + public boolean getDeleted() { + return this.mDeleted; + } + +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java new file mode 100644 index 0000000..a272bb1 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlData.java @@ -0,0 +1,189 @@ +/* + * 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; // 无效ID常量 + + 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; // 数据ID列索引 + + public static final int DATA_MIME_TYPE_COLUMN = 1; // 数据MIME类型列索引 + + public static final int DATA_CONTENT_COLUMN = 2; // 数据内容列索引 + + public static final int DATA_CONTENT_DATA_1_COLUMN = 3; // 数据内容数据1列索引 + + public static final int DATA_CONTENT_DATA_3_COLUMN = 4; // 数据内容数据3列索引 + + private ContentResolver mContentResolver; // 内容解析器 + + private boolean mIsCreate; // 是否为创建标志 + + private long mDataId; // 数据ID + + private String mDataMimeType; // 数据MIME类型 + + private String mDataContent; // 数据内容 + + private long mDataContentData1; // 数据内容数据1 + + private String mDataContentData3; // 数据内容数据3 + + private ContentValues mDiffDataValues; // 差异数据值 + + public SqlData(Context context) { + mContentResolver = context.getContentResolver(); // 获取内容解析器 + mIsCreate = true; // 设置为创建标志 + mDataId = INVALID_ID; // 初始化数据ID + mDataMimeType = DataConstants.NOTE; // 初始化数据MIME类型 + mDataContent = ""; // 初始化数据内容 + mDataContentData1 = 0; // 初始化数据内容数据1 + mDataContentData3 = ""; // 初始化数据内容数据3 + 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); // 从游标获取数据ID + mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN); // 从游标获取数据MIME类型 + mDataContent = c.getString(DATA_CONTENT_COLUMN); // 从游标获取数据内容 + mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN); // 从游标获取数据内容数据1 + mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN); // 从游标获取数据内容数据3 + } + + public void setContent(JSONObject js) throws JSONException { + long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID; // 获取JSON中的数据ID + if (mIsCreate || mDataId != dataId) { + mDiffDataValues.put(DataColumns.ID, dataId); // 更新差异数据值中的数据ID + } + mDataId = dataId; // 更新数据ID + + String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE) + : DataConstants.NOTE; // 获取JSON中的数据MIME类型 + if (mIsCreate || !mDataMimeType.equals(dataMimeType)) { + mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType); // 更新差异数据值中的数据MIME类型 + } + mDataMimeType = dataMimeType; // 更新数据MIME类型 + + String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : ""; // 获取JSON中的数据内容 + if (mIsCreate || !mDataContent.equals(dataContent)) { + mDiffDataValues.put(DataColumns.CONTENT, dataContent); // 更新差异数据值中的数据内容 + } + mDataContent = dataContent; // 更新数据内容 + + long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0; // 获取JSON中的数据内容数据1 + if (mIsCreate || mDataContentData1 != dataContentData1) { + mDiffDataValues.put(DataColumns.DATA1, dataContentData1); // 更新差异数据值中的数据内容数据1 + } + mDataContentData1 = dataContentData1; // 更新数据内容数据1 + + String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : ""; // 获取JSON中的数据内容数据3 + if (mIsCreate || !mDataContentData3.equals(dataContentData3)) { + mDiffDataValues.put(DataColumns.DATA3, dataContentData3); // 更新差异数据值中的数据内容数据3 + } + mDataContentData3 = dataContentData3; // 更新数据内容数据3 + } + + 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(); // 创建JSON对象 + js.put(DataColumns.ID, mDataId); // 将数据ID放入JSON对象 + js.put(DataColumns.MIME_TYPE, mDataMimeType); // 将数据MIME类型放入JSON对象 + js.put(DataColumns.CONTENT, mDataContent); // 将数据内容放入JSON对象 + js.put(DataColumns.DATA1, mDataContentData1); // 将数据内容数据1放入JSON对象 + js.put(DataColumns.DATA3, mDataContentData3); // 将数据内容数据3放入JSON对象 + return js; // 返回JSON对象 + } + + public void commit(long noteId, boolean validateVersion, long version) { + + if (mIsCreate) { + if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) { + mDiffDataValues.remove(DataColumns.ID); // 移除差异数据值中的数据ID + } + + mDiffDataValues.put(DataColumns.NOTE_ID, noteId); // 将笔记ID放入差异数据值 + Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues); // 插入数据 + try { + mDataId = Long.valueOf(uri.getPathSegments().get(1)); // 获取插入数据的ID + } 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; // 返回数据ID + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java new file mode 100644 index 0000000..b439eda --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/SqlNote.java @@ -0,0 +1,503 @@ +/* + * 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; + +// 导入所需的Android系统类 +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; + +// 导入JSON相关类 +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +// 导入Java工具类 +import java.util.ArrayList; + + +public class SqlNote { + private static final String TAG = SqlNote.class.getSimpleName(); // 日志标签 + + private static final int INVALID_ID = -99999; // 无效ID常量 + + // 笔记表的列名数组,用于数据库查询 + 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; // ID列索引 + public static final int ALERTED_DATE_COLUMN = 1; // 提醒日期列索引 + public static final int BG_COLOR_ID_COLUMN = 2; // 背景颜色ID列索引 + 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; // 父ID列索引 + public static final int SNIPPET_COLUMN = 8; // 摘要列索引 + public static final int TYPE_COLUMN = 9; // 类型列索引 + public static final int WIDGET_ID_COLUMN = 10; // 小部件ID列索引 + public static final int WIDGET_TYPE_COLUMN = 11; // 小部件类型列索引 + public static final int SYNC_ID_COLUMN = 12; // 同步ID列索引 + public static final int LOCAL_MODIFIED_COLUMN = 13; // 本地修改列索引 + public static final int ORIGIN_PARENT_ID_COLUMN = 14; // 原始父ID列索引 + public static final int GTASK_ID_COLUMN = 15; // GTask ID列索引 + public static final int VERSION_COLUMN = 16; // 版本列索引 + + // 类的成员变量 + private Context mContext; // 上下文对象 + private ContentResolver mContentResolver; // 内容解析器 + private boolean mIsCreate; // 是否是新建笔记 + private long mId; // 笔记ID + private long mAlertDate; // 提醒日期 + private int mBgColorId; // 背景颜色ID + private long mCreatedDate; // 创建日期 + private int mHasAttachment; // 是否有附件 + private long mModifiedDate; // 修改日期 + private long mParentId; // 父ID + private String mSnippet; // 摘要 + private int mType; // 类型 + private int mWidgetId; // 小部件ID + private int mWidgetType; // 小部件类型 + private long mOriginParent; // 原始父ID + 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(); + } + + // 构造函数,从Cursor加载笔记 + 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(); + } + + // 构造函数,根据ID加载笔记 + 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(); + + } + + // 根据ID从数据库加载笔记 + 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(); + } + } + + // 从Cursor加载笔记数据 + 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) { + // 对于文件夹类型,只能更新摘要和类型 + 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; + } + + // 获取笔记内容的JSON表示 + 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; + } + + // 设置父ID + public void setParentId(long id) { + mParentId = id; + mDiffNoteValues.put(NoteColumns.PARENT_ID, id); + } + + // 设置GTask ID + public void setGtaskId(String gid) { + mDiffNoteValues.put(NoteColumns.GTASK_ID, gid); + } + + // 设置同步ID + public void setSyncId(long syncId) { + mDiffNoteValues.put(NoteColumns.SYNC_ID, syncId); + } + + // 重置本地修改标记 + public void resetLocalModified() { + mDiffNoteValues.put(NoteColumns.LOCAL_MODIFIED, 0); + } + + // 获取笔记ID + public long getId() { + return mId; + } + + // 获取父ID + 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); + } + } + } + + // 刷新本地信息 + loadFromCursor(mId); + if (mType == Notes.TYPE_NOTE) + loadDataContent(); + + mDiffNoteValues.clear(); + mIsCreate = false; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java new file mode 100644 index 0000000..9962e6a --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/Task.java @@ -0,0 +1,428 @@ +/* + * 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; + +/** + * Task类表示一个Google Task任务 + */ +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; + + /** + * 构造函数,初始化Task对象 + */ + public Task() { + super(); + mCompleted = false; + mNotes = null; + mPriorSibling = null; + mParent = null; + mMetaInfo = null; + } + + /** + * 获取创建任务的JSON动作对象 + * @param actionId 动作ID + * @return 创建任务的JSON对象 + */ + 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; + } + + /** + * 获取更新任务的JSON动作对象 + * @param actionId 动作ID + * @return 更新任务的JSON对象 + */ + 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; + } + + /** + * 通过远程JSON设置任务内容 + * @param js 远程JSON对象 + */ + 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"); + } + } + } + + /** + * 通过本地JSON设置任务内容 + * @param js 本地JSON对象 + */ + 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(); + } + } + + /** + * 从内容获取本地JSON对象 + * @return 本地JSON对象 + */ + 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; + } + } + + /** + * 设置任务的元信息 + * @param metaData 元信息对象 + */ + 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; + } + } + } + + /** + * 获取同步动作 + * @param c 数据库游标 + * @return 同步动作类型 + */ + 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; + } + + /** + * 判断任务是否值得保存 + * @return 如果任务有内容返回true,否则返回false + */ + public boolean isWorthSaving() { + return mMetaInfo != null || (getName() != null && getName().trim().length() > 0) + || (getNotes() != null && getNotes().trim().length() > 0); + } + + /** + * 设置任务完成状态 + * @param completed 完成状态 + */ + public void setCompleted(boolean completed) { + this.mCompleted = completed; + } + + /** + * 设置任务备注 + * @param notes 备注内容 + */ + public void setNotes(String notes) { + this.mNotes = notes; + } + + /** + * 设置前一个兄弟任务 + * @param priorSibling 前一个兄弟任务 + */ + public void setPriorSibling(Task priorSibling) { + this.mPriorSibling = priorSibling; + } + + /** + * 设置父任务列表 + * @param parent 父任务列表 + */ + public void setParent(TaskList parent) { + this.mParent = parent; + } + + /** + * 获取任务完成状态 + * @return 任务完成状态 + */ + public boolean getCompleted() { + return this.mCompleted; + } + + /** + * 获取任务备注 + * @return 任务备注内容 + */ + public String getNotes() { + return this.mNotes; + } + + /** + * 获取前一个兄弟任务 + * @return 前一个兄弟任务 + */ + public Task getPriorSibling() { + return this.mPriorSibling; + } + + /** + * 获取父任务列表 + * @return 父任务列表 + */ + public TaskList getParent() { + return this.mParent; + } + +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java new file mode 100644 index 0000000..f774c32 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/data/TaskList.java @@ -0,0 +1,438 @@ +/* + * 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; + +/** + * TaskList类表示一个任务列表,继承自Node类 + */ +public class TaskList extends Node { + // 日志标签 + private static final String TAG = TaskList.class.getSimpleName(); + + // 任务列表索引 + private int mIndex; + + // 子任务列表 + private ArrayList mChildren; + + /** + * 构造函数,初始化TaskList对象 + */ + public TaskList() { + super(); + mChildren = new ArrayList(); + mIndex = 1; + } + + /** + * 获取创建任务列表的JSON动作对象 + * @param actionId 动作ID + * @return 创建任务列表的JSON对象 + */ + public JSONObject getCreateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // 设置动作类型为创建 + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_CREATE); + + // 设置动作ID + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // 设置索引 + js.put(GTaskStringUtils.GTASK_JSON_INDEX, mIndex); + + // 设置实体数据 + 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; + } + + /** + * 获取更新任务列表的JSON动作对象 + * @param actionId 动作ID + * @return 更新任务列表的JSON对象 + */ + public JSONObject getUpdateAction(int actionId) { + JSONObject js = new JSONObject(); + + try { + // 设置动作类型为更新 + js.put(GTaskStringUtils.GTASK_JSON_ACTION_TYPE, + GTaskStringUtils.GTASK_JSON_ACTION_TYPE_UPDATE); + + // 设置动作ID + js.put(GTaskStringUtils.GTASK_JSON_ACTION_ID, actionId); + + // 设置任务列表ID + js.put(GTaskStringUtils.GTASK_JSON_ID, getGid()); + + // 设置实体数据 + 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; + } + + /** + * 根据远程JSON数据设置任务列表内容 + * @param js 远程JSON数据 + */ + public void setContentByRemoteJSON(JSONObject js) { + if (js != null) { + try { + // 设置任务列表ID + if (js.has(GTaskStringUtils.GTASK_JSON_ID)) { + setGid(js.getString(GTaskStringUtils.GTASK_JSON_ID)); + } + + // 设置最后修改时间 + if (js.has(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)) { + setLastModified(js.getLong(GTaskStringUtils.GTASK_JSON_LAST_MODIFIED)); + } + + // 设置名称 + 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"); + } + } + } + + /** + * 根据本地JSON数据设置任务列表内容 + * @param js 本地JSON数据 + */ + 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(); + } + } + + /** + * 从内容生成本地JSON数据 + * @return 本地JSON对象 + */ + 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; + } + } + + /** + * 获取同步动作 + * @param c 数据库游标 + * @return 同步动作类型 + */ + public int getSyncAction(Cursor c) { + try { + if (c.getInt(SqlNote.LOCAL_MODIFIED_COLUMN) == 0) { + // 本地未修改 + if (c.getLong(SqlNote.SYNC_ID_COLUMN) == getLastModified()) { + // 双方都未更新 + return SYNC_ACTION_NONE; + } else { + // 应用远程更新到本地 + return SYNC_ACTION_UPDATE_LOCAL; + } + } else { + // 验证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()) { + // 仅本地修改 + return SYNC_ACTION_UPDATE_REMOTE; + } else { + // 对于文件夹冲突,仅应用本地修改 + return SYNC_ACTION_UPDATE_REMOTE; + } + } + } catch (Exception e) { + Log.e(TAG, e.toString()); + e.printStackTrace(); + } + + return SYNC_ACTION_ERROR; + } + + /** + * 获取子任务数量 + * @return 子任务数量 + */ + public int getChildTaskCount() { + return mChildren.size(); + } + + /** + * 添加子任务 + * @param task 要添加的任务 + * @return 是否添加成功 + */ + public boolean addChildTask(Task task) { + boolean ret = false; + if (task != null && !mChildren.contains(task)) { + ret = mChildren.add(task); + if (ret) { + // 设置前一个兄弟任务和父任务 + task.setPriorSibling(mChildren.isEmpty() ? null : mChildren + .get(mChildren.size() - 1)); + task.setParent(this); + } + } + return ret; + } + + /** + * 在指定位置添加子任务 + * @param task 要添加的任务 + * @param index 添加位置 + * @return 是否添加成功 + */ + 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); + + // 更新任务列表 + 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; + } + + /** + * 移除子任务 + * @param task 要移除的任务 + * @return 是否移除成功 + */ + public boolean removeChildTask(Task task) { + boolean ret = false; + int index = mChildren.indexOf(task); + if (index != -1) { + ret = mChildren.remove(task); + + if (ret) { + // 重置前一个兄弟任务和父任务 + task.setPriorSibling(null); + task.setParent(null); + + // 更新任务列表 + if (index != mChildren.size()) { + mChildren.get(index).setPriorSibling( + index == 0 ? null : mChildren.get(index - 1)); + } + } + } + return ret; + } + + /** + * 移动子任务到指定位置 + * @param task 要移动的任务 + * @param index 目标位置 + * @return 是否移动成功 + */ + 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)); + } + + /** + * 根据GID查找子任务 + * @param gid 任务GID + * @return 找到的任务,未找到返回null + */ + 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; + } + + /** + * 获取子任务的索引 + * @param task 子任务 + * @return 任务索引 + */ + public int getChildTaskIndex(Task task) { + return mChildren.indexOf(task); + } + + /** + * 根据索引获取子任务 + * @param index 任务索引 + * @return 子任务对象 + */ + public Task getChildTaskByIndex(int index) { + if (index < 0 || index >= mChildren.size()) { + Log.e(TAG, "getTaskByIndex: invalid index"); + return null; + } + return mChildren.get(index); + } + + /** + * 根据GID获取子任务 + * @param gid 任务GID + * @return 子任务对象 + */ + public Task getChilTaskByGid(String gid) { + for (Task task : mChildren) { + if (task.getGid().equals(gid)) + return task; + } + return null; + } + + /** + * 获取子任务列表 + * @return 子任务列表 + */ + public ArrayList getChildTaskList() { + return this.mChildren; + } + + /** + * 设置任务列表索引 + * @param index 索引值 + */ + public void setIndex(int index) { + this.mIndex = index; + } + + /** + * 获取任务列表索引 + * @return 索引值 + */ + public int getIndex() { + return this.mIndex; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java new file mode 100644 index 0000000..fe215d2 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/ActionFailureException.java @@ -0,0 +1,54 @@ +/* + * 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; + +/** + * Google Task操作失败异常类 + * 用于处理Google Task同步过程中的操作失败情况 + */ +public class ActionFailureException extends RuntimeException { + + /** + * 序列化ID + */ + private static final long serialVersionUID = 4425249765923293627L; + + /** + * 无参构造函数 + * 创建一个没有详细信息的ActionFailureException + */ + public ActionFailureException() { + super(); + } + + /** + * 带错误信息的构造函数 + * @param paramString 错误信息描述 + */ + public ActionFailureException(String paramString) { + super(paramString); + } + + /** + * 带错误信息和原因的构造函数 + * @param paramString 错误信息描述 + * @param paramThrowable 导致此异常的原因 + */ + public ActionFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java new file mode 100644 index 0000000..1023b1a --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/exception/NetworkFailureException.java @@ -0,0 +1,54 @@ +/* + * 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; + +/** + * 网络失败异常类 + * 用于处理Google Task同步过程中的网络连接失败情况 + */ +public class NetworkFailureException extends Exception { + + /** + * 序列化ID + */ + private static final long serialVersionUID = 2107610287180234136L; + + /** + * 无参构造函数 + * 创建一个没有详细信息的NetworkFailureException + */ + public NetworkFailureException() { + super(); + } + + /** + * 带错误信息的构造函数 + * @param paramString 错误信息描述 + */ + public NetworkFailureException(String paramString) { + super(paramString); + } + + /** + * 带错误信息和原因的构造函数 + * @param paramString 错误信息描述 + * @param paramThrowable 导致此异常的原因 + */ + public NetworkFailureException(String paramString, Throwable paramThrowable) { + super(paramString, paramThrowable); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java new file mode 100644 index 0000000..1c9cf18 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskASyncTask.java @@ -0,0 +1,170 @@ +/* + * 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; + +/** + * Google Task异步任务类 + * 用于在后台执行Google Task同步操作 + */ +public class GTaskASyncTask extends AsyncTask { + + // 通知ID + private static int GTASK_SYNC_NOTIFICATION_ID = 5234235; + + /** + * 同步完成监听器接口 + */ + public interface OnCompleteListener { + void onComplete(); + } + + // 上下文对象 + private Context mContext; + + // 通知管理器 + private NotificationManager mNotifiManager; + + // Google Task管理器 + private GTaskManager mTaskManager; + + // 同步完成监听器 + private OnCompleteListener mOnCompleteListener; + + /** + * 构造函数 + * @param context 上下文 + * @param listener 完成监听器 + */ + 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(); + } + + /** + * 发布同步进度 + * @param message 进度信息 + */ + public void publishProgess(String message) { + publishProgress(new String[] { + message + }); + } + + /** + * 显示通知 + * @param tickerId 通知标题资源ID + * @param content 通知内容 + */ + private void showNotification(int tickerId, String content) { + PendingIntent pendingIntent; + if (tickerId != R.string.ticker_success) { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesPreferenceActivity.class), 0); + + } else { + pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, + NotesListActivity.class), 0); + } + + // 创建通知 + Notification.Builder builder = new Notification.Builder(mContext) + .setAutoCancel(true) + .setContentTitle(mContext.getString(R.string.app_name)) + .setContentText(content) + .setContentIntent(pendingIntent) + .setWhen(System.currentTimeMillis()) + .setOngoing(true); + Notification notification=builder.getNotification(); + mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification); + } + + /** + * 后台执行同步操作 + * @param unused 未使用的参数 + * @return 同步状态码 + */ + @Override + protected Integer doInBackground(Void... unused) { + publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity + .getSyncAccountName(mContext))); + return mTaskManager.sync(mContext, this); + } + + /** + * 更新同步进度 + * @param progress 进度信息数组 + */ + @Override + protected void onProgressUpdate(String... progress) { + showNotification(R.string.ticker_syncing, progress[0]); + if (mContext instanceof GTaskSyncService) { + ((GTaskSyncService) mContext).sendBroadcast(progress[0]); + } + } + + /** + * 同步完成后的处理 + * @param result 同步结果状态码 + */ + @Override + protected void onPostExecute(Integer result) { + if (result == GTaskManager.STATE_SUCCESS) { + // 同步成功 + showNotification(R.string.ticker_success, mContext.getString( + R.string.success_sync_account, mTaskManager.getSyncAccount())); + NotesPreferenceActivity.setLastSyncTime(mContext, System.currentTimeMillis()); + } else if (result == GTaskManager.STATE_NETWORK_ERROR) { + // 网络错误 + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_network)); + } else if (result == GTaskManager.STATE_INTERNAL_ERROR) { + // 内部错误 + showNotification(R.string.ticker_fail, mContext.getString(R.string.error_sync_internal)); + } else if (result == GTaskManager.STATE_SYNC_CANCELLED) { + // 同步被取消 + showNotification(R.string.ticker_cancel, mContext + .getString(R.string.error_sync_cancelled)); + } + if (mOnCompleteListener != null) { + new Thread(new Runnable() { + public void run() { + mOnCompleteListener.onComplete(); + } + }).start(); + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java new file mode 100644 index 0000000..5ab4e3c --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskClient.java @@ -0,0 +1,682 @@ +/* + * 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; + +/** + * GTaskClient类用于处理与Google Tasks的同步交互 + * 实现了单例模式,提供了登录、创建任务、更新任务等功能 + */ +public class GTaskClient { + private static final String TAG = GTaskClient.class.getSimpleName(); + + // Google Tasks相关URL常量 + 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; + + // HTTP客户端 + private DefaultHttpClient mHttpClient; + + // 请求URL + 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; + } + + /** + * 获取GTaskClient的单例实例 + * @return GTaskClient实例 + */ + public static synchronized GTaskClient getInstance() { + if (mInstance == null) { + mInstance = new GTaskClient(); + } + return mInstance; + } + + /** + * 登录Google账户 + * @param activity 当前Activity + * @return 是否登录成功 + */ + public boolean login(Activity activity) { + // 检查登录是否过期(5分钟) + final long interval = 1000 * 60 * 5; + if (mLastLoginTime + interval < System.currentTimeMillis()) { + mLoggedin = false; + } + + // 切换账号后需要重新登录 + 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; + } + + // 如果是自定义域名,需要特殊处理登录URL + 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; + } + } + + // 尝试使用官方URL登录 + if (!mLoggedin) { + mGetUrl = GTASK_GET_URL; + mPostUrl = GTASK_POST_URL; + if (!tryToLoginGtask(activity, authToken)) { + return false; + } + } + + mLoggedin = true; + return true; + } + + /** + * 登录Google账户获取认证Token + * @param activity 当前Activity + * @param invalidateToken 是否使token失效 + * @return 认证Token + */ + 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; + } + + // 获取认证Token + 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; + } + + /** + * 尝试登录Google Tasks + * @param activity 当前Activity + * @param authToken 认证Token + * @return 是否登录成功 + */ + private boolean tryToLoginGtask(Activity activity, String authToken) { + if (!loginGtask(authToken)) { + // Token可能过期,尝试重新获取Token + 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; + } + + /** + * 使用Token登录Google Tasks + * @param authToken 认证Token + * @return 是否登录成功 + */ + 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); + + // 登录Google Tasks + try { + String loginUrl = mGetUrl + "?auth=" + authToken; + HttpGet httpGet = new HttpGet(loginUrl); + HttpResponse response = null; + response = mHttpClient.execute(httpGet); + + // 获取认证Cookie + 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"); + } + + // 获取客户端版本号 + 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) { + Log.e(TAG, "httpget gtask_url failed"); + return false; + } + + return true; + } + + /** + * 获取操作ID + * @return 操作ID + */ + private int getActionId() { + return mActionId++; + } + + /** + * 创建HTTP POST请求 + * @return HttpPost对象 + */ + 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; + } + + /** + * 获取HTTP响应内容 + * @param entity HTTP实体 + * @return 响应内容字符串 + * @throws IOException IO异常 + */ + 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(); + } + } + + /** + * 发送POST请求 + * @param js 请求JSON数据 + * @return 响应JSON对象 + * @throws NetworkFailureException 网络异常 + */ + 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); + + // 执行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"); + } + } + + /** + * 创建任务 + * @param task 任务对象 + * @throws NetworkFailureException 网络异常 + */ + 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); + + // 发送请求 + 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"); + } + } + + /** + * 创建任务列表 + * @param tasklist 任务列表对象 + * @throws NetworkFailureException 网络异常 + */ + 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); + + // 发送请求 + 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"); + } + } + + /** + * 提交更新 + * @throws NetworkFailureException 网络异常 + */ + 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"); + } + } + } + + /** + * 添加节点更新 + * @param node 节点对象 + * @throws NetworkFailureException 网络异常 + */ + public void addUpdateNode(Node node) throws NetworkFailureException { + if (node != null) { + // 更新项过多可能导致错误,最多10项 + if (mUpdateArray != null && mUpdateArray.length() > 10) { + commitUpdate(); + } + + if (mUpdateArray == null) + mUpdateArray = new JSONArray(); + mUpdateArray.put(node.getUpdateAction(getActionId())); + } + } + + /** + * 移动任务 + * @param task 任务对象 + * @param preParent 原父任务列表 + * @param curParent 目标父任务列表 + * @throws NetworkFailureException 网络异常 + */ + 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) { + // 仅当在同一任务列表内移动且不是第一个时添加prior_sibling_id + 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) { + // 仅当在不同任务列表间移动时添加dest_list + 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"); + } + } + + /** + * 删除节点 + * @param node 节点对象 + * @throws NetworkFailureException 网络异常 + */ + 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"); + } + } + + /** + * 获取任务列表 + * @return 任务列表JSON数组 + * @throws NetworkFailureException 网络异常 + */ + 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); + + // 获取任务列表 + 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"); + } + } + + /** + * 获取指定任务列表的任务 + * @param listGid 任务列表ID + * @return 任务JSON数组 + * @throws NetworkFailureException 网络异常 + */ + 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"); + } + } + + /** + * 获取同步账户 + * @return 同步账户对象 + */ + public Account getSyncAccount() { + return mAccount; + } + + /** + * 重置更新数组 + */ + public void resetUpdateArray() { + mUpdateArray = null; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java new file mode 100644 index 0000000..5c69917 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskManager.java @@ -0,0 +1,840 @@ +/* + * 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; + +/** + * GTaskManager类用于管理Google Tasks同步功能 + * 实现了本地笔记与Google Tasks的双向同步 + */ +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; // 用于获取认证Token的Activity + 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; // 本地删除ID集合 + private HashMap mGidToNid; // Google ID到本地Note ID的映射 + private HashMap mNidToGid; // 本地Note ID到Google ID的映射 + + /** + * 私有构造函数,初始化所有数据结构 + */ + 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(); + } + + /** + * 获取GTaskManager的单例实例 + */ + public static synchronized GTaskManager getInstance() { + if (mInstance == null) { + mInstance = new GTaskManager(); + } + return mInstance; + } + + /** + * 设置Activity上下文,用于获取认证Token + */ + public synchronized void setActivityContext(Activity activity) { + mActivity = activity; + } + + /** + * 执行同步操作 + * @param context 上下文 + * @param asyncTask 异步任务对象 + * @return 同步状态码 + */ + 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(); + + // 登录Google Tasks + if (!mCancelled) { + if (!client.login(mActivity)) { + throw new NetworkFailureException("login google task failed"); + } + } + + // 从Google获取任务列表 + asyncTask.publishProgess(mContext.getString(R.string.sync_progress_init_list)); + initGTaskList(); + + // 执行内容同步 + 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; + } + + /** + * 初始化Google Tasks列表 + * 获取远程任务列表并加载元数据 + */ + private void initGTaskList() throws NetworkFailureException { + if (mCancelled) + return; + GTaskClient client = GTaskClient.getInstance(); + try { + JSONArray jsTaskLists = client.getTaskLists(); + + // 首先初始化元数据列表 + 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); + + // 加载元数据 + 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); + } + } + } + } + } + + // 如果元数据列表不存在则创建 + if (mMetaList == null) { + mMetaList = new TaskList(); + mMetaList.setName(GTaskStringUtils.MIUI_FOLDER_PREFFIX + + GTaskStringUtils.FOLDER_META); + GTaskClient.getInstance().createTaskList(mMetaList); + } + + // 初始化任务列表 + 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); + + // 加载任务 + 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; + } + + // 处理本地已删除的笔记 + 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; + } + } + + // 先同步文件夹 + syncFolder(); + + // 处理数据库中已存在的笔记 + 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) { + // 本地新增 + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // 远程删除 + 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; + } + } + + // 处理剩余项目 + 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可能被其他线程设置,需要逐个检查 + // 清理本地删除表 + if (!mCancelled) { + if (!DataUtils.batchDeleteNotes(mContentResolver, mLocalDeleteIdMap)) { + throw new ActionFailureException("failed to batch-delete local deleted notes"); + } + } + + // 刷新本地同步ID + if (!mCancelled) { + GTaskClient.getInstance().commitUpdate(); + refreshLocalSyncId(); + } + + } + + /** + * 同步文件夹 + * 处理本地和远程文件夹的同步 + */ + private void syncFolder() throws NetworkFailureException { + Cursor c = null; + String gid; + Node node; + int syncType; + + if (mCancelled) { + return; + } + + // 处理根文件夹 + 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); + // 对于系统文件夹,仅在必要时更新远程名称 + 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; + } + } + + // 处理通话记录文件夹 + 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); + // 对于系统文件夹,仅在必要时更新远程名称 + 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; + } + } + + // 处理本地已存在的文件夹 + 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) { + // 本地新增 + syncType = Node.SYNC_ACTION_ADD_REMOTE; + } else { + // 远程删除 + 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; + } + } + + // 处理远程新增的文件夹 + 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(); + } + + /** + * 执行内容同步操作 + * @param syncType 同步类型 + * @param node 节点对象 + * @param c 数据库游标 + */ + 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: + // 合并双方的修改可能是个好主意 + // 目前简单使用本地更新 + updateRemoteNode(node, c); + break; + case Node.SYNC_ACTION_NONE: + break; + case Node.SYNC_ACTION_ERROR: + default: + throw new ActionFailureException("unknown sync action type"); + } + } + + /** + * 添加本地节点 + * @param node 要添加的节点 + */ + 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)) { + // ID不可用,需要创建新的 + 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)) { + // 数据ID不可用,需要创建新的 + 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()); + } + + // 创建本地节点 + sqlNote.setGtaskId(node.getGid()); + sqlNote.commit(false); + + // 更新gid-nid映射 + mGidToNid.put(node.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), node.getGid()); + + // 更新元数据 + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 更新本地节点 + * @param node 节点对象 + * @param c 数据库游标 + */ + private void updateLocalNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote; + // 在本地更新笔记 + 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); + + // 更新元数据信息 + updateRemoteMeta(node.getGid(), sqlNote); + } + + /** + * 添加远程节点 + * @param node 节点对象 + * @param c 数据库游标 + */ + private void addRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + Node n; + + // 远程更新 + 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; + + // 添加元数据 + updateRemoteMeta(task.getGid(), sqlNote); + } else { + TaskList tasklist = null; + + // 如果文件夹已存在则需要跳过 + 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; + } + } + + // 没有匹配项则可以添加 + if (tasklist == null) { + tasklist = new TaskList(); + tasklist.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().createTaskList(tasklist); + mGTaskListHashMap.put(tasklist.getGid(), tasklist); + } + n = (Node) tasklist; + } + + // 更新本地笔记 + sqlNote.setGtaskId(n.getGid()); + sqlNote.commit(false); + sqlNote.resetLocalModified(); + sqlNote.commit(true); + + // gid-id映射 + mGidToNid.put(n.getGid(), sqlNote.getId()); + mNidToGid.put(sqlNote.getId(), n.getGid()); + } + + /** + * 更新远程节点 + * @param node 节点对象 + * @param c 数据库游标 + */ + private void updateRemoteNode(Node node, Cursor c) throws NetworkFailureException { + if (mCancelled) { + return; + } + + SqlNote sqlNote = new SqlNote(mContext, c); + + // update remotely + node.setContentByLocalJSON(sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(node); + + // update meta + updateRemoteMeta(node.getGid(), sqlNote); + + // move task if necessary + if (sqlNote.isNoteType()) { + Task task = (Task) node; + TaskList preParentList = task.getParent(); + + String curParentGid = mNidToGid.get(sqlNote.getParentId()); + if (curParentGid == null) { + Log.e(TAG, "cannot find task's parent tasklist"); + throw new ActionFailureException("cannot update remote task"); + } + TaskList curParentList = mGTaskListHashMap.get(curParentGid); + + if (preParentList != curParentList) { + preParentList.removeChildTask(task); + curParentList.addChildTask(task); + GTaskClient.getInstance().moveTask(task, preParentList, curParentList); + } + } + + // clear local modified flag + sqlNote.resetLocalModified(); + sqlNote.commit(true); + } + + private void updateRemoteMeta(String gid, SqlNote sqlNote) throws NetworkFailureException { + if (sqlNote != null && sqlNote.isNoteType()) { + MetaData metaData = mMetaHashMap.get(gid); + if (metaData != null) { + metaData.setMeta(gid, sqlNote.getContent()); + GTaskClient.getInstance().addUpdateNode(metaData); + } else { + metaData = new MetaData(); + metaData.setMeta(gid, sqlNote.getContent()); + mMetaList.addChildTask(metaData); + mMetaHashMap.put(gid, metaData); + GTaskClient.getInstance().createTask(metaData); + } + } + } + + private void refreshLocalSyncId() throws NetworkFailureException { + if (mCancelled) { + return; + } + + // get the latest gtask list + mGTaskHashMap.clear(); + mGTaskListHashMap.clear(); + mMetaHashMap.clear(); + initGTaskList(); + + Cursor c = null; + try { + c = mContentResolver.query(Notes.CONTENT_NOTE_URI, SqlNote.PROJECTION_NOTE, + "(type<>? AND parent_id<>?)", new String[] { + String.valueOf(Notes.TYPE_SYSTEM), String.valueOf(Notes.ID_TRASH_FOLER) + }, NoteColumns.TYPE + " DESC"); + if (c != null) { + while (c.moveToNext()) { + String gid = c.getString(SqlNote.GTASK_ID_COLUMN); + Node node = mGTaskHashMap.get(gid); + if (node != null) { + mGTaskHashMap.remove(gid); + ContentValues values = new ContentValues(); + values.put(NoteColumns.SYNC_ID, node.getLastModified()); + mContentResolver.update(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, + c.getLong(SqlNote.ID_COLUMN)), values, null, null); + } else { + Log.e(TAG, "something is missed"); + throw new ActionFailureException( + "some local items don't have gid after sync"); + } + } + } else { + Log.w(TAG, "failed to query local note to refresh sync id"); + } + } finally { + if (c != null) { + c.close(); + c = null; + } + } + } + + public String getSyncAccount() { + return GTaskClient.getInstance().getSyncAccount().name; + } + + public void cancelSync() { + mCancelled = true; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java new file mode 100644 index 0000000..5d68b0b --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/gtask/remote/GTaskSyncService.java @@ -0,0 +1,188 @@ +/* + * 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; + +/** + * Google Tasks同步服务类 + * 负责管理与Google Tasks的同步操作,包括启动同步、取消同步等功能 + */ +public class GTaskSyncService extends Service { + /** Intent中同步动作的键名 */ + 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; + + /** 广播Action名称 */ + public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service"; + + /** 广播Extra:是否正在同步 */ + public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing"; + + /** 广播Extra:同步进度信息 */ + 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(); + } + } + + /** + * Service创建时的回调 + * 初始化同步任务为空 + */ + @Override + public void onCreate() { + mSyncTask = null; + } + + /** + * Service启动时的回调 + * 处理同步相关的Intent请求 + * @param intent 启动服务的Intent + * @param flags 启动标志 + * @param startId 启动ID + * @return 粘性服务的标志 + */ + @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(); + } + } + + /** + * 绑定Service时的回调 + * 本服务不支持绑定,返回null + */ + public IBinder onBind(Intent intent) { + return null; + } + + /** + * 发送同步状态广播 + * @param msg 同步进度信息 + */ + 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); + } + + /** + * 静态方法:启动同步 + * @param activity 当前Activity上下文 + */ + 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); + } + + /** + * 静态方法:取消同步 + * @param context 应用程序上下文 + */ + 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); + } + + /** + * 静态方法:判断是否正在同步 + * @return 是否有正在进行的同步任务 + */ + public static boolean isSyncing() { + return mSyncTask != null; + } + + /** + * 静态方法:获取当前同步进度信息 + * @return 同步进度信息字符串 + */ + public static String getProgressString() { + return mSyncProgress; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java b/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java new file mode 100644 index 0000000..42a4e41 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/model/Note.java @@ -0,0 +1,329 @@ +/* + * 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"; // 日志标签 + + /** + * 创建新笔记ID + * @param context 上下文 + * @param folderId 文件夹ID + * @return 新创建的笔记ID + */ + public static synchronized long getNewNoteId(Context context, long folderId) { + // 在数据库中创建新笔记 + 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(); + } + + /** + * 设置笔记值 + * @param key 键 + * @param value 值 + */ + public void setNoteValue(String key, String value) { + mNoteDiffValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + /** + * 设置文本数据 + * @param key 键 + * @param value 值 + */ + public void setTextData(String key, String value) { + mNoteData.setTextData(key, value); + } + + /** + * 设置文本数据ID + * @param id 文本数据ID + */ + public void setTextDataId(long id) { + mNoteData.setTextDataId(id); + } + + /** + * 获取文本数据ID + * @return 文本数据ID + */ + public long getTextDataId() { + return mNoteData.mTextDataId; + } + + /** + * 设置通话数据ID + * @param id 通话数据ID + */ + public void setCallDataId(long id) { + mNoteData.setCallDataId(id); + } + + /** + * 设置通话数据 + * @param key 键 + * @param value 值 + */ + public void setCallData(String key, String value) { + mNoteData.setCallData(key, value); + } + + /** + * 检查笔记是否在本地被修改 + * @return 是否被修改 + */ + public boolean isLocalModified() { + return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified(); + } + + /** + * 同步笔记到数据库 + * @param context 上下文 + * @param noteId 笔记ID + * @return 同步是否成功 + */ + public boolean syncNote(Context context, long noteId) { + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + if (!isLocalModified()) { + return true; + } + + /** + * 理论上,一旦数据改变,笔记应该在{@link NoteColumns#LOCAL_MODIFIED}和 + * {@link NoteColumns#MODIFIED_DATE}上更新。为了数据安全,即使更新笔记失败, + * 我们也会更新笔记数据信息 + */ + if (context.getContentResolver().update( + ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null, + null) == 0) { + Log.e(TAG, "Update note error, should not happen"); + // 不返回,继续执行 + } + mNoteDiffValues.clear(); + + if (mNoteData.isLocalModified() + && (mNoteData.pushIntoContentResolver(context, noteId) == null)) { + return false; + } + + return true; + } + + /** + * 笔记数据内部类,用于管理笔记的具体内容 + */ + private class NoteData { + private long mTextDataId; // 文本数据ID + private ContentValues mTextDataValues; // 文本数据值 + private long mCallDataId; // 通话数据ID + private ContentValues mCallDataValues; // 通话数据值 + private static final String TAG = "NoteData"; // 日志标签 + + /** + * 构造函数 + */ + public NoteData() { + mTextDataValues = new ContentValues(); + mCallDataValues = new ContentValues(); + mTextDataId = 0; + mCallDataId = 0; + } + + /** + * 检查数据是否在本地被修改 + * @return 是否被修改 + */ + boolean isLocalModified() { + return mTextDataValues.size() > 0 || mCallDataValues.size() > 0; + } + + /** + * 设置文本数据ID + * @param id 文本数据ID + */ + void setTextDataId(long id) { + if(id <= 0) { + throw new IllegalArgumentException("Text data id should larger than 0"); + } + mTextDataId = id; + } + + /** + * 设置通话数据ID + * @param id 通话数据ID + */ + void setCallDataId(long id) { + if (id <= 0) { + throw new IllegalArgumentException("Call data id should larger than 0"); + } + mCallDataId = id; + } + + /** + * 设置通话数据 + * @param key 键 + * @param value 值 + */ + void setCallData(String key, String value) { + mCallDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + /** + * 设置文本数据 + * @param key 键 + * @param value 值 + */ + void setTextData(String key, String value) { + mTextDataValues.put(key, value); + mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1); + mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis()); + } + + /** + * 将数据推送到ContentResolver + * @param context 上下文 + * @param noteId 笔记ID + * @return 操作结果URI + */ + Uri pushIntoContentResolver(Context context, long noteId) { + /** + * 安全检查 + */ + if (noteId <= 0) { + throw new IllegalArgumentException("Wrong note id:" + noteId); + } + + ArrayList operationList = new ArrayList(); + ContentProviderOperation.Builder builder = null; + + if(mTextDataValues.size() > 0) { + mTextDataValues.put(DataColumns.NOTE_ID, noteId); + if (mTextDataId == 0) { + mTextDataValues.put(DataColumns.MIME_TYPE, TextNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mTextDataValues); + try { + setTextDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new text data fail with noteId" + noteId); + mTextDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mTextDataId)); + builder.withValues(mTextDataValues); + operationList.add(builder.build()); + } + mTextDataValues.clear(); + } + + if(mCallDataValues.size() > 0) { + mCallDataValues.put(DataColumns.NOTE_ID, noteId); + if (mCallDataId == 0) { + mCallDataValues.put(DataColumns.MIME_TYPE, CallNote.CONTENT_ITEM_TYPE); + Uri uri = context.getContentResolver().insert(Notes.CONTENT_DATA_URI, + mCallDataValues); + try { + setCallDataId(Long.valueOf(uri.getPathSegments().get(1))); + } catch (NumberFormatException e) { + Log.e(TAG, "Insert new call data fail with noteId" + noteId); + mCallDataValues.clear(); + return null; + } + } else { + builder = ContentProviderOperation.newUpdate(ContentUris.withAppendedId( + Notes.CONTENT_DATA_URI, mCallDataId)); + builder.withValues(mCallDataValues); + operationList.add(builder.build()); + } + mCallDataValues.clear(); + } + + if (operationList.size() > 0) { + try { + ContentProviderResult[] results = context.getContentResolver().applyBatch( + Notes.AUTHORITY, operationList); + return (results == null || results.length == 0 || results[0] == null) ? null + : ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId); + } catch (RemoteException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } catch (OperationApplicationException e) { + Log.e(TAG, String.format("%s: %s", e.toString(), e.getMessage())); + return null; + } + } + return null; + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java b/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java new file mode 100644 index 0000000..3f1c33a --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/model/WorkingNote.java @@ -0,0 +1,503 @@ +/* + * 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 { + // 笔记对象 + private Note mNote; + // 笔记ID + private long mNoteId; + // 笔记内容 + private String mContent; + // 笔记模式(普通模式或清单模式) + private int mMode; + // 提醒时间 + private long mAlertDate; + // 修改时间 + private long mModifiedDate; + // 背景颜色ID + private int mBgColorId; + // 小部件ID + private int mWidgetId; + // 小部件类型 + private int mWidgetType; + // 文件夹ID + private long mFolderId; + // 上下文对象 + private Context mContext; + // 日志标签 + private static final String TAG = "WorkingNote"; + // 是否已删除标记 + private boolean mIsDeleted; + // 笔记设置变更监听器 + private NoteSettingChangedListener mNoteSettingStatusListener; + + /** + * 数据表查询的列定义 + */ + public static final String[] DATA_PROJECTION = new String[] { + DataColumns.ID, + DataColumns.CONTENT, + 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; + + /** + * 创建新笔记的构造函数 + * @param context 上下文对象 + * @param folderId 文件夹ID + */ + private WorkingNote(Context context, long folderId) { + mContext = context; + mAlertDate = 0; + mModifiedDate = System.currentTimeMillis(); + mFolderId = folderId; + mNote = new Note(); + mNoteId = 0; + mIsDeleted = false; + mMode = 0; + mWidgetType = Notes.TYPE_WIDGET_INVALIDE; + } + + /** + * 加载已有笔记的构造函数 + * @param context 上下文对象 + * @param noteId 笔记ID + * @param folderId 文件夹ID + */ + 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); + } + } + + /** + * 创建空白笔记 + * @param context 上下文对象 + * @param folderId 文件夹ID + * @param widgetId 小部件ID + * @param widgetType 小部件类型 + * @param defaultBgColorId 默认背景色ID + * @return 新创建的工作笔记对象 + */ + public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + int widgetType, int defaultBgColorId) { + WorkingNote note = new WorkingNote(context, folderId); + note.setBgColorId(defaultBgColorId); + note.setWidgetId(widgetId); + note.setWidgetType(widgetType); + return note; + } + + /** + * 加载已有笔记 + * @param context 上下文对象 + * @param id 笔记ID + * @return 加载的工作笔记对象 + */ + public static WorkingNote load(Context context, long id) { + return new WorkingNote(context, id, 0); + } + + /** + * 保存笔记 + * @return 是否保存成功 + */ + public synchronized boolean saveNote() { + if (isWorthSaving()) { + if (!existInDatabase()) { + if ((mNoteId = Note.getNewNoteId(mContext, mFolderId)) == 0) { + Log.e(TAG, "Create new note fail with id:" + mNoteId); + return false; + } + } + + mNote.syncNote(mContext, mNoteId); + + /** + * 如果笔记有关联的小部件,更新小部件内容 + */ + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE + && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + return true; + } else { + return false; + } + } + + /** + * 判断笔记是否已存在于数据库 + * @return 是否存在 + */ + public boolean existInDatabase() { + return mNoteId > 0; + } + + /** + * 判断笔记是否值得保存 + * @return 是否值得保存 + */ + private boolean isWorthSaving() { + if (mIsDeleted || (!existInDatabase() && TextUtils.isEmpty(mContent)) + || (existInDatabase() && !mNote.isLocalModified())) { + return false; + } else { + return true; + } + } + + /** + * 设置笔记设置变更监听器 + * @param l 监听器对象 + */ + public void setOnSettingStatusChangedListener(NoteSettingChangedListener l) { + mNoteSettingStatusListener = l; + } + + /** + * 设置提醒时间 + * @param date 提醒时间 + * @param set 是否设置提醒 + */ + public void setAlertDate(long date, boolean set) { + if (date != mAlertDate) { + mAlertDate = date; + mNote.setNoteValue(NoteColumns.ALERTED_DATE, String.valueOf(mAlertDate)); + } + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onClockAlertChanged(date, set); + } + } + + /** + * 标记笔记是否删除 + * @param mark 是否删除 + */ + public void markDeleted(boolean mark) { + mIsDeleted = mark; + if (mWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID + && mWidgetType != Notes.TYPE_WIDGET_INVALIDE && mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onWidgetChanged(); + } + } + + /** + * 设置背景颜色ID + * @param id 颜色ID + */ + public void setBgColorId(int id) { + if (id != mBgColorId) { + mBgColorId = id; + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onBackgroundColorChanged(); + } + mNote.setNoteValue(NoteColumns.BG_COLOR_ID, String.valueOf(id)); + } + } + + /** + * 设置清单模式 + * @param mode 模式值 + */ + public void setCheckListMode(int mode) { + if (mMode != mode) { + if (mNoteSettingStatusListener != null) { + mNoteSettingStatusListener.onCheckListModeChanged(mMode, mode); + } + mMode = mode; + mNote.setTextData(TextNote.MODE, String.valueOf(mMode)); + } + } + + /** + * 设置小部件类型 + * @param type 小部件类型 + */ + public void setWidgetType(int type) { + if (type != mWidgetType) { + mWidgetType = type; + mNote.setNoteValue(NoteColumns.WIDGET_TYPE, String.valueOf(mWidgetType)); + } + } + + /** + * 设置小部件ID + * @param id 小部件ID + */ + public void setWidgetId(int id) { + if (id != mWidgetId) { + mWidgetId = id; + mNote.setNoteValue(NoteColumns.WIDGET_ID, String.valueOf(mWidgetId)); + } + } + + /** + * 设置笔记文本内容 + * @param text 文本内容 + */ + public void setWorkingText(String text) { + if (!TextUtils.equals(mContent, text)) { + mContent = text; + mNote.setTextData(DataColumns.CONTENT, mContent); + } + } + + /** + * 将笔记转换为通话记录笔记 + * @param phoneNumber 电话号码 + * @param callDate 通话时间 + */ + public void convertToCallNote(String phoneNumber, long callDate) { + mNote.setCallData(CallNote.CALL_DATE, String.valueOf(callDate)); + mNote.setCallData(CallNote.PHONE_NUMBER, phoneNumber); + mNote.setNoteValue(NoteColumns.PARENT_ID, String.valueOf(Notes.ID_CALL_RECORD_FOLDER)); + } + + /** + * 判断是否设置了闹钟提醒 + * @return 是否有提醒 + */ + public boolean hasClockAlert() { + return (mAlertDate > 0 ? true : false); + } + + /** + * 获取笔记内容 + * @return 笔记内容 + */ + public String getContent() { + return mContent; + } + + /** + * 获取提醒时间 + * @return 提醒时间 + */ + public long getAlertDate() { + return mAlertDate; + } + + /** + * 获取修改时间 + * @return 修改时间 + */ + public long getModifiedDate() { + return mModifiedDate; + } + + /** + * 获取背景颜色资源ID + * @return 背景颜色资源ID + */ + public int getBgColorResId() { + return NoteBgResources.getNoteBgResource(mBgColorId); + } + + /** + * 获取背景颜色ID + * @return 背景颜色ID + */ + public int getBgColorId() { + return mBgColorId; + } + + /** + * 获取标题背景资源ID + * @return 标题背景资源ID + */ + public int getTitleBgResId() { + return NoteBgResources.getNoteTitleBgResource(mBgColorId); + } + + /** + * 获取清单模式 + * @return 清单模式值 + */ + public int getCheckListMode() { + return mMode; + } + + /** + * 获取笔记ID + * @return 笔记ID + */ + public long getNoteId() { + return mNoteId; + } + + /** + * 获取文件夹ID + * @return 文件夹ID + */ + public long getFolderId() { + return mFolderId; + } + + /** + * 获取小部件ID + * @return 小部件ID + */ + public int getWidgetId() { + return mWidgetId; + } + + /** + * 获取小部件类型 + * @return 小部件类型 + */ + public int getWidgetType() { + return mWidgetType; + } + + /** + * 笔记设置变更监听器接口 + */ + public interface NoteSettingChangedListener { + /** + * 当笔记背景颜色改变时调用 + */ + void onBackgroundColorChanged(); + + /** + * 当设置闹钟提醒时调用 + * @param date 提醒时间 + * @param set 是否设置提醒 + */ + void onClockAlertChanged(long date, boolean set); + + /** + * 当小部件改变时调用 + */ + void onWidgetChanged(); + + /** + * 当在清单模式和普通模式间切换时调用 + * @param oldMode 切换前的模式 + * @param newMode 切换后的模式 + */ + void onCheckListModeChanged(int oldMode, int newMode); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java new file mode 100644 index 0000000..f70c033 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/BackupUtils.java @@ -0,0 +1,390 @@ +/* + * 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"; + + // 单例模式相关变量 + private static BackupUtils sInstance; + + /** + * 获取BackupUtils单例实例 + * @param context 上下文对象 + * @return BackupUtils实例 + */ + public static synchronized BackupUtils getInstance(Context context) { + if (sInstance == null) { + sInstance = new BackupUtils(context); + } + return sInstance; + } + + /** + * 以下状态常量用于表示备份或恢复的状态 + */ + // SD卡未挂载 + public static final int STATE_SD_CARD_UNMOUONTED = 0; + // 备份文件不存在 + public static final int STATE_BACKUP_FILE_NOT_EXIST = 1; + // 数据已损坏,可能被其他程序修改 + public static final int STATE_DATA_DESTROIED = 2; + // 系统运行时错误导致备份或恢复失败 + public static final int STATE_SYSTEM_ERROR = 3; + // 备份或恢复成功 + public static final int STATE_SUCCESS = 4; + + private TextExport mTextExport; + + /** + * 私有构造方法 + * @param context 上下文对象 + */ + private BackupUtils(Context context) { + mTextExport = new TextExport(context); + } + + /** + * 检查外部存储是否可用 + * @return 外部存储是否可用 + */ + private static boolean externalStorageAvailable() { + return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()); + } + + /** + * 导出笔记到文本文件 + * @return 导出状态码 + */ + public int exportToText() { + return mTextExport.exportToText(); + } + + /** + * 获取导出的文本文件名 + * @return 文件名 + */ + public String getExportedTextFileName() { + return mTextExport.mFileName; + } + + /** + * 获取导出的文本文件目录 + * @return 文件目录 + */ + public String getExportedTextFileDir() { + return mTextExport.mFileDirectory; + } + + /** + * 文本导出内部类,处理具体的导出逻辑 + */ + private static class TextExport { + // 笔记查询的列投影 + private static final String[] NOTE_PROJECTION = { + NoteColumns.ID, + NoteColumns.MODIFIED_DATE, + 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; + + /** + * 构造方法 + * @param context 上下文对象 + */ + public TextExport(Context context) { + TEXT_FORMAT = context.getResources().getStringArray(R.array.format_for_exported_note); + mContext = context; + mFileName = ""; + mFileDirectory = ""; + } + + /** + * 获取格式化字符串 + * @param id 格式ID + * @return 格式化字符串 + */ + private String getFormat(int id) { + return TEXT_FORMAT[id]; + } + + /** + * 导出指定文件夹下的笔记到文本 + * @param folderId 文件夹ID + * @param ps 输出流 + */ + private void exportFolderToText(String folderId, PrintStream ps) { + // 查询属于该文件夹的笔记 + 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 { + // 打印笔记的最后修改日期 + ps.println(String.format(getFormat(FORMAT_NOTE_DATE), DateFormat.format( + mContext.getString(R.string.format_datetime_mdhm), + notesCursor.getLong(NOTE_COLUMN_MODIFIED_DATE)))); + // 查询该笔记的数据并导出 + String noteId = notesCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (notesCursor.moveToNext()); + } + notesCursor.close(); + } + } + + /** + * 导出指定ID的笔记到输出流 + * @param noteId 笔记ID + * @param ps 输出流 + */ + 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)) { + // 导出通话记录类型的笔记 + 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)); + } + // 打印通话日期 + ps.println(String.format(getFormat(FORMAT_NOTE_CONTENT), DateFormat + .format(mContext.getString(R.string.format_datetime_mdhm), + callDate))); + // 打印通话位置 + 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(); + } + // 在笔记之间打印分隔符 + try { + ps.write(new byte[] { + Character.LINE_SEPARATOR, Character.LETTER_NUMBER + }); + } catch (IOException e) { + Log.e(TAG, e.toString()); + } + } + + /** + * 将笔记导出为用户可读的文本格式 + * @return 导出状态码 + */ + 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; + } + // 首先导出文件夹及其笔记 + 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 { + // 打印文件夹名称 + 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(); + } + + // 导出根目录下的笔记 + 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)))); + // 查询并导出笔记数据 + String noteId = noteCursor.getString(NOTE_COLUMN_ID); + exportNoteToText(noteId, ps); + } while (noteCursor.moveToNext()); + } + noteCursor.close(); + } + ps.close(); + + return STATE_SUCCESS; + } + + /** + * 获取指向导出文本文件的打印流 + * @return PrintStream对象 + */ + 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; + } + } + + /** + * 在SD卡上生成用于存储导出数据的文本文件 + * @param context 上下文对象 + * @param filePathResId 文件路径资源ID + * @param fileNameFormatResId 文件名格式资源ID + * @return 生成的文件对象,失败返回null + */ + private static File generateFileMountedOnSDcard(Context context, int filePathResId, int fileNameFormatResId) { + StringBuilder sb = new StringBuilder(); + sb.append(Environment.getExternalStorageDirectory()); + sb.append(context.getString(filePathResId)); + File filedir = new File(sb.toString()); + sb.append(context.getString( + fileNameFormatResId, + DateFormat.format(context.getString(R.string.format_date_ymd), + System.currentTimeMillis()))); + File file = new File(sb.toString()); + + try { + if (!filedir.exists()) { + filedir.mkdir(); + } + if (!file.exists()) { + file.createNewFile(); + } + return file; + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java new file mode 100644 index 0000000..13d257e --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/DataUtils.java @@ -0,0 +1,378 @@ +/* + * 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"; + + /** + * 批量删除笔记 + * @param resolver ContentResolver对象 + * @param ids 要删除的笔记ID集合 + * @return 删除是否成功 + */ + public static boolean batchDeleteNotes(ContentResolver resolver, HashSet ids) { + if (ids == null) { + Log.d(TAG, "the ids is null"); + 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; + } + + /** + * 将笔记移动到指定文件夹 + * @param resolver ContentResolver对象 + * @param id 笔记ID + * @param srcFolderId 源文件夹ID + * @param desFolderId 目标文件夹ID + */ + public static void moveNoteToFoler(ContentResolver resolver, long id, long srcFolderId, long desFolderId) { + ContentValues values = new ContentValues(); + values.put(NoteColumns.PARENT_ID, desFolderId); + 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); + } + + /** + * 批量移动笔记到指定文件夹 + * @param resolver ContentResolver对象 + * @param ids 要移动的笔记ID集合 + * @param folderId 目标文件夹ID + * @return 移动是否成功 + */ + 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; + } + + /** + * 获取用户文件夹数量(不包括系统文件夹) + * @param resolver ContentResolver对象 + * @return 用户文件夹数量 + */ + 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; + } + + /** + * 检查指定ID和类型的笔记是否可见(不在回收站中) + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @param type 笔记类型 + * @return 笔记是否可见 + */ + public static boolean visibleInNoteDatabase(ContentResolver resolver, long noteId, int type) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, + 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; + } + + /** + * 检查指定ID的笔记是否存在于数据库中 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 笔记是否存在 + */ + public static boolean existInNoteDatabase(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + /** + * 检查指定ID的数据是否存在于数据库中 + * @param resolver ContentResolver对象 + * @param dataId 数据ID + * @return 数据是否存在 + */ + public static boolean existInDataDatabase(ContentResolver resolver, long dataId) { + Cursor cursor = resolver.query(ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), + null, null, null, null); + + boolean exist = false; + if (cursor != null) { + if (cursor.getCount() > 0) { + exist = true; + } + cursor.close(); + } + return exist; + } + + /** + * 检查指定名称的可见文件夹是否存在 + * @param resolver ContentResolver对象 + * @param name 文件夹名称 + * @return 文件夹是否存在 + */ + public static boolean checkVisibleFolderName(ContentResolver resolver, String name) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, null, + NoteColumns.TYPE + "=" + Notes.TYPE_FOLDER + + " 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; + } + + /** + * 获取指定文件夹下所有笔记的小部件属性 + * @param resolver ContentResolver对象 + * @param folderId 文件夹ID + * @return 小部件属性集合 + */ + public static HashSet getFolderNoteWidget(ContentResolver resolver, long folderId) { + Cursor c = resolver.query(Notes.CONTENT_NOTE_URI, + new String[] { NoteColumns.WIDGET_ID, NoteColumns.WIDGET_TYPE }, + 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; + } + + /** + * 根据笔记ID获取通话号码 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 通话号码 + */ + public static String getCallNumberByNoteId(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.PHONE_NUMBER }, + 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 ""; + } + + /** + * 根据电话号码和通话日期获取笔记ID + * @param resolver ContentResolver对象 + * @param phoneNumber 电话号码 + * @param callDate 通话日期 + * @return 笔记ID + */ + public static long getNoteIdByPhoneNumberAndCallDate(ContentResolver resolver, String phoneNumber, long callDate) { + Cursor cursor = resolver.query(Notes.CONTENT_DATA_URI, + new String [] { CallNote.NOTE_ID }, + 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; + } + + /** + * 根据笔记ID获取笔记摘要 + * @param resolver ContentResolver对象 + * @param noteId 笔记ID + * @return 笔记摘要 + */ + public static String getSnippetById(ContentResolver resolver, long noteId) { + Cursor cursor = resolver.query(Notes.CONTENT_NOTE_URI, + new String [] { NoteColumns.SNIPPET }, + 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); + } + + /** + * 格式化笔记摘要,去除首尾空格并截取第一行 + * @param snippet 原始摘要 + * @return 格式化后的摘要 + */ + public static String getFormattedSnippet(String snippet) { + if (snippet != null) { + snippet = snippet.trim(); + int index = snippet.indexOf('\n'); + if (index != -1) { + snippet = snippet.substring(0, index); + } + } + return snippet; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java new file mode 100644 index 0000000..cf5ae7b --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/GTaskStringUtils.java @@ -0,0 +1,167 @@ +/* + * 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; + +/** + * Google Tasks同步功能相关的字符串常量工具类 + * 包含了与Google Tasks API交互时使用的JSON字段名称常量 + */ +public class GTaskStringUtils { + + // 操作相关的JSON字段 + /** 操作ID */ + public final static String GTASK_JSON_ACTION_ID = "action_id"; + + /** 操作列表 */ + public final static String GTASK_JSON_ACTION_LIST = "action_list"; + + /** 操作类型 */ + public final static String GTASK_JSON_ACTION_TYPE = "action_type"; + + /** 创建操作类型 */ + public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create"; + + /** 获取所有数据操作类型 */ + public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all"; + + /** 移动操作类型 */ + public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move"; + + /** 更新操作类型 */ + public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update"; + + // 任务实体相关的JSON字段 + /** 创建者ID */ + public final static String GTASK_JSON_CREATOR_ID = "creator_id"; + + /** 子实体 */ + public final static String GTASK_JSON_CHILD_ENTITY = "child_entity"; + + /** 客户端版本 */ + public final static String GTASK_JSON_CLIENT_VERSION = "client_version"; + + /** 是否完成 */ + public final static String GTASK_JSON_COMPLETED = "completed"; + + /** 当前列表ID */ + public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id"; + + /** 默认列表ID */ + public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id"; + + /** 是否已删除 */ + public final static String GTASK_JSON_DELETED = "deleted"; + + /** 目标列表 */ + public final static String GTASK_JSON_DEST_LIST = "dest_list"; + + /** 目标父节点 */ + public final static String GTASK_JSON_DEST_PARENT = "dest_parent"; + + /** 目标父节点类型 */ + public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type"; + + /** 实体变更 */ + public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta"; + + /** 实体类型 */ + public final static String GTASK_JSON_ENTITY_TYPE = "entity_type"; + + /** 是否获取已删除项 */ + public final static String GTASK_JSON_GET_DELETED = "get_deleted"; + + /** ID字段 */ + public final static String GTASK_JSON_ID = "id"; + + /** 索引 */ + public final static String GTASK_JSON_INDEX = "index"; + + /** 最后修改时间 */ + public final static String GTASK_JSON_LAST_MODIFIED = "last_modified"; + + /** 最新同步点 */ + public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point"; + + /** 列表ID */ + public final static String GTASK_JSON_LIST_ID = "list_id"; + + /** 列表集合 */ + public final static String GTASK_JSON_LISTS = "lists"; + + /** 名称 */ + public final static String GTASK_JSON_NAME = "name"; + + /** 新ID */ + public final static String GTASK_JSON_NEW_ID = "new_id"; + + /** 笔记集合 */ + public final static String GTASK_JSON_NOTES = "notes"; + + /** 父ID */ + public final static String GTASK_JSON_PARENT_ID = "parent_id"; + + /** 前一个兄弟节点ID */ + public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id"; + + /** 结果集 */ + public final static String GTASK_JSON_RESULTS = "results"; + + /** 源列表 */ + public final static String GTASK_JSON_SOURCE_LIST = "source_list"; + + /** 任务集合 */ + public final static String GTASK_JSON_TASKS = "tasks"; + + /** 类型 */ + public final static String GTASK_JSON_TYPE = "type"; + + /** 组类型 */ + public final static String GTASK_JSON_TYPE_GROUP = "GROUP"; + + /** 任务类型 */ + public final static String GTASK_JSON_TYPE_TASK = "TASK"; + + /** 用户 */ + public final static String GTASK_JSON_USER = "user"; + + // MIUI笔记相关的常量 + /** MIUI笔记文件夹前缀 */ + public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]"; + + /** 默认文件夹名称 */ + public final static String FOLDER_DEFAULT = "Default"; + + /** 通话记录文件夹名称 */ + public final static String FOLDER_CALL_NOTE = "Call_Note"; + + /** 元数据文件夹名称 */ + public final static String FOLDER_META = "METADATA"; + + // 元数据相关的常量 + /** 元数据Google Task ID标识 */ + public final static String META_HEAD_GTASK_ID = "meta_gid"; + + /** 元数据笔记标识 */ + public final static String META_HEAD_NOTE = "meta_note"; + + /** 元数据内容标识 */ + public final static String META_HEAD_DATA = "meta_data"; + + /** 元数据笔记名称 */ + public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE"; + +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java new file mode 100644 index 0000000..aa58739 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/tool/ResourceParser.java @@ -0,0 +1,259 @@ +/* + * 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 + }; + + /** + * 获取笔记编辑界面的背景资源 + * @param id 背景颜色ID + * @return 对应的背景资源ID + */ + public static int getNoteBgResource(int id) { + return BG_EDIT_RESOURCES[id]; + } + + /** + * 获取笔记标题栏的背景资源 + * @param id 背景颜色ID + * @return 对应的标题栏背景资源ID + */ + public static int getNoteTitleBgResource(int id) { + return BG_EDIT_TITLE_RESOURCES[id]; + } + } + + /** + * 获取默认的背景颜色ID + * 如果用户设置了随机背景色,则随机返回一个颜色ID + * 否则返回默认的黄色 + * @param context 上下文对象 + * @return 背景颜色ID + */ + public static int getDefaultBgId(Context context) { + if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean( + NotesPreferenceActivity.PREFERENCE_SET_BG_COLOR_KEY, false)) { + 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; + } + } + + /** + * Widget小部件背景资源管理内部类 + * 管理2x和4x大小Widget的背景资源 + */ + public static class WidgetBgResources { + // 2x大小Widget的背景资源 + private final static int[] BG_2X_RESOURCES = new int[]{ + R.drawable.widget_2x_yellow, + R.drawable.widget_2x_blue, + R.drawable.widget_2x_white, + R.drawable.widget_2x_green, + R.drawable.widget_2x_red, + }; + + /** + * 获取2x大小Widget的背景资源 + */ + public static int getWidget2xBgResource(int id) { + return BG_2X_RESOURCES[id]; + } + + // 4x大小Widget的背景资源 + private final static int[] BG_4X_RESOURCES = new int[]{ + R.drawable.widget_4x_yellow, + R.drawable.widget_4x_blue, + R.drawable.widget_4x_white, + R.drawable.widget_4x_green, + R.drawable.widget_4x_red + }; + + /** + * 获取4x大小Widget的背景资源 + */ + public static int getWidget4xBgResource(int id) { + return BG_4X_RESOURCES[id]; + } + } + + /** + * 文本外观资源管理内部类 + * 管理不同大小的文本样式资源 + */ + public static class TextAppearanceResources { + // 文本外观资源数组 + private final static int[] TEXTAPPEARANCE_RESOURCES = new int[]{ + R.style.TextAppearanceNormal, + R.style.TextAppearanceMedium, + R.style.TextAppearanceLarge, + R.style.TextAppearanceSuper + }; + + /** + * 获取文本外观资源 + * @param id 字体大小ID + * @return 对应的文本样式资源ID + */ + public static int getTexAppearanceResource(int id) { + /** + * HACKME: 修复在SharedPreference中存储资源ID的bug + * 如果ID大于等于资源数组长度,返回默认字体大小 + */ + if (id >= TEXTAPPEARANCE_RESOURCES.length) { + return BG_DEFAULT_FONT_SIZE; + } + return TEXTAPPEARANCE_RESOURCES[id]; + } + + /** + * 获取文本外观资源的总数 + */ + public static int getResourcesSize() { + return TEXTAPPEARANCE_RESOURCES.length; + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java new file mode 100644 index 0000000..68c208f --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmAlertActivity.java @@ -0,0 +1,199 @@ +/* + * 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 { + // 笔记ID + private long mNoteId; + // 笔记摘要内容 + private String mSnippet; + // 摘要预览最大长度 + private static final int SNIPPET_PREW_MAX_LEN = 60; + // 媒体播放器 + MediaPlayer mPlayer; + + /** + * 活动创建时的回调方法 + * 初始化窗口参数、获取笔记信息并显示提醒 + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + final Window win = getWindow(); + // 设置锁屏时显示 + win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); + + // 如果屏幕关闭,添加额外窗口标志 + if (!isScreenOn()) { + win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); + } + + Intent intent = getIntent(); + + try { + // 获取笔记ID和内容摘要 + mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); + mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + // 如果摘要过长则截取 + mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, + SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) + : mSnippet; + } catch (IllegalArgumentException e) { + e.printStackTrace(); + return; + } + + mPlayer = new MediaPlayer(); + // 检查笔记是否可见,如果可见则显示提醒 + if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { + showActionDialog(); + playAlarmSound(); + } else { + finish(); + } + } + + /** + * 检查屏幕是否点亮 + * @return 屏幕是否处于点亮状态 + */ + private boolean isScreenOn() { + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + return pm.isScreenOn(); + } + + /** + * 播放闹钟提醒音乐 + * 获取系统默认闹钟铃声并循环播放 + */ + private void playAlarmSound() { + Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); + + // 获取静音模式影响的音频流 + int silentModeStreams = Settings.System.getInt(getContentResolver(), + Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); + + // 设置音频流类型 + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { + mPlayer.setAudioStreamType(silentModeStreams); + } else { + mPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); + } + try { + mPlayer.setDataSource(this, url); + mPlayer.prepare(); + mPlayer.setLooping(true); + mPlayer.start(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (IllegalStateException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 显示提醒对话框 + * 包含笔记摘要内容和操作按钮 + */ + private void showActionDialog() { + AlertDialog.Builder dialog = new AlertDialog.Builder(this); + dialog.setTitle(R.string.app_name); + dialog.setMessage(mSnippet); + dialog.setPositiveButton(R.string.notealert_ok, this); + // 屏幕点亮时显示进入按钮 + if (isScreenOn()) { + dialog.setNegativeButton(R.string.notealert_enter, this); + } + dialog.show().setOnDismissListener(this); + } + + /** + * 对话框按钮点击事件处理 + * @param dialog 对话框 + * @param which 按钮类型 + */ + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_NEGATIVE: + // 点击进入按钮,打开笔记编辑界面 + Intent intent = new Intent(this, NoteEditActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.putExtra(Intent.EXTRA_UID, mNoteId); + 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/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java new file mode 100644 index 0000000..7426f28 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmInitReceiver.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.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, // 笔记ID + NoteColumns.ALERTED_DATE // 提醒时间 + }; + + /** + * 查询结果列的索引常量 + */ + private static final int COLUMN_ID = 0; // ID列索引 + private static final int COLUMN_ALERTED_DATE = 1; // 提醒时间列索引 + + /** + * 接收广播时的回调方法 + * 查询所有未到期的提醒笔记,并设置对应的闹钟 + * @param context 上下文对象 + * @param intent 接收到的Intent + */ + @Override + public void onReceive(Context context, Intent intent) { + // 获取当前系统时间 + long currentDate = System.currentTimeMillis(); + + // 查询所有未到期的提醒笔记 + Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, + new String[] { String.valueOf(currentDate) }, + null); + + if (c != null) { + if (c.moveToFirst()) { + do { + // 获取提醒时间 + long alertDate = c.getLong(COLUMN_ALERTED_DATE); + + // 创建闹钟广播的Intent + Intent sender = new Intent(context, AlarmReceiver.class); + sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + + // 创建PendingIntent + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); + + // 获取闹钟管理器服务 + AlarmManager alermManager = (AlarmManager) context + .getSystemService(Context.ALARM_SERVICE); + + // 设置闹钟 + alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + } while (c.moveToNext()); + } + // 关闭游标 + c.close(); + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java new file mode 100644 index 0000000..dcad7d1 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/AlarmReceiver.java @@ -0,0 +1,44 @@ +/* + * 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 { + + /** + * 接收闹钟广播时的回调方法 + * 启动闹钟提醒活动(AlarmAlertActivity) + * @param context 上下文对象 + * @param intent 接收到的Intent,包含笔记ID等信息 + */ + @Override + public void onReceive(Context context, Intent intent) { + // 设置要启动的Activity类为AlarmAlertActivity + intent.setClass(context, AlarmAlertActivity.class); + // 添加NEW_TASK标志,因为广播接收器运行在非Activity环境 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // 启动闹钟提醒界面 + context.startActivity(intent); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java new file mode 100644 index 0000000..89791cb --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePicker.java @@ -0,0 +1,529 @@ +/* + * 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; + +/** + * 日期时间选择器组件 + * 提供日期和时间的选择功能,支持12小时制和24小时制 + */ +public class DateTimePicker extends FrameLayout { + + // 默认启用状态 + private static final boolean DEFAULT_ENABLE_STATE = true; + + // 时间常量定义 + private static final int HOURS_IN_HALF_DAY = 12; // 12小时制 + private static final int HOURS_IN_ALL_DAY = 24; // 24小时制 + private static final int DAYS_IN_ALL_WEEK = 7; // 一周7天 + + // 各选择器的最大最小值 + private static final int DATE_SPINNER_MIN_VAL = 0; + private static final int DATE_SPINNER_MAX_VAL = DAYS_IN_ALL_WEEK - 1; + private static final int HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW = 0; + 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; // 是否为24小时制 + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; // 控件是否可用 + private boolean mInitialising; // 是否正在初始化 + + // 日期时间改变监听器 + private OnDateTimeChangedListener mOnDateTimeChangedListener; + + /** + * 日期改变监听器 + * 处理日期选择器值变化 + */ + private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + // 根据选择器值的变化调整日期 + mDate.add(Calendar.DAY_OF_YEAR, newVal - oldVal); + updateDateControl(); + onDateTimeChanged(); + } + }; + + /** + * 小时改变监听器 + * 处理小时选择器值变化 + */ + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { + @Override + public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + boolean isDateChanged = false; + Calendar cal = Calendar.getInstance(); + + // 12小时制时的处理 + if (!mIs24HourView) { + // 处理跨天的情况 + if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { + cal.setTimeInMillis(mDate.getTimeInMillis()); + cal.add(Calendar.DAY_OF_YEAR, 1); + 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 { + // 24小时制时的处理 + 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(); + } + }; + + /** + * 上午/下午改变监听器 + * 处理AM/PM选择器值变化 + */ + 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); + + // 初始化AM/PM选择器 + 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); + + // 更新控件初始状态 + updateDateControl(); + updateHourControl(); + updateAmPmControl(); + + set24HourView(is24HourView); + setCurrentDate(date); + setEnabled(isEnabled()); + 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; + } + + /** + * 获取当前选择的时间戳 + */ + public long getCurrentDateInTimeMillis() { + return mDate.getTimeInMillis(); + } + + /** + * 设置当前日期时间 + */ + 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)); + } + + /** + * 设置当前日期时间 + */ + public void setCurrentDate(int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + setCurrentYear(year); + setCurrentMonth(month); + setCurrentDay(dayOfMonth); + setCurrentHour(hourOfDay); + setCurrentMinute(minute); + } + + /** + * 获取当前年份 + */ + public int getCurrentYear() { + return mDate.get(Calendar.YEAR); + } + + /** + * 设置当前年份 + */ + public void setCurrentYear(int year) { + if (!mInitialising && year == getCurrentYear()) { + return; + } + mDate.set(Calendar.YEAR, year); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * 获取当前月份 + */ + public int getCurrentMonth() { + return mDate.get(Calendar.MONTH); + } + + /** + * 设置当前月份 + */ + public void setCurrentMonth(int month) { + if (!mInitialising && month == getCurrentMonth()) { + return; + } + mDate.set(Calendar.MONTH, month); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * 获取当前日期 + */ + public int getCurrentDay() { + return mDate.get(Calendar.DAY_OF_MONTH); + } + + /** + * 设置当前日期 + */ + public void setCurrentDay(int dayOfMonth) { + if (!mInitialising && dayOfMonth == getCurrentDay()) { + return; + } + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + updateDateControl(); + onDateTimeChanged(); + } + + /** + * 获取当前小时(24小时制) + */ + 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; + } + } + } + + /** + * 设置当前小时 + */ + 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(); + } + + /** + * 获取当前分钟 + */ + public int getCurrentMinute() { + return mDate.get(Calendar.MINUTE); + } + + /** + * 设置当前分钟 + */ + public void setCurrentMinute(int minute) { + if (!mInitialising && minute == getCurrentMinute()) { + return; + } + mMinuteSpinner.setValue(minute); + mDate.set(Calendar.MINUTE, minute); + onDateTimeChanged(); + } + + /** + * 判断是否为24小时制 + */ + public boolean is24HourView () { + return mIs24HourView; + } + + /** + * 设置时间显示格式(12/24小时制) + */ + 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(); + } + + /** + * 更新AM/PM显示 + */ + 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); + } + } + + /** + * 设置日期时间改变监听器 + */ + public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { + mOnDateTimeChangedListener = callback; + } + + /** + * 触发日期时间改变事件 + */ + private void onDateTimeChanged() { + if (mOnDateTimeChangedListener != null) { + mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), + getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java new file mode 100644 index 0000000..91ab139 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DateTimePickerDialog.java @@ -0,0 +1,135 @@ +/* + * 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; + +/** + * 日期时间选择对话框 + * 提供日期和时间的选择界面,继承自AlertDialog + */ +public class DateTimePickerDialog extends AlertDialog implements OnClickListener { + + // 日期时间对象,保存当前选择的日期时间 + private Calendar mDate = Calendar.getInstance(); + // 是否使用24小时制 + private boolean mIs24HourView; + // 日期时间设置监听器 + private OnDateTimeSetListener mOnDateTimeSetListener; + // 日期时间选择器控件 + private DateTimePicker mDateTimePicker; + + /** + * 日期时间设置监听器接口 + * 用于回调通知日期时间设置完成 + */ + public interface OnDateTimeSetListener { + void OnDateTimeSet(AlertDialog dialog, long date); + } + + /** + * 构造函数 + * @param context 上下文对象 + * @param date 初始日期时间 + */ + public DateTimePickerDialog(Context context, long date) { + super(context); + // 创建日期时间选择器 + mDateTimePicker = new DateTimePicker(context); + setView(mDateTimePicker); + + // 设置日期时间变化监听器 + mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { + public void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + // 更新日期时间对象 + mDate.set(Calendar.YEAR, year); + mDate.set(Calendar.MONTH, month); + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + mDate.set(Calendar.MINUTE, minute); + // 更新对话框标题 + updateTitle(mDate.getTimeInMillis()); + } + }); + + // 初始化日期时间 + mDate.setTimeInMillis(date); + mDate.set(Calendar.SECOND, 0); + mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); + + // 设置对话框按钮 + setButton(context.getString(R.string.datetime_dialog_ok), this); + setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + + // 设置时间显示格式 + set24HourView(DateFormat.is24HourFormat(this.getContext())); + updateTitle(mDate.getTimeInMillis()); + } + + /** + * 设置是否使用24小时制 + * @param is24HourView true表示使用24小时制,false表示使用12小时制 + */ + public void set24HourView(boolean is24HourView) { + mIs24HourView = is24HourView; + } + + /** + * 设置日期时间监听器 + * @param callBack 监听器对象 + */ + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { + mOnDateTimeSetListener = callBack; + } + + /** + * 更新对话框标题 + * 根据当前选择的日期时间更新标题显示 + * @param date 当前选择的日期时间 + */ + private void updateTitle(long date) { + int flag = + DateUtils.FORMAT_SHOW_YEAR | + 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/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java new file mode 100644 index 0000000..fa329fd --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/DropdownMenu.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.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; + + /** + * 构造函数 + * @param context 上下文对象 + * @param button 要绑定的按钮控件 + * @param menuId 菜单资源ID + */ + public DropdownMenu(Context context, Button button, int menuId) { + // 保存按钮引用 + mButton = button; + // 设置下拉图标背景 + mButton.setBackgroundResource(R.drawable.dropdown_icon); + // 创建弹出菜单并关联按钮 + mPopupMenu = new PopupMenu(context, mButton); + // 获取菜单对象 + mMenu = mPopupMenu.getMenu(); + // 加载菜单资源 + mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + // 设置按钮点击监听器,显示菜单 + mButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + mPopupMenu.show(); + } + }); + } + + /** + * 设置菜单项点击监听器 + * @param listener 菜单项点击监听器 + */ + public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { + if (mPopupMenu != null) { + mPopupMenu.setOnMenuItemClickListener(listener); + } + } + + /** + * 查找指定ID的菜单项 + * @param id 菜单项ID + * @return 菜单项对象 + */ + public MenuItem findItem(int id) { + return mMenu.findItem(id); + } + + /** + * 设置按钮文本 + * @param title 要显示的文本 + */ + public void setTitle(CharSequence title) { + mButton.setText(title); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java new file mode 100644 index 0000000..a7d9039 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/FoldersListAdapter.java @@ -0,0 +1,124 @@ +/* + * 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; + +/** + * 文件夹列表适配器类 + * 用于显示笔记文件夹列表,继承自CursorAdapter + */ +public class FoldersListAdapter extends CursorAdapter { + /** + * 数据库查询的列定义 + */ + public static final String [] PROJECTION = { + NoteColumns.ID, // 文件夹ID + NoteColumns.SNIPPET // 文件夹名称 + }; + + /** + * 查询结果列的索引常量 + */ + public static final int ID_COLUMN = 0; // ID列索引 + public static final int NAME_COLUMN = 1; // 名称列索引 + + /** + * 构造函数 + * @param context 上下文对象 + * @param c 数据库游标 + */ + public FoldersListAdapter(Context context, Cursor c) { + super(context, c); + } + + /** + * 创建新的列表项视图 + * @param context 上下文对象 + * @param cursor 数据库游标 + * @param parent 父视图 + * @return 新创建的FolderListItem视图 + */ + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + return new FolderListItem(context); + } + + /** + * 绑定数据到视图 + * @param view 要绑定的视图 + * @param context 上下文对象 + * @param cursor 数据库游标 + */ + @Override + public void bindView(View view, Context context, Cursor cursor) { + if (view instanceof FolderListItem) { + // 获取文件夹名称,如果是根文件夹则显示"移动到父文件夹" + String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + ((FolderListItem) view).bind(folderName); + } + } + + /** + * 获取指定位置的文件夹名称 + * @param context 上下文对象 + * @param position 列表位置 + * @return 文件夹名称 + */ + public String getFolderName(Context context, int position) { + Cursor cursor = (Cursor) getItem(position); + return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); + } + + /** + * 文件夹列表项视图类 + * 用于显示单个文件夹项 + */ + private class FolderListItem extends LinearLayout { + private TextView mName; // 文件夹名称文本视图 + + /** + * 构造函数 + * @param context 上下文对象 + */ + public FolderListItem(Context context) { + super(context); + inflate(context, R.layout.folder_list_item, this); + mName = (TextView) findViewById(R.id.tv_folder_name); + } + + /** + * 绑定文件夹名称到视图 + * @param name 文件夹名称 + */ + public void bind(String name) { + mName.setText(name); + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java new file mode 100644 index 0000000..7ac6c31 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditActivity.java @@ -0,0 +1,952 @@ +/* + * 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; + +/** + * 笔记编辑界面的Activity类 + * 提供笔记的编辑、保存、分享等功能 + */ +public class NoteEditActivity extends Activity implements OnClickListener, + NoteSettingChangedListener, OnTextViewChangeListener { + + /** + * 头部视图控件的持有者类 + */ + private class HeadViewHolder { + public TextView tvModified; // 修改时间文本 + public ImageView ivAlertIcon; // 提醒图标 + public TextView tvAlertDate; // 提醒日期文本 + public ImageView ibSetBgColor; // 设置背景颜色按钮 + } + + /** + * 背景颜色选择器按钮ID与颜色值的映射 + */ + 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); + } + + /** + * 背景颜色ID与选择器选中状态的映射 + */ + 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); + } + + /** + * 字体大小选择器按钮ID与字体大小值的映射 + */ + 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); + } + + /** + * 字体大小ID与选择器选中状态的映射 + */ + 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; // 字体大小ID + + 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); + + // 初始化Activity状态,如果失败则结束Activity + if (savedInstanceState == null && !initActivityState(getIntent())) { + finish(); + return; + } + // 初始化资源 + initResources(); + } + + /** + * 当Activity被系统杀死时恢复状态 + */ + @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"); + } + } + + /** + * 初始化Activity状态 + * @param intent Intent对象 + * @return 初始化是否成功 + */ + private boolean initActivityState(Intent intent) { + /** + * 如果用户指定了ACTION_VIEW但没有提供id, + * 则跳转到笔记列表Activity + */ + mWorkingNote = null; + if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) { + long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0); + mUserQuery = ""; + + /** + * 从搜索结果启动 + */ + 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())) { + // 新建笔记 + long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0); + int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID); + int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE, + Notes.TYPE_WIDGET_INVALIDE); + int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, + ResourceParser.getDefaultBgId(this)); + + // 解析通话记录笔记 + String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); + long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0); + if (callDate != 0 && phoneNumber != null) { + if (TextUtils.isEmpty(phoneNumber)) { + Log.w(TAG, "The call record number is null"); + } + long noteId = 0; + if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(), + phoneNumber, callDate)) > 0) { + mWorkingNote = WorkingNote.load(this, noteId); + if (mWorkingNote == null) { + Log.e(TAG, "load call note failed with note id" + noteId); + finish(); + return false; + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, + widgetType, bgResId); + mWorkingNote.convertToCallNote(phoneNumber, callDate); + } + } else { + mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType, + bgResId); + } + + getWindow().setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } else { + Log.e(TAG, "Intent not specified action, should not support"); + finish(); + return false; + } + mWorkingNote.setOnSettingStatusChangedListener(this); + return true; + } + + @Override + protected void onResume() { + super.onResume(); + initNoteScreen(); + } + + /** + * 初始化笔记界面 + */ + private void initNoteScreen() { + // 设置字体样式 + mNoteEditor.setTextAppearance(this, TextAppearanceResources + .getTexAppearanceResource(mFontSizeId)); + + // 根据模式切换显示 + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + switchToListMode(mWorkingNote.getContent()); + } else { + mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); + mNoteEditor.setSelection(mNoteEditor.getText().length()); + } + + // 隐藏所有背景选择器 + for (Integer id : sBgSelectorSelectionMap.keySet()) { + findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE); + } + + // 设置背景颜色 + mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId()); + mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId()); + + // 设置修改时间 + mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this, + mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE + | DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME + | DateUtils.FORMAT_SHOW_YEAR)); + + /** + * TODO: 添加设置提醒的菜单。目前禁用它因为DateTimePicker + * 还没有准备好 + */ + 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); + /** + * 对于没有笔记id的新笔记,我们应该首先保存它以 + * 生成一个id。如果正在编辑的笔记不值得保存,就 + * 没有id,这相当于创建新笔记 + */ + 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); + } + + /** + * 判断触摸事件是否在视图范围内 + * @param view 视图 + * @param ev 触摸事件 + * @return 是否在范围内 + */ + 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: 修复在共享首选项中存储资源id的bug。 + * id可能大于资源长度,在这种情况下, + * 返回{@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(); + } + + /** + * 清除设置状态 + * @return 是否清除了状态 + */ + 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(); + } + + /** + * 分享笔记到支持{@link Intent#ACTION_SEND}动作 + * 和{text/plain}类型的应用 + */ + 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() { + // 首先保存当前编辑的笔记 + saveNote(); + + // 为安全起见,启动一个新的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/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java new file mode 100644 index 0000000..a5c42c1 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteEditText.java @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.micode.notes.ui; + +import android.content.Context; +import android.graphics.Rect; +import android.text.Layout; +import android.text.Selection; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.style.URLSpan; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.MotionEvent; +import android.widget.EditText; + +import net.micode.notes.R; + +import java.util.HashMap; +import java.util.Map; + +/** + * 笔记编辑文本框类 + * 继承自EditText,实现了笔记编辑的核心功能 + */ +public class NoteEditText extends EditText { + private static final String TAG = "NoteEditText"; + // 当前编辑框的索引 + private int mIndex; + // 删除操作前的光标位置 + private int mSelectionStartBeforeDelete; + + // 支持的链接类型常量 + private static final String SCHEME_TEL = "tel:" ; // 电话链接 + private static final String SCHEME_HTTP = "http:" ; // 网页链接 + private static final String SCHEME_EMAIL = "mailto:" ; // 邮件链接 + + // 链接类型与对应操作文本资源的映射 + 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); + } + + /** + * 文本变化监听器接口 + * 由NoteEditActivity实现,用于处理文本编辑事件 + */ + public interface OnTextViewChangeListener { + /** + * 当按下删除键且文本为空时删除当前编辑框 + */ + void onEditTextDelete(int index, String text); + + /** + * 当按下回车键时在当前编辑框后添加新的编辑框 + */ + void onEditTextEnter(int index, String text); + + /** + * 根据文本是否为空显示或隐藏选项 + */ + 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); + } + + /** + * 处理触摸事件,实现光标的准确定位 + */ + @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) { + // 根据是否有文本通知监听器更新UI + 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); + + // 获取选中文本中的URL + final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class); + if (urls.length == 1) { + // 根据URL类型设置对应的操作文本 + int defaultResId = 0; + for(String schema: sSchemaActionResMap.keySet()) { + if(urls[0].getURL().indexOf(schema) >= 0) { + 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) { + // 处理URL点击 + urls[0].onClick(NoteEditText.this); + return true; + } + }); + } + } + super.onCreateContextMenu(menu); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java new file mode 100644 index 0000000..cf79a21 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NoteItemData.java @@ -0,0 +1,315 @@ +/* + * 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, // 笔记ID + NoteColumns.ALERTED_DATE, // 提醒日期 + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.CREATED_DATE, // 创建日期 + NoteColumns.HAS_ATTACHMENT, // 是否有附件 + NoteColumns.MODIFIED_DATE, // 修改日期 + NoteColumns.NOTES_COUNT, // 笔记数量 + NoteColumns.PARENT_ID, // 父文件夹ID + NoteColumns.SNIPPET, // 笔记摘要 + NoteColumns.TYPE, // 笔记类型 + NoteColumns.WIDGET_ID, // 小部件ID + NoteColumns.WIDGET_TYPE, // 小部件类型 + }; + + // 查询结果列的索引常量 + private static final int ID_COLUMN = 0; + private static final int ALERTED_DATE_COLUMN = 1; + private static final int BG_COLOR_ID_COLUMN = 2; + private static final int CREATED_DATE_COLUMN = 3; + private static final int HAS_ATTACHMENT_COLUMN = 4; + private static final int MODIFIED_DATE_COLUMN = 5; + private static final int NOTES_COUNT_COLUMN = 6; + private static final int PARENT_ID_COLUMN = 7; + private static final int SNIPPET_COLUMN = 8; + private static final int TYPE_COLUMN = 9; + private static final int WIDGET_ID_COLUMN = 10; + private static final int WIDGET_TYPE_COLUMN = 11; + + // 笔记基本属性 + private long mId; // 笔记ID + private long mAlertDate; // 提醒时间 + private int mBgColorId; // 背景颜色 + private long mCreatedDate; // 创建时间 + private boolean mHasAttachment; // 是否有附件 + private long mModifiedDate; // 修改时间 + private int mNotesCount; // 笔记数量 + private long mParentId; // 父文件夹ID + private String mSnippet; // 笔记摘要 + private int mType; // 笔记类型 + private int mWidgetId; // 小部件ID + private int mWidgetType; // 小部件类型 + private String mName; // 联系人姓名(通话记录用) + private String mPhoneNumber; // 电话号码(通话记录用) + + // 笔记在列表中的位置状态 + private boolean mIsLastItem; // 是否为最后一项 + private boolean mIsFirstItem; // 是否为第一项 + private boolean mIsOnlyOneItem; // 是否为唯一项 + private boolean mIsOneNoteFollowingFolder; // 是否为文件夹后的单个笔记 + private boolean mIsMultiNotesFollowingFolder; // 是否为文件夹后的多个笔记之一 + + /** + * 构造函数 + * @param context 上下文对象 + * @param cursor 数据库游标 + */ + public NoteItemData(Context context, Cursor cursor) { + // 从游标中读取笔记数据 + mId = cursor.getLong(ID_COLUMN); + mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN); + mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN); + mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN); + mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0); + 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); + } + + /** + * 检查笔记在列表中的位置状态 + * @param cursor 数据库游标 + */ + private void checkPostion(Cursor cursor) { + mIsLastItem = cursor.isLast(); + mIsFirstItem = cursor.isFirst(); + mIsOnlyOneItem = (cursor.getCount() == 1); + mIsMultiNotesFollowingFolder = false; + mIsOneNoteFollowingFolder = false; + + // 检查是否为文件夹后的笔记 + if (mType == Notes.TYPE_NOTE && !mIsFirstItem) { + int position = cursor.getPosition(); + if (cursor.moveToPrevious()) { + 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"); + } + } + } + } + + // 以下是各种getter方法 + + /** + * 判断是否为文件夹后的单个笔记 + */ + public boolean isOneFollowingFolder() { + return mIsOneNoteFollowingFolder; + } + + /** + * 判断是否为文件夹后的多个笔记之一 + */ + public boolean isMultiFollowingFolder() { + return mIsMultiNotesFollowingFolder; + } + + /** + * 判断是否为最后一项 + */ + public boolean isLast() { + return mIsLastItem; + } + + /** + * 获取通话记录联系人名称 + */ + public String getCallName() { + return mName; + } + + /** + * 判断是否为第一项 + */ + public boolean isFirst() { + return mIsFirstItem; + } + + /** + * 判断是否为唯一项 + */ + public boolean isSingle() { + return mIsOnlyOneItem; + } + + /** + * 获取笔记ID + */ + public long getId() { + return mId; + } + + /** + * 获取提醒时间 + */ + public long getAlertDate() { + return mAlertDate; + } + + /** + * 获取创建时间 + */ + public long getCreatedDate() { + return mCreatedDate; + } + + /** + * 判断是否有附件 + */ + public boolean hasAttachment() { + return mHasAttachment; + } + + /** + * 获取修改时间 + */ + public long getModifiedDate() { + return mModifiedDate; + } + + /** + * 获取背景颜色ID + */ + public int getBgColorId() { + return mBgColorId; + } + + /** + * 获取父文件夹ID + */ + public long getParentId() { + return mParentId; + } + + /** + * 获取笔记数量 + */ + public int getNotesCount() { + return mNotesCount; + } + + /** + * 获取文件夹ID + */ + public long getFolderId () { + return mParentId; + } + + /** + * 获取笔记类型 + */ + public int getType() { + return mType; + } + + /** + * 获取小部件类型 + */ + public int getWidgetType() { + return mWidgetType; + } + + /** + * 获取小部件ID + */ + public int getWidgetId() { + return mWidgetId; + } + + /** + * 获取笔记摘要 + */ + public String getSnippet() { + return mSnippet; + } + + /** + * 判断是否设置了提醒 + */ + public boolean hasAlert() { + return (mAlertDate > 0); + } + + /** + * 判断是否为通话记录 + */ + public boolean isCallRecord() { + return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber)); + } + + /** + * 获取笔记类型的静态方法 + * @param cursor 数据库游标 + * @return 笔记类型 + */ + public static int getNoteType(Cursor cursor) { + return cursor.getInt(TYPE_COLUMN); + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListActivity.java new file mode 100644 index 0000000..e843aec --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -0,0 +1,954 @@ +/* + * 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/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java new file mode 100644 index 0000000..a0d2d5a --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -0,0 +1,247 @@ +/* + * 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; // 记录列表项选择状态的Map + private int mNotesCount; // 笔记总数 + private boolean mChoiceMode; // 是否处于多选模式 + + /** + * 小部件属性内部类 + * 用于存储小部件的ID和类型信息 + */ + public static class AppWidgetAttribute { + public int widgetId; // 小部件ID + public int widgetType; // 小部件类型 + }; + + /** + * 构造函数 + * @param context 上下文对象 + */ + 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())); + } + } + + /** + * 设置列表项的选中状态 + * @param position 位置 + * @param checked 是否选中 + */ + public void setCheckedItem(final int position, final boolean checked) { + mSelectedIndex.put(position, checked); + notifyDataSetChanged(); + } + + /** + * 判断是否处于多选模式 + */ + public boolean isInChoiceMode() { + return mChoiceMode; + } + + /** + * 设置多选模式 + * @param mode 是否开启多选 + */ + public void setChoiceMode(boolean mode) { + mSelectedIndex.clear(); + mChoiceMode = mode; + } + + /** + * 全选/取消全选 + * @param checked 是否选中 + */ + public void selectAll(boolean checked) { + Cursor cursor = getCursor(); + for (int i = 0; i < getCount(); i++) { + if (cursor.moveToPosition(i)) { + if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { + setCheckedItem(i, checked); + } + } + } + } + + /** + * 获取所有选中项的ID集合 + * @return 选中项ID的HashSet + */ + 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; + } + + /** + * 获取所有选中的小部件属性 + * @return 小部件属性的HashSet + */ + 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; + } + + /** + * 获取选中项的数量 + * @return 选中的数量 + */ + 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; + } + + /** + * 判断是否全部选中 + * @return 是否全选 + */ + public boolean isAllSelected() { + int checkedCount = getSelectedCount(); + return (checkedCount != 0 && checkedCount == mNotesCount); + } + + /** + * 判断指定位置的项是否被选中 + * @param position 位置 + * @return 是否选中 + */ + public boolean isSelectedItem(final int position) { + if (null == mSelectedIndex.get(position)) { + return false; + } + return mSelectedIndex.get(position); + } + + /** + * 内容改变时的回调 + */ + @Override + protected void onContentChanged() { + super.onContentChanged(); + calcNotesCount(); + } + + /** + * 更换数据源时的回调 + */ + @Override + public void changeCursor(Cursor cursor) { + super.changeCursor(cursor); + calcNotesCount(); + } + + /** + * 计算笔记总数 + * 仅计算类型为NOTE的项目 + */ + private void calcNotesCount() { + mNotesCount = 0; + for (int i = 0; i < getCount(); i++) { + 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/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java new file mode 100644 index 0000000..1d75c7f --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesListItem.java @@ -0,0 +1,162 @@ +/* + * 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; // 选择框 + + /** + * 构造函数 + * @param context 上下文对象 + */ + public NotesListItem(Context context) { + super(context); + // 加载note_item布局 + inflate(context, R.layout.note_item, this); + // 初始化各个视图组件 + mAlert = (ImageView) findViewById(R.id.iv_alert_icon); + mTitle = (TextView) findViewById(R.id.tv_title); + mTime = (TextView) findViewById(R.id.tv_time); + mCallName = (TextView) findViewById(R.id.tv_name); + mCheckBox = (CheckBox) findViewById(android.R.id.checkbox); + } + + /** + * 绑定数据到视图 + * @param context 上下文对象 + * @param data 笔记项数据 + * @param choiceMode 是否处于选择模式 + * @param checked 是否被选中 + */ + public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { + // 处理选择框的显示状态 + if (choiceMode && data.getType() == Notes.TYPE_NOTE) { + mCheckBox.setVisibility(View.VISIBLE); + mCheckBox.setChecked(checked); + } 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); + } + + /** + * 设置列表项背景 + * @param data 笔记项数据 + */ + private void setBackground(NoteItemData data) { + int id = data.getBgColorId(); + if (data.getType() == Notes.TYPE_NOTE) { + // 根据笔记在列表中的位置设置不同的背景 + if (data.isSingle() || data.isOneFollowingFolder()) { + // 单个笔记或紧跟文件夹的笔记 + setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); + } else if (data.isLast()) { + // 最后一个笔记 + setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); + } else if (data.isFirst() || data.isMultiFollowingFolder()) { + // 第一个笔记或多个紧跟文件夹的笔记 + setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); + } else { + // 普通笔记 + setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); + } + } else { + // 文件夹背景 + setBackgroundResource(NoteItemBgResources.getFolderBgRes()); + } + } + + /** + * 获取笔记项数据 + * @return 笔记项数据对象 + */ + public NoteItemData getItemData() { + return mItemData; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java new file mode 100644 index 0000000..402ff11 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/ui/NotesPreferenceActivity.java @@ -0,0 +1,488 @@ +/* + * 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; + +/** + * 笔记应用的设置界面Activity + * 主要功能包括: + * 1. 账户同步设置 + * 2. 同步状态显示 + * 3. 背景颜色设置等 + */ +public class NotesPreferenceActivity extends PreferenceActivity { + // 偏好设置的文件名 + public static final String PREFERENCE_NAME = "notes_preferences"; + + // 同步账户名称的键值 + public static final String PREFERENCE_SYNC_ACCOUNT_NAME = "pref_key_account_name"; + + // 最后同步时间的键值 + public static final String PREFERENCE_LAST_SYNC_TIME = "pref_last_sync_time"; + + // 背景颜色设置的键值 + public static final String PREFERENCE_SET_BG_COLOR_KEY = "pref_key_bg_random_appear"; + + // 同步账户设置的键值 + private static final String PREFERENCE_SYNC_ACCOUNT_KEY = "pref_sync_account_key"; + + // 账户权限过滤的键值 + private static final String AUTHORITIES_FILTER_KEY = "authorities"; + + // 账户设置分类 + private PreferenceCategory mAccountCategory; + + // 广播接收器,用于接收同步服务的状态更新 + private GTaskReceiver mReceiver; + + // 原始账户列表 + private Account[] mOriAccounts; + + // 是否已添加新账户的标志 + private boolean mHasAddedAccount; + + /** + * Activity创建时的回调 + */ + @Override + protected void onCreate(Bundle icicle) { + super.onCreate(icicle); + + /* 设置应用图标可以用于导航 */ + getActionBar().setDisplayHomeAsUpEnabled(true); + + // 加载偏好设置的XML布局 + addPreferencesFromResource(R.xml.preferences); + mAccountCategory = (PreferenceCategory) findPreference(PREFERENCE_SYNC_ACCOUNT_KEY); + + // 初始化并注册广播接收器 + mReceiver = new GTaskReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(GTaskSyncService.GTASK_SERVICE_BROADCAST_NAME); + registerReceiver(mReceiver, filter); + + // 初始化账户相关变量 + mOriAccounts = null; + + // 添加设置页面的头部视图 + View header = LayoutInflater.from(this).inflate(R.layout.settings_header, null); + getListView().addHeaderView(header, null, true); + } + + /** + * Activity恢复时的回调 + * 主要处理账户添加后的自动设置 + */ + @Override + protected void onResume() { + super.onResume(); + + // 如果添加了新账户,需要自动设置为同步账户 + 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(); + } + + /** + * Activity销毁时的回调 + * 注销广播接收器 + */ + @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)) { + // 首次设置账户 + showSelectAccountAlertDialog(); + } else { + // 已有账户,显示更改账户的确认对话框 + 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); + + // 根据同步状态设置按钮 + 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))); + + // 设置最后同步时间显示 + 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); + + // 获取Google账户列表 + Account[] accounts = getGoogleAccounts(); + String defAccount = getSyncAccountName(this); + + mOriAccounts = accounts; + mHasAddedAccount = false; + + // 设置账户列表选项 + if (accounts.length > 0) { + CharSequence[] items = new CharSequence[accounts.length]; + final CharSequence[] itemMapping = items; + 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(); + } + + /** + * 获取设备上的Google账户列表 + */ + private Account[] getGoogleAccounts() { + AccountManager accountManager = AccountManager.get(this); + return accountManager.getAccountsByType("com.google"); + } + + /** + * 设置同步账户 + * @param account 账户名称 + */ + private void setSyncAccount(String account) { + if (!getSyncAccountName(this).equals(account)) { + // 保存新账户设置 + SharedPreferences settings = getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + if (account != null) { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, account); + } else { + editor.putString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + editor.commit(); + + // 清除上次同步时间 + setLastSyncTime(this, 0); + + // 清除本地Google任务相关信息 + 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(); + + // 清除本地Google任务相关信息 + 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(); + } + + /** + * 获取同步账户名称 + * @param context 上下文 + * @return 账户名称 + */ + public static String getSyncAccountName(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getString(PREFERENCE_SYNC_ACCOUNT_NAME, ""); + } + + /** + * 设置最后同步时间 + * @param context 上下文 + * @param time 同步时间 + */ + public static void setLastSyncTime(Context context, long time) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putLong(PREFERENCE_LAST_SYNC_TIME, time); + editor.commit(); + } + + /** + * 获取最后同步时间 + * @param context 上下文 + * @return 同步时间 + */ + public static long getLastSyncTime(Context context) { + SharedPreferences settings = context.getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); + return settings.getLong(PREFERENCE_LAST_SYNC_TIME, 0); + } + + /** + * Google任务同步服务的广播接收器 + * 用于接收同步状态更新并刷新UI + */ + private class GTaskReceiver extends BroadcastReceiver { + + @Override + 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)); + } + } + } + + /** + * 处理菜单项选择事件 + * @param item 选中的菜单项 + * @return 是否处理了选择事件 + */ + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + // 返回笔记列表界面 + Intent intent = new Intent(this, NotesListActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + return true; + default: + return false; + } + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java new file mode 100644 index 0000000..0c853e5 --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider.java @@ -0,0 +1,180 @@ +/* + * 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, // 笔记ID + NoteColumns.BG_COLOR_ID, // 背景颜色ID + NoteColumns.SNIPPET // 笔记摘要 + }; + + /** + * 查询结果列的索引常量 + */ + public static final int COLUMN_ID = 0; // ID列索引 + public static final int COLUMN_BG_COLOR_ID = 1; // 背景色ID列索引 + public static final int COLUMN_SNIPPET = 2; // 摘要列索引 + + private static final String TAG = "NoteWidgetProvider"; + + /** + * 当小部件被删除时调用 + * 将对应笔记的widget_id设置为无效值 + */ + @Override + public void onDeleted(Context context, int[] appWidgetIds) { + ContentValues values = new ContentValues(); + 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])}); + } + } + + /** + * 获取指定widget_id对应的笔记信息 + * @param context 上下文 + * @param widgetId 小部件ID + * @return 包含笔记信息的Cursor对象 + */ + private Cursor getNoteWidgetInfo(Context context, int widgetId) { + return context.getContentResolver().query(Notes.CONTENT_NOTE_URI, + PROJECTION, + NoteColumns.WIDGET_ID + "=? AND " + NoteColumns.PARENT_ID + "<>?", + new String[] { String.valueOf(widgetId), String.valueOf(Notes.ID_TRASH_FOLER) }, + null); + } + + /** + * 更新小部件 + * 调用私有update方法,默认非隐私模式 + */ + protected void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + update(context, appWidgetManager, appWidgetIds, false); + } + + /** + * 更新小部件的具体实现 + * @param context 上下文 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 要更新的小部件ID数组 + * @param privacyMode 是否为隐私模式 + */ + private void update(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, + boolean privacyMode) { + for (int i = 0; i < appWidgetIds.length; i++) { + if (appWidgetIds[i] != AppWidgetManager.INVALID_APPWIDGET_ID) { + // 初始化默认值 + int bgId = ResourceParser.getDefaultBgId(context); + String snippet = ""; + Intent intent = new Intent(context, NoteEditActivity.class); + 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 + RemoteViews rv = new RemoteViews(context.getPackageName(), getLayoutId()); + rv.setImageViewResource(R.id.widget_bg_image, getBgResourceId(bgId)); + intent.putExtra(Notes.INTENT_EXTRA_BACKGROUND_ID, bgId); + + // 创建PendingIntent + PendingIntent pendingIntent = null; + if (privacyMode) { + // 隐私模式下显示提示文本,点击打开笔记列表 + rv.setTextViewText(R.id.widget_text, + context.getString(R.string.widget_under_visit_mode)); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], new Intent( + context, NotesListActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + } else { + // 正常模式下显示笔记内容,点击打开笔记编辑 + rv.setTextViewText(R.id.widget_text, snippet); + pendingIntent = PendingIntent.getActivity(context, appWidgetIds[i], intent, + PendingIntent.FLAG_UPDATE_CURRENT); + } + + rv.setOnClickPendingIntent(R.id.widget_text, pendingIntent); + appWidgetManager.updateAppWidget(appWidgetIds[i], rv); + } + } + } + + /** + * 获取小部件背景资源ID + * @param bgId 背景ID + * @return 对应的背景资源ID + */ + protected abstract int getBgResourceId(int bgId); + + /** + * 获取小部件布局资源ID + * @return 布局资源ID + */ + protected abstract int getLayoutId(); + + /** + * 获取小部件类型 + * @return 小部件类型 + */ + protected abstract int getWidgetType(); +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java new file mode 100644 index 0000000..ba173df --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_2x.java @@ -0,0 +1,69 @@ +/* + * 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; + +/** + * 2x大小的笔记桌面小部件提供者类 + * 继承自NoteWidgetProvider基类,实现2x大小小部件的具体功能 + */ +public class NoteWidgetProvider_2x extends NoteWidgetProvider { + /** + * 当小部件更新时调用 + * 调用父类的update方法执行实际的更新操作 + * @param context 上下文对象 + * @param appWidgetManager 小部件管理器 + * @param appWidgetIds 需要更新的小部件ID数组 + */ + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + super.update(context, appWidgetManager, appWidgetIds); + } + + /** + * 获取小部件布局资源ID + * @return 返回2x大小小部件的布局资源ID + */ + @Override + protected int getLayoutId() { + return R.layout.widget_2x; + } + + /** + * 获取小部件背景资源ID + * @param bgId 背景ID + * @return 返回对应的2x大小小部件背景资源ID + */ + protected int getBgResourceId(int bgId) { + return ResourceParser.WidgetBgResources.getWidget2xBgResource(bgId); + } + + /** + * 获取小部件类型 + * @return 返回2x大小小部件的类型标识 + */ + @Override + protected int getWidgetType() { + return Notes.TYPE_WIDGET_2X; + } +} diff --git a/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java new file mode 100644 index 0000000..c12a02e --- /dev/null +++ b/src/Notes-master/app/src/main/java/net/micode/notes/widget/NoteWidgetProvider_4x.java @@ -0,0 +1,46 @@ +/* + * 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/src/Notes-master/app/src/main/res/color/primary_text_dark.xml b/src/Notes-master/app/src/main/res/color/primary_text_dark.xml new file mode 100644 index 0000000..8ad98e3 --- /dev/null +++ b/src/Notes-master/app/src/main/res/color/primary_text_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/color/secondary_text_dark.xml b/src/Notes-master/app/src/main/res/color/secondary_text_dark.xml new file mode 100644 index 0000000..9cf8a1a --- /dev/null +++ b/src/Notes-master/app/src/main/res/color/secondary_text_dark.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/bg_btn_set_color.png b/src/Notes-master/app/src/main/res/drawable-hdpi/bg_btn_set_color.png new file mode 100644 index 0000000..5eb5d44 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/bg_btn_set_color.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/bg_color_btn_mask.png b/src/Notes-master/app/src/main/res/drawable-hdpi/bg_color_btn_mask.png new file mode 100644 index 0000000..100db77 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/bg_color_btn_mask.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/call_record.png b/src/Notes-master/app/src/main/res/drawable-hdpi/call_record.png new file mode 100644 index 0000000..fb88ca4 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/call_record.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/clock.png b/src/Notes-master/app/src/main/res/drawable-hdpi/clock.png new file mode 100644 index 0000000..5f2ae9a Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/clock.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/delete.png b/src/Notes-master/app/src/main/res/drawable-hdpi/delete.png new file mode 100644 index 0000000..643de3e Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/delete.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/dropdown_icon.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/dropdown_icon.9.png new file mode 100644 index 0000000..5525025 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/dropdown_icon.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_blue.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_blue.9.png new file mode 100644 index 0000000..55a1856 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_blue.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_green.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_green.9.png new file mode 100644 index 0000000..2cb2d60 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_green.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_red.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_red.9.png new file mode 100644 index 0000000..bae944a Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_red.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_blue.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_blue.9.png new file mode 100644 index 0000000..96e6092 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_blue.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_green.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_green.9.png new file mode 100644 index 0000000..08d8644 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_green.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_red.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_red.9.png new file mode 100644 index 0000000..9c430e5 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_red.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_white.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_white.9.png new file mode 100644 index 0000000..19e8d95 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_white.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_yellow.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_yellow.9.png new file mode 100644 index 0000000..bf8f580 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_title_yellow.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_white.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_white.9.png new file mode 100644 index 0000000..918f7a6 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_white.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/edit_yellow.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_yellow.9.png new file mode 100644 index 0000000..10cb642 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/edit_yellow.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/font_large.png b/src/Notes-master/app/src/main/res/drawable-hdpi/font_large.png new file mode 100644 index 0000000..78cf2e6 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/font_large.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/font_normal.png b/src/Notes-master/app/src/main/res/drawable-hdpi/font_normal.png new file mode 100644 index 0000000..9de7ced Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/font_normal.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/font_size_selector_bg.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/font_size_selector_bg.9.png new file mode 100644 index 0000000..be8e64c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/font_size_selector_bg.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/font_small.png b/src/Notes-master/app/src/main/res/drawable-hdpi/font_small.png new file mode 100644 index 0000000..d3ff104 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/font_small.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/font_super.png b/src/Notes-master/app/src/main/res/drawable-hdpi/font_super.png new file mode 100644 index 0000000..85b13a1 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/font_super.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/icon_app.png b/src/Notes-master/app/src/main/res/drawable-hdpi/icon_app.png new file mode 100644 index 0000000..418aadc Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/icon_app.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_background.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_background.png new file mode 100644 index 0000000..087e1f9 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_background.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_down.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_down.9.png new file mode 100644 index 0000000..b88eebf Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_down.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_middle.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_middle.9.png new file mode 100644 index 0000000..96b1c8b Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_middle.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_single.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_single.9.png new file mode 100644 index 0000000..d7e7206 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_single.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_up.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_up.9.png new file mode 100644 index 0000000..632e88c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_blue_up.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_folder.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_folder.9.png new file mode 100644 index 0000000..829f61b Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_folder.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_footer_bg.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_footer_bg.9.png new file mode 100644 index 0000000..5325c25 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_footer_bg.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_down.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_down.9.png new file mode 100644 index 0000000..64a39d9 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_down.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_middle.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_middle.9.png new file mode 100644 index 0000000..897325a Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_middle.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_single.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_single.9.png new file mode 100644 index 0000000..c83405f Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_single.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_up.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_up.9.png new file mode 100644 index 0000000..141f9e1 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_green_up.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_down.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_down.9.png new file mode 100644 index 0000000..4224309 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_down.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_middle.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_middle.9.png new file mode 100644 index 0000000..9988f17 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_middle.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_single.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_single.9.png new file mode 100644 index 0000000..587c348 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_single.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_up.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_up.9.png new file mode 100644 index 0000000..46b4757 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_red_up.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_down.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_down.9.png new file mode 100644 index 0000000..29f9d8c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_down.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_middle.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_middle.9.png new file mode 100644 index 0000000..77a4ab4 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_middle.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_single.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_single.9.png new file mode 100644 index 0000000..3e79189 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_single.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_up.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_up.9.png new file mode 100644 index 0000000..e23cd5c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_white_up.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_down.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_down.9.png new file mode 100644 index 0000000..31cfc1e Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_down.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_middle.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_middle.9.png new file mode 100644 index 0000000..b6549b2 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_middle.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_single.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_single.9.png new file mode 100644 index 0000000..3faf507 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_single.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_up.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_up.9.png new file mode 100644 index 0000000..4ae791c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/list_yellow_up.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/menu_delete.png b/src/Notes-master/app/src/main/res/drawable-hdpi/menu_delete.png new file mode 100644 index 0000000..ccdfc4b Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/menu_delete.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/menu_move.png b/src/Notes-master/app/src/main/res/drawable-hdpi/menu_move.png new file mode 100644 index 0000000..1140b71 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/menu_move.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_normal.png b/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_normal.png new file mode 100644 index 0000000..e24e0d1 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_normal.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_pressed.png b/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_pressed.png new file mode 100644 index 0000000..c748936 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/new_note_pressed.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png b/src/Notes-master/app/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png new file mode 100644 index 0000000..fc49552 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/note_edit_color_selector_panel.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/notification.png b/src/Notes-master/app/src/main/res/drawable-hdpi/notification.png new file mode 100644 index 0000000..b13ab4a Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/notification.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/search_result.png b/src/Notes-master/app/src/main/res/drawable-hdpi/search_result.png new file mode 100644 index 0000000..ff2befd Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/search_result.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/selected.png b/src/Notes-master/app/src/main/res/drawable-hdpi/selected.png new file mode 100644 index 0000000..b889bef Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/selected.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/title_alert.png b/src/Notes-master/app/src/main/res/drawable-hdpi/title_alert.png new file mode 100644 index 0000000..544ee9c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/title_alert.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/title_bar_bg.9.png b/src/Notes-master/app/src/main/res/drawable-hdpi/title_bar_bg.9.png new file mode 100644 index 0000000..eb6bff0 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/title_bar_bg.9.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_blue.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_blue.png new file mode 100644 index 0000000..a1707f4 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_blue.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_green.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_green.png new file mode 100644 index 0000000..f86886c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_green.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_red.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_red.png new file mode 100644 index 0000000..0e66c29 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_red.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_white.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_white.png new file mode 100644 index 0000000..5f0619a Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_white.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_yellow.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_yellow.png new file mode 100644 index 0000000..12d1c2b Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_2x_yellow.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_blue.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_blue.png new file mode 100644 index 0000000..9183738 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_blue.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_green.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_green.png new file mode 100644 index 0000000..fa8b452 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_green.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_red.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_red.png new file mode 100644 index 0000000..62de074 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_red.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_white.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_white.png new file mode 100644 index 0000000..a37d67c Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_white.png differ diff --git a/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_yellow.png b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_yellow.png new file mode 100644 index 0000000..d7c5fa4 Binary files /dev/null and b/src/Notes-master/app/src/main/res/drawable-hdpi/widget_4x_yellow.png differ diff --git a/src/Notes-master/app/src/main/res/drawable/new_note.xml b/src/Notes-master/app/src/main/res/drawable/new_note.xml new file mode 100644 index 0000000..2154ebc --- /dev/null +++ b/src/Notes-master/app/src/main/res/drawable/new_note.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/src/Notes-master/app/src/main/res/layout/account_dialog_title.xml b/src/Notes-master/app/src/main/res/layout/account_dialog_title.xml new file mode 100644 index 0000000..7717112 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/account_dialog_title.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/layout/add_account_text.xml b/src/Notes-master/app/src/main/res/layout/add_account_text.xml new file mode 100644 index 0000000..c799178 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/add_account_text.xml @@ -0,0 +1,32 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/layout/datetime_picker.xml b/src/Notes-master/app/src/main/res/layout/datetime_picker.xml new file mode 100644 index 0000000..f10d592 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/datetime_picker.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/layout/dialog_edit_text.xml b/src/Notes-master/app/src/main/res/layout/dialog_edit_text.xml new file mode 100644 index 0000000..361b39a --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/dialog_edit_text.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/layout/folder_list_item.xml b/src/Notes-master/app/src/main/res/layout/folder_list_item.xml new file mode 100644 index 0000000..77e8148 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/folder_list_item.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Notes-master/app/src/main/res/layout/note_edit.xml b/src/Notes-master/app/src/main/res/layout/note_edit.xml new file mode 100644 index 0000000..10b2aa7 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/note_edit.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Notes-master/app/src/main/res/layout/note_edit_list_item.xml b/src/Notes-master/app/src/main/res/layout/note_edit_list_item.xml new file mode 100644 index 0000000..a885f9c --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/note_edit_list_item.xml @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/src/Notes-master/app/src/main/res/layout/note_item.xml b/src/Notes-master/app/src/main/res/layout/note_item.xml new file mode 100644 index 0000000..d541f6a --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/note_item.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Notes-master/app/src/main/res/layout/note_list.xml b/src/Notes-master/app/src/main/res/layout/note_list.xml new file mode 100644 index 0000000..6b25d38 --- /dev/null +++ b/src/Notes-master/app/src/main/res/layout/note_list.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + +