Compare commits

..

No commits in common. 'master' and 'develop' have entirely different histories.

Binary file not shown.

@ -1,9 +0,0 @@
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
project.properties
.settings/
.classpath
.project

@ -1,2 +0,0 @@
#Thu Nov 13 18:19:18 CST 2025
gradle.version=8.5

@ -1,2 +0,0 @@
#Wed Nov 19 11:36:51 CST 2025
java.home=D\:\\Android studio2\\jbr

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

@ -1 +0,0 @@
local.properties

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

@ -1,6 +0,0 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="showDecorations" value="true" />
</component>
</project>

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

@ -1,190 +0,0 @@
Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

@ -1,23 +0,0 @@
[中文]
1. MiCode便签是小米便签的社区开源版由MIUI团队(www.miui.com) 发起并贡献第一批代码遵循NOTICE文件所描述的开源协议
今后为MiCode社区(www.micode.net) 拥有,并由社区发布和维护。
2. Bug反馈和跟踪请访问Github,
https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
3. 功能建议和综合讨论请访问MiCode,
http://micode.net/forum.php?mod=forumdisplay&fid=38
[English]
1. MiCode Notes is open source edition of XM notepad, it's first initiated and sponsored by MIUI team (www.miui.com).
It's opened under license described by NOTICE file. It's owned by the MiCode community (www.micode.net). In future,
the MiCode community will release and maintain this project.
2. Regarding issue tracking, please visit Github,
https://github.com/MiCode/Notes/issues?sort=created&direction=desc&state=open
3. Regarding feature request and general discussion, please visit Micode forum,
http://micode.net/forum.php?mod=forumdisplay&fid=38

@ -1,65 +0,0 @@
plugins {
alias(libs.plugins.android.application)
}
android {
namespace = "net.micode.notes"
compileSdk {
version = release(36)
}
defaultConfig {
applicationId = "net.micode.notes"
minSdk = 30
targetSdk = 36
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
packaging {
resources.excludes.add("META-INF/DEPENDENCIES");
resources.excludes.add("META-INF/NOTICE");
resources.excludes.add("META-INF/LICENSE");
resources.excludes.add("META-INF/LICENSE.txt");
resources.excludes.add("META-INF/NOTICE.txt");
}
}
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
implementation(files("D:\\Android_Studio\\Notes-master\\httpcomponents-client-4.5.14-bin.zip"))
// implementation(fileTree(mapOf(
// "dir" to "D:\\Android_Studio\\Notes-master\\httpcomponents-client-4.5.14-bin",
// "include" to listOf("*.aar", "*.jar"),
// "exclude" to listOf("")
// )))
implementation(files("D:\\Android_Studio\\Notes-master\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-osgi-4.5.14.jar"))
implementation(files("D:\\Android_Studio\\Notes-master\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-win-4.5.14.jar"))
implementation(files("D:\\Android_Studio\\Notes-master\\httpcomponents-client-4.5.14-bin\\lib\\httpcore-4.4.16.jar"))
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
}

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

@ -1,113 +0,0 @@
#Sat Nov 15 09:53:21 CST 2025
net.micode.notes.app-main-33\:/color/primary_text_dark.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\color_primary_text_dark.xml.flat
net.micode.notes.app-main-33\:/color/secondary_text_dark.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\color_secondary_text_dark.xml.flat
net.micode.notes.app-main-33\:/drawable-hdpi/bg_btn_set_color.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_bg_btn_set_color.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/bg_color_btn_mask.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_bg_color_btn_mask.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/call_record.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_call_record.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/clock.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_clock.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/delete.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_delete.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/dropdown_icon.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_dropdown_icon.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_blue.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_blue.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_green.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_green.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_red.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_red.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_title_blue.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_title_blue.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_title_green.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_title_green.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_title_red.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_title_red.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_title_white.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_title_white.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_title_yellow.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_title_yellow.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_white.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_white.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/edit_yellow.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_edit_yellow.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/font_large.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_font_large.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/font_normal.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_font_normal.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/font_size_selector_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_font_size_selector_bg.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/font_small.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_font_small.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/font_super.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_font_super.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/icon_app.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_icon_app.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_background.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_background.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_blue_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_blue_down.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_blue_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_blue_middle.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_blue_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_blue_single.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_blue_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_blue_up.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_folder.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_folder.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_footer_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_footer_bg.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_green_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_green_down.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_green_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_green_middle.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_green_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_green_single.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_green_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_green_up.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_red_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_red_down.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_red_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_red_middle.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_red_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_red_single.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_red_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_red_up.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_white_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_white_down.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_white_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_white_middle.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_white_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_white_single.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_white_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_white_up.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_yellow_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_yellow_down.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_yellow_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_yellow_middle.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_yellow_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_yellow_single.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/list_yellow_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_list_yellow_up.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/menu_delete.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_menu_delete.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/menu_move.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_menu_move.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/new_note_normal.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_new_note_normal.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/new_note_pressed.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_new_note_pressed.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/note_edit_color_selector_panel.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_note_edit_color_selector_panel.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/notification.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_notification.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/search_result.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_search_result.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/selected.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_selected.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/title_alert.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_title_alert.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/title_bar_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_title_bar_bg.9.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_2x_blue.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_2x_blue.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_2x_green.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_2x_green.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_2x_red.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_2x_red.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_2x_white.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_2x_white.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_2x_yellow.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_2x_yellow.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_4x_blue.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_4x_blue.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_4x_green.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_4x_green.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_4x_red.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_4x_red.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_4x_white.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_4x_white.png.flat
net.micode.notes.app-main-33\:/drawable-hdpi/widget_4x_yellow.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable-hdpi_widget_4x_yellow.png.flat
net.micode.notes.app-main-33\:/drawable/ic_launcher_background.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable_ic_launcher_background.xml.flat
net.micode.notes.app-main-33\:/drawable/ic_launcher_foreground.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable_ic_launcher_foreground.xml.flat
net.micode.notes.app-main-33\:/drawable/new_note.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\drawable_new_note.xml.flat
net.micode.notes.app-main-33\:/layout/account_dialog_title.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_account_dialog_title.xml.flat
net.micode.notes.app-main-33\:/layout/activity_main.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_activity_main.xml.flat
net.micode.notes.app-main-33\:/layout/add_account_text.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_add_account_text.xml.flat
net.micode.notes.app-main-33\:/layout/datetime_picker.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_datetime_picker.xml.flat
net.micode.notes.app-main-33\:/layout/dialog_edit_text.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_dialog_edit_text.xml.flat
net.micode.notes.app-main-33\:/layout/folder_list_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_folder_list_item.xml.flat
net.micode.notes.app-main-33\:/layout/note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_edit.xml.flat
net.micode.notes.app-main-33\:/layout/note_edit_list_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_edit_list_item.xml.flat
net.micode.notes.app-main-33\:/layout/note_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_item.xml.flat
net.micode.notes.app-main-33\:/layout/note_list.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_list.xml.flat
net.micode.notes.app-main-33\:/layout/note_list_dropdown_menu.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_list_dropdown_menu.xml.flat
net.micode.notes.app-main-33\:/layout/note_list_footer.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_note_list_footer.xml.flat
net.micode.notes.app-main-33\:/layout/settings_header.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_settings_header.xml.flat
net.micode.notes.app-main-33\:/layout/widget_2x.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_widget_2x.xml.flat
net.micode.notes.app-main-33\:/layout/widget_4x.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\layout_widget_4x.xml.flat
net.micode.notes.app-main-33\:/menu/call_note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_call_note_edit.xml.flat
net.micode.notes.app-main-33\:/menu/call_record_folder.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_call_record_folder.xml.flat
net.micode.notes.app-main-33\:/menu/note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_note_edit.xml.flat
net.micode.notes.app-main-33\:/menu/note_list.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_note_list.xml.flat
net.micode.notes.app-main-33\:/menu/note_list_dropdown.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_note_list_dropdown.xml.flat
net.micode.notes.app-main-33\:/menu/note_list_options.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_note_list_options.xml.flat
net.micode.notes.app-main-33\:/menu/sub_folder.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\menu_sub_folder.xml.flat
net.micode.notes.app-main-33\:/mipmap-anydpi/ic_launcher.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-anydpi_ic_launcher.xml.flat
net.micode.notes.app-main-33\:/mipmap-anydpi/ic_launcher_round.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-anydpi_ic_launcher_round.xml.flat
net.micode.notes.app-main-33\:/mipmap-hdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-hdpi_ic_launcher.webp.flat
net.micode.notes.app-main-33\:/mipmap-hdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-hdpi_ic_launcher_round.webp.flat
net.micode.notes.app-main-33\:/mipmap-mdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-mdpi_ic_launcher.webp.flat
net.micode.notes.app-main-33\:/mipmap-mdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-mdpi_ic_launcher_round.webp.flat
net.micode.notes.app-main-33\:/mipmap-xhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xhdpi_ic_launcher.webp.flat
net.micode.notes.app-main-33\:/mipmap-xhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xhdpi_ic_launcher_round.webp.flat
net.micode.notes.app-main-33\:/mipmap-xxhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xxhdpi_ic_launcher.webp.flat
net.micode.notes.app-main-33\:/mipmap-xxhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xxhdpi_ic_launcher_round.webp.flat
net.micode.notes.app-main-33\:/mipmap-xxxhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xxxhdpi_ic_launcher.webp.flat
net.micode.notes.app-main-33\:/mipmap-xxxhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\mipmap-xxxhdpi_ic_launcher_round.webp.flat
net.micode.notes.app-main-33\:/raw-zh-rCN/introduction=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\raw-zh-rCN_introduction.flat
net.micode.notes.app-main-33\:/raw/introduction=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\raw_introduction.flat
net.micode.notes.app-main-33\:/xml/backup_rules.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_backup_rules.xml.flat
net.micode.notes.app-main-33\:/xml/data_extraction_rules.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_data_extraction_rules.xml.flat
net.micode.notes.app-main-33\:/xml/preferences.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_preferences.xml.flat
net.micode.notes.app-main-33\:/xml/searchable.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_searchable.xml.flat
net.micode.notes.app-main-33\:/xml/widget_2x_info.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_widget_2x_info.xml.flat
net.micode.notes.app-main-33\:/xml/widget_4x_info.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\merged_res\\debug\\mergeDebugResources\\xml_widget_4x_info.xml.flat

@ -1,209 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2" xmlns:ns2="http://schemas.android.com/tools">
<string-array name="menu_share_ways">
<item>短信</item>
<item>邮件</item>
</string-array>
<plurals name="mtrl_badge_content_description">
<item quantity="one">%d 条新通知</item>
<item quantity="other">%d 条新通知</item>
</plurals>
<plurals name="search_results_title">
<item quantity="other"><ns1:g id="NUMBER">%1$s</ns1:g> 条符合“<ns1:g id="SEARCH">%2$s</ns1:g>”的搜索结果</item>
</plurals>
<string msgid="5976598919945601918" name="abc_action_bar_home_description">"转到首页"</string>
<string msgid="8388173803310557296" name="abc_action_bar_up_description">"转到上一层级"</string>
<string msgid="3937310113216875497" name="abc_action_menu_overflow_description">"更多选项"</string>
<string msgid="4692188335987374352" name="abc_action_mode_done">"完成"</string>
<string msgid="1189761859438369441" name="abc_activity_chooser_view_see_all">"查看全部"</string>
<string msgid="2165779757652331008" name="abc_activitychooserview_choose_application">"选择应用"</string>
<string msgid="4215997306490295099" name="abc_capital_off">"关闭"</string>
<string msgid="884982626291842264" name="abc_capital_on">"开启"</string>
<string msgid="8833365367933412986" name="abc_menu_alt_shortcut_label">"Alt+"</string>
<string msgid="2223301931652355242" name="abc_menu_ctrl_shortcut_label">"Ctrl+"</string>
<string msgid="838001238306846836" name="abc_menu_delete_shortcut_label">"Delete 键"</string>
<string msgid="7986526966204849475" name="abc_menu_enter_shortcut_label">"Enter 键"</string>
<string msgid="375214403600139847" name="abc_menu_function_shortcut_label">"Fn+"</string>
<string msgid="4192209724446364286" name="abc_menu_meta_shortcut_label">"Meta+"</string>
<string msgid="4741552369836443843" name="abc_menu_shift_shortcut_label">"Shift+"</string>
<string msgid="5473865519181928982" name="abc_menu_space_shortcut_label">"空格键"</string>
<string msgid="6180552449598693998" name="abc_menu_sym_shortcut_label">"Sym+"</string>
<string msgid="5520303668377388990" name="abc_prepend_shortcut_label">"Menu+"</string>
<string msgid="7208076849092622260" name="abc_search_hint">"搜索…"</string>
<string msgid="3741173234950517107" name="abc_searchview_description_clear">"清除查询"</string>
<string msgid="693312494995508443" name="abc_searchview_description_query">"搜索查询"</string>
<string msgid="3417662926640357176" name="abc_searchview_description_search">"搜索"</string>
<string msgid="1486535517437947103" name="abc_searchview_description_submit">"提交查询"</string>
<string msgid="2293578557972875415" name="abc_searchview_description_voice">"语音搜索"</string>
<string msgid="8875138169939072951" name="abc_shareactionprovider_share_with">"分享对象"</string>
<string msgid="9055268688411532828" name="abc_shareactionprovider_share_with_application">"与<ns1:g id="APPLICATION_NAME">%s</ns1:g>分享"</string>
<string msgid="1656852541809559762" name="abc_toolbar_collapse_description">"收起"</string>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗?</string>
<string name="alert_message_delete_note">确认要删除该条便签吗?</string>
<string name="alert_message_delete_notes">确认要删除所选的 %d 条便签吗?</string>
<string name="alert_title_delete">删除</string>
<string name="app_name">便签</string>
<string name="app_widget2x2">便签2x2</string>
<string name="app_widget4x4">便签4x4</string>
<string name="bottomsheet_action_collapse">收起底部动作条</string>
<string name="bottomsheet_action_expand">展开底部动作条</string>
<string name="bottomsheet_action_expand_halfway">展开到一半高度</string>
<string name="bottomsheet_drag_handle_clicked">拖动手柄被点按两次</string>
<string name="bottomsheet_drag_handle_content_description">拖动手柄</string>
<string name="button_delete">删除</string>
<string name="call_record_folder_name">通话便签</string>
<string name="character_counter_content_description">输入了 %1$d 个字符(上限为 %2$d 个)</string>
<string name="character_counter_overflowed_content_description">超出字符数限制(共 %1$d 个,上限为 %2$d 个)</string>
<string name="clear_text_end_icon_content_description">清除文字</string>
<string name="datetime_dialog_cancel">取消</string>
<string name="datetime_dialog_ok">设置</string>
<string name="delete_remind_time_message">成功删除提醒</string>
<string name="error_icon_content_description">错误</string>
<string name="error_note_empty_for_clock">不能为空便签设置闹钟提醒</string>
<string name="error_note_empty_for_send_to_desktop">不能将空便签发送到桌面</string>
<string name="error_note_not_exist">要查看的便签不存在</string>
<string name="error_sdcard_export">导出文本时发生错误请检查SD卡</string>
<string name="error_sdcard_unmounted">SD卡被占用不能操作</string>
<string name="error_sync_cancelled">同步已取消</string>
<string name="error_sync_internal">同步失败,发生内部错误</string>
<string name="error_sync_network">同步失败,请检查网络和帐号设置</string>
<string name="exposed_dropdown_menu_content_description">显示下拉菜单</string>
<string name="failed_sdcard_export">导出失败</string>
<string name="folder_exist">文件夹 %1$s 已存在,请重新命名</string>
<string name="format_date_ymd">yyyyMMdd</string>
<string name="format_datetime_mdhm">MM月dd日 kk:mm</string>
<string name="format_exported_file_location">已将文本文件(%1$s)输出至SD卡(%2$s)目录</string>
<string name="format_move_notes_to_folder">已将所选 %1$d 条便签移到 %2$s 文件夹</string>
<string name="hint_foler_name">请输入名称</string>
<string name="icon_content_description">对话框图标</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="item_view_role_description">标签页</string>
<string name="material_clock_toggle_content_description">选择上午或下午</string>
<string name="material_hour_24h_suffix">%1$s 小时</string>
<string name="material_hour_selection">选择小时</string>
<string name="material_hour_suffix">%1$s 点</string>
<string name="material_minute_selection">选择分钟</string>
<string name="material_minute_suffix">%1$s 分</string>
<string name="material_timepicker_am">上午</string>
<string name="material_timepicker_clock_mode_description">切换到时钟模式来输入时间。</string>
<string name="material_timepicker_hour">小时</string>
<string name="material_timepicker_minute">分钟</string>
<string name="material_timepicker_pm">下午</string>
<string name="material_timepicker_select_time">选择时间</string>
<string name="material_timepicker_text_input_mode_description">切换到文字输入模式来输入时间。</string>
<string name="menu_alert">提醒我</string>
<string name="menu_create_folder">新建文件夹</string>
<string name="menu_delete">删除</string>
<string name="menu_deselect_all">取消全选</string>
<string name="menu_export_text">导出文本</string>
<string name="menu_folder_change_name">修改文件夹名称</string>
<string name="menu_folder_delete">刪除文件夹</string>
<string name="menu_folder_view">查看文件夹</string>
<string name="menu_font_large"></string>
<string name="menu_font_normal">正常</string>
<string name="menu_font_size">文字大小</string>
<string name="menu_font_small"></string>
<string name="menu_font_super">超大</string>
<string name="menu_list_mode">进入清单模式</string>
<string name="menu_move">移动到文件夹</string>
<string name="menu_move_parent_folder">上一级文件夹</string>
<string name="menu_normal_mode">退出清单模式</string>
<string name="menu_remove_remind">删除提醒</string>
<string name="menu_search">搜索</string>
<string name="menu_select_all">全选</string>
<string name="menu_select_none">没有选中项,操作无效</string>
<string name="menu_select_title">选中了 %d 项</string>
<string name="menu_send_to_desktop">发送到桌面</string>
<string name="menu_setting">设置</string>
<string name="menu_share">分享</string>
<string name="menu_sync">同步</string>
<string name="menu_sync_cancel">取消同步</string>
<string name="menu_title_select_folder">选择文件夹</string>
<string name="mtrl_badge_numberless_content_description">新通知</string>
<string name="mtrl_chip_close_icon_content_description">移除%1$s</string>
<string name="mtrl_exceed_max_badge_number_content_description" ns2:ignore="PluralsCandidate">有 %1$d 条以上的新通知</string>
<string name="mtrl_picker_a11y_next_month">转到下个月</string>
<string name="mtrl_picker_a11y_prev_month">转到上个月</string>
<string name="mtrl_picker_announce_current_range_selection">开始日期选择:%1$s 结束日期选择:%2$s</string>
<string name="mtrl_picker_announce_current_selection">当前的选择是:%1$s</string>
<string name="mtrl_picker_announce_current_selection_none"></string>
<string name="mtrl_picker_cancel">取消</string>
<string name="mtrl_picker_confirm">确定</string>
<string name="mtrl_picker_date_header_selected">%1$s</string>
<string name="mtrl_picker_date_header_title">请选择日期</string>
<string name="mtrl_picker_date_header_unselected">选定的日期</string>
<string name="mtrl_picker_day_of_week_column_header">表示周几的列:%1$s</string>
<string name="mtrl_picker_end_date_description">结束日期 %1$s</string>
<string name="mtrl_picker_invalid_format">格式无效。</string>
<string name="mtrl_picker_invalid_format_example">示例:%1$s</string>
<string name="mtrl_picker_invalid_format_use">使用:%1$s</string>
<string name="mtrl_picker_invalid_range">范围无效。</string>
<string name="mtrl_picker_navigate_to_current_year_description">转到今年%1$d</string>
<string name="mtrl_picker_navigate_to_year_description">转到 %1$d 年</string>
<string name="mtrl_picker_out_of_range">不在允许的范围内:%1$s</string>
<string name="mtrl_picker_range_header_only_end_selected">开始日期 %1$s</string>
<string name="mtrl_picker_range_header_only_start_selected">%1$s 结束日期</string>
<string name="mtrl_picker_range_header_selected">%1$s - %2$s</string>
<string name="mtrl_picker_range_header_title">请选择范围</string>
<string name="mtrl_picker_range_header_unselected">开始日期 - 结束日期</string>
<string name="mtrl_picker_save">保存</string>
<string name="mtrl_picker_start_date_description">开始日期 %1$s</string>
<string name="mtrl_picker_text_input_date_hint">日期</string>
<string name="mtrl_picker_text_input_date_range_end_hint">结束日期</string>
<string name="mtrl_picker_text_input_date_range_start_hint">开始日期</string>
<string name="mtrl_picker_text_input_day_abbr">d</string>
<string name="mtrl_picker_text_input_month_abbr">m</string>
<string name="mtrl_picker_text_input_year_abbr">y</string>
<string name="mtrl_picker_today_description">今天%1$s</string>
<string name="mtrl_picker_toggle_to_calendar_input_mode">切换到日历输入模式</string>
<string name="mtrl_picker_toggle_to_day_selection">点按即可切换到日历视图</string>
<string name="mtrl_picker_toggle_to_text_input_mode">切换到文本字段输入模式</string>
<string name="mtrl_picker_toggle_to_year_selection">点按即可切换到年视图</string>
<string name="mtrl_timepicker_cancel">取消</string>
<string name="mtrl_timepicker_confirm">确定</string>
<string name="note_alert_expired">已过期</string>
<string name="note_link_email">发送邮件</string>
<string name="note_link_other">打开地图</string>
<string name="note_link_tel">呼叫电话</string>
<string name="note_link_web">浏览网页</string>
<string name="notealert_enter">查看</string>
<string name="notealert_ok">知道了</string>
<string name="notelist_menu_new">新建便签</string>
<string name="notelist_string_info">...</string>
<string name="password_toggle_content_description">显示密码</string>
<string name="preferences_account_summary">与google task同步便签记录</string>
<string name="preferences_account_title">同步账号</string>
<string name="preferences_add_account">添加账号</string>
<string name="preferences_bg_random_appear_title">新建便签背景颜色随机</string>
<string name="preferences_button_sync_cancel">取消同步</string>
<string name="preferences_button_sync_immediately">立即同步</string>
<string name="preferences_dialog_change_account_title">当前帐号 %1$s</string>
<string name="preferences_dialog_change_account_warn_msg">如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复</string>
<string name="preferences_dialog_select_account_tips">请选择google帐号便签将与该帐号的google task内容同步。</string>
<string name="preferences_dialog_select_account_title">同步便签</string>
<string name="preferences_last_sync_time">上次同步于 %1$s</string>
<string name="preferences_menu_cancel">取消</string>
<string name="preferences_menu_change_account">更换账号</string>
<string name="preferences_menu_remove_account">删除账号</string>
<string name="preferences_title">设置</string>
<string name="preferences_toast_cannot_change_account">正在同步中,不能修改同步帐号</string>
<string name="preferences_toast_success_set_accout">同步帐号已设置为%1$s</string>
<string name="search">便签</string>
<string name="search_hint">搜索便签</string>
<string name="search_label">正在搜索便签</string>
<string msgid="6264217191555673260" name="search_menu_title">"搜索"</string>
<string name="search_setting_description">便签中的文字</string>
<string name="set_remind_time_message">创建提醒</string>
<string msgid="6277540029070332960" name="status_bar_notification_info_overflow">"999+"</string>
<string name="success_sdcard_export">导出成功</string>
<string name="success_sync_account">与%1$s同步成功</string>
<string name="sync_progress_init_list">正在获取服务器便签列表...</string>
<string name="sync_progress_login">登录%1$s...</string>
<string name="sync_progress_syncing">正在同步本地便签...</string>
<string name="ticker_cancel">同步已取消</string>
<string name="ticker_fail">同步失败</string>
<string name="ticker_success">同步成功</string>
<string name="ticker_syncing">同步便签...</string>
<string name="widget_havenot_content">没有关联内容,点击新建便签。</string>
<string name="widget_under_visit_mode">访客模式下,便签内容不可见</string>
</resources>

@ -1,209 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2" xmlns:ns2="http://schemas.android.com/tools">
<string-array name="menu_share_ways">
<item>短信</item>
<item>郵件</item>
</string-array>
<plurals name="mtrl_badge_content_description">
<item quantity="one">%d 則新通知</item>
<item quantity="other">%d 則新通知</item>
</plurals>
<plurals name="search_results_title">
<item quantity="other"><ns1:g id="NUMBER">%1$s</ns1:g> 條符合”<ns1:g id="SEARCH">%2$s</ns1:g>“的搜尋結果</item>
</plurals>
<string msgid="5976598919945601918" name="abc_action_bar_home_description">"瀏覽首頁"</string>
<string msgid="8388173803310557296" name="abc_action_bar_up_description">"向上瀏覽"</string>
<string msgid="3937310113216875497" name="abc_action_menu_overflow_description">"更多選項"</string>
<string msgid="4692188335987374352" name="abc_action_mode_done">"完成"</string>
<string msgid="1189761859438369441" name="abc_activity_chooser_view_see_all">"查看全部"</string>
<string msgid="2165779757652331008" name="abc_activitychooserview_choose_application">"選擇應用程式"</string>
<string msgid="4215997306490295099" name="abc_capital_off">"關閉"</string>
<string msgid="884982626291842264" name="abc_capital_on">"開啟"</string>
<string msgid="8833365367933412986" name="abc_menu_alt_shortcut_label">"Alt +"</string>
<string msgid="2223301931652355242" name="abc_menu_ctrl_shortcut_label">"Ctrl +"</string>
<string msgid="838001238306846836" name="abc_menu_delete_shortcut_label">"Delete 鍵"</string>
<string msgid="7986526966204849475" name="abc_menu_enter_shortcut_label">"Enter 鍵"</string>
<string msgid="375214403600139847" name="abc_menu_function_shortcut_label">"Fn +"</string>
<string msgid="4192209724446364286" name="abc_menu_meta_shortcut_label">"Meta +"</string>
<string msgid="4741552369836443843" name="abc_menu_shift_shortcut_label">"Shift +"</string>
<string msgid="5473865519181928982" name="abc_menu_space_shortcut_label">"空格鍵"</string>
<string msgid="6180552449598693998" name="abc_menu_sym_shortcut_label">"Sym +"</string>
<string msgid="5520303668377388990" name="abc_prepend_shortcut_label">"Menu +"</string>
<string msgid="7208076849092622260" name="abc_search_hint">"搜尋…"</string>
<string msgid="3741173234950517107" name="abc_searchview_description_clear">"清除查詢"</string>
<string msgid="693312494995508443" name="abc_searchview_description_query">"搜尋查詢"</string>
<string msgid="3417662926640357176" name="abc_searchview_description_search">"搜尋"</string>
<string msgid="1486535517437947103" name="abc_searchview_description_submit">"提交查詢"</string>
<string msgid="2293578557972875415" name="abc_searchview_description_voice">"語音搜尋"</string>
<string msgid="8875138169939072951" name="abc_shareactionprovider_share_with">"分享對象"</string>
<string msgid="9055268688411532828" name="abc_shareactionprovider_share_with_application">"與「<ns1:g id="APPLICATION_NAME">%s</ns1:g>」分享"</string>
<string msgid="1656852541809559762" name="abc_toolbar_collapse_description">"收合"</string>
<string name="alert_message_delete_folder">確認刪除檔夾及所包含的便簽嗎?</string>
<string name="alert_message_delete_note">确认要删除該條便籤嗎?</string>
<string name="alert_message_delete_notes">确认要刪除所選的 %d 條便籤嗎?</string>
<string name="alert_title_delete">刪除</string>
<string name="app_name">便簽</string>
<string name="app_widget2x2">便簽2x2</string>
<string name="app_widget4x4">便簽4x4</string>
<string name="bottomsheet_action_collapse">收合底部功能表</string>
<string name="bottomsheet_action_expand">展開底部功能表</string>
<string name="bottomsheet_action_expand_halfway">展開一半</string>
<string name="bottomsheet_drag_handle_clicked">已輕觸兩下拖曳控點</string>
<string name="bottomsheet_drag_handle_content_description">拖曳控點</string>
<string name="button_delete">刪除</string>
<string name="call_record_folder_name">通話便籤</string>
<string name="character_counter_content_description">已輸入 %1$d 個字元 (上限為 %2$d 個字元)</string>
<string name="character_counter_overflowed_content_description">超過字元限制 (共 %1$d 字元,上限 %2$d 字元)</string>
<string name="clear_text_end_icon_content_description">清除文字</string>
<string name="datetime_dialog_cancel">取消</string>
<string name="datetime_dialog_ok">設置</string>
<string name="delete_remind_time_message">成功刪除提醒</string>
<string name="error_icon_content_description">錯誤</string>
<string name="error_note_empty_for_clock">不能爲空便籤設置鬧鐘提醒</string>
<string name="error_note_empty_for_send_to_desktop">不能將空便籤發送到桌面</string>
<string name="error_note_not_exist">要查看的便籤不存在</string>
<string name="error_sdcard_export">導出TXT時發生錯誤請檢查SD卡</string>
<string name="error_sdcard_unmounted">SD卡被佔用不能操作</string>
<string name="error_sync_cancelled">同步已取消</string>
<string name="error_sync_internal">同步失敗,發生內部錯誤</string>
<string name="error_sync_network">同步失敗,請檢查網絡和帳號設置</string>
<string name="exposed_dropdown_menu_content_description">顯示下拉式選單</string>
<string name="failed_sdcard_export">導出失敗</string>
<string name="folder_exist">文件夾 %1$s 已存在,請重新命名</string>
<string name="format_date_ymd">yyyyMMdd</string>
<string name="format_datetime_mdhm">MM月dd日 kk:mm</string>
<string name="format_exported_file_location">已將文本文件(%1$s)導出至SD(%2$s)目錄</string>
<string name="format_move_notes_to_folder">已將所選 %1$d 便籤移到 %2$s 文件夾</string>
<string name="hint_foler_name">請輸入名稱</string>
<string name="icon_content_description">對話方塊圖示</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="item_view_role_description">分頁標籤</string>
<string name="material_clock_toggle_content_description">選取上午或下午</string>
<string name="material_hour_24h_suffix">%1$s 小時</string>
<string name="material_hour_selection">請選取時段</string>
<string name="material_hour_suffix">%1$s 點</string>
<string name="material_minute_selection">選取分鐘數</string>
<string name="material_minute_suffix">%1$s 分</string>
<string name="material_timepicker_am">AM</string>
<string name="material_timepicker_clock_mode_description">切換至時鐘模式來輸入時間。</string>
<string name="material_timepicker_hour">小時</string>
<string name="material_timepicker_minute">分鐘</string>
<string name="material_timepicker_pm">PM</string>
<string name="material_timepicker_select_time">選取時間</string>
<string name="material_timepicker_text_input_mode_description">切換至文字輸入模式來輸入時間。</string>
<string name="menu_alert">提醒我</string>
<string name="menu_create_folder">新建文件夾</string>
<string name="menu_delete">刪除</string>
<string name="menu_deselect_all">取消全選</string>
<string name="menu_export_text">導出文本</string>
<string name="menu_folder_change_name">修改文件夾名稱</string>
<string name="menu_folder_delete">刪除文件夾</string>
<string name="menu_folder_view">查看文件夾</string>
<string name="menu_font_large"></string>
<string name="menu_font_normal">正常</string>
<string name="menu_font_size">文字大小</string>
<string name="menu_font_small"></string>
<string name="menu_font_super">超大</string>
<string name="menu_list_mode">進入清單模式</string>
<string name="menu_move">移動到文件夾</string>
<string name="menu_move_parent_folder">上一級文件夾</string>
<string name="menu_normal_mode">退出清單模式</string>
<string name="menu_remove_remind">刪除提醒</string>
<string name="menu_search">搜尋</string>
<string name="menu_select_all">全選</string>
<string name="menu_select_none">沒有選中項,操作無效</string>
<string name="menu_select_title">選中了 %d 項</string>
<string name="menu_send_to_desktop">發送到桌面</string>
<string name="menu_setting">設置</string>
<string name="menu_share">分享</string>
<string name="menu_sync">同步</string>
<string name="menu_sync_cancel">取消同步</string>
<string name="menu_title_select_folder">選擇文件夾</string>
<string name="mtrl_badge_numberless_content_description">新通知</string>
<string name="mtrl_chip_close_icon_content_description">移除 %1$s</string>
<string name="mtrl_exceed_max_badge_number_content_description" ns2:ignore="PluralsCandidate">超過 %1$d 則新通知</string>
<string name="mtrl_picker_a11y_next_month">變更至下個月</string>
<string name="mtrl_picker_a11y_prev_month">變更至上個月</string>
<string name="mtrl_picker_announce_current_range_selection">所選開始日期:%1$s - 所選結束日期:%2$s</string>
<string name="mtrl_picker_announce_current_selection">目前選取:%1$s</string>
<string name="mtrl_picker_announce_current_selection_none"></string>
<string name="mtrl_picker_cancel">取消</string>
<string name="mtrl_picker_confirm">確定</string>
<string name="mtrl_picker_date_header_selected">%1$s</string>
<string name="mtrl_picker_date_header_title">選取日期</string>
<string name="mtrl_picker_date_header_unselected">所選日期</string>
<string name="mtrl_picker_day_of_week_column_header">星期幾資料欄:%1$s</string>
<string name="mtrl_picker_end_date_description">結束日期:%1$s</string>
<string name="mtrl_picker_invalid_format">格式無效。</string>
<string name="mtrl_picker_invalid_format_example">範例:%1$s</string>
<string name="mtrl_picker_invalid_format_use">使用:%1$s</string>
<string name="mtrl_picker_invalid_range">日期範圍無效。</string>
<string name="mtrl_picker_navigate_to_current_year_description">前往今年 %1$d</string>
<string name="mtrl_picker_navigate_to_year_description">前往 %1$d 年</string>
<string name="mtrl_picker_out_of_range">超出日期範圍:%1$s</string>
<string name="mtrl_picker_range_header_only_end_selected">開始日期 %1$s</string>
<string name="mtrl_picker_range_header_only_start_selected">%1$s 結束日期</string>
<string name="mtrl_picker_range_header_selected">%1$s %2$s</string>
<string name="mtrl_picker_range_header_title">選取範圍</string>
<string name="mtrl_picker_range_header_unselected">開始日期 - 結束日期</string>
<string name="mtrl_picker_save">儲存</string>
<string name="mtrl_picker_start_date_description">開始日期:%1$s</string>
<string name="mtrl_picker_text_input_date_hint">日期</string>
<string name="mtrl_picker_text_input_date_range_end_hint">結束日期</string>
<string name="mtrl_picker_text_input_date_range_start_hint">開始日期</string>
<string name="mtrl_picker_text_input_day_abbr">d</string>
<string name="mtrl_picker_text_input_month_abbr">m</string>
<string name="mtrl_picker_text_input_year_abbr">y</string>
<string name="mtrl_picker_today_description">今天 %1$s</string>
<string name="mtrl_picker_toggle_to_calendar_input_mode">切換至日曆輸入模式</string>
<string name="mtrl_picker_toggle_to_day_selection">輕觸即可切換至日曆檢視畫面</string>
<string name="mtrl_picker_toggle_to_text_input_mode">切換至文字輸入模式</string>
<string name="mtrl_picker_toggle_to_year_selection">輕觸即可切換至年份檢視畫面</string>
<string name="mtrl_timepicker_cancel">取消</string>
<string name="mtrl_timepicker_confirm">確定</string>
<string name="note_alert_expired">已過期</string>
<string name="note_link_email">發送郵件</string>
<string name="note_link_other">打開地圖</string>
<string name="note_link_tel">呼叫電話</string>
<string name="note_link_web">浏覽網頁</string>
<string name="notealert_enter">查看</string>
<string name="notealert_ok">知道了</string>
<string name="notelist_menu_new">新建便簽</string>
<string name="notelist_string_info">...</string>
<string name="password_toggle_content_description">顯示密碼</string>
<string name="preferences_account_summary">与google task同步便簽記錄</string>
<string name="preferences_account_title">同步賬號</string>
<string name="preferences_add_account">添加賬號</string>
<string name="preferences_bg_random_appear_title">新建便籤背景顏色隨機</string>
<string name="preferences_button_sync_cancel">取消同步</string>
<string name="preferences_button_sync_immediately">立即同步</string>
<string name="preferences_dialog_change_account_title">當前帳號 %1$s</string>
<string name="preferences_dialog_change_account_warn_msg">如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復</string>
<string name="preferences_dialog_select_account_tips">請選擇google帳號便簽將與該帳號的google task內容同步。</string>
<string name="preferences_dialog_select_account_title">同步便簽</string>
<string name="preferences_last_sync_time">上次同步于 %1$s</string>
<string name="preferences_menu_cancel">取消</string>
<string name="preferences_menu_change_account">更換賬號</string>
<string name="preferences_menu_remove_account">刪除賬號</string>
<string name="preferences_title">設置</string>
<string name="preferences_toast_cannot_change_account">正在同步中,不能修改同步帳號</string>
<string name="preferences_toast_success_set_accout">同步帳號已設置為%1$s</string>
<string name="search">便籤</string>
<string name="search_hint">搜索便籤</string>
<string name="search_label">正在搜索便籤</string>
<string msgid="6264217191555673260" name="search_menu_title">"搜尋"</string>
<string name="search_setting_description">便籤中的文字</string>
<string name="set_remind_time_message">創建提醒</string>
<string msgid="6277540029070332960" name="status_bar_notification_info_overflow">"999+"</string>
<string name="success_sdcard_export">導出成功</string>
<string name="success_sync_account">與%1$s同步成功</string>
<string name="sync_progress_init_list">正在獲取服務器便籤列表...</string>
<string name="sync_progress_login">登陸%1$s...</string>
<string name="sync_progress_syncing">正在同步本地便籤...</string>
<string name="ticker_cancel">同步已取消</string>
<string name="ticker_fail">同步失敗</string>
<string name="ticker_success">同步成功</string>
<string name="ticker_syncing">同步便簽...</string>
<string name="widget_havenot_content">沒有關聯內容,點擊新建便簽。</string>
<string name="widget_under_visit_mode">訪客模式下,便籤內容不可見</string>
</resources>

File diff suppressed because one or more lines are too long

@ -1,113 +0,0 @@
#Sat Nov 15 09:53:21 CST 2025
net.micode.notes.app-main-5\:/color/primary_text_dark.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\color\\primary_text_dark.xml
net.micode.notes.app-main-5\:/color/secondary_text_dark.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\color\\secondary_text_dark.xml
net.micode.notes.app-main-5\:/drawable-hdpi/bg_btn_set_color.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\bg_btn_set_color.png
net.micode.notes.app-main-5\:/drawable-hdpi/bg_color_btn_mask.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\bg_color_btn_mask.png
net.micode.notes.app-main-5\:/drawable-hdpi/call_record.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\call_record.png
net.micode.notes.app-main-5\:/drawable-hdpi/clock.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\clock.png
net.micode.notes.app-main-5\:/drawable-hdpi/delete.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\delete.png
net.micode.notes.app-main-5\:/drawable-hdpi/dropdown_icon.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\dropdown_icon.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_blue.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_blue.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_green.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_green.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_red.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_red.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_title_blue.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_title_blue.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_title_green.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_title_green.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_title_red.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_title_red.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_title_white.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_title_white.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_title_yellow.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_title_yellow.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_white.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_white.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/edit_yellow.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\edit_yellow.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/font_large.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\font_large.png
net.micode.notes.app-main-5\:/drawable-hdpi/font_normal.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\font_normal.png
net.micode.notes.app-main-5\:/drawable-hdpi/font_size_selector_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\font_size_selector_bg.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/font_small.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\font_small.png
net.micode.notes.app-main-5\:/drawable-hdpi/font_super.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\font_super.png
net.micode.notes.app-main-5\:/drawable-hdpi/icon_app.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\icon_app.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_background.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_background.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_blue_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_blue_down.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_blue_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_blue_middle.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_blue_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_blue_single.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_blue_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_blue_up.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_folder.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_folder.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_footer_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_footer_bg.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_green_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_green_down.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_green_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_green_middle.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_green_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_green_single.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_green_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_green_up.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_red_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_red_down.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_red_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_red_middle.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_red_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_red_single.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_red_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_red_up.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_white_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_white_down.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_white_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_white_middle.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_white_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_white_single.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_white_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_white_up.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_yellow_down.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_yellow_down.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_yellow_middle.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_yellow_middle.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_yellow_single.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_yellow_single.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/list_yellow_up.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\list_yellow_up.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/menu_delete.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\menu_delete.png
net.micode.notes.app-main-5\:/drawable-hdpi/menu_move.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\menu_move.png
net.micode.notes.app-main-5\:/drawable-hdpi/new_note_normal.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\new_note_normal.png
net.micode.notes.app-main-5\:/drawable-hdpi/new_note_pressed.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\new_note_pressed.png
net.micode.notes.app-main-5\:/drawable-hdpi/note_edit_color_selector_panel.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\note_edit_color_selector_panel.png
net.micode.notes.app-main-5\:/drawable-hdpi/notification.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\notification.png
net.micode.notes.app-main-5\:/drawable-hdpi/search_result.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\search_result.png
net.micode.notes.app-main-5\:/drawable-hdpi/selected.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\selected.png
net.micode.notes.app-main-5\:/drawable-hdpi/title_alert.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\title_alert.png
net.micode.notes.app-main-5\:/drawable-hdpi/title_bar_bg.9.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\title_bar_bg.9.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_2x_blue.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_2x_blue.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_2x_green.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_2x_green.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_2x_red.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_2x_red.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_2x_white.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_2x_white.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_2x_yellow.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_2x_yellow.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_4x_blue.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_4x_blue.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_4x_green.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_4x_green.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_4x_red.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_4x_red.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_4x_white.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_4x_white.png
net.micode.notes.app-main-5\:/drawable-hdpi/widget_4x_yellow.png=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable-hdpi-v4\\widget_4x_yellow.png
net.micode.notes.app-main-5\:/drawable/ic_launcher_background.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable\\ic_launcher_background.xml
net.micode.notes.app-main-5\:/drawable/ic_launcher_foreground.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable\\ic_launcher_foreground.xml
net.micode.notes.app-main-5\:/drawable/new_note.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\drawable\\new_note.xml
net.micode.notes.app-main-5\:/layout/account_dialog_title.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\account_dialog_title.xml
net.micode.notes.app-main-5\:/layout/activity_main.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\activity_main.xml
net.micode.notes.app-main-5\:/layout/add_account_text.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\add_account_text.xml
net.micode.notes.app-main-5\:/layout/datetime_picker.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\datetime_picker.xml
net.micode.notes.app-main-5\:/layout/dialog_edit_text.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\dialog_edit_text.xml
net.micode.notes.app-main-5\:/layout/folder_list_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\folder_list_item.xml
net.micode.notes.app-main-5\:/layout/note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_edit.xml
net.micode.notes.app-main-5\:/layout/note_edit_list_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_edit_list_item.xml
net.micode.notes.app-main-5\:/layout/note_item.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_item.xml
net.micode.notes.app-main-5\:/layout/note_list.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_list.xml
net.micode.notes.app-main-5\:/layout/note_list_dropdown_menu.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_list_dropdown_menu.xml
net.micode.notes.app-main-5\:/layout/note_list_footer.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\note_list_footer.xml
net.micode.notes.app-main-5\:/layout/settings_header.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\settings_header.xml
net.micode.notes.app-main-5\:/layout/widget_2x.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\widget_2x.xml
net.micode.notes.app-main-5\:/layout/widget_4x.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\layout\\widget_4x.xml
net.micode.notes.app-main-5\:/menu/call_note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\call_note_edit.xml
net.micode.notes.app-main-5\:/menu/call_record_folder.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\call_record_folder.xml
net.micode.notes.app-main-5\:/menu/note_edit.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\note_edit.xml
net.micode.notes.app-main-5\:/menu/note_list.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\note_list.xml
net.micode.notes.app-main-5\:/menu/note_list_dropdown.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\note_list_dropdown.xml
net.micode.notes.app-main-5\:/menu/note_list_options.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\note_list_options.xml
net.micode.notes.app-main-5\:/menu/sub_folder.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\menu\\sub_folder.xml
net.micode.notes.app-main-5\:/mipmap-anydpi/ic_launcher.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-anydpi-v4\\ic_launcher.xml
net.micode.notes.app-main-5\:/mipmap-anydpi/ic_launcher_round.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-anydpi-v4\\ic_launcher_round.xml
net.micode.notes.app-main-5\:/mipmap-hdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-hdpi-v4\\ic_launcher.webp
net.micode.notes.app-main-5\:/mipmap-hdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-hdpi-v4\\ic_launcher_round.webp
net.micode.notes.app-main-5\:/mipmap-mdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-mdpi-v4\\ic_launcher.webp
net.micode.notes.app-main-5\:/mipmap-mdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-mdpi-v4\\ic_launcher_round.webp
net.micode.notes.app-main-5\:/mipmap-xhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xhdpi-v4\\ic_launcher.webp
net.micode.notes.app-main-5\:/mipmap-xhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xhdpi-v4\\ic_launcher_round.webp
net.micode.notes.app-main-5\:/mipmap-xxhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xxhdpi-v4\\ic_launcher.webp
net.micode.notes.app-main-5\:/mipmap-xxhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xxhdpi-v4\\ic_launcher_round.webp
net.micode.notes.app-main-5\:/mipmap-xxxhdpi/ic_launcher.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xxxhdpi-v4\\ic_launcher.webp
net.micode.notes.app-main-5\:/mipmap-xxxhdpi/ic_launcher_round.webp=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\mipmap-xxxhdpi-v4\\ic_launcher_round.webp
net.micode.notes.app-main-5\:/raw-zh-rCN/introduction=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\raw-zh-rCN\\introduction
net.micode.notes.app-main-5\:/raw/introduction=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\raw\\introduction
net.micode.notes.app-main-5\:/xml/backup_rules.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\backup_rules.xml
net.micode.notes.app-main-5\:/xml/data_extraction_rules.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\data_extraction_rules.xml
net.micode.notes.app-main-5\:/xml/preferences.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\preferences.xml
net.micode.notes.app-main-5\:/xml/searchable.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\searchable.xml
net.micode.notes.app-main-5\:/xml/widget_2x_info.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\widget_2x_info.xml
net.micode.notes.app-main-5\:/xml/widget_4x_info.xml=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\packaged_res\\debug\\packageDebugResources\\xml\\widget_4x_info.xml

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="menu_share_ways">
<item>短信</item>
<item>邮件</item>
</string-array>
<plurals name="search_results_title">
<item quantity="other"><ns1:g id="NUMBER">%1$s</ns1:g> 条符合“<ns1:g id="SEARCH">%2$s</ns1:g>”的搜索结果</item>
</plurals>
<string name="alert_message_delete_folder">确认删除文件夹及所包含的便签吗?</string>
<string name="alert_message_delete_note">确认要删除该条便签吗?</string>
<string name="alert_message_delete_notes">确认要删除所选的 %d 条便签吗?</string>
<string name="alert_title_delete">删除</string>
<string name="app_name">便签</string>
<string name="app_widget2x2">便签2x2</string>
<string name="app_widget4x4">便签4x4</string>
<string name="button_delete">删除</string>
<string name="call_record_folder_name">通话便签</string>
<string name="datetime_dialog_cancel">取消</string>
<string name="datetime_dialog_ok">设置</string>
<string name="delete_remind_time_message">成功删除提醒</string>
<string name="error_note_empty_for_clock">不能为空便签设置闹钟提醒</string>
<string name="error_note_empty_for_send_to_desktop">不能将空便签发送到桌面</string>
<string name="error_note_not_exist">要查看的便签不存在</string>
<string name="error_sdcard_export">导出文本时发生错误请检查SD卡</string>
<string name="error_sdcard_unmounted">SD卡被占用不能操作</string>
<string name="error_sync_cancelled">同步已取消</string>
<string name="error_sync_internal">同步失败,发生内部错误</string>
<string name="error_sync_network">同步失败,请检查网络和帐号设置</string>
<string name="failed_sdcard_export">导出失败</string>
<string name="folder_exist">文件夹 %1$s 已存在,请重新命名</string>
<string name="format_date_ymd">yyyyMMdd</string>
<string name="format_datetime_mdhm">MM月dd日 kk:mm</string>
<string name="format_exported_file_location">已将文本文件(%1$s)输出至SD卡(%2$s)目录</string>
<string name="format_move_notes_to_folder">已将所选 %1$d 条便签移到 %2$s 文件夹</string>
<string name="hint_foler_name">请输入名称</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="menu_alert">提醒我</string>
<string name="menu_create_folder">新建文件夹</string>
<string name="menu_delete">删除</string>
<string name="menu_deselect_all">取消全选</string>
<string name="menu_export_text">导出文本</string>
<string name="menu_folder_change_name">修改文件夹名称</string>
<string name="menu_folder_delete">刪除文件夹</string>
<string name="menu_folder_view">查看文件夹</string>
<string name="menu_font_large"></string>
<string name="menu_font_normal">正常</string>
<string name="menu_font_size">文字大小</string>
<string name="menu_font_small"></string>
<string name="menu_font_super">超大</string>
<string name="menu_list_mode">进入清单模式</string>
<string name="menu_move">移动到文件夹</string>
<string name="menu_move_parent_folder">上一级文件夹</string>
<string name="menu_normal_mode">退出清单模式</string>
<string name="menu_remove_remind">删除提醒</string>
<string name="menu_search">搜索</string>
<string name="menu_select_all">全选</string>
<string name="menu_select_none">没有选中项,操作无效</string>
<string name="menu_select_title">选中了 %d 项</string>
<string name="menu_send_to_desktop">发送到桌面</string>
<string name="menu_setting">设置</string>
<string name="menu_share">分享</string>
<string name="menu_sync">同步</string>
<string name="menu_sync_cancel">取消同步</string>
<string name="menu_title_select_folder">选择文件夹</string>
<string name="note_alert_expired">已过期</string>
<string name="note_link_email">发送邮件</string>
<string name="note_link_other">打开地图</string>
<string name="note_link_tel">呼叫电话</string>
<string name="note_link_web">浏览网页</string>
<string name="notealert_enter">查看</string>
<string name="notealert_ok">知道了</string>
<string name="notelist_menu_new">新建便签</string>
<string name="notelist_string_info">...</string>
<string name="preferences_account_summary">与google task同步便签记录</string>
<string name="preferences_account_title">同步账号</string>
<string name="preferences_add_account">添加账号</string>
<string name="preferences_bg_random_appear_title">新建便签背景颜色随机</string>
<string name="preferences_button_sync_cancel">取消同步</string>
<string name="preferences_button_sync_immediately">立即同步</string>
<string name="preferences_dialog_change_account_title">当前帐号 %1$s</string>
<string name="preferences_dialog_change_account_warn_msg">如更换同步帐号,过去的帐号同步信息将被清空,再次切换的同时可能会造成数据重复</string>
<string name="preferences_dialog_select_account_tips">请选择google帐号便签将与该帐号的google task内容同步。</string>
<string name="preferences_dialog_select_account_title">同步便签</string>
<string name="preferences_last_sync_time">上次同步于 %1$s</string>
<string name="preferences_menu_cancel">取消</string>
<string name="preferences_menu_change_account">更换账号</string>
<string name="preferences_menu_remove_account">删除账号</string>
<string name="preferences_title">设置</string>
<string name="preferences_toast_cannot_change_account">正在同步中,不能修改同步帐号</string>
<string name="preferences_toast_success_set_accout">同步帐号已设置为%1$s</string>
<string name="search">便签</string>
<string name="search_hint">搜索便签</string>
<string name="search_label">正在搜索便签</string>
<string name="search_setting_description">便签中的文字</string>
<string name="set_remind_time_message">创建提醒</string>
<string name="success_sdcard_export">导出成功</string>
<string name="success_sync_account">与%1$s同步成功</string>
<string name="sync_progress_init_list">正在获取服务器便签列表...</string>
<string name="sync_progress_login">登录%1$s...</string>
<string name="sync_progress_syncing">正在同步本地便签...</string>
<string name="ticker_cancel">同步已取消</string>
<string name="ticker_fail">同步失败</string>
<string name="ticker_success">同步成功</string>
<string name="ticker_syncing">同步便签...</string>
<string name="widget_havenot_content">没有关联内容,点击新建便签。</string>
<string name="widget_under_visit_mode">访客模式下,便签内容不可见</string>
</resources>

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="menu_share_ways">
<item>短信</item>
<item>郵件</item>
</string-array>
<plurals name="search_results_title">
<item quantity="other"><ns1:g id="NUMBER">%1$s</ns1:g> 條符合”<ns1:g id="SEARCH">%2$s</ns1:g>“的搜尋結果</item>
</plurals>
<string name="alert_message_delete_folder">確認刪除檔夾及所包含的便簽嗎?</string>
<string name="alert_message_delete_note">确认要删除該條便籤嗎?</string>
<string name="alert_message_delete_notes">确认要刪除所選的 %d 條便籤嗎?</string>
<string name="alert_title_delete">刪除</string>
<string name="app_name">便簽</string>
<string name="app_widget2x2">便簽2x2</string>
<string name="app_widget4x4">便簽4x4</string>
<string name="button_delete">刪除</string>
<string name="call_record_folder_name">通話便籤</string>
<string name="datetime_dialog_cancel">取消</string>
<string name="datetime_dialog_ok">設置</string>
<string name="delete_remind_time_message">成功刪除提醒</string>
<string name="error_note_empty_for_clock">不能爲空便籤設置鬧鐘提醒</string>
<string name="error_note_empty_for_send_to_desktop">不能將空便籤發送到桌面</string>
<string name="error_note_not_exist">要查看的便籤不存在</string>
<string name="error_sdcard_export">導出TXT時發生錯誤請檢查SD卡</string>
<string name="error_sdcard_unmounted">SD卡被佔用不能操作</string>
<string name="error_sync_cancelled">同步已取消</string>
<string name="error_sync_internal">同步失敗,發生內部錯誤</string>
<string name="error_sync_network">同步失敗,請檢查網絡和帳號設置</string>
<string name="failed_sdcard_export">導出失敗</string>
<string name="folder_exist">文件夾 %1$s 已存在,請重新命名</string>
<string name="format_date_ymd">yyyyMMdd</string>
<string name="format_datetime_mdhm">MM月dd日 kk:mm</string>
<string name="format_exported_file_location">已將文本文件(%1$s)導出至SD(%2$s)目錄</string>
<string name="format_move_notes_to_folder">已將所選 %1$d 便籤移到 %2$s 文件夾</string>
<string name="hint_foler_name">請輸入名稱</string>
<string name="info_note_enter_desktop">已添加到桌面</string>
<string name="menu_alert">提醒我</string>
<string name="menu_create_folder">新建文件夾</string>
<string name="menu_delete">刪除</string>
<string name="menu_deselect_all">取消全選</string>
<string name="menu_export_text">導出文本</string>
<string name="menu_folder_change_name">修改文件夾名稱</string>
<string name="menu_folder_delete">刪除文件夾</string>
<string name="menu_folder_view">查看文件夾</string>
<string name="menu_font_large"></string>
<string name="menu_font_normal">正常</string>
<string name="menu_font_size">文字大小</string>
<string name="menu_font_small"></string>
<string name="menu_font_super">超大</string>
<string name="menu_list_mode">進入清單模式</string>
<string name="menu_move">移動到文件夾</string>
<string name="menu_move_parent_folder">上一級文件夾</string>
<string name="menu_normal_mode">退出清單模式</string>
<string name="menu_remove_remind">刪除提醒</string>
<string name="menu_search">搜尋</string>
<string name="menu_select_all">全選</string>
<string name="menu_select_none">沒有選中項,操作無效</string>
<string name="menu_select_title">選中了 %d 項</string>
<string name="menu_send_to_desktop">發送到桌面</string>
<string name="menu_setting">設置</string>
<string name="menu_share">分享</string>
<string name="menu_sync">同步</string>
<string name="menu_sync_cancel">取消同步</string>
<string name="menu_title_select_folder">選擇文件夾</string>
<string name="note_alert_expired">已過期</string>
<string name="note_link_email">發送郵件</string>
<string name="note_link_other">打開地圖</string>
<string name="note_link_tel">呼叫電話</string>
<string name="note_link_web">浏覽網頁</string>
<string name="notealert_enter">查看</string>
<string name="notealert_ok">知道了</string>
<string name="notelist_menu_new">新建便簽</string>
<string name="notelist_string_info">...</string>
<string name="preferences_account_summary">与google task同步便簽記錄</string>
<string name="preferences_account_title">同步賬號</string>
<string name="preferences_add_account">添加賬號</string>
<string name="preferences_bg_random_appear_title">新建便籤背景顏色隨機</string>
<string name="preferences_button_sync_cancel">取消同步</string>
<string name="preferences_button_sync_immediately">立即同步</string>
<string name="preferences_dialog_change_account_title">當前帳號 %1$s</string>
<string name="preferences_dialog_change_account_warn_msg">如更換同步帳號,過去的帳號同步信息將被清空,再次切換的同時可能會造成數據重復</string>
<string name="preferences_dialog_select_account_tips">請選擇google帳號便簽將與該帳號的google task內容同步。</string>
<string name="preferences_dialog_select_account_title">同步便簽</string>
<string name="preferences_last_sync_time">上次同步于 %1$s</string>
<string name="preferences_menu_cancel">取消</string>
<string name="preferences_menu_change_account">更換賬號</string>
<string name="preferences_menu_remove_account">刪除賬號</string>
<string name="preferences_title">設置</string>
<string name="preferences_toast_cannot_change_account">正在同步中,不能修改同步帳號</string>
<string name="preferences_toast_success_set_accout">同步帳號已設置為%1$s</string>
<string name="search">便籤</string>
<string name="search_hint">搜索便籤</string>
<string name="search_label">正在搜索便籤</string>
<string name="search_setting_description">便籤中的文字</string>
<string name="set_remind_time_message">創建提醒</string>
<string name="success_sdcard_export">導出成功</string>
<string name="success_sync_account">與%1$s同步成功</string>
<string name="sync_progress_init_list">正在獲取服務器便籤列表...</string>
<string name="sync_progress_login">登陸%1$s...</string>
<string name="sync_progress_syncing">正在同步本地便籤...</string>
<string name="ticker_cancel">同步已取消</string>
<string name="ticker_fail">同步失敗</string>
<string name="ticker_success">同步成功</string>
<string name="ticker_syncing">同步便簽...</string>
<string name="widget_havenot_content">沒有關聯內容,點擊新建便簽。</string>
<string name="widget_under_visit_mode">訪客模式下,便籤內容不可見</string>
</resources>

@ -1,174 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="format_for_exported_note">
<item>-%s</item>
<item>--%s</item>
<item>--%s</item>
<item>--%s</item>
</string-array>
<string-array name="menu_share_ways">
<item>Messaging</item>
<item>Email</item>
</string-array>
<color name="user_query_highlight">#335b5b5b</color>
<dimen name="text_font_size_large">26sp</dimen>
<dimen name="text_font_size_medium">20sp</dimen>
<dimen name="text_font_size_normal">17sp</dimen>
<dimen name="text_font_size_small">14sp</dimen>
<dimen name="text_font_size_super">33sp</dimen>
<plurals name="search_results_title">
<item quantity="one"><ns1:g example="1" id="number">%1$s</ns1:g> result for \"<ns1:g example="???" id="search">%2$s</ns1:g>\"</item>
<item quantity="other"><ns1:g example="15" id="number">%1$s</ns1:g> results for \"<ns1:g example="???" id="search">%2$s</ns1:g>\"</item>
</plurals>
<string name="alert_message_delete_folder">Confirm to delete folder and its notes?</string>
<string name="alert_message_delete_note">Confirm to delete this note?</string>
<string name="alert_message_delete_notes">Confirm to delete the selected %d notes?</string>
<string name="alert_title_delete">Delete selected notes</string>
<string name="app_name">Notes</string>
<string name="app_widget2x2">Notes 2x2</string>
<string name="app_widget4x4">Notes 4x4</string>
<string name="button_delete">Delete</string>
<string name="call_record_folder_name">Call notes</string>
<string name="datetime_dialog_cancel">cancel</string>
<string name="datetime_dialog_ok">set</string>
<string name="delete_remind_time_message">Delete reminder successfully</string>
<string name="error_note_empty_for_clock">Sorry, can not set clock on empty note</string>
<string name="error_note_empty_for_send_to_desktop">Sorry, can not send and empty note to home</string>
<string name="error_note_not_exist">The note is not exist</string>
<string name="error_sdcard_export">Export failed, please check SD card</string>
<string name="error_sdcard_unmounted">SD card busy, not available now</string>
<string name="error_sync_cancelled">Sync is canceled</string>
<string name="error_sync_internal">Sync failed, internal error occurs</string>
<string name="error_sync_network">Sync failed, please check network and account settings</string>
<string name="failed_sdcard_export">Export fail</string>
<string name="file_name_txt_format">notes_%s.txt</string>
<string name="file_path">/MIUI/notes/</string>
<string name="folder_exist">The folder %1$s exist, please rename</string>
<string name="format_date_ymd">yyyyMMdd</string>
<string name="format_datetime_mdhm">MMMd kk:mm</string>
<string name="format_exported_file_location">Export text file (%1$s) to SD (%2$s) directory</string>
<string name="format_folder_files_count">(%d)</string>
<string name="format_move_notes_to_folder">Have moved selected %1$d notes to %2$s folder</string>
<string name="hint_foler_name">Input name</string>
<string name="info_note_enter_desktop">Note added to home</string>
<string name="menu_alert">Remind me</string>
<string name="menu_create_folder">New Folder</string>
<string name="menu_delete">Delete</string>
<string name="menu_deselect_all">Deselect all</string>
<string name="menu_export_text">Export text</string>
<string name="menu_folder_change_name">Change folder name</string>
<string name="menu_folder_delete">Delete folder</string>
<string name="menu_folder_view">View folder</string>
<string name="menu_font_large">Large</string>
<string name="menu_font_normal">Medium</string>
<string name="menu_font_size">Font size</string>
<string name="menu_font_small">Small</string>
<string name="menu_font_super">Super</string>
<string name="menu_list_mode">Enter check list</string>
<string name="menu_move">Move to folder</string>
<string name="menu_move_parent_folder">Parent folder</string>
<string name="menu_normal_mode">Leave check list</string>
<string name="menu_remove_remind">Delete reminder</string>
<string name="menu_search">Search</string>
<string name="menu_select_all">Select all</string>
<string name="menu_select_none">Nothing selected, the operation is invalid</string>
<string name="menu_select_title">%d selected</string>
<string name="menu_send_to_desktop">Send to home</string>
<string name="menu_setting">Settings</string>
<string name="menu_share">Share</string>
<string name="menu_sync">Sync</string>
<string name="menu_sync_cancel">Cancel syncing</string>
<string name="menu_title_select_folder">Select folder</string>
<string name="note_alert_expired">Expired</string>
<string name="note_link_email">Send email</string>
<string name="note_link_other">Open map</string>
<string name="note_link_tel">Call</string>
<string name="note_link_web">Browse web</string>
<string name="notealert_enter">Take a look</string>
<string name="notealert_ok">Got it</string>
<string name="notelist_menu_new">Add note</string>
<string name="notelist_string_info">...</string>
<string name="preferences_account_summary">Sync notes with google task</string>
<string name="preferences_account_title">Sync account</string>
<string name="preferences_add_account">Add account</string>
<string name="preferences_bg_random_appear_title">New note background color random</string>
<string name="preferences_button_sync_cancel">Cancel syncing</string>
<string name="preferences_button_sync_immediately">Sync immediately</string>
<string name="preferences_dialog_change_account_title">Current account %1$s</string>
<string name="preferences_dialog_change_account_warn_msg">All sync related information will be deleted, which may result in duplicated items sometime</string>
<string name="preferences_dialog_select_account_tips">Please select a google account. Local notes will be synced with google task.</string>
<string name="preferences_dialog_select_account_title">Sync notes</string>
<string name="preferences_last_sync_time">Last sync time %1$s</string>
<string name="preferences_last_sync_time_format">yyyy-MM-dd hh:mm:ss</string>
<string name="preferences_menu_cancel">Cancel</string>
<string name="preferences_menu_change_account">Change sync account</string>
<string name="preferences_menu_remove_account">Remove sync account</string>
<string name="preferences_title">Settings</string>
<string name="preferences_toast_cannot_change_account">Cannot change the account because sync is in progress</string>
<string name="preferences_toast_success_set_accout">%1$s has been set as the sync account</string>
<string name="search">Notes</string>
<string name="search_hint">Search notes</string>
<string name="search_label">Searching Notes</string>
<string name="search_setting_description">Text in your notes</string>
<string name="set_remind_time_message">Set reminder</string>
<string name="success_sdcard_export">Export successful</string>
<string name="success_sync_account">Sync is successful with account %1$s</string>
<string name="sync_progress_init_list">Getting remote note list...</string>
<string name="sync_progress_login">Logging into %1$s...</string>
<string name="sync_progress_syncing">Synchronize local notes with Google Task...</string>
<string name="ticker_cancel">Sync is canceled</string>
<string name="ticker_fail">Sync is failed</string>
<string name="ticker_success">Sync is successful</string>
<string name="ticker_syncing">Syncing notes...</string>
<string name="widget_havenot_content">No associated note found, click to create associated note.</string>
<string name="widget_under_visit_mode">Privacy modecan not see note content</string>
<style name="Base.Theme.Notesmaster" parent="Theme.Material3.DayNight.NoActionBar">
</style>
<style name="HighlightTextAppearancePrimary">
<item name="android:textSize">@dimen/text_font_size_normal</item>
<item name="android:textColor">@color/primary_text_dark</item>
</style>
<style name="HighlightTextAppearanceSecondary">
<item name="android:textSize">@dimen/text_font_size_small</item>
<item name="android:textColor">@color/secondary_text_dark</item>
</style>
<style name="NoteActionBarStyle" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
<item name="android:displayOptions"/>
<item name="android:visibility">gone</item>
</style>
<style name="NoteTheme" parent="@android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">@style/NoteActionBarStyle</item>
</style>
<style name="TextAppearanceLarge">
<item name="android:textSize">@dimen/text_font_size_large</item>
<item name="android:textColorLink">#0000ff</item>
</style>
<style name="TextAppearanceMedium">
<item name="android:textSize">@dimen/text_font_size_medium</item>
<item name="android:textColorLink">#0000ff</item>
</style>
<style name="TextAppearanceNormal">
<item name="android:textSize">@dimen/text_font_size_normal</item>
<item name="android:textColorLink">#0000ff</item>
</style>
<style name="TextAppearancePrimaryItem">
<item name="android:textSize">@dimen/text_font_size_normal</item>
<item name="android:textColor">@color/primary_text_dark</item>
</style>
<style name="TextAppearanceSecondaryItem">
<item name="android:textSize">@dimen/text_font_size_small</item>
<item name="android:textColor">@color/secondary_text_dark</item>
</style>
<style name="TextAppearanceSuper">
<item name="android:textSize">@dimen/text_font_size_super</item>
<item name="android:textColorLink">#0000ff</item>
</style>
<style name="TextAppearanceUnderMenuIcon">
<item name="android:textSize">@dimen/text_font_size_normal</item>
<item name="android:textColor">@android:color/black</item>
</style>
<style name="Theme.Notesmaster" parent="Base.Theme.Notesmaster"/>
</resources>

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

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

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

@ -1,28 +0,0 @@
#Sat Nov 15 10:02:39 CST 2025
base.0=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeExtDexDebug\\classes.dex
base.1=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\0\\classes.dex
base.2=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\11\\classes.dex
base.3=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\12\\classes.dex
base.4=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\13\\classes.dex
base.5=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\15\\classes.dex
base.6=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\4\\classes.dex
base.7=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeProjectDexDebug\\5\\classes.dex
base.8=D\:\\Android_Studio\\Notes-master\\app\\build\\intermediates\\dex\\debug\\mergeExtDexDebug\\classes2.dex
path.0=classes.dex
path.1=0/classes.dex
path.2=11/classes.dex
path.3=12/classes.dex
path.4=13/classes.dex
path.5=15/classes.dex
path.6=4/classes.dex
path.7=5/classes.dex
path.8=classes2.dex
renamed.0=classes.dex
renamed.1=classes2.dex
renamed.2=classes3.dex
renamed.3=classes4.dex
renamed.4=classes5.dex
renamed.5=classes6.dex
renamed.6=classes7.dex
renamed.7=classes8.dex
renamed.8=classes9.dex

@ -1,480 +0,0 @@
-- Merging decision tree log ---
manifest
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:2:1-156:12
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:2:1-156:12
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:2:1-156:12
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:2:1-156:12
MERGED from [com.google.android.material:material:1.10.0] C:\Users\10378\.gradle\caches\8.13\transforms\ed657c2504032b7a94cb05d64bda34d5\transformed\material-1.10.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.constraintlayout:constraintlayout:2.1.4] C:\Users\10378\.gradle\caches\8.13\transforms\870de2a67c9be5b4f7ba5f2fd672777d\transformed\constraintlayout-2.1.4\AndroidManifest.xml:2:1-11:12
MERGED from [androidx.appcompat:appcompat-resources:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\253ea21f9554755940a8db3922afaeff\transformed\appcompat-resources-1.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.appcompat:appcompat:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\9193172717a5ca3eb1d6453fe3e6bfa7\transformed\appcompat-1.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.viewpager2:viewpager2:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\d5e3c0fc96934450134f763386936834\transformed\viewpager2-1.0.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.fragment:fragment:1.3.6] C:\Users\10378\.gradle\caches\8.13\transforms\d7e369ba3abc83dc6eb17d2b9ff2b16e\transformed\fragment-1.3.6\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.activity:activity:1.8.0] C:\Users\10378\.gradle\caches\8.13\transforms\4d6dea971ad80dc04c21708a717167ea\transformed\activity-1.8.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.emoji2:emoji2-views-helper:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\48c4c6d14791ee6cec92f7438b041848\transformed\emoji2-views-helper-1.2.0\AndroidManifest.xml:2:1-7:12
MERGED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:17:1-35:12
MERGED from [androidx.drawerlayout:drawerlayout:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\8aefd914ef407cb79d151c2844281eb1\transformed\drawerlayout-1.1.1\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.coordinatorlayout:coordinatorlayout:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\2f69197fad576b29d6a5e0f895e3aeb9\transformed\coordinatorlayout-1.1.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.dynamicanimation:dynamicanimation:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\15c4f2ae4253de18a0c7852b333c0870\transformed\dynamicanimation-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.transition:transition:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f090351ecbad81af69788a152edefd31\transformed\transition-1.2.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\3fd560b09a657265f043b6181d3cad63\transformed\vectordrawable-animated-1.1.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\25cc9b6c6f46a5024d85c2da5b360d5f\transformed\vectordrawable-1.1.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.legacy:legacy-support-core-utils:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\dc979c0b8b75e85bf4f176a761287089\transformed\legacy-support-core-utils-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.loader:loader:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\e83b86d57eb58c7c76ab2665efee131c\transformed\loader-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.savedstate:savedstate:1.2.1] C:\Users\10378\.gradle\caches\8.13\transforms\3cd917734a573e15a1ed51b3d437c18f\transformed\savedstate-1.2.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.lifecycle:lifecycle-livedata:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\8fdc621be8d3dd6a3c8f1f413cf45d5f\transformed\lifecycle-livedata-2.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:17:1-35:12
MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\0316481e296926d0b7aaa92fc9d0879d\transformed\lifecycle-livedata-core-2.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\aa81dc7b2bc51662cef11e0791bbccc9\transformed\lifecycle-viewmodel-2.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.lifecycle:lifecycle-runtime:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\bf4089128f1f860ab38b60b53569d520\transformed\lifecycle-runtime-2.6.1\AndroidManifest.xml:2:1-7:12
MERGED from [androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\85be53262d2521c6dcf63c409a54c35e\transformed\lifecycle-viewmodel-savedstate-2.6.1\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.core:core-ktx:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\03335d5232404a4d38ccc4e74bc998ab\transformed\core-ktx-1.9.0\AndroidManifest.xml:2:1-7:12
MERGED from [androidx.viewpager:viewpager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\de3f4c52d4b0fdcc70f69eab382f3d12\transformed\viewpager-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.recyclerview:recyclerview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\71f6c76cdbc8be36c07e3dc59644ba39\transformed\recyclerview-1.1.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.customview:customview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\46a1220a5d503e2a05755c314bee8b16\transformed\customview-1.1.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:17:1-30:12
MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\7e23495443aa5b2a0afac798e6faa601\transformed\cursoradapter-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.cardview:cardview:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\a0953f93c0e20abd38f655613f7b3a90\transformed\cardview-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:17:1-55:12
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:17:1-33:12
MERGED from [androidx.tracing:tracing:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\9c51bb1fa58bd8be09c4e0e0ecfd97c7\transformed\tracing-1.0.0\AndroidManifest.xml:17:1-24:12
MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\f82167c09e6ae91837d5b49ea1000efe\transformed\versionedparcelable-1.1.1\AndroidManifest.xml:17:1-27:12
MERGED from [androidx.arch.core:core-runtime:2.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f834c8cdbec868b61611d31b352d57e2\transformed\core-runtime-2.2.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.interpolator:interpolator:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\0d41002bdfd7c1dabad725943b1ed8e9\transformed\interpolator-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.documentfile:documentfile:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\53b765b4f3e71482b1bc2f1c233d0225\transformed\documentfile-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.localbroadcastmanager:localbroadcastmanager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\6df0be6c3fac32bc396c1462157bc500\transformed\localbroadcastmanager-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.print:print:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\8a8e23bd4d6d86f3c9260a14e3fb93d7\transformed\print-1.0.0\AndroidManifest.xml:17:1-22:12
MERGED from [androidx.annotation:annotation-experimental:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\85ce0127863c5903b3a85662f2e1090e\transformed\annotation-experimental-1.3.0\AndroidManifest.xml:17:1-22:12
package
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
android:versionName
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
xmlns:tools
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:3:5-51
android:versionCode
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
xmlns:android
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:2:11-69
uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:5:5-81
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:5:22-78
uses-permission#com.android.launcher.permission.INSTALL_SHORTCUT
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:6:5-88
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:6:22-85
uses-permission#android.permission.INTERNET
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:7:5-67
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:7:22-64
uses-permission#android.permission.READ_CONTACTS
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:8:5-72
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:8:22-69
uses-permission#android.permission.MANAGE_ACCOUNTS
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:9:5-74
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:9:22-71
uses-permission#android.permission.AUTHENTICATE_ACCOUNTS
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:10:5-80
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:10:22-77
uses-permission#android.permission.GET_ACCOUNTS
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:11:5-71
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:11:22-68
uses-permission#android.permission.USE_CREDENTIALS
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:12:5-74
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:12:22-71
uses-permission#android.permission.RECEIVE_BOOT_COMPLETED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:13:5-81
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:13:22-78
application
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:15:5-154:19
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:15:5-154:19
MERGED from [com.google.android.material:material:1.10.0] C:\Users\10378\.gradle\caches\8.13\transforms\ed657c2504032b7a94cb05d64bda34d5\transformed\material-1.10.0\AndroidManifest.xml:22:5-20
MERGED from [com.google.android.material:material:1.10.0] C:\Users\10378\.gradle\caches\8.13\transforms\ed657c2504032b7a94cb05d64bda34d5\transformed\material-1.10.0\AndroidManifest.xml:22:5-20
MERGED from [androidx.constraintlayout:constraintlayout:2.1.4] C:\Users\10378\.gradle\caches\8.13\transforms\870de2a67c9be5b4f7ba5f2fd672777d\transformed\constraintlayout-2.1.4\AndroidManifest.xml:9:5-20
MERGED from [androidx.constraintlayout:constraintlayout:2.1.4] C:\Users\10378\.gradle\caches\8.13\transforms\870de2a67c9be5b4f7ba5f2fd672777d\transformed\constraintlayout-2.1.4\AndroidManifest.xml:9:5-20
MERGED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:23:5-33:19
MERGED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:23:5-33:19
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:23:5-33:19
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:23:5-33:19
MERGED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:28:5-89
MERGED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:28:5-89
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:23:5-53:19
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:23:5-53:19
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:25:5-31:19
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:25:5-31:19
MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\f82167c09e6ae91837d5b49ea1000efe\transformed\versionedparcelable-1.1.1\AndroidManifest.xml:24:5-25:19
MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\f82167c09e6ae91837d5b49ea1000efe\transformed\versionedparcelable-1.1.1\AndroidManifest.xml:24:5-25:19
android:extractNativeLibs
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
android:appComponentFactory
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:28:18-86
android:supportsRtl
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:22:9-35
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:20:9-41
android:fullBackupContent
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:18:9-54
android:roundIcon
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:21:9-54
tools:targetApi
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:24:9-29
android:icon
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:19:9-43
android:allowBackup
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:16:9-35
android:theme
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:23:9-49
android:dataExtractionRules
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:17:9-65
activity#net.micode.notes.ui.NotesListActivity
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:26:9-40:20
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:29:13-45
android:launchMode
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:30:13-43
android:windowSoftInputMode
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:33:13-52
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:34:13-36
android:uiOptions
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:32:13-57
android:configChanges
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:28:13-74
android:theme
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:31:13-45
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:27:13-49
intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:36:13-39:29
action#android.intent.action.MAIN
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:37:17-69
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:37:25-66
category#android.intent.category.LAUNCHER
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:38:17-77
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:38:27-74
activity#net.micode.notes.ui.NoteEditActivity
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:42:9-71:20
android:launchMode
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:45:13-43
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:47:13-36
android:configChanges
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:44:13-74
android:theme
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:46:13-45
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:43:13-48
intent-filter#action:name:android.intent.action.VIEW+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:49:13-54:30
action#android.intent.action.VIEW
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:50:17-69
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:50:25-66
category#android.intent.category.DEFAULT
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:51:17-76
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:51:27-73
data
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:52:17-78
android:mimeType
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:52:23-75
intent-filter#action:name:android.intent.action.INSERT_OR_EDIT+category:name:android.intent.category.DEFAULT+data:mimeType:vnd.android.cursor.item/call_note+data:mimeType:vnd.android.cursor.item/text_note
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:56:13-61:29
action#android.intent.action.INSERT_OR_EDIT
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:57:17-79
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:57:25-76
intent-filter#action:name:android.intent.action.SEARCH+category:name:android.intent.category.DEFAULT
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:63:13-66:29
action#android.intent.action.SEARCH
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:64:17-71
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:64:25-68
meta-data#android.app.searchable
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:68:13-70:54
android:resource
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:70:17-51
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:69:17-54
provider#net.micode.notes.data.NotesProvider
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:74:9-77:43
android:authorities
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:76:13-47
android:multiprocess
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:77:13-40
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:75:13-63
receiver#net.micode.notes.widget.NoteWidgetProvider_2x
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:79:9-92:20
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:81:13-50
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:82:13-36
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:80:13-57
intent-filter#action:name:android.appwidget.action.APPWIDGET_DELETED+action:name:android.appwidget.action.APPWIDGET_UPDATE+action:name:android.intent.action.PRIVACY_MODE_CHANGED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:83:13-87:29
action#android.appwidget.action.APPWIDGET_UPDATE
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:84:17-84
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:84:25-81
action#android.appwidget.action.APPWIDGET_DELETED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:85:17-85
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:85:25-82
action#android.intent.action.PRIVACY_MODE_CHANGED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:86:17-85
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:86:25-82
meta-data#android.appwidget.provider
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:89:13-91:58
android:resource
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:91:17-55
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:90:17-58
receiver#net.micode.notes.widget.NoteWidgetProvider_4x
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:93:9-107:20
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:95:13-50
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:96:13-36
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:94:13-57
receiver#net.micode.notes.ui.AlarmInitReceiver
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:109:9-114:20
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:110:13-36
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:109:19-55
intent-filter#action:name:android.intent.action.BOOT_COMPLETED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:111:13-113:29
action#android.intent.action.BOOT_COMPLETED
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:112:17-79
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:112:25-76
receiver#net.micode.notes.ui.AlarmReceiver
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:116:9-119:20
android:process
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:118:13-38
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:117:13-61
activity#net.micode.notes.ui.AlarmAlertActivity
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:121:9-126:20
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:123:13-45
android:launchMode
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:124:13-48
android:theme
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:125:13-75
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:122:13-50
activity#net.micode.notes.ui.NotesPreferenceActivity
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:128:9-133:20
android:label
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:130:13-54
android:launchMode
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:131:13-43
android:theme
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:132:13-60
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:129:13-71
service#net.micode.notes.gtask.remote.GTaskSyncService
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:135:9-138:19
android:exported
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:137:13-37
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:136:13-74
meta-data#android.app.default_searchable
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:140:9-142:52
android:value
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:142:13-49
android:name
ADDED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml:141:13-58
uses-sdk
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml reason: use-sdk injection requested
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
MERGED from [com.google.android.material:material:1.10.0] C:\Users\10378\.gradle\caches\8.13\transforms\ed657c2504032b7a94cb05d64bda34d5\transformed\material-1.10.0\AndroidManifest.xml:20:5-44
MERGED from [com.google.android.material:material:1.10.0] C:\Users\10378\.gradle\caches\8.13\transforms\ed657c2504032b7a94cb05d64bda34d5\transformed\material-1.10.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.constraintlayout:constraintlayout:2.1.4] C:\Users\10378\.gradle\caches\8.13\transforms\870de2a67c9be5b4f7ba5f2fd672777d\transformed\constraintlayout-2.1.4\AndroidManifest.xml:5:5-7:41
MERGED from [androidx.constraintlayout:constraintlayout:2.1.4] C:\Users\10378\.gradle\caches\8.13\transforms\870de2a67c9be5b4f7ba5f2fd672777d\transformed\constraintlayout-2.1.4\AndroidManifest.xml:5:5-7:41
MERGED from [androidx.appcompat:appcompat-resources:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\253ea21f9554755940a8db3922afaeff\transformed\appcompat-resources-1.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.appcompat:appcompat-resources:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\253ea21f9554755940a8db3922afaeff\transformed\appcompat-resources-1.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.appcompat:appcompat:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\9193172717a5ca3eb1d6453fe3e6bfa7\transformed\appcompat-1.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.appcompat:appcompat:1.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\9193172717a5ca3eb1d6453fe3e6bfa7\transformed\appcompat-1.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.viewpager2:viewpager2:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\d5e3c0fc96934450134f763386936834\transformed\viewpager2-1.0.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.viewpager2:viewpager2:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\d5e3c0fc96934450134f763386936834\transformed\viewpager2-1.0.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.fragment:fragment:1.3.6] C:\Users\10378\.gradle\caches\8.13\transforms\d7e369ba3abc83dc6eb17d2b9ff2b16e\transformed\fragment-1.3.6\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.fragment:fragment:1.3.6] C:\Users\10378\.gradle\caches\8.13\transforms\d7e369ba3abc83dc6eb17d2b9ff2b16e\transformed\fragment-1.3.6\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.activity:activity:1.8.0] C:\Users\10378\.gradle\caches\8.13\transforms\4d6dea971ad80dc04c21708a717167ea\transformed\activity-1.8.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.activity:activity:1.8.0] C:\Users\10378\.gradle\caches\8.13\transforms\4d6dea971ad80dc04c21708a717167ea\transformed\activity-1.8.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.emoji2:emoji2-views-helper:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\48c4c6d14791ee6cec92f7438b041848\transformed\emoji2-views-helper-1.2.0\AndroidManifest.xml:5:5-44
MERGED from [androidx.emoji2:emoji2-views-helper:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\48c4c6d14791ee6cec92f7438b041848\transformed\emoji2-views-helper-1.2.0\AndroidManifest.xml:5:5-44
MERGED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:21:5-44
MERGED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:21:5-44
MERGED from [androidx.drawerlayout:drawerlayout:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\8aefd914ef407cb79d151c2844281eb1\transformed\drawerlayout-1.1.1\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.drawerlayout:drawerlayout:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\8aefd914ef407cb79d151c2844281eb1\transformed\drawerlayout-1.1.1\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.coordinatorlayout:coordinatorlayout:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\2f69197fad576b29d6a5e0f895e3aeb9\transformed\coordinatorlayout-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.coordinatorlayout:coordinatorlayout:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\2f69197fad576b29d6a5e0f895e3aeb9\transformed\coordinatorlayout-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.dynamicanimation:dynamicanimation:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\15c4f2ae4253de18a0c7852b333c0870\transformed\dynamicanimation-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.dynamicanimation:dynamicanimation:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\15c4f2ae4253de18a0c7852b333c0870\transformed\dynamicanimation-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.transition:transition:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f090351ecbad81af69788a152edefd31\transformed\transition-1.2.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.transition:transition:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f090351ecbad81af69788a152edefd31\transformed\transition-1.2.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\3fd560b09a657265f043b6181d3cad63\transformed\vectordrawable-animated-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\3fd560b09a657265f043b6181d3cad63\transformed\vectordrawable-animated-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\25cc9b6c6f46a5024d85c2da5b360d5f\transformed\vectordrawable-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\25cc9b6c6f46a5024d85c2da5b360d5f\transformed\vectordrawable-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.legacy:legacy-support-core-utils:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\dc979c0b8b75e85bf4f176a761287089\transformed\legacy-support-core-utils-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.legacy:legacy-support-core-utils:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\dc979c0b8b75e85bf4f176a761287089\transformed\legacy-support-core-utils-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.loader:loader:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\e83b86d57eb58c7c76ab2665efee131c\transformed\loader-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.loader:loader:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\e83b86d57eb58c7c76ab2665efee131c\transformed\loader-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.savedstate:savedstate:1.2.1] C:\Users\10378\.gradle\caches\8.13\transforms\3cd917734a573e15a1ed51b3d437c18f\transformed\savedstate-1.2.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.savedstate:savedstate:1.2.1] C:\Users\10378\.gradle\caches\8.13\transforms\3cd917734a573e15a1ed51b3d437c18f\transformed\savedstate-1.2.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-livedata:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\8fdc621be8d3dd6a3c8f1f413cf45d5f\transformed\lifecycle-livedata-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-livedata:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\8fdc621be8d3dd6a3c8f1f413cf45d5f\transformed\lifecycle-livedata-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:21:5-44
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:21:5-44
MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\0316481e296926d0b7aaa92fc9d0879d\transformed\lifecycle-livedata-core-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\0316481e296926d0b7aaa92fc9d0879d\transformed\lifecycle-livedata-core-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\aa81dc7b2bc51662cef11e0791bbccc9\transformed\lifecycle-viewmodel-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\aa81dc7b2bc51662cef11e0791bbccc9\transformed\lifecycle-viewmodel-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-runtime:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\bf4089128f1f860ab38b60b53569d520\transformed\lifecycle-runtime-2.6.1\AndroidManifest.xml:5:5-44
MERGED from [androidx.lifecycle:lifecycle-runtime:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\bf4089128f1f860ab38b60b53569d520\transformed\lifecycle-runtime-2.6.1\AndroidManifest.xml:5:5-44
MERGED from [androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\85be53262d2521c6dcf63c409a54c35e\transformed\lifecycle-viewmodel-savedstate-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\85be53262d2521c6dcf63c409a54c35e\transformed\lifecycle-viewmodel-savedstate-2.6.1\AndroidManifest.xml:20:5-44
MERGED from [androidx.core:core-ktx:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\03335d5232404a4d38ccc4e74bc998ab\transformed\core-ktx-1.9.0\AndroidManifest.xml:5:5-44
MERGED from [androidx.core:core-ktx:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\03335d5232404a4d38ccc4e74bc998ab\transformed\core-ktx-1.9.0\AndroidManifest.xml:5:5-44
MERGED from [androidx.viewpager:viewpager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\de3f4c52d4b0fdcc70f69eab382f3d12\transformed\viewpager-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.viewpager:viewpager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\de3f4c52d4b0fdcc70f69eab382f3d12\transformed\viewpager-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.recyclerview:recyclerview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\71f6c76cdbc8be36c07e3dc59644ba39\transformed\recyclerview-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.recyclerview:recyclerview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\71f6c76cdbc8be36c07e3dc59644ba39\transformed\recyclerview-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.customview:customview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\46a1220a5d503e2a05755c314bee8b16\transformed\customview-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.customview:customview:1.1.0] C:\Users\10378\.gradle\caches\8.13\transforms\46a1220a5d503e2a05755c314bee8b16\transformed\customview-1.1.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\7e23495443aa5b2a0afac798e6faa601\transformed\cursoradapter-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\7e23495443aa5b2a0afac798e6faa601\transformed\cursoradapter-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.cardview:cardview:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\a0953f93c0e20abd38f655613f7b3a90\transformed\cardview-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.cardview:cardview:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\a0953f93c0e20abd38f655613f7b3a90\transformed\cardview-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:21:5-44
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:21:5-44
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:21:5-23:41
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:21:5-23:41
MERGED from [androidx.tracing:tracing:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\9c51bb1fa58bd8be09c4e0e0ecfd97c7\transformed\tracing-1.0.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.tracing:tracing:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\9c51bb1fa58bd8be09c4e0e0ecfd97c7\transformed\tracing-1.0.0\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\f82167c09e6ae91837d5b49ea1000efe\transformed\versionedparcelable-1.1.1\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\f82167c09e6ae91837d5b49ea1000efe\transformed\versionedparcelable-1.1.1\AndroidManifest.xml:20:5-22:41
MERGED from [androidx.arch.core:core-runtime:2.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f834c8cdbec868b61611d31b352d57e2\transformed\core-runtime-2.2.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.arch.core:core-runtime:2.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\f834c8cdbec868b61611d31b352d57e2\transformed\core-runtime-2.2.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.interpolator:interpolator:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\0d41002bdfd7c1dabad725943b1ed8e9\transformed\interpolator-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.interpolator:interpolator:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\0d41002bdfd7c1dabad725943b1ed8e9\transformed\interpolator-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.documentfile:documentfile:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\53b765b4f3e71482b1bc2f1c233d0225\transformed\documentfile-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.documentfile:documentfile:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\53b765b4f3e71482b1bc2f1c233d0225\transformed\documentfile-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.localbroadcastmanager:localbroadcastmanager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\6df0be6c3fac32bc396c1462157bc500\transformed\localbroadcastmanager-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.localbroadcastmanager:localbroadcastmanager:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\6df0be6c3fac32bc396c1462157bc500\transformed\localbroadcastmanager-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.print:print:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\8a8e23bd4d6d86f3c9260a14e3fb93d7\transformed\print-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.print:print:1.0.0] C:\Users\10378\.gradle\caches\8.13\transforms\8a8e23bd4d6d86f3c9260a14e3fb93d7\transformed\print-1.0.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.annotation:annotation-experimental:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\85ce0127863c5903b3a85662f2e1090e\transformed\annotation-experimental-1.3.0\AndroidManifest.xml:20:5-44
MERGED from [androidx.annotation:annotation-experimental:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\85ce0127863c5903b3a85662f2e1090e\transformed\annotation-experimental-1.3.0\AndroidManifest.xml:20:5-44
android:targetSdkVersion
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
android:minSdkVersion
INJECTED from D:\Android_Studio\Notes-master\app\src\main\AndroidManifest.xml
provider#androidx.startup.InitializationProvider
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:24:9-32:20
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:24:9-32:20
MERGED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:24:9-32:20
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:24:9-32:20
MERGED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:24:9-32:20
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:26:9-30:34
MERGED from [androidx.startup:startup-runtime:1.1.1] C:\Users\10378\.gradle\caches\8.13\transforms\5b2084b85d0b8f58b7a5c610eddf4201\transformed\startup-runtime-1.1.1\AndroidManifest.xml:26:9-30:34
tools:node
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:28:13-31
android:authorities
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:26:13-68
android:exported
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:27:13-37
android:name
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:25:13-67
meta-data#androidx.emoji2.text.EmojiCompatInitializer
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:29:13-31:52
android:value
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:31:17-49
android:name
ADDED from [androidx.emoji2:emoji2:1.2.0] C:\Users\10378\.gradle\caches\8.13\transforms\bfa9cd8b68d1ff1df5e7bfe6b1b175b5\transformed\emoji2-1.2.0\AndroidManifest.xml:30:17-75
meta-data#androidx.lifecycle.ProcessLifecycleInitializer
ADDED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:29:13-31:52
android:value
ADDED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:31:17-49
android:name
ADDED from [androidx.lifecycle:lifecycle-process:2.6.1] C:\Users\10378\.gradle\caches\8.13\transforms\393ab09f0ce39ac79f37ed07c72b8b1d\transformed\lifecycle-process-2.6.1\AndroidManifest.xml:30:17-78
permission#${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:22:5-24:47
android:protectionLevel
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:24:9-44
android:name
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:23:9-81
permission#net.micode.notes.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:22:5-24:47
android:protectionLevel
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:24:9-44
android:name
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:23:9-81
uses-permission#${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:26:5-97
android:name
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:26:22-94
uses-permission#net.micode.notes.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:26:5-97
android:name
ADDED from [androidx.core:core:1.9.0] C:\Users\10378\.gradle\caches\8.13\transforms\7699c2b1350bc9ca59e9ccf72b7bc4e9\transformed\core-1.9.0\AndroidManifest.xml:26:22-94
meta-data#androidx.profileinstaller.ProfileInstallerInitializer
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:29:13-31:52
android:value
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:31:17-49
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:30:17-85
receiver#androidx.profileinstaller.ProfileInstallReceiver
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:34:9-52:20
android:enabled
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:37:13-35
android:exported
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:38:13-36
android:permission
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:39:13-57
android:directBootAware
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:36:13-44
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:35:13-76
intent-filter#action:name:androidx.profileinstaller.action.INSTALL_PROFILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:40:13-42:29
action#androidx.profileinstaller.action.INSTALL_PROFILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:41:17-91
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:41:25-88
intent-filter#action:name:androidx.profileinstaller.action.SKIP_FILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:43:13-45:29
action#androidx.profileinstaller.action.SKIP_FILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:44:17-85
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:44:25-82
intent-filter#action:name:androidx.profileinstaller.action.SAVE_PROFILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:46:13-48:29
action#androidx.profileinstaller.action.SAVE_PROFILE
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:47:17-88
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:47:25-85
intent-filter#action:name:androidx.profileinstaller.action.BENCHMARK_OPERATION
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:49:13-51:29
action#androidx.profileinstaller.action.BENCHMARK_OPERATION
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:50:17-95
android:name
ADDED from [androidx.profileinstaller:profileinstaller:1.3.0] C:\Users\10378\.gradle\caches\8.13\transforms\e59e35a0826f049bad7349147760bd58\transformed\profileinstaller-1.3.0\AndroidManifest.xml:50:25-92

@ -1,21 +0,0 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -1,26 +0,0 @@
package net.micode.notes;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("net.micode.notes", appContext.getPackageName());
}
}

@ -1,260 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- AndroidManifest.xml - 应用的配置文件,定义应用的基本信息和组件 -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- xmlns:android定义Android命名空间 -->
<!-- xmlns:tools定义工具命名空间用于开发工具 -->
<!-- 权限声明区域:声明应用需要的各种系统权限 -->
<!-- 写入外部存储权限:允许应用保存文件到设备存储 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 安装快捷方式权限:允许应用创建桌面快捷方式 -->
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- 网络访问权限:允许应用访问互联网 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 读取联系人权限:允许应用读取设备联系人 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- 管理账户权限:允许应用管理设备上的账户 -->
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<!-- 认证账户权限:允许应用作为账户认证器 -->
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<!-- 获取账户权限:允许应用获取设备上的账户列表 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- 使用凭据权限:允许应用使用账户凭据 -->
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<!-- 接收启动完成广播权限:允许应用在系统启动完成后接收广播 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- 应用定义区域:定义应用的基本属性和组件 -->
<application
android:allowBackup="true"
<!-- 允许系统备份应用数据 -->
android:dataExtractionRules="@xml/data_extraction_rules"
<!-- 定义数据提取规则(用于备份) -->
android:fullBackupContent="@xml/backup_rules"
<!-- 指定完整备份的配置规则 -->
android:icon="@mipmap/ic_launcher"
<!-- 应用图标(常规尺寸) -->
android:label="@string/app_name"
<!-- 应用显示名称,引用字符串资源 -->
android:roundIcon="@mipmap/ic_launcher_round"
<!-- 圆形应用图标(用于某些设备) -->
android:supportsRtl="true"
<!-- 支持从右到左的布局(如阿拉伯语、希伯来语) -->
android:theme="@style/Theme.Notesmaster"
<!-- 应用主题样式 -->
tools:targetApi="31">
<!-- 指定目标API级别为Android 12API 31 -->
<!-- 主活动:显示笔记列表 -->
<activity
android:name=".ui.NotesListActivity"
<!-- 活动类的相对路径 -->
android:configChanges="keyboardHidden|orientation|screenSize"
<!-- 配置变化时由应用自己处理,不重启活动 -->
android:label="@string/app_name"
<!-- 活动标题 -->
android:launchMode="singleTop"
<!-- 启动模式:如果已在栈顶则重用,不在栈顶则创建新实例 -->
android:theme="@style/NoteTheme"
<!-- 活动的特定主题 -->
android:uiOptions="splitActionBarWhenNarrow"
<!-- 在窄屏时拆分操作栏 -->
android:windowSoftInputMode="adjustPan"
<!-- 软键盘弹出时调整面板,不调整大小 -->
android:exported="true">
<!-- 允许其他应用启动此活动 -->
<!-- 意图过滤器:定义活动可以响应的操作 -->
<intent-filter>
<!-- 主入口点:当用户点击应用图标时启动 -->
<action android:name="android.intent.action.MAIN" />
<!-- 启动器类别:表示出现在应用列表中 -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 笔记编辑活动:创建或编辑笔记 -->
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:exported="true">
<!-- 同样允许其他应用启动 -->
<!-- 第一个意图过滤器:处理查看操作 -->
<intent-filter >
<action android:name="android.intent.action.VIEW" />
<!-- 查看数据 -->
<category android:name="android.intent.category.DEFAULT" />
<!-- 默认类别 -->
<data android:mimeType="vnd.android.cursor.item/text_note" />
<!-- 支持的MIME类型文本笔记 -->
<data android:mimeType="vnd.android.cursor.item/call_note" />
<!-- 支持的MIME类型通话笔记 -->
</intent-filter >>
<!-- 第二个意图过滤器:处理插入或编辑操作 -->
<intent-filter >
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<!-- 插入或编辑数据 -->
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<!-- 第三个意图过滤器:处理搜索操作 -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<!-- 响应搜索请求 -->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- 元数据:声明此活动可搜索 -->
<meta-data
android:name="android.app.searchable"
<!-- 搜索相关配置 -->
android:resource="@xml/searchable" />
<!-- 指向搜索配置XML文件 -->
</activity>
<!-- 内容提供者:管理应用数据的共享访问 -->
<provider
android:name="net.micode.notes.data.NotesProvider"
<!-- 提供者类的完整路径 -->
android:authorities="micode_notes"
<!-- 唯一标识符其他应用使用此URI访问数据 -->
android:multiprocess="true" />
<!-- 支持在多进程中运行 -->
<!-- 2x2尺寸的小部件 -->
<receiver
android:name=".widget.NoteWidgetProvider_2x"
<!-- 小部件广播接收器类 -->
android:label="@string/app_widget2x2"
<!-- 小部件在列表中的显示名称 -->
android:exported="true">
<!-- 允许系统和其他应用发送广播到此接收器 -->
<intent-filter>
<!-- 小部件更新操作 -->
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<!-- 小部件删除操作 -->
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<!-- 隐私模式变化操作(可能是自定义的) -->
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<!-- 小部件配置元数据 -->
<meta-data
android:name="android.appwidget.provider"
<!-- 小部件提供者信息 -->
android:resource="@xml/widget_2x_info" />
<!-- 指向小部件配置XML文件 -->
</receiver>
<!-- 4x4尺寸的小部件 -->
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:label="@string/app_widget4x4"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<!-- 闹钟初始化接收器:处理系统启动完成 -->
<receiver android:name=".ui.AlarmInitReceiver"
android:exported="true">
<intent-filter>
<!-- 系统启动完成广播 -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- 闹钟接收器:处理闹钟触发 -->
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote" >
<!-- 在远程进程中运行,避免影响主进程 -->
</receiver>
<!-- 闹钟提醒活动:显示闹钟提醒界面 -->
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
<!-- 单实例模式:总是创建新任务,且只有一个实例 -->
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
<!-- 使用Holo主题无标题栏壁纸背景 -->
</activity>
<!-- 设置活动:显示应用偏好设置 -->
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light" >
<!-- 使用Holo Light主题 -->
</activity>
<!-- 后台同步服务处理Google任务同步 -->
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false" >
<!-- 不导出:仅限本应用使用 -->
</service>
<!-- 应用级元数据:设置默认搜索活动 -->
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
<!-- 指定NoteEditActivity为默认搜索目标 -->
<!-- 注释掉的主活动(可能是旧版本或备用入口) -->
<!-- <activity-->
<!-- android:name=".MainActivity"-->
<!-- android:exported="true">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
</application>
<!-- 应用定义结束 -->
</manifest>
<!-- 清单文件结束 -->

@ -1,24 +0,0 @@
package net.micode.notes;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
}
}

@ -1,47 +0,0 @@
package net.micode_master
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import net.micode_master.ui.theme.NotesmasterTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
NotesmasterTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
}
}
}
}
}
@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
NotesmasterTheme {
Greeting("Android")
}
}

@ -1,131 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.data;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Data;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import java.util.HashMap;
/**
*
*
*
* 便
*
*
* 1.
* 2.
* 3.
*
*
* - 使
* -
* -
*
* @author MiCode Open Source Community
* @version 1.0
*/
public class Contact {
// 联系人信息缓存,使用静态单例模式避免重复查询
// 键:电话号码字符串,值:联系人显示名称
private static HashMap<String, String> sContactCache;
// 日志标签,用于调试和错误记录
private static final String TAG = "Contact";
// 查询联系人信息的SQL选择语句模板
// 使用PHONE_NUMBERS_EQUAL函数进行电话号码匹配支持不同格式
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 = '+')";
/**
*
*
*
* 1. -
* 2. -
* 3. - ContentResolver
* 4. -
* 5. -
*
* @param context 访ContentResolver
* @param phoneNumber
* @return null
*
*
* 1.
* 2.
* 3.
* 4.
* 5.
* 6.
*/
public static String getContact(Context context, String phoneNumber) {
// 初始化联系人缓存(懒加载模式)
if(sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
// 检查缓存中是否已存在该电话号码的联系人信息
if(sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 构建查询条件,使用电话号码最小匹配格式
String selection = CALLER_ID_SELECTION.replace("+",
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
// 执行数据库查询,获取联系人显示名称
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
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资源被正确释放
cursor.close();
}
} else {
// 记录未找到匹配的联系人
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
}
}

@ -1,433 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.data;
import android.net.Uri;
/**
* 便
*
* 便
* 1. 便
* 2. ID
* 3. Intent
* 4.
* 5.
* 6. Content URI
* 7. MIME
*
*
* - 便(TYPE_NOTE)(TYPE_FOLDER)(TYPE_SYSTEM)
* -
* - 便(NoteColumns)(DataColumns)
* -
*
*
* - 使
* - Content Provider访
* -
*
* @author MiCode Open Source Community
* @version 1.0
*/
public class Notes {
// Content Provider的权限标识符用于构建Content URI
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} 便
* {@link Notes#ID_TRASH_FOLER} 便
*/
public static final int ID_ROOT_FOLDER = 0; // 根文件夹ID默认主文件夹
public static final int ID_TEMPARAY_FOLDER = -1; // 临时文件夹ID未分类便签
public static final int ID_CALL_RECORD_FOLDER = -2; // 通话记录文件夹ID
public static final int ID_TRASH_FOLER = -3; // 回收站文件夹ID
// Intent扩展参数常量用于在Activity之间传递便签相关数据
// 提醒日期参数 - 设置便签的提醒时间戳
public static final String INTENT_EXTRA_ALERT_DATE = "net.micode.notes.alert_date";
// 背景颜色ID参数 - 指定便签的背景颜色
public static final String INTENT_EXTRA_BACKGROUND_ID = "net.micode.notes.background_color_id";
// 小组件ID参数 - 指定便签关联的小组件标识
public static final String INTENT_EXTRA_WIDGET_ID = "net.micode.notes.widget_id";
// 小组件类型参数 - 指定小组件的尺寸类型2x2或4x4
public static final String INTENT_EXTRA_WIDGET_TYPE = "net.micode.notes.widget_type";
// 文件夹ID参数 - 指定便签所属的父文件夹
public static final String INTENT_EXTRA_FOLDER_ID = "net.micode.notes.folder_id";
// 通话日期参数 - 通话记录便签的通话时间戳
public static final String INTENT_EXTRA_CALL_DATE = "net.micode.notes.call_date";
// 小组件类型常量定义
// 无效小组件类型 - 用于标识未正确配置的小组件
public static final int TYPE_WIDGET_INVALIDE = -1;
// 2x2尺寸小组件 - 较小的桌面小组件尺寸
public static final int TYPE_WIDGET_2X = 0;
// 4x4尺寸小组件 - 较大的桌面小组件尺寸
public static final int TYPE_WIDGET_4X = 1;
/**
*
*
* 便MIME
* Content Provider便
*
*
* - 便MIME
* - Content Provider
* - 便
* - 便
*
*
* - Content Provider
* - 便
* - 便
* -
*
*
* - 使MIME
* - Android Content Provider
* - 便
* -
*/
public static class DataConstants {
/**
* 便MIME
*
* 便
* TextNote.CONTENT_ITEM_TYPE
*
* - 便
* - Content Provider
* - 便
* -
*/
public static final String NOTE = TextNote.CONTENT_ITEM_TYPE;
/**
* 便MIME
*
* 便
* CallNote.CONTENT_ITEM_TYPE
*
* - 便
* -
* -
* -
*
*
* -
* - 便便
*/
public static final String CALL_NOTE = CallNote.CONTENT_ITEM_TYPE;
}
// Content URI定义用于访问Content Provider中的数据
/**
* 便Content URI
* 便访note
* URIcontent://micode_notes/note
*/
public static final Uri CONTENT_NOTE_URI = Uri.parse("content://" + AUTHORITY + "/note");
/**
* Content URI
* 便访data
* URIcontent://micode_notes/data
*/
public static final Uri CONTENT_DATA_URI = Uri.parse("content://" + AUTHORITY + "/data");
// 便签表字段接口定义
// 定义了note表便签和文件夹表的所有字段常量
public interface NoteColumns {
/**
*
* <P> INTEGER (long) - </P>
* <P> 便</P>
*/
public static final String ID = "_id";
/**
* ID
* <P> INTEGER (long) - </P>
* <P> 便0</P>
*/
public static final String PARENT_ID = "parent_id";
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> 便</P>
*/
public static final String CREATED_DATE = "created_date";
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> 便</P>
*/
public static final String MODIFIED_DATE = "modified_date";
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> 便0</P>
*/
public static final String ALERTED_DATE = "alert_date";
/**
* /
* <P> TEXT - </P>
* <P> 便</P>
*/
public static final String SNIPPET = "snippet";
/**
* ID
* <P> INTEGER (long) - </P>
* <P> 便0</P>
*/
public static final String WIDGET_ID = "widget_id";
/**
*
* <P> INTEGER (long) - </P>
* <P> 2x24x4</P>
*/
public static final String WIDGET_TYPE = "widget_type";
/**
* ID
* <P> INTEGER (long) - </P>
* <P> 便</P>
*/
public static final String BG_COLOR_ID = "bg_color_id";
/**
*
* <P> INTEGER - 0/1</P>
* <P> 便01</P>
*/
public static final String HAS_ATTACHMENT = "has_attachment";
/**
* 便
* <P> INTEGER (long) - </P>
* <P> 便</P>
*/
public static final String NOTES_COUNT = "notes_count";
/**
*
* <P> INTEGER - </P>
* <P> TYPE_NOTE/TYPE_FOLDER/TYPE_SYSTEM</P>
*/
public static final String TYPE = "type";
/**
* ID
* <P> INTEGER (long) - </P>
* <P> 便</P>
*/
public static final String SYNC_ID = "sync_id";
/**
*
* <P> INTEGER - 0/1</P>
* <P> 便</P>
*/
public static final String LOCAL_MODIFIED = "local_modified";
/**
* ID
* <P> INTEGER - ID</P>
* <P> 便ID</P>
*/
public static final String ORIGIN_PARENT_ID = "origin_parent_id";
/**
* GoogleID
* <P> TEXT - </P>
* <P> Google TasksID</P>
*/
public static final String GTASK_ID = "gtask_id";
/**
*
* <P> INTEGER (long) - </P>
* <P> 便</P>
*/
public static final String VERSION = "version";
}
// 数据表字段接口定义
// 定义了data表便签详细数据表的所有字段常量
public interface DataColumns {
/**
*
* <P> INTEGER (long) - </P>
* <P> </P>
*/
public static final String ID = "_id";
/**
* MIME
* <P> TEXT - </P>
* <P> </P>
*/
public static final String MIME_TYPE = "mime_type";
/**
* 便ID
* <P> INTEGER (long) - </P>
* <P> 便note</P>
*/
public static final String NOTE_ID = "note_id";
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> </P>
*/
public static final String CREATED_DATE = "created_date";
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> </P>
*/
public static final String MODIFIED_DATE = "modified_date";
/**
*
* <P> TEXT - </P>
* <P> 便</P>
*/
public static final String CONTENT = "content";
/**
* 1
* <P> INTEGER - </P>
* <P> MIME_TYPE</P>
*/
public static final String DATA1 = "data1";
/**
* 2
* <P> INTEGER - </P>
* <P> MIME_TYPE</P>
*/
public static final String DATA2 = "data2";
/**
* 3
* <P> TEXT - </P>
* <P> MIME_TYPE</P>
*/
public static final String DATA3 = "data3";
/**
* 4
* <P> TEXT - </P>
* <P> MIME_TYPE</P>
*/
public static final String DATA4 = "data4";
/**
* 5
* <P> TEXT - </P>
* <P> MIME_TYPE</P>
*/
public static final String DATA5 = "data5";
}
// 文本便签数据类
// 继承DataColumns接口定义文本便签特有的字段和常量
public static final class TextNote implements DataColumns {
/**
*
* <P> Integer - </P>
* <P> 1- 0-</P>
* <P> 便</P>
*/
public static final String MODE = DATA1;
// 清单模式常量值
public static final int MODE_CHECK_LIST = 1;
// Content Provider相关常量
// 目录类型MIME - 用于表示这是一个文本便签目录
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/text_note";
// 单项类型MIME - 用于表示单个文本便签
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/text_note";
// 文本便签的Content URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/text_note");
}
// 通话记录便签数据类
// 继承DataColumns接口定义通话记录便签特有的字段和常量
public static final class CallNote implements DataColumns {
/**
*
* <P> INTEGER (long) - Unix</P>
* <P> </P>
*/
public static final String CALL_DATE = DATA1;
/**
*
* <P> TEXT - </P>
* <P> </P>
*/
public static final String PHONE_NUMBER = DATA3;
// Content Provider相关常量
// 目录类型MIME - 用于表示这是一个通话记录目录
public static final String CONTENT_TYPE = "vnd.android.cursor.dir/call_note";
// 单项类型MIME - 用于表示单个通话记录
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/call_note";
// 通话记录的Content URI
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/call_note");
}
}

@ -1,809 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.data;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
/**
* 便
*
* SQLiteOpenHelper便SQLite
* 1.
* 2. notedata
* 3.
* 4.
* 5.
*
*
* - note便
* - data便
* -
*
*
* - 使访
* -
* - 使便
* -
*
* @author MiCode Open Source Community
* @version 1.0
*/
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语句
// 该表存储便签和文件夹的基本信息,包括层级关系、属性设置等
private static final String CREATE_NOTE_TABLE_SQL =
"CREATE TABLE " + TABLE.NOTE + "(" +
NoteColumns.ID + " INTEGER PRIMARY KEY," + // 主键ID
NoteColumns.PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + // 父文件夹ID默认为根文件夹
NoteColumns.ALERTED_DATE + " INTEGER NOT NULL DEFAULT 0," + // 提醒时间戳默认为0无提醒
NoteColumns.BG_COLOR_ID + " INTEGER NOT NULL DEFAULT 0," + // 背景颜色ID默认为0
NoteColumns.CREATED_DATE + " INTEGER NOT NULL DEFAULT (strftime('%s','now') * 1000)," + // 创建时间
NoteColumns.HAS_ATTACHMENT + " INTEGER NOT NULL DEFAULT 0," + // 是否有附件默认为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," + // 小组件ID默认为0
NoteColumns.WIDGET_TYPE + " INTEGER NOT NULL DEFAULT -1," + // 小组件类型,默认为-1无效
NoteColumns.SYNC_ID + " INTEGER NOT NULL DEFAULT 0," + // 同步ID用于云同步
NoteColumns.LOCAL_MODIFIED + " INTEGER NOT NULL DEFAULT 0," + // 本地修改标识
NoteColumns.ORIGIN_PARENT_ID + " INTEGER NOT NULL DEFAULT 0," + // 原始父文件夹ID用于撤销
NoteColumns.GTASK_ID + " TEXT NOT NULL DEFAULT ''," + // Google任务ID
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," + // 主键ID
DataColumns.MIME_TYPE + " TEXT NOT NULL," + // 数据MIME类型必填
DataColumns.NOTE_ID + " INTEGER NOT NULL DEFAULT 0," + // 关联的便签ID
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," + // 通用数据字段1整数类型
DataColumns.DATA2 + " INTEGER," + // 通用数据字段2整数类型
DataColumns.DATA3 + " TEXT NOT NULL DEFAULT ''," + // 通用数据字段3文本类型
DataColumns.DATA4 + " TEXT NOT NULL DEFAULT ''," + // 通用数据字段4文本类型
DataColumns.DATA5 + " TEXT NOT NULL DEFAULT ''" + // 通用数据字段5文本类型
")";
// 为data表创建NOTE_ID字段的索引
// 用于提高根据便签ID查询数据的性能
private static final String CREATE_DATA_NOTE_ID_INDEX_SQL =
"CREATE INDEX IF NOT EXISTS note_id_index ON " +
TABLE.DATA + "(" + DataColumns.NOTE_ID + ");";
/**
* 便便
*
* NOTEPARENT_ID便
* NOTES_COUNT1
* 便
*
* AFTER UPDATE
* NoteColumns.PARENT_IDID
*/
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";
/**
* 便便
*
* NOTEPARENT_ID便
* NOTES_COUNT1
* NOTES_COUNT0
* 便
*
* AFTER UPDATE
* NoteColumns.PARENT_IDID
* NOTES_COUNT > 0
*/
private static final String NOTE_DECREASE_FOLDER_COUNT_ON_UPDATE_TRIGGER =
"CREATE TRIGGER decrease_folder_count_on_update " +
" AFTER UPDATE OF " + NoteColumns.PARENT_ID + " ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + "-1" +
" WHERE " + NoteColumns.ID + "=old." + NoteColumns.PARENT_ID +
" AND " + NoteColumns.NOTES_COUNT + ">0" + ";" +
" END";
/**
* 便便
*
* NOTE便
* NOTES_COUNT1
* 便便
* 便便
*
* AFTER INSERT
* 便便
* 便便
*/
private static final String NOTE_INCREASE_FOLDER_COUNT_ON_INSERT_TRIGGER =
"CREATE TRIGGER increase_folder_count_on_insert " +
" AFTER INSERT ON " + TABLE.NOTE +
" BEGIN " +
" UPDATE " + TABLE.NOTE +
" SET " + NoteColumns.NOTES_COUNT + "=" + NoteColumns.NOTES_COUNT + " + 1" +
" WHERE " + NoteColumns.ID + "=new." + NoteColumns.PARENT_ID + ";" +
" END";
/**
* 便便
*
* NOTE便
* 便NOTES_COUNT1
* NOTES_COUNT0
* 便便
*
* AFTER DELETE
* NOTES_COUNT > 0
* 便便
* 便
*/
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";
/**
* 便便
*
* DATAMIMENOTE
* CONTENTNOTESNIPPET
* 便便
*
* AFTER INSERT
* MIMEDataConstants.NOTE
* 便SNIPPET
* 便便
* DATA.CONTENT NOTE.SNIPPET
*/
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";
/**
* 便便
*
* DATAMIMENOTE
* CONTENTNOTESNIPPET
* 便便
*
* AFTER UPDATE
* MIMEDataConstants.NOTE
* 便SNIPPET
* 便
* 便
*/
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";
/**
* 便便
*
* DATAMIMENOTE
* NOTESNIPPET
* 便
*
* AFTER DELETE
* MIMEDataConstants.NOTE
* 便SNIPPET
* SNIPPET''NULL
* 便
*/
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";
/**
* 便
*
* NOTE
* 便DATA
*
*
* AFTER DELETE
* 便
* DATA便
* 便
*/
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";
/**
* 便
*
* NOTE
* NOTE便
*
*
* AFTER DELETE
* 便
*
*
*
*/
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";
/**
* 便
*
* NOTEIDID
* 便
*
*
* AFTER UPDATE
* IDNotes.ID_TRASH_FOLERID
* PARENT_IDID
*
* 便
*/
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 Android访
*
*
* - SQLiteOpenHelper
* - DB_NAME"note.db"
* - DB_VERSION4
* - null使
*
*
* - note.db
* - 4
* - null使
*/
public NotesDatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
/**
* NOTE
*
* @param db SQLite
*
*
* 1. NOTE便
* 2. NOTE
* 3.
* 4. 便
*
*
* - CREATE_NOTE_TABLE_SQL
* - reCreateNoteTableTriggers()
* - createSystemFolder()
* -
*
*
* - 便
* - ID
* -
*/
public void createNoteTable(SQLiteDatabase db) {
db.execSQL(CREATE_NOTE_TABLE_SQL);
reCreateNoteTableTriggers(db);
createSystemFolder(db);
Log.d(TAG, "note table has been created");
}
/**
* NOTE
*
* @param db SQLite
*
*
* NOTE
*
*
*
* -
* -
* -
* -
* -
* - 便
* - 便
*
*
* - 使SQL
*
*
* -
* -
* -
*/
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 SQLite
*
*
* 便
* IDTYPE_SYSTEM
*
*
* 1. (ID_CALL_RECORD_FOLDER)
* - 便
* - IDNotes.ID_CALL_RECORD_FOLDER
* - TYPE_SYSTEM
*
* 2. (ID_ROOT_FOLDER)
* - 便
* - IDNotes.ID_ROOT_FOLDER
* - TYPE_SYSTEM
*
* 3. (ID_TEMPARAY_FOLDER)
* - 便
* - IDNotes.ID_TEMPARAY_FOLDER
* - TYPE_SYSTEM
*
* 4. (ID_TRASH_FOLER)
* - 便
* - IDNotes.ID_TRASH_FOLER
* - TYPE_SYSTEM
*
*
* - TYPE_SYSTEM
* - 使ID
* - IDTYPE使
*/
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);
}
/**
* DATA
*
* @param db SQLite
*
*
* 1. DATA便
* 2. DATA
* 3. NOTE_ID
* 4. 便
*
*
* - CREATE_DATA_TABLE_SQL
* - reCreateDataTableTriggers()
* - CREATE_DATA_NOTE_ID_INDEX_SQL
* -
*
*
* - 便
* - IDMIME便ID
* -
*
*
* - NOTE_ID便ID
* - 使便ID
*/
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");
}
/**
* DATA
*
* @param db SQLite
*
*
* DATA
* 便
*
*
* - 便
* - 便
* - 便
*
*
* - 便
* - 使SQL
*
*
* - 便便
* - 便便
* - 便便
*
*
* -
* - 便
* - DATANOTE
*/
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);
}
/**
*
*
* @param context Android
* @return NotesDatabaseHelper
*
*
*
* 使线线
*
*
* -
* - 线使synchronized线
* -
* - 访
*
* 使
* -
* -
* -
*
*
* - ContextApplicationContext
* -
* - 线
*/
static synchronized NotesDatabaseHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new NotesDatabaseHelper(context);
}
return mInstance;
}
/**
* SQLite
*
* @param db SQLite
*
*
*
* SQLiteOpenHelper
*
*
* 1. NOTE便
* 2. DATA便
* 3.
* 4.
* 5.
*
*
* - NOTE便
* - DATA便
* -
* -
*
*
* - 访
* -
* -
*
*
* -
* - 使I/O
*/
@Override
public void onCreate(SQLiteDatabase db) {
createNoteTable(db);
createDataTable(db);
}
/**
* SQLite
*
* @param db SQLite
* @param oldVersion
* @param newVersion
*
*
*
*
*
*
* 1. 1 2drop
* 2. 2 3GTASK_ID
* 3. 3 4VERSION
*
*
* -
* - upgradeToV2, upgradeToV3, upgradeToV4
* - 122
*
*
* - 2
* - 使reCreateTriggers
*
*
* - IllegalStateException
* -
*
*
* -
* - 使
* -
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
boolean reCreateTriggers = false;
boolean skipV2 = false;
if (oldVersion == 1) {
upgradeToV2(db);
skipV2 = true; // 版本1升级包含版本2升级
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("便签数据库升级到版本 " + newVersion
+ " 失败");
}
}
/**
* 2
*
* @param db SQLite
*
*
* 2
*
*
*
* 1. NOTE
* 2. DATA
* 3. NOTE
* 4. DATA
*
*
* -
* - 便
* -
* -
*
* 使
* -
* -
* -
*
*
* -
* - 使
* - 12
*/
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 SQLite
*
*
* 3使
*
*
* 1.
* - 便
* - 便
* - 便
*
* 2.
* - NOTEGTASK_IDTEXT
* - Google TasksID
* -
*
* 3.
* - (ID_TRASH_FOLER)
* - TYPE_SYSTEM
* - 便
*
*
* - Google TasksGTASK_IDGoogle Tasks
* - 便
* -
*
*
* -
* - 使
* - 2
*/
private void upgradeToV3(SQLiteDatabase db) {
// 清理无用触发器 - 这些触发器在版本3中不再需要
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");
// 添加Google Tasks同步所需的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);
}
private void upgradeToV4(SQLiteDatabase db) {
db.execSQL("ALTER TABLE " + TABLE.NOTE + " ADD COLUMN " + NoteColumns.VERSION
+ " INTEGER NOT NULL DEFAULT 0");
}
}

@ -1,305 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.data;
import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import net.micode.notes.R;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
public class NotesProvider extends ContentProvider {
private static final UriMatcher mMatcher;
private NotesDatabaseHelper mHelper;
private static final String TAG = "NotesProvider";
private static final int URI_NOTE = 1;
private static final int URI_NOTE_ITEM = 2;
private static final int URI_DATA = 3;
private static final int URI_DATA_ITEM = 4;
private static final int URI_SEARCH = 5;
private static final int URI_SEARCH_SUGGEST = 6;
static {
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
mMatcher.addURI(Notes.AUTHORITY, "note", URI_NOTE);
mMatcher.addURI(Notes.AUTHORITY, "note/#", URI_NOTE_ITEM);
mMatcher.addURI(Notes.AUTHORITY, "data", URI_DATA);
mMatcher.addURI(Notes.AUTHORITY, "data/#", URI_DATA_ITEM);
mMatcher.addURI(Notes.AUTHORITY, "search", URI_SEARCH);
mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, URI_SEARCH_SUGGEST);
mMatcher.addURI(Notes.AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", URI_SEARCH_SUGGEST);
}
/**
* x'0A' represents the '\n' character in sqlite. For title and content in the search result,
* we will trim '\n' and white space in order to show more information.
*/
private static final String NOTES_SEARCH_PROJECTION = NoteColumns.ID + ","
+ NoteColumns.ID + " AS " + SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_1 + ","
+ "TRIM(REPLACE(" + NoteColumns.SNIPPET + ", x'0A','')) AS " + SearchManager.SUGGEST_COLUMN_TEXT_2 + ","
+ R.drawable.search_result + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1 + ","
+ "'" + Intent.ACTION_VIEW + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_ACTION + ","
+ "'" + Notes.TextNote.CONTENT_TYPE + "' AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA;
private static String NOTES_SNIPPET_SEARCH_QUERY = "SELECT " + NOTES_SEARCH_PROJECTION
+ " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.SNIPPET + " LIKE ?"
+ " AND " + NoteColumns.PARENT_ID + "<>" + Notes.ID_TRASH_FOLER
+ " AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE;
@Override
public boolean onCreate() {
mHelper = NotesDatabaseHelper.getInstance(getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
Cursor c = null;
SQLiteDatabase db = mHelper.getReadableDatabase();
String id = null;
switch (mMatcher.match(uri)) {
case URI_NOTE:
c = db.query(TABLE.NOTE, projection, selection, selectionArgs, null, null,
sortOrder);
break;
case URI_NOTE_ITEM:
id = uri.getPathSegments().get(1);
c = db.query(TABLE.NOTE, projection, NoteColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs, null, null, sortOrder);
break;
case URI_DATA:
c = db.query(TABLE.DATA, projection, selection, selectionArgs, null, null,
sortOrder);
break;
case URI_DATA_ITEM:
id = uri.getPathSegments().get(1);
c = db.query(TABLE.DATA, projection, DataColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs, null, null, sortOrder);
break;
case URI_SEARCH:
case URI_SEARCH_SUGGEST:
if (sortOrder != null || projection != null) {
throw new IllegalArgumentException(
"do not specify sortOrder, selection, selectionArgs, or projection" + "with this query");
}
String searchString = null;
if (mMatcher.match(uri) == URI_SEARCH_SUGGEST) {
if (uri.getPathSegments().size() > 1) {
searchString = uri.getPathSegments().get(1);
}
} else {
searchString = uri.getQueryParameter("pattern");
}
if (TextUtils.isEmpty(searchString)) {
return null;
}
try {
searchString = String.format("%%%s%%", searchString);
c = db.rawQuery(NOTES_SNIPPET_SEARCH_QUERY,
new String[] { searchString });
} catch (IllegalStateException ex) {
Log.e(TAG, "got exception: " + ex.toString());
}
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (c != null) {
c.setNotificationUri(getContext().getContentResolver(), uri);
}
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mHelper.getWritableDatabase();
long dataId = 0, noteId = 0, insertedId = 0;
switch (mMatcher.match(uri)) {
case URI_NOTE:
insertedId = noteId = db.insert(TABLE.NOTE, null, values);
break;
case URI_DATA:
if (values.containsKey(DataColumns.NOTE_ID)) {
noteId = values.getAsLong(DataColumns.NOTE_ID);
} else {
Log.d(TAG, "Wrong data format without note id:" + values.toString());
}
insertedId = dataId = db.insert(TABLE.DATA, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
// Notify the note uri
if (noteId > 0) {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), null);
}
// Notify the data uri
if (dataId > 0) {
getContext().getContentResolver().notifyChange(
ContentUris.withAppendedId(Notes.CONTENT_DATA_URI, dataId), null);
}
return ContentUris.withAppendedId(uri, insertedId);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
String id = null;
SQLiteDatabase db = mHelper.getWritableDatabase();
boolean deleteData = false;
switch (mMatcher.match(uri)) {
case URI_NOTE:
selection = "(" + selection + ") AND " + NoteColumns.ID + ">0 ";
count = db.delete(TABLE.NOTE, selection, selectionArgs);
break;
case URI_NOTE_ITEM:
id = uri.getPathSegments().get(1);
/**
* ID that smaller than 0 is system folder which is not allowed to
* trash
*/
long noteId = Long.valueOf(id);
if (noteId <= 0) {
break;
}
count = db.delete(TABLE.NOTE,
NoteColumns.ID + "=" + id + parseSelection(selection), selectionArgs);
break;
case URI_DATA:
count = db.delete(TABLE.DATA, selection, selectionArgs);
deleteData = true;
break;
case URI_DATA_ITEM:
id = uri.getPathSegments().get(1);
count = db.delete(TABLE.DATA,
DataColumns.ID + "=" + id + parseSelection(selection), selectionArgs);
deleteData = true;
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (count > 0) {
if (deleteData) {
getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);
}
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
int count = 0;
String id = null;
SQLiteDatabase db = mHelper.getWritableDatabase();
boolean updateData = false;
switch (mMatcher.match(uri)) {
case URI_NOTE:
increaseNoteVersion(-1, selection, selectionArgs);
count = db.update(TABLE.NOTE, values, selection, selectionArgs);
break;
case URI_NOTE_ITEM:
id = uri.getPathSegments().get(1);
increaseNoteVersion(Long.valueOf(id), selection, selectionArgs);
count = db.update(TABLE.NOTE, values, NoteColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs);
break;
case URI_DATA:
count = db.update(TABLE.DATA, values, selection, selectionArgs);
updateData = true;
break;
case URI_DATA_ITEM:
id = uri.getPathSegments().get(1);
count = db.update(TABLE.DATA, values, DataColumns.ID + "=" + id
+ parseSelection(selection), selectionArgs);
updateData = true;
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
if (count > 0) {
if (updateData) {
getContext().getContentResolver().notifyChange(Notes.CONTENT_NOTE_URI, null);
}
getContext().getContentResolver().notifyChange(uri, null);
}
return count;
}
private String parseSelection(String selection) {
return (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : "");
}
private void increaseNoteVersion(long id, String selection, String[] selectionArgs) {
StringBuilder sql = new StringBuilder(120);
sql.append("UPDATE ");
sql.append(TABLE.NOTE);
sql.append(" SET ");
sql.append(NoteColumns.VERSION);
sql.append("=" + NoteColumns.VERSION + "+1 ");
if (id > 0 || !TextUtils.isEmpty(selection)) {
sql.append(" WHERE ");
}
if (id > 0) {
sql.append(NoteColumns.ID + "=" + String.valueOf(id));
}
if (!TextUtils.isEmpty(selection)) {
String selectString = id > 0 ? parseSelection(selection) : selection;
for (String args : selectionArgs) {
selectString = selectString.replaceFirst("\\?", args);
}
sql.append(selectString);
}
mHelper.getWritableDatabase().execSQL(sql.toString());
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
}

@ -1,252 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.data;
import android.database.Cursor;
import android.util.Log;
import net.micode.notes.tool.GTaskStringUtils;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Google Tasks
*
* TaskGoogle Tasks
* Google Tasks
*
*
* - Task
* - Google Tasks
* -
* -
* -
*
*
* - Google Tasks
* - 便Google Tasks
* -
*
*
* - IllegalAccessError
* -
* - 使JSON
*
* @author MiCode Open Source Community
* @version 1.0
*/
public class MetaData extends Task {
/**
*
*/
private final static String TAG = MetaData.class.getSimpleName();
/**
* Google TasksID
*
* Google Tasks
* 便Google Tasks
* Google TasksID
* null
*/
private String mRelatedGid = null;
/**
*
*
* @param gid Google TasksID
* @param metaInfo JSON
*
*
* Google TasksID
*
*
*
* 1. JSONGoogle TasksID
* 2. JSONnotes
* 3. META_NOTE_NAME
*
*
* - 使GTaskStringUtils.META_HEAD_GTASK_IDID
* - JSON
* - 便
*
*
* - IDJSON
* - 使IDnotes
*
*
* -
* -
* - 便Google Tasks
*/
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 TasksID
*
* @return Google TasksIDnull
*
*
* Google Tasks
*
*
*
* - ID
* - null
*
* 使
* -
* -
* - Google Tasks
*
*
* - mRelatedGid
* - setContentByRemoteJSON
*/
public String getRelatedGid() {
return mRelatedGid;
}
/**
*
*
* @return truefalse
*
*
* TaskisWorthSaving
* notesGoogle Tasks
*
*
* - getNotes()null
* - notesnull
* -
*
*
* -
* -
* - Google Tasks
*
*
* - Task
* - MetaDatanotes
* -
*/
@Override
public boolean isWorthSaving() {
return getNotes() != null;
}
/**
* JSON
*
* @param js Google TasksJSON
*
*
* Google Tasks
* JSON
*
*
* 1. setContentByRemoteJSON
* 2. notes
* 3. notesJSON
* 4. Google TasksID
*
*
* - getNotes()JSON
* - JSON
* - 使GTaskStringUtils.META_HEAD_GTASK_IDID
* - IDmRelatedGid
*
*
* - JSON
* - mRelatedGidnull
* - 使
*
*
* -
* - 便Google Tasks
* -
*/
@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
*
*
* MetaDataIllegalAccessError
* MetaDataGoogle Tasks
*
*
* - MetaDataJSON
* -
* - MetaData使
* -
*
* Task
* - JSON
* - Task
* -
* -
*
*
* - 使setContentByRemoteJSON
* - 使setMeta
* - setter
*
* @throws IllegalAccessError
*/
@Override
public void setContentByLocalJSON(JSONObject js) {
// MetaData专门用于远程数据同步不支持本地JSON处理
throw new IllegalAccessError("MetaData:setContentByLocalJSON should not be called");
}
@Override
public JSONObject getLocalJSONFromContent() {
throw new IllegalAccessError("MetaData:getLocalJSONFromContent should not be called");
}
@Override
public int getSyncAction(Cursor c) {
throw new IllegalAccessError("MetaData:getSyncAction should not be called");
}
}

@ -1,555 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.data;
import android.database.Cursor;
import org.json.JSONObject;
/**
* Google Tasks
*
* Google Tasks
* TaskListTask
*
*
* - Google TasksID
* -
* - JSON
* -
* -
*
*
* - 使
* -
*
*
* - Google Tasks
* -
* -
*
* @author MiCode Open Source Community
* @version 1.0
*/
public abstract class Node {
/**
*
*
*
*
* -
* -
* -
*/
public static final int SYNC_ACTION_NONE = 0;
/**
*
*
* Google Tasks
*
* - 便
* - Google Tasks
* -
*/
public static final int SYNC_ACTION_ADD_REMOTE = 1;
/**
*
*
* Android
*
* - Google Tasks
* -
* -
*/
public static final int SYNC_ACTION_ADD_LOCAL = 2;
/**
*
*
* Google Tasks
*
* - 便
* - Google Tasks
* -
*/
public static final int SYNC_ACTION_DEL_REMOTE = 3;
/**
*
*
* Android
*
* - Google Tasks
* -
* -
*/
public static final int SYNC_ACTION_DEL_LOCAL = 4;
/**
*
*
* Google Tasks
*
* - 便
* - Google Tasks
* -
*/
public static final int SYNC_ACTION_UPDATE_REMOTE = 5;
/**
*
*
* Android
*
* - Google Tasks
* -
* -
*/
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;
/**
* Google Tasks
*
* Google TasksID
*
* -
* - Google Tasks
* -
* Google Tasks API
* null
*/
private String mGid;
/**
*
*
*
*
* -
* -
* -
*
* UI
*/
private String mName;
/**
*
*
*
*
* -
* -
* -
* Unix
* 0
*/
private long mLastModified;
/**
*
*
*
*
* -
* -
* -
* truefalse
* false
*/
private boolean mDeleted;
/**
*
*
*
* Node
* Node
*
*
* - mGid: nullGoogle Tasks
* - mName:
* - mLastModified: 0
* - mDeleted: false
*
*
* -
* - 使
* - setter
*/
public Node() {
mGid = null;
mName = "";
mLastModified = 0;
mDeleted = false;
}
/**
* JSON
*
* @param actionId
* @return JSONObject JSON
*
*
* Google Tasks APIJSON
*
*
*
* - 便Google Tasks
* - API
* -
*
*
* -
* - Google Tasks API
* -
*/
public abstract JSONObject getCreateAction(int actionId);
/**
* JSON
*
* @param actionId
* @return JSONObject JSON
*
*
* Google Tasks APIJSON
*
*
*
* - 便Google Tasks
* - API
* -
*
*
* - GID
* -
* - Google Tasks API
*/
public abstract JSONObject getUpdateAction(int actionId);
/**
* JSON
*
* @param js Google TasksJSON
*
*
* Google TasksJSON
*
*
*
* - Google Tasks
* -
* -
*
*
* - JSON
* - ID
* -
* -
*/
public abstract void setContentByRemoteJSON(JSONObject js);
/**
* JSON
*
* @param js JSON
*
*
* JSON
*
*
*
* -
* -
* -
*
*
* - Node
* -
* -
*/
public abstract void setContentByLocalJSON(JSONObject js);
/**
* JSON
*
* @return JSONObject JSON
*
*
* JSON
*
*
*
* - SQLite
* -
* -
*
*
* -
* -
* -
*/
public abstract JSONObject getLocalJSONFromContent();
/**
*
*
* @param c
* @return int
*
*
*
*
*
*
* -
* -
* -
* -
*
*
* -
* -
* -
* -
*
*
* - SYNC_ACTION_NONE:
* - SYNC_ACTION_ADD_REMOTE:
* - SYNC_ACTION_ADD_LOCAL:
* - SYNC_ACTION_UPDATE_REMOTE:
* - SYNC_ACTION_UPDATE_LOCAL:
* - SYNC_ACTION_UPDATE_CONFLICT:
* - SYNC_ACTION_ERROR:
*/
public abstract int getSyncAction(Cursor c);
/**
* Google Tasks
*
* @param gid Google Tasks
*
*
* Google Tasks
*
*
*
* - Google Tasks
* - ID
* -
*
*
* - gid: Google Tasks API
* - null
*/
public void setGid(String gid) {
this.mGid = gid;
}
/**
*
*
* @param name
*
*
*
*
*
*
* - 便
* -
* -
* -
*
*
* - name: 使
* - Google Tasks API
*/
public void setName(String name) {
this.mName = name;
}
/**
*
*
* @param lastModified Unix
*
*
*
*
*
*
* - 便
* -
* -
* -
*
*
* - lastModified: Unix
* - 0
* - 使System.currentTimeMillis()
*/
public void setLastModified(long lastModified) {
this.mLastModified = lastModified;
}
/**
*
*
* @param deleted truefalse
*
*
*
*
*
*
* - 便
* -
* -
* -
*
*
* - deleted: truefalse
* -
* -
*/
public void setDeleted(boolean deleted) {
this.mDeleted = deleted;
}
/**
* Google Tasks
*
* @return String Google Tasksnull
*
*
* Google Tasks
*
*
*
* - nullGoogle Tasks
* - ID
* - IDGoogle Tasks API
*
*
* - IDAPI
* -
* -
*/
public String getGid() {
return this.mGid;
}
/**
*
*
* @return String null
*
*
*
* null使
*
*
* - null
* -
* - UTF-8
*
*
* - UI
* -
* -
* -
*/
public String getName() {
return this.mName;
}
/**
*
*
* @return long Unix
*
*
*
*
*
*
* - Unix
* - 0
* -
*
*
* -
* -
* -
* -
*/
public long getLastModified() {
return this.mLastModified;
}
/**
*
*
* @return boolean truefalse
*
*
*
*
*
*
* - true
* - false
* -
*
*
* -
* - UI
* -
* -
*/
public boolean getDeleted() {
return this.mDeleted;
}
}

@ -1,622 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.data;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.DataConstants;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.NotesDatabaseHelper.TABLE;
import net.micode.notes.gtask.exception.ActionFailureException;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 便SQL
*
* 便DataSQLite
* Google Tasks
*
*
* - 便
* - JSONSQLite
* -
* -
* - ContentResolver访
*
*
* - 使Data Access Object (DAO)访
* - Builder
* - Copy-on-Write
*
*
* - JSON便
* -
* - SQLite
*
*
* - Google Tasks
* -
* -
*
* @author MiCode Open Source Community
* @version 1.0
*/
public class SqlData {
/**
*
*/
private static final String TAG = SqlData.class.getSimpleName();
/**
* ID
*
* ID使
*
* - ID/ID
* - ID
* -
*/
private static final int INVALID_ID = -99999;
/**
*
*
*
*
* -
* - 访
* - Cursor访
*
*
* - DataColumns.ID:
* - DataColumns.MIME_TYPE: MIME
* - DataColumns.CONTENT:
* - DataColumns.DATA1: 1
* - DataColumns.DATA3: 3
*/
public static final String[] PROJECTION_DATA = new String[] {
DataColumns.ID, DataColumns.MIME_TYPE, DataColumns.CONTENT, DataColumns.DATA1,
DataColumns.DATA3
};
/**
* ID
*
* 访CursorID
* PROJECTION_DATA0
*/
public static final int DATA_ID_COLUMN = 0;
/**
* MIME
*
* 访CursorMIME
* PROJECTION_DATA1
*/
public static final int DATA_MIME_TYPE_COLUMN = 1;
/**
*
*
* 访Cursor
* PROJECTION_DATA2
*/
public static final int DATA_CONTENT_COLUMN = 2;
/**
* 1
*
* 访CursorDATA1
* PROJECTION_DATA3
*/
public static final int DATA_CONTENT_DATA_1_COLUMN = 3;
/**
* 3
*
* 访CursorDATA3
* PROJECTION_DATA4
*/
public static final int DATA_CONTENT_DATA_3_COLUMN = 4;
/**
* Android访
*
* 便Content Provider访
*
* - CRUD
* -
* - 访
* -
*
* Context访
* SqlData
*/
private ContentResolver mContentResolver;
/**
*
*
* SqlData
*
* -
* - INSERT vs UPDATE
* -
*
*
* - trueINSERT
* - falseUPDATE
*/
private boolean mIsCreate;
/**
*
*
* SQLiteID
*
* -
* -
* -
*
* SQLiteINTEGER PRIMARY KEY
* INVALID_ID
* 1
*/
private long mDataId;
/**
* MIME
*
*
*
* -
* -
* -
*
* TEXT
* DataConstants.NOTE便
* DataConstants.NOTE
*/
private String mDataMimeType;
/**
*
*
*
*
* - 便
* -
* -
*
* TEXT
* HTMLMarkdown
*
*/
private String mDataContent;
/**
* 1
*
*
*
* -
* -
* -
*
* INTEGER
*
* 0
*/
private long mDataContentData1;
/**
* 3
*
*
*
* -
* -
* -
*
* TEXT
* URL
*
*/
private String mDataContentData3;
/**
*
*
*
*
* -
* - Copy-on-Write
* -
* -
*
*
*
*
*/
private ContentValues mDiffDataValues;
/**
* SqlData
*
* @param context AndroidContentResolver
*
*
* SqlData
*
*
*
* - mContentResolver: Context访
* - mIsCreate: trueINSERT
* - mDataId: INVALID_IDID
* - mDataMimeType: DataConstants.NOTE
* - mDataContent:
* - mDataContentData1: 0
* - mDataContentData3:
* - mDiffDataValues: ContentValues
*
*
* -
* -
* - 便
*/
public SqlData(Context context) {
mContentResolver = context.getContentResolver();
mIsCreate = true;
mDataId = INVALID_ID;
mDataMimeType = DataConstants.NOTE;
mDataContent = "";
mDataContentData1 = 0;
mDataContentData3 = "";
mDiffDataValues = new ContentValues();
}
/**
* SqlData
*
* @param context AndroidContentResolver
* @param c
*
*
* SqlData
*
*
*
* - mContentResolver: Context访
* - mIsCreate: falseUPDATE
* - loadFromCursor(c):
* - mDiffDataValues: ContentValues
*
*
* -
* - 便
* -
*
*
* - PROJECTION_DATA
* -
*/
public SqlData(Context context, Cursor c) {
mContentResolver = context.getContentResolver();
mIsCreate = false;
loadFromCursor(c);
mDiffDataValues = new ContentValues();
}
/**
*
*
* @param c
*
*
* SqlData
*
*
*
* - mDataId: DATA_ID_COLUMNID
* - mDataMimeType: DATA_MIME_TYPE_COLUMNMIME
* - mDataContent: DATA_CONTENT_COLUMN
* - mDataContentData1: DATA_CONTENT_DATA_1_COLUMN1
* - mDataContentData3: DATA_CONTENT_DATA_3_COLUMN3
*
*
* -
* -
* -
*
*
* -
* -
* - 使访
*/
private void loadFromCursor(Cursor c) {
mDataId = c.getLong(DATA_ID_COLUMN);
mDataMimeType = c.getString(DATA_MIME_TYPE_COLUMN);
mDataContent = c.getString(DATA_CONTENT_COLUMN);
mDataContentData1 = c.getLong(DATA_CONTENT_DATA_1_COLUMN);
mDataContentData3 = c.getString(DATA_CONTENT_DATA_3_COLUMN);
}
/**
* SqlDataJSON
*
* @param js JSON
* @throws JSONException JSON
*
*
* JSONSqlData
*
*
*
* 1. ID
* - JSONDataColumns.ID
* - 使INVALID_ID
* - ID
*
* 2. MIME
* - JSONDataColumns.MIME_TYPE
* - 使DataConstants.NOTE
* -
*
* 3.
* - JSONDataColumns.CONTENT
* - 使
* -
*
* 4. 1
* - JSONDataColumns.DATA1
* - 使0
* -
*
* 5. 3
* - JSONDataColumns.DATA3
* - 使
* -
*
*
* -
* -
* - 使
*
*
* -
* -
* -
*/
public void setContent(JSONObject js) throws JSONException {
long dataId = js.has(DataColumns.ID) ? js.getLong(DataColumns.ID) : INVALID_ID;
if (mIsCreate || mDataId != dataId) {
mDiffDataValues.put(DataColumns.ID, dataId);
}
mDataId = dataId;
String dataMimeType = js.has(DataColumns.MIME_TYPE) ? js.getString(DataColumns.MIME_TYPE)
: DataConstants.NOTE;
if (mIsCreate || !mDataMimeType.equals(dataMimeType)) {
mDiffDataValues.put(DataColumns.MIME_TYPE, dataMimeType);
}
mDataMimeType = dataMimeType;
String dataContent = js.has(DataColumns.CONTENT) ? js.getString(DataColumns.CONTENT) : "";
if (mIsCreate || !mDataContent.equals(dataContent)) {
mDiffDataValues.put(DataColumns.CONTENT, dataContent);
}
mDataContent = dataContent;
long dataContentData1 = js.has(DataColumns.DATA1) ? js.getLong(DataColumns.DATA1) : 0;
if (mIsCreate || mDataContentData1 != dataContentData1) {
mDiffDataValues.put(DataColumns.DATA1, dataContentData1);
}
mDataContentData1 = dataContentData1;
String dataContentData3 = js.has(DataColumns.DATA3) ? js.getString(DataColumns.DATA3) : "";
if (mIsCreate || !mDataContentData3.equals(dataContentData3)) {
mDiffDataValues.put(DataColumns.DATA3, dataContentData3);
}
mDataContentData3 = dataContentData3;
}
/**
* SqlDataJSON
*
* @return JSONObject JSONnull
* @throws JSONException JSON
*
*
* SqlDataJSON
* JSON
*
*
* - mIsCreatetrue
* - null
* - JSON
*
*
* - JSON
* - DataColumns.ID:
* - DataColumns.MIME_TYPE: MIME
* - DataColumns.CONTENT:
* - DataColumns.DATA1: 1
* - DataColumns.DATA3: 3
*
*
* - JSON
* - null
*
*
* -
* -
* -
* -
*
*
* - commit()
* - JSON
* - mDiffDataValues
*/
public JSONObject getContent() throws JSONException {
if (mIsCreate) {
Log.e(TAG, "it seems that we haven't created this in database yet");
return null;
}
JSONObject js = new JSONObject();
js.put(DataColumns.ID, mDataId);
js.put(DataColumns.MIME_TYPE, mDataMimeType);
js.put(DataColumns.CONTENT, mDataContent);
js.put(DataColumns.DATA1, mDataContentData1);
js.put(DataColumns.DATA3, mDataContentData3);
return js;
}
/**
*
*
* @param noteId 便ID便
* @param validateVersion
* @param version
*
*
* SqlDataSQLiteINSERTUPDATE
*
*
*
*
* 1. mIsCreate = true
* - IDINVALID_ID
* - noteId便
* - INSERT
* - UriID
* - IDActionFailureException
*
* 2. mIsCreate = false
* - mDiffDataValues.size() > 0
* -
* - UPDATE
* - 使SQL便
* -
* - UPDATE
* - 0
*
*
* -
* - 便
* - "更新丢失"
*
*
* - mDiffDataValues
* - mIsCreatefalse
*
*
* - NumberFormatExceptionID
* - ActionFailureException
*
*
* - 便
* -
* -
*
*
* - 线
* -
* -
*/
public void commit(long noteId, boolean validateVersion, long version) {
if (mIsCreate) {
if (mDataId == INVALID_ID && mDiffDataValues.containsKey(DataColumns.ID)) {
mDiffDataValues.remove(DataColumns.ID);
}
mDiffDataValues.put(DataColumns.NOTE_ID, noteId);
Uri uri = mContentResolver.insert(Notes.CONTENT_DATA_URI, mDiffDataValues);
try {
mDataId = Long.valueOf(uri.getPathSegments().get(1));
} catch (NumberFormatException e) {
Log.e(TAG, "Get note id error :" + e.toString());
throw new ActionFailureException("create note failed");
}
} else {
if (mDiffDataValues.size() > 0) {
int result = 0;
if (!validateVersion) {
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues, null, null);
} else {
result = mContentResolver.update(ContentUris.withAppendedId(
Notes.CONTENT_DATA_URI, mDataId), mDiffDataValues,
" ? in (SELECT " + NoteColumns.ID + " FROM " + TABLE.NOTE
+ " WHERE " + NoteColumns.VERSION + "=?)", new String[] {
String.valueOf(noteId), String.valueOf(version)
});
}
if (result == 0) {
Log.w(TAG, "there is no update. maybe user updates note when syncing");
}
}
}
mDiffDataValues.clear();
mIsCreate = false;
}
/**
*
*
* @return long IDINVALID_ID
*
*
* SqlDataID
*
*
*
* - ID
* - INVALID_ID (-99999)ID
*
*
* -
* -
* -
* -
*
*
* - INVALID_ID
* - commit()ID
* - ID
*
*
* - O(1)
* -
* - 线
*/
public long getId() {
return mDataId;
}
}

@ -1,140 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.exception;
/**
* Google Tasks
*
*
* Google Tasks API
* RuntimeException
*
*
* - Google Tasks
* -
* -
* -
* - API
*
*
* -
* - UI
* -
*
* NetworkFailureException
* - ActionFailureException
* - NetworkFailureException
*
* @author micode_master
* @version 1.0
* @since Notes
*/
public class ActionFailureException extends RuntimeException {
private static final long serialVersionUID = 4425249765923293627L;
/**
*
*
*
*
*
*
* 使
* -
* -
* -
*
*
* - 使
* -
*
* @see #ActionFailureException(String)
* @see #ActionFailureException(String, Throwable)
*/
public ActionFailureException() {
super();
}
/**
*
*
*
*
*
*
*
* @param paramString
*
* "创建任务列表失败:用户权限不足"
*
* 使
* -
* -
* -
*
*
* - 使
* -
* -
*
* @param paramString null200
*
* @see #ActionFailureException()
* @see #ActionFailureException(String, Throwable)
*/
public ActionFailureException(String paramString) {
super(paramString);
}
/**
*
*
*
*
* 便
*
*
* @param paramString
* @param paramThrowable
*
*
* 使
* -
* -
* -
* -
*
*
* - getCause()
* - 便
* -
*
*
* - paramThrowablenull使
* -
* -
*
* @param paramString
* @param paramThrowable
*
* @see #ActionFailureException()
* @see #ActionFailureException(String)
*/
public ActionFailureException(String paramString, Throwable paramThrowable) {
super(paramString, paramThrowable);
}
}

@ -1,154 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.exception;
/**
* Google Tasks
*
*
* Google Tasks
* Exception.checked
*
*
* -
* - DNS
* -
* - SSL/TLS
* -
* -
* - Wi-Fi
*
*
* -
* -
* -
* - 退
*
* ActionFailureException
* - NetworkFailureException
* - ActionFailureException
*
*
* -
* -
* -
* - 线
*
* @author micode_master
* @version 1.0
* @since Notes
*/
public class NetworkFailureException extends Exception {
private static final long serialVersionUID = 2107610287180234136L;
/**
*
*
*
*
*
*
* 使
* -
* -
* -
*
*
* - 使
* -
* -
*
* @see #NetworkFailureException(String)
* @see #NetworkFailureException(String, Throwable)
*/
public NetworkFailureException() {
super();
}
/**
*
*
*
*
* 便
*
*
* @param paramString
* - Wi-Fi/
* - DNS
* - API
* - HTTP
* "连接Google Tasks API超时请检查网络连接"
*
*
* -
* -
* -
* - 使
*
* @param paramString 200
*
* @see #NetworkFailureException()
* @see #NetworkFailureException(String, Throwable)
*/
public NetworkFailureException(String paramString) {
super(paramString);
}
/**
*
*
*
*
* 便
*
*
* @param paramString
* @param paramThrowable
* - SocketTimeoutException/
* - ConnectException
* - UnknownHostExceptionDNS
* - SSLHandshakeExceptionSSL
* - FileNotFoundException404HTTP
* - IOExceptionIO
*
* 使
* -
* -
* -
* -
*
*
* - getCause()
* -
* -
*
*
* - paramThrowablenull使
* -
* -
*
* @param paramString
* @param paramThrowable
*
* @see #NetworkFailureException()
* @see #NetworkFailureException(String)
*/
public NetworkFailureException(String paramString, Throwable paramThrowable) {
super(paramString, paramThrowable);
}
}

@ -1,579 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.remote;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import net.micode.notes.R;
import net.micode.notes.ui.NotesListActivity;
import net.micode.notes.ui.NotesPreferenceActivity;
/**
* Google Tasks
*
*
* AndroidAsyncTask线Google Tasks
*
*
*
* - Google TasksUI线
* -
* -
* -
* -
*
*
* 1. 线doInBackground()
* 2. onProgressUpdate()
* 3. onPostExecute()
* 4.
*
*
* -
* -
* -
* -
*
* @author micode_master
* @version 1.0
* @since Notes
*/
public class GTaskASyncTask extends AsyncTask<Void, String, Integer> {
/**
* Google Tasks
*
*
* Google Tasks
*
*
* 使
* -
* -
* -
*
* @see NotificationManager#notify(int, Notification)
*/
private static int GTASK_SYNC_NOTIFICATION_ID = 5234235;
/**
*
*
*
*
*
*
* 使
* - UI
* -
* -
* -
*
* @see #mOnCompleteListener
*/
public interface OnCompleteListener {
/**
*
*
*
* Google Tasks
*
*
*
* - 线UI
* -
* - 线
*/
void onComplete();
}
/**
* Android
*
*
* 访
*
*
*
* -
* - NotificationManager
* - Activity
* - 访
*
* @see Context
*/
private Context mContext;
/**
* Android
*
*
*
*
*
*
* -
* -
* -
*
* @see NotificationManager
*/
private NotificationManager mNotifiManager;
/**
* Google Tasks
*
*
* GTaskManagerGoogle Tasks
*
*
*
* - Google Tasks API
* *
* -
* -
*
* @see GTaskManager
*/
private GTaskManager mTaskManager;
/**
*
*
*
*
* null
*
* 使
* - UI
* -
* -
* -
*
* 线
* - 线
* - 线
*
* @see OnCompleteListener
*/
private OnCompleteListener mOnCompleteListener;
/**
* GTaskASyncTask
*
*
* Google Tasks
*
*
* @param context Android
* @param listener
* null
*
*
* 1.
* 2.
* 3.
* 4. GTaskManager
*
*
* - contextnullNullPointerException
* - 线
* -
* - GTaskManager线
*
* 线
* - UI线
* - 线
*
* @param context Androidnull
* @param listener
*
* @see Context
* @see OnCompleteListener
*/
public GTaskASyncTask(Context context, OnCompleteListener listener) {
mContext = context;
mOnCompleteListener = listener;
mNotifiManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
mTaskManager = GTaskManager.getInstance();
}
/**
* Google Tasks
*
*
* GTaskManager
*
*
*
* - GTaskManagercancelSync()
* -
* -
* -
*
* 使
* -
* -
* -
* -
*
*
* -
* -
* - onPostExecute
* - UI
*
* 线
* - 线
* - 线
*
* @see GTaskManager#cancelSync()
*/
public void cancelSync() {
mTaskManager.cancelSync();
}
/**
*
*
*
* UI线
*
*
*
* @param message
* - "正在登录""正在获取任务列表"
* - Google
* -
* -
*
* 使
* - "正在登录Google账户username@gmail.com"
* - "正在同步任务列表已处理15/20个任务"
* - "正在上传本地修改5个新增任务"
* - "正在下载远程更新3个任务已同步"
*
*
* -
* - AsyncTaskpublishProgress()
* - onProgressUpdate()
* -
*
*
* - messagenull使
* -
* -
* -
*
* 线
* - 线
* - publishProgress()线
*
* @param message null
*
* @see #publishProgress(String...)
* @see #onProgressUpdate(String...)
*/
public void publishProgess(String message) {
publishProgress(new String[] {
message
});
}
/**
*
*
*
*
*
*
*
* @param tickerId ID
* 使
* @param content
*
*
*
* 1. (R.string.ticker_syncing)
* -
* -
* -
*
* 2. (R.string.ticker_success)
* -
* -
* -
*
* 3. (R.string.ticker_fail)
* -
* -
* -
*
* 4. (R.string.ticker_cancel)
* -
* -
* -
*
*
* - 使
* - FLAG_AUTO_CANCEL
* - DEFAULT_LIGHTS
* -
*
*
* - tickerIdID
* - content
* -
* -
*
* @param tickerId ID
* @param content
*
* @see Notification
* @see NotificationManager
*/
private void showNotification(int tickerId, String content) {
Notification notification = new Notification(R.drawable.notification, mContext
.getString(tickerId), System.currentTimeMillis());
notification.defaults = Notification.DEFAULT_LIGHTS;
notification.flags = Notification.FLAG_AUTO_CANCEL;
PendingIntent pendingIntent;
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), 0);
} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), 0);
}
notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
pendingIntent);
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
}
/**
* Google Tasks
*
*
* 线Google Tasks
*
*
*
* 1.
* 2. GTaskManager
* 3.
*
*
* @return Integer
* - GTaskManager.STATE_SUCCESS
* - GTaskManager.STATE_NETWORK_ERROR
* - GTaskManager.STATE_INTERNAL_ERROR
* - GTaskManager.STATE_SYNC_CANCELLED
*
*
* - STATE_NETWORK_ERROR
* - STATE_INTERNAL_ERROR
* - STATE_SYNC_CANCELLED
*
* 线
* - 线UI
* -
* - publishProgress()UI
*
*
* - 线UI
* -
* -
*
* @param unused 使
*
* @return Integer
*
* @see GTaskManager#sync(Context, GTaskASyncTask)
* @see #publishProgress(String...)
* @see #onProgressUpdate(String...)
*/
@Override
protected Integer doInBackground(Void... unused) {
publishProgess(mContext.getString(R.string.sync_progress_login, NotesPreferenceActivity
.getSyncAccountName(mContext)));
return mTaskManager.sync(mContext, this);
}
/**
*
*
*
* UI线
* 广
*
*
* @param progress
* -
* -
* -
*
*
* 1.
* 2. GTaskSyncService广
* 3. UI线
*
*
* - 使R.string.ticker_syncing
* -
* -
*
* 广
* - contextGTaskSyncService
* - 广
* - Service
*
* 线
* - UI线
* - UI
* -
*
*
* - progressnull
* -
* -
* -
*
* @param progress null
*
* @see #showNotification(int, String)
* @see #publishProgess(String)
*/
@Override
protected void onProgressUpdate(String... progress) {
showNotification(R.string.ticker_syncing, progress[0]);
if (mContext instanceof GTaskSyncService) {
((GTaskSyncService) mContext).sendBroadcast(progress[0]);
}
}
/**
*
*
*
* UI线
*
*
*
* @param result
* - GTaskManager.STATE_SUCCESS
* - GTaskManager.STATE_NETWORK_ERROR
* - GTaskManager.STATE_INTERNAL_ERROR
* - GTaskManager.STATE_SYNC_CANCELLED
*
* (STATE_SUCCESS)
* -
* -
* -
* -
*
* (STATE_NETWORK_ERROR)
* -
* -
* -
* -
*
* (STATE_INTERNAL_ERROR)
* -
* -
* -
* -
*
* (STATE_SYNC_CANCELLED)
* -
* -
* -
*
*
* - mOnCompleteListener
* - 线onComplete()
* - UI线
* -
*
* 线
* - UI线
* - UI
* - 线
*
*
* - result
* -
* -
* - UI线
*
* @param result null
*
* @see #showNotification(int, String)
* @see NotesPreferenceActivity#setLastSyncTime(Context, long)
* @see GTaskManager#getSyncAccount()
*/
@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() {
/**
*
*
*
* 线
* UI线
*
*
* - UI
* -
* -
* -
* -
*
*
* - 线UI
* -
* -
* - 线访
*/
public void run() {
mOnCompleteListener.onComplete();
}
}).start();
}
}
}

@ -1,724 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.gtask.remote;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
/**
* Google Tasks
*
*
* AndroidServiceGoogle Tasks
* 广
*
*
* - UI
* -
* - 广
* -
* -
* - 使START_STICKY
*
*
* -
* -
* -
* - onCreateonStartCommandonLowMemory
*
*
* 1. startSync()
* 2. onStartCommand()
* 3. GTaskASyncTask
* 4. 广
* 5.
*
* 广
* - 广UI/
* - 广
* - 使广
*
* 线
* - 使线
* -
* - 广UI线线
*
*
* - onCreate()
* - onStartCommand()START_STICKY
* - onLowMemory()
*
* @author micode_master
* @version 1.0
* @since Notes
*/
public class GTaskSyncService extends Service {
/**
*
*
*
* Intent
* startService()extra
*
* 使
* - ACTION_START_SYNC
* - ACTION_CANCEL_SYNC
* - ACTION_INVALID
*
* @see #ACTION_START_SYNC
* @see #ACTION_CANCEL_SYNC
* @see #ACTION_INVALID
*/
public final static String ACTION_STRING_NAME = "sync_action_type";
/**
*
*
*
* Google Tasks
* IntentACTION_STRING_NAME
*
* 使
* -
* -
* -
*
* @see #ACTION_STRING_NAME
* @see #startSync()
*/
public final static int ACTION_START_SYNC = 0;
/**
*
*
*
* Google Tasks
*
*
* 使
* -
* - 退
* -
*
* @see #ACTION_STRING_NAME
* @see #cancelSync()
*/
public final static int ACTION_CANCEL_SYNC = 1;
/**
*
*
*
*
* Intent使
*
* 使
* - Intent
* -
* -
*
* @see #ACTION_STRING_NAME
* @see #onStartCommand(Intent, int, int)
*/
public final static int ACTION_INVALID = 2;
/**
* Google Tasks广
*
*
* 广Action
* GTaskSyncService广
*
* 广
* -
* -
* -
*
* 使
* - UI
* -
* - UI
*
* @see #sendBroadcast(String)
* @see #GTASK_SERVICE_BROADCAST_IS_SYNCING
* @see #GTASK_SERVICE_BROADCAST_PROGRESS_MSG
*/
public final static String GTASK_SERVICE_BROADCAST_NAME = "net.micode.notes.gtask.remote.gtask_sync_service";
/**
* 广
*
*
* 广
* Boolean
*
*
* - true
* - false
*
* 使
* - UI
* -
* - /
*
* @see #GTASK_SERVICE_BROADCAST_NAME
* @see #isSyncing()
*/
public final static String GTASK_SERVICE_BROADCAST_IS_SYNCING = "isSyncing";
/**
* 广
*
*
* 广
* String
*
*
* - "正在登录Google账户..."
* - "正在同步任务列表..."
* - "正在更新笔记内容..."
*
* 使
* - UI
* -
* -
*
* @see #GTASK_SERVICE_BROADCAST_NAME
* @see #getProgressString()
*/
public final static String GTASK_SERVICE_BROADCAST_PROGRESS_MSG = "progressMsg";
/**
*
*
*
* Google Tasks
*
*
*
* - null
* - nullGTaskASyncTask
*
* 线
* - 访
* - synchronized线
*
*
* -
* - null
* -
*
* @see GTaskASyncTask
* @see #startSync()
* @see #cancelSync()
* @see #isSyncing()
*/
private static GTaskASyncTask mSyncTask = null;
/**
*
*
*
*
* 广
*
*
* -
* -
*
*
* -
* -
* -
*
* 使
* - UI
* -
* -
*
* @see #sendBroadcast(String)
* @see #getProgressString()
*/
private static String mSyncProgress = "";
/**
* Google Tasks
*
*
* Google Tasks
*
*
*
* 1.
* 2. GTaskASyncTask
* 3.
* 4. 广
* 5.
*
*
* - mSyncTasknull
* - mSyncTasknull
*
*
* - mSyncTasknull
* - 广
* - stopSelf()
*
* 广
* - 广UI
* - 广UI
*
* @see GTaskASyncTask
* @see #sendBroadcast(String)
* @see #stopSelf()
*/
private void startSync() {
if (mSyncTask == null) {
mSyncTask = new GTaskASyncTask(this, new GTaskASyncTask.OnCompleteListener() {
public void onComplete() {
mSyncTask = null;
sendBroadcast("");
stopSelf();
}
});
sendBroadcast("");
mSyncTask.execute();
}
}
/**
*
*
*
* Google Tasks
*
*
*
* - mSyncTasknull
* - mSyncTasknull
*
*
* - mSyncTask.cancelSync()
* - onCancelled()
* - mSyncTask
*
* 使
* -
* - 退
* -
* -
*
*
* -
* - GTaskASyncTask
* -
*
* @see GTaskASyncTask#cancelSync()
* @see #mSyncTask
* @see #onLowMemory()
*/
private void cancelSync() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
*
*
*
* ServiceonCreate()
*
*
*
* - mSyncTasknull
* -
*
*
* -
* - startService()
* -
*
*
* -
* -
* -
*
* @see #onStartCommand(Intent, int, int)
* @see #mSyncTask
*/
@Override
public void onCreate() {
mSyncTask = null;
}
/**
*
*
*
* ServiceonStartCommand()Intent
*
*
*
* @param intent Intent
* @param flags 0
* @param startId ID
*
*
* @return int START_STICKY
*
*
* 1. IntentBundle
* 2. BundleACTION_STRING_NAME
* 3.
* - ACTION_START_SYNC
* - ACTION_CANCEL_SYNC
* -
* 4. START_STICKY
*
*
* - START_STICKY
* - Intent
* -
*
* @param intent Intent
* @param flags
* @param startId ID
*
* @return int START_STICKY
*
* @see #ACTION_STRING_NAME
* @see #ACTION_START_SYNC
* @see #ACTION_CANCEL_SYNC
* @see #startSync()
* @see #cancelSync()
*/
@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);
}
/**
*
*
*
* ServiceonLowMemory()
*
*
*
* -
* - Android
* -
*
*
* -
* - cancelSync()
* - GTaskASyncTask
*
*
* -
* -
* -
*
*
* - 线
* -
* -
*
* @see #cancelSync()
* @see #mSyncTask
*/
@Override
public void onLowMemory() {
if (mSyncTask != null) {
mSyncTask.cancelSync();
}
}
/**
*
*
*
* ServiceonBind()null
*
*
*
* @return IBinder null
*
*
* - GTaskSyncServiceStarted Service
* - startService()stopService()
* -
* - Intent广
*
*
* - startService()Intent
* - sendBroadcast()广
* -
*
* @param intent Intent
*
* @return IBinder null
*/
public IBinder onBind(Intent intent) {
return null;
}
/**
* 广
*
*
* 广
* 广
*
*
* @param msg
*
* 广
* -
* -
* - 广ActionGTASK_SERVICE_BROADCAST_NAME
*
*
* 1. mSyncProgress
* 2. Intent
* 3.
* 4.
* 5. 广
*
* 使
* - 广
* -
* - 广
* - 广
*
* 广
* - UI
* -
* -
*
* @param msg
*
* @see #GTASK_SERVICE_BROADCAST_NAME
* @see #GTASK_SERVICE_BROADCAST_IS_SYNCING
* @see #GTASK_SERVICE_BROADCAST_PROGRESS_MSG
* @see #mSyncProgress
*/
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);
}
/**
* Google Tasks
*
*
*
* GTaskSyncService
*
*
* @param activity Android
*
*
* 1. GTaskManager
* 2. Intent
* 3. IntentACTION_START_SYNC
* 4. activity.startService()
*
*
* - GTaskManager.getInstance().setActivityContext(activity)
* - 访Android
* -
*
*
* - GTaskSyncServiceIntent
* -
* - startService()
*
*
* - Activity
* - Activity
*
* @param activity Android
*
* @see GTaskManager#setActivityContext(Activity)
* @see #ACTION_START_SYNC
* @see #startSync()
*/
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);
}
/**
* Google Tasks
*
*
*
* Intent
*
*
* @param context AndroidIntent
*
*
* 1. Intent
* 2. IntentACTION_CANCEL_SYNC
* 3. context.startService()
* 4. GTaskSyncServicecancelSync()
*
*
* - IntentGTaskSyncService
* - onStartCommand()
* - mSyncTask.cancelSync()
*
* 使
* -
* - 退
* -
* -
*
*
* - 使ApplicationContextActivityContextServiceContext
* -
* -
*
*
* -
* -
* - stopService()
*
* @param context Android
*
* @see #ACTION_CANCEL_SYNC
* @see #cancelSync()
*/
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);
}
/**
*
*
*
*
* mSyncTask
*
*
* @return boolean
* - true
* - false
*
*
* - mSyncTasknull
* - mSyncTasknull
*
* 使
* - UI
* - /
* -
* -
*
* 线
* - 线
* - mSyncTask访线
* -
*
*
* -
* -
* - UI线
*
* @return boolean
*
* @see #mSyncTask
* @see #GTASK_SERVICE_BROADCAST_IS_SYNCING
*/
public static boolean isSyncing() {
return mSyncTask != null;
}
/**
*
*
*
*
* mSyncProgress
*
*
* @return String
* -
* -
*
*
* - "正在登录Google账户..."
* - "正在同步任务列表..."
* - "正在更新笔记内容..."
* - ""
*
* 使
* - UI
* -
* -
* -
*
*
* - sendBroadcast(String msg)
* -
* -
* -
*
*
* -
* -
* - UI线
* -
*
* @return String
*
* @see #mSyncProgress
* @see #sendBroadcast(String)
* @see #GTASK_SERVICE_BROADCAST_PROGRESS_MSG
*/
public static String getProgressString() {
return mSyncProgress;
}
}

@ -1,424 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.model;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.OperationApplicationException;
import android.net.Uri;
import android.os.RemoteException;
import android.util.Log;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.CallNote;
import net.micode.notes.data.Notes.DataColumns;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.data.Notes.TextNote;
import java.util.ArrayList;
/**
*
*
*
*
*
*
*
* -
* -
* -
* -
* - ContentProvider
* -
*
*
* - noteID/
* - dataMIMETextNote.CONTENT_ITEM_TYPE
* - dataMIMECallNote.CONTENT_ITEM_TYPE
*
*
* - LOCAL_MODIFIED
* -
* - 使ContentProvider
*
* 使
* 1. getNewNoteId()
* 2. setNoteValue()setTextData()setCallData()
* 3. syncNote()
*
*
* -
* - 使applyBatch()
* -
*
* @author micode_master
* @version 1.0
* @since Notes
*/
public class Note {
/**
*
*
*
* ContentValues
*
*
*
* -
* - LOCAL_MODIFIED
* - MODIFIED_DATE
*
*
* - setNoteValue()
* - syncNote()
* -
*
* 使
* -
* -
* -
* -
*
* @see #setNoteValue(String, String)
* @see #syncNote(Context, long)
*/
private ContentValues mNoteDiffValues;
/**
*
*
*
* NoteData
*
*
*
* -
* -
*
*
* - ID
* - ID
* -
* - ContentProvider
*
*
* - Note
* -
* - Note
*
* @see NoteData
* @see #mNoteDiffValues
*/
private NoteData mNoteData;
/**
*
*
*
* Note
* 便Note
*
* 使
* -
* -
* -
* -
*
* @see Log#d(String, String)
* @see Log#e(String, String)
* @see Log#w(String, String)
*/
private static final String TAG = "Note";
/**
* Create a new note id for adding a new note to databases
*/
public static synchronized long getNewNoteId(Context context, long folderId) {
// Create a new note in the database
ContentValues values = new ContentValues();
long createdTime = System.currentTimeMillis();
values.put(NoteColumns.CREATED_DATE, createdTime);
values.put(NoteColumns.MODIFIED_DATE, createdTime);
values.put(NoteColumns.TYPE, Notes.TYPE_NOTE);
values.put(NoteColumns.LOCAL_MODIFIED, 1);
values.put(NoteColumns.PARENT_ID, folderId);
Uri uri = context.getContentResolver().insert(Notes.CONTENT_NOTE_URI, values);
long noteId = 0;
try {
noteId = Long.valueOf(uri.getPathSegments().get(1));
} catch (NumberFormatException e) {
Log.e(TAG, "Get note id error :" + e.toString());
noteId = 0;
}
if (noteId == -1) {
throw new IllegalStateException("Wrong note id:" + noteId);
}
return noteId;
}
public Note() {
mNoteDiffValues = new ContentValues();
mNoteData = new NoteData();
}
public void setNoteValue(String key, String value) {
mNoteDiffValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
public void setTextData(String key, String value) {
mNoteData.setTextData(key, value);
}
public void setTextDataId(long id) {
mNoteData.setTextDataId(id);
}
public long getTextDataId() {
return mNoteData.mTextDataId;
}
public void setCallDataId(long id) {
mNoteData.setCallDataId(id);
}
public void setCallData(String key, String value) {
mNoteData.setCallData(key, value);
}
public boolean isLocalModified() {
return mNoteDiffValues.size() > 0 || mNoteData.isLocalModified();
}
public boolean syncNote(Context context, long noteId) {
if (noteId <= 0) {
throw new IllegalArgumentException("Wrong note id:" + noteId);
}
if (!isLocalModified()) {
return true;
}
/**
* In theory, once data changed, the note should be updated on {@link NoteColumns#LOCAL_MODIFIED} and
* {@link NoteColumns#MODIFIED_DATE}. For data safety, though update note fails, we also update the
* note data info
*/
if (context.getContentResolver().update(
ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, noteId), mNoteDiffValues, null,
null) == 0) {
Log.e(TAG, "Update note error, should not happen");
// Do not return, fall through
}
mNoteDiffValues.clear();
if (mNoteData.isLocalModified()
&& (mNoteData.pushIntoContentResolver(context, noteId) == null)) {
return false;
}
return true;
}
private class NoteData {
private long mTextDataId;
private ContentValues mTextDataValues;
private long mCallDataId;
private ContentValues mCallDataValues;
private static final String TAG = "NoteData";
public NoteData() {
mTextDataValues = new ContentValues();
mCallDataValues = new ContentValues();
mTextDataId = 0;
mCallDataId = 0;
}
boolean isLocalModified() {
return mTextDataValues.size() > 0 || mCallDataValues.size() > 0;
}
void setTextDataId(long id) {
if(id <= 0) {
throw new IllegalArgumentException("Text data id should larger than 0");
}
mTextDataId = id;
}
void setCallDataId(long id) {
if (id <= 0) {
throw new IllegalArgumentException("Call data id should larger than 0");
}
mCallDataId = id;
}
void setCallData(String key, String value) {
mCallDataValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
void setTextData(String key, String value) {
mTextDataValues.put(key, value);
mNoteDiffValues.put(NoteColumns.LOCAL_MODIFIED, 1);
mNoteDiffValues.put(NoteColumns.MODIFIED_DATE, System.currentTimeMillis());
}
/**
* ContentProvider
*
*
* NoteDataContentProvider
*
*
*
* @param context Android访ContentResolver
* @param noteId ID
*
*
* @return Uri URI
* - Content URI
* - null
*
*
* @throws IllegalArgumentException noteId
*
*
* 1. ID
* 2. ContentProviderOperation
* 3.
* 4.
* 5.
* 6.
*
*
* - mTextDataId/mCallDataId0
* - ID0
* -
*
*
* - 使ContentProviderapplyBatch()
* -
* -
*
*
* - null
* - RemoteExceptionOperationApplicationException
* - NumberFormatExceptionURI
*
*
* - 访
* - ContentValues
* -
*
*
* - mTextDataValuesmCallDataValues
* -
* -
*
* @param context Android
* @param noteId ID
*
* @return Uri URI
*
* @throws IllegalArgumentException ID
*
* @see ContentProvider#applyBatch(String, ArrayList)
* @see ContentProviderOperation
* @see ContentProviderResult
*/
Uri pushIntoContentResolver(Context context, long noteId) {
/**
*
*/
if (noteId <= 0) {
throw new IllegalArgumentException("错误的笔记ID" + noteId);
}
ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
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, "插入新文本数据失败笔记ID" + 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, "插入新通话数据失败笔记ID" + 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;
}
}
}

@ -1,778 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.tool;
/**
* Google Tasks API
*
*
* Google Tasks API使JSON
* Google TasksAPI
*
*
* - Google Tasks APIJSON
* - action
* - Google Tasks
* -
* -
*
*
* -
* - API
* - Google Tasks
* - 便
*
* @author MiCode
* @version 1.0
*/
public class GTaskStringUtils {
/**
* Google Tasks JSONID
*
*
* Google Tasks APIID
*
*
* 使
* - API
* -
* -
*/
public final static String GTASK_JSON_ACTION_ID = "action_id";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* -
*/
public final static String GTASK_JSON_ACTION_LIST = "action_list";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* - API
* -
*/
public final static String GTASK_JSON_ACTION_TYPE = "action_type";
/**
* Google Tasks JSON
*
*
*
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create";
/**
* Google Tasks JSON
*
*
*
* Google Tasks
*
* 使
* -
* -
* - 线
*/
public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* - Google Tasks
* -
*/
public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update";
/**
* Google Tasks JSONID
*
*
* ID
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_CREATOR_ID = "creator_id";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - JSON
*/
public final static String GTASK_JSON_CHILD_ENTITY = "child_entity";
/**
* Google Tasks JSON
*
*
* JSON
* API
*
* 使
* - API
* -
* -
*/
public final static String GTASK_JSON_CLIENT_VERSION = "client_version";
/**
* Google Tasks JSON
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_COMPLETED = "completed";
/**
* Google Tasks JSONID
*
*
* IDJSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id";
/**
* Google Tasks JSONID
*
*
* IDJSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id";
/**
* Google Tasks JSON
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_DELETED = "deleted";
/**
* Google Tasks JSON
*
*
* IDJSON
*
*
* 使
* -
* - Google Tasks
* -
*/
public final static String GTASK_JSON_DEST_LIST = "dest_list";
/**
* Google Tasks JSON
*
*
* IDJSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_DEST_PARENT = "dest_parent";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_ENTITY_TYPE = "entity_type";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_GET_DELETED = "get_deleted";
/**
* Google Tasks JSONID
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_ID = "id";
/**
* Google Tasks JSON
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_INDEX = "index";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_LAST_MODIFIED = "last_modified";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point";
/**
* Google Tasks JSONID
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_LIST_ID = "list_id";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_LISTS = "lists";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_NAME = "name";
/**
* Google Tasks JSONID
*
*
* ID
* IDID
*
* 使
* - ID
* - ID
* - Google TasksID
*/
public final static String GTASK_JSON_NEW_ID = "new_id";
/**
* Google Tasks JSON
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_NOTES = "notes";
/**
* Google Tasks JSONID
*
*
* JSON
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_PARENT_ID = "parent_id";
/**
* Google Tasks JSONID
*
*
* ID
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_RESULTS = "results";
/**
* Google Tasks JSON
*
*
* ID
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_SOURCE_LIST = "source_list";
/**
* Google Tasks JSON
*
*
* Google Tasks
*
*
* 使
* - Google Tasks
* -
* - Google Tasks API
*/
public final static String GTASK_JSON_TASKS = "tasks";
/**
* Google Tasks JSON
*
*
*
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_TYPE = "type";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_TYPE_GROUP = "GROUP";
/**
* Google Tasks JSON
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_TYPE_TASK = "TASK";
/**
* Google Tasks JSON
*
*
* JSON
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String GTASK_JSON_USER = "user";
/**
* MIUI
*
*
* MiCodeGoogle Tasks
* Google TasksMiCode
*
* 使
* - Google Tasks
* - MiCode
* -
*/
public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]";
/**
*
*
*
*
*
*
* 使
* -
* - fallback
* - Google Tasks
*/
public final static String FOLDER_DEFAULT = "Default";
/**
*
*
*
*
*
*
* 使
* -
* -
* - Google Tasks
*/
public final static String FOLDER_CALL_NOTE = "Call_Note";
/**
*
*
*
*
*
*
* 使
* -
* - 访
* - Google Tasks
*/
public final static String FOLDER_META = "METADATA";
/**
* Google Tasks ID
*
*
* Google Tasks
* Google Tasks
*
* 使
* - Google TasksID
* -
* - Google Tasks
*/
public final static String META_HEAD_GTASK_ID = "meta_gid";
/**
*
*
*
*
* Google Tasks
*
* 使
* -
* - Google Tasks
* -
*/
public final static String META_HEAD_NOTE = "meta_note";
/**
*
*
*
*
* Google Tasks
*
* 使
* -
* -
* - Google Tasks
*/
public final static String META_HEAD_DATA = "meta_data";
/**
*
*
*
*
* Google Tasks
*
* 使
* -
* - Google Tasks
* - 访
*/
public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE";
public final static String GTASK_JSON_ACTION_LIST = "action_list";
public final static String GTASK_JSON_ACTION_TYPE = "action_type";
public final static String GTASK_JSON_ACTION_TYPE_CREATE = "create";
public final static String GTASK_JSON_ACTION_TYPE_GETALL = "get_all";
public final static String GTASK_JSON_ACTION_TYPE_MOVE = "move";
public final static String GTASK_JSON_ACTION_TYPE_UPDATE = "update";
public final static String GTASK_JSON_CREATOR_ID = "creator_id";
public final static String GTASK_JSON_CHILD_ENTITY = "child_entity";
public final static String GTASK_JSON_CLIENT_VERSION = "client_version";
public final static String GTASK_JSON_COMPLETED = "completed";
public final static String GTASK_JSON_CURRENT_LIST_ID = "current_list_id";
public final static String GTASK_JSON_DEFAULT_LIST_ID = "default_list_id";
public final static String GTASK_JSON_DELETED = "deleted";
public final static String GTASK_JSON_DEST_LIST = "dest_list";
public final static String GTASK_JSON_DEST_PARENT = "dest_parent";
public final static String GTASK_JSON_DEST_PARENT_TYPE = "dest_parent_type";
public final static String GTASK_JSON_ENTITY_DELTA = "entity_delta";
public final static String GTASK_JSON_ENTITY_TYPE = "entity_type";
public final static String GTASK_JSON_GET_DELETED = "get_deleted";
public final static String GTASK_JSON_ID = "id";
public final static String GTASK_JSON_INDEX = "index";
public final static String GTASK_JSON_LAST_MODIFIED = "last_modified";
public final static String GTASK_JSON_LATEST_SYNC_POINT = "latest_sync_point";
public final static String GTASK_JSON_LIST_ID = "list_id";
public final static String GTASK_JSON_LISTS = "lists";
public final static String GTASK_JSON_NAME = "name";
public final static String GTASK_JSON_NEW_ID = "new_id";
public final static String GTASK_JSON_NOTES = "notes";
public final static String GTASK_JSON_PARENT_ID = "parent_id";
public final static String GTASK_JSON_PRIOR_SIBLING_ID = "prior_sibling_id";
public final static String GTASK_JSON_RESULTS = "results";
public final static String GTASK_JSON_SOURCE_LIST = "source_list";
public final static String GTASK_JSON_TASKS = "tasks";
public final static String GTASK_JSON_TYPE = "type";
public final static String GTASK_JSON_TYPE_GROUP = "GROUP";
public final static String GTASK_JSON_TYPE_TASK = "TASK";
public final static String GTASK_JSON_USER = "user";
public final static String MIUI_FOLDER_PREFFIX = "[MIUI_Notes]";
public final static String FOLDER_DEFAULT = "Default";
public final static String FOLDER_CALL_NOTE = "Call_Note";
public final static String FOLDER_META = "METADATA";
public final static String META_HEAD_GTASK_ID = "meta_gid";
public final static String META_HEAD_NOTE = "meta_note";
public final static String META_HEAD_DATA = "meta_data";
public final static String META_NOTE_NAME = "[META INFO] DON'T UPDATE AND DELETE";
}

@ -1,803 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.tool;
import android.content.Context;
import android.preference.PreferenceManager;
import net.micode.notes.R;
import net.micode.notes.ui.NotesPreferenceActivity;
/**
*
*
*
* UI
* 访
*
*
* -
* -
* -
* -
* -
*
*
* -
* - drawable
* *
* -
*
* @author MiCode
* @version 1.0
*/
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;
/**
*
*
*
* 使
* TEXT_MEDIUM
*
*
* -
* -
*/
public static final int BG_DEFAULT_FONT_SIZE = TEXT_MEDIUM;
/**
*
*
*
*
* drawable
*
*
* - drawable
* - ID
* - 5绿
*
*
* - BG_EDIT_RESOURCES:
* - BG_EDIT_TITLE_RESOURCES:
*/
public static class NoteBgResources {
/**
*
*
*
* 5drawableID
* YELLOW=0, BLUE=1, WHITE=2, GREEN=3, RED=4
*
*
* - edit_yellow
* - edit_blue
* - edit_white
* - 绿edit_green
* - edit_red
*/
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
};
/**
*
*
*
* 5drawableID
* YELLOW=0, BLUE=1, WHITE=2, GREEN=3, RED=4
*
*
* - edit_title_yellow
* - edit_title_blue
* - edit_title_white
* - 绿edit_title_green
* - edit_title_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
};
/**
*
*
*
* IDdrawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* - Activity
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteBgResource(int id) {
return BG_EDIT_RESOURCES[id];
}
/**
*
*
*
* IDdrawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* - Activity
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteTitleBgResource(int id) {
return BG_EDIT_TITLE_RESOURCES[id];
}
}
/**
* ID
*
*
* ID
*
*
*
* @param context Android访SharedPreferences
*
*
* @return int ID
* - 0-4
* - BG_DEFAULT_COLOR
*
*
* 1.
* 2. ID0-45
* 3. ID
*
*
* - PREFERENCE_SET_BG_COLOR_KEY:
*
* 使
* -
* -
* -
*
* @param context Android
* @return int 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;
}
}
/**
*
*
*
*
* drawable
*
*
* -
* - 5
* -
* - drawable
*
*
* - FIRST:
* - NORMAL:
* - LAST:
* - SINGLE:
*/
public static class NoteItemBgResources {
/**
*
*
*
* 5drawableID
*
*
*
* - list_yellow_up
* - list_blue_up
* - list_white_up
* - 绿list_green_up
* - list_red_up
*/
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
};
/**
*
*
*
* 5drawableID
*
*
*
* - list_yellow_middle
* - list_blue_middle
* - list_white_middle
* - 绿list_green_middle
* - list_red_middle
*/
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
};
/**
*
*
*
* 5drawableID
*
*
*
* - list_yellow_down
* - list_blue_down
* - list_white_down
* - 绿list_green_down
* - list_red_down
*/
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,
};
/**
*
*
*
* 5drawableID
*
*
*
* - list_yellow_single
* - list_blue_single
* - list_white_single
* - 绿list_green_single
* - list_red_single
*/
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
};
/**
*
*
*
* IDdrawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteBgFirstRes(int id) {
return BG_FIRST_RESOURCES[id];
}
/**
*
*
*
* IDdrawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteBgLastRes(int id) {
return BG_LAST_RESOURCES[id];
}
/**
*
*
*
* IDdrawableID
*
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteBgSingleRes(int id) {
return BG_SINGLE_RESOURCES[id];
}
/**
*
*
*
* IDdrawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int ID
*/
public static int getNoteBgNormalRes(int id) {
return BG_NORMAL_RESOURCES[id];
}
/**
*
*
*
* drawableID
* 使
*
*
* @return int drawableID
*
* 使
* -
* -
* -
*
* @return int ID
*/
public static int getFolderBgRes() {
return R.drawable.list_folder;
}
}
/**
*
*
*
* Android
* 2x24x4
*
*
* -
* - 5
* -
* - drawable
*
*
* - 2x2
* - 4x4
*
*
* - 绿
*/
public static class WidgetBgResources {
/**
* 2x2
*
*
* 52x2drawableID
* 2x2
*
*
* - widget_2x_yellow
* - widget_2x_blue
* - widget_2x_white
* - 绿widget_2x_green
* - widget_2x_red
*/
private final static int [] BG_2X_RESOURCES = new int [] {
R.drawable.widget_2x_yellow,
R.drawable.widget_2x_blue,
R.drawable.widget_2x_white,
R.drawable.widget_2x_green,
R.drawable.widget_2x_red,
};
/**
* 2x2
*
*
* ID2x2drawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int 2x2drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int 2x2ID
*/
public static int getWidget2xBgResource(int id) {
return BG_2X_RESOURCES[id];
}
/**
* 4x4
*
*
* 54x4drawableID
* 4x4
*
*
* - widget_4x_yellow
* - widget_4x_blue
* - widget_4x_white
* - 绿widget_4x_green
* - widget_4x_red
*/
private final static int [] BG_4X_RESOURCES = new int [] {
R.drawable.widget_4x_yellow,
R.drawable.widget_4x_blue,
R.drawable.widget_4x_white,
R.drawable.widget_4x_green,
R.drawable.widget_4x_red
};
/**
* 4x4
*
*
* ID4x4drawableID
*
*
* @param id IDYELLOW, BLUE, WHITE, GREEN, RED
*
*
* @return int 4x4drawableID
*
* 使
* -
* -
* -
*
* @param id ID
* @return int 4x4ID
*/
public static int getWidget4xBgResource(int id) {
return BG_4X_RESOURCES[id];
}
}
/**
*
*
*
*
* TextAppearance访
*
*
* - Android
* - 4
* - ID
* -
*
*
* - TextAppearanceNormal:
* - TextAppearanceMedium:
* - TextAppearanceLarge:
* - TextAppearanceSuper:
*/
public static class TextAppearanceResources {
/**
*
*
*
* 4AndroidID
* TEXT_SMALL=0, TEXT_MEDIUM=1, TEXT_LARGE=2, TEXT_SUPER=3
*
*
* - 0TextAppearanceNormal
* - 1TextAppearanceMedium
* - 2TextAppearanceLarge
* - 3TextAppearanceSuper
*/
private final static int [] TEXTAPPEARANCE_RESOURCES = new int [] {
R.style.TextAppearanceNormal,
R.style.TextAppearanceMedium,
R.style.TextAppearanceLarge,
R.style.TextAppearanceSuper
};
/**
*
*
*
* IDTextAppearanceID
*
*
*
* @param id IDTEXT_SMALL, TEXT_MEDIUM, TEXT_LARGE, TEXT_SUPER
*
*
* @return int TextAppearanceID
* - IDID
* - IDBG_DEFAULT_FONT_SIZE
*
*
* SharedPreferencesID
*
*
* 使
* - Activity
* -
* -
*
* @param id ID
* @return int TextAppearanceID
*/
public static int getTexAppearanceResource(int id) {
/**
* HACKME: SharedPreferencesIDbug
*
*
* ID
* 使
*
*
* ID
*
*
*
* IDTextAppearanceID
* IDBG_DEFAULT_FONT_SIZETEXT_MEDIUM
*/
if (id >= TEXTAPPEARANCE_RESOURCES.length) {
return BG_DEFAULT_FONT_SIZE;
}
return TEXTAPPEARANCE_RESOURCES[id];
}
/**
*
*
*
*
* UI
*
*
* @return int 4
*
* 使
* -
* -
* -
*
* @return int
*/
public static int getResourcesSize() {
return TEXTAPPEARANCE_RESOURCES.length;
}
}
}

@ -1,433 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.view.Window;
import android.view.WindowManager;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import java.io.IOException;
/**
*
*
*
*
*
*
*
* -
* -
* -
* -
* -
*
*
* - Android Activity
* -
* -
* -
* -
*
* 使
* -
* -
* -
*
* @author MiCode
* @version 1.0
*/
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
*
*/
MediaPlayer mPlayer;
/**
*
*
*
*
*
*
* @param savedInstanceState Bundle
*
*
* 1. onCreate
* 2.
* 3.
* 4.
* 5. IntentID
* 6.
* 7.
*
*
* - FLAG_SHOW_WHEN_LOCKED:
* - FLAG_KEEP_SCREEN_ON:
* - FLAG_TURN_SCREEN_ON:
* - FLAG_ALLOW_LOCK_WHILE_SCREEN_ON:
* - FLAG_LAYOUT_INSET_DECOR:
*
* @param savedInstanceState Bundle
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 请求无标题栏窗口特征,简洁的提醒界面
requestWindowFeature(Window.FEATURE_NO_TITLE);
// 获取窗口对象并设置锁屏显示标志
final Window win = getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
// 如果屏幕关闭,设置额外的标志以支持锁屏提醒
if (!isScreenOn()) {
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
}
// 获取启动此活动的Intent对象
Intent intent = getIntent();
try {
// 从Intent的URI中解析笔记ID
// 假设URI格式为content://notes/note/[note_id]
mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1));
// 根据笔记ID获取笔记摘要内容
mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId);
// 如果摘要过长,进行截断处理并添加省略号
mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0,
SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info)
: mSnippet;
} catch (IllegalArgumentException e) {
// 解析失败时打印错误并退出活动
e.printStackTrace();
return;
}
// 创建媒体播放器实例用于播放提醒声音
mPlayer = new MediaPlayer();
// 检查笔记是否可见,如果可见则显示提醒对话框和播放声音
if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) {
showActionDialog();
playAlarmSound();
} else {
// 如果笔记不可见,直接结束活动
finish();
}
}
/**
*
*
*
*
*
*
*
* @return boolean
* - true:
* - false:
*
* 使
* -
* -
*
* @return boolean
*/
private boolean isScreenOn() {
// 获取PowerManager服务
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
return pm.isScreenOn();
}
/**
*
*
*
*
*
*
*
* 1. URI
* 2.
* 3.
* 4.
* 5.
*
*
* -
* -
* -
*
*
* - IllegalArgumentException: URI
* - SecurityException:
* - IllegalStateException:
* - IOException:
*/
private void playAlarmSound() {
// 获取系统默认闹钟铃声URI
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) {
// URI参数错误打印异常信息
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
*
*
* - BUTTON_NEGATIVE:
* - :
*
*
* - IntentACTION_VIEW
* - ID
* - NoteEditActivity
*
* @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;
}
}
/**
*
*
*
*
*
*
*
* @param dialog
*
*
* 1.
* 2.
*
*
* -
* -
* -
* -
*
* @param dialog
*/
public void onDismiss(DialogInterface dialog) {
// 停止播放提醒声音并清理资源
stopAlarmSound();
// 结束当前提醒活动
finish();
}
/**
*
*
*
*
*
*
*
* -
* -
* -
* - null
*
* 使
* -
* -
* -
*
*
* - release()MediaPlayer
* -
* -
*/
private void stopAlarmSound() {
if (mPlayer != null) {
// 停止播放
mPlayer.stop();
// 释放播放器资源
mPlayer.release();
// 将引用置为null便于垃圾回收
mPlayer = null;
}
}
}

@ -1,314 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
/**
* 广
*
*
*
*
*
*
* -
* - AlarmManager
* - AlarmReceiver
*
*
* - Android BroadcastReceiver
* - TYPE_NOTE
* - PendingIntent
* - 使RTC_WAKEUP
*
*
* -
* -
* -
* -
*
* @author MiCode
* @version 1.0
*/
public class AlarmInitReceiver extends BroadcastReceiver {
/**
*
*
*
*
*
*
*
* - NoteColumns.ID:
* - NoteColumns.ALERTED_DATE:
*/
private static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE
};
/**
* ID
*
*
* CursorID
* ID
*/
private static final int COLUMN_ID = 0;
/**
*
*
*
* Cursor
*
*/
private static final int COLUMN_ALERTED_DATE = 1;
/**
* 广
*
*
* 广
*
*
*
* 1.
* 2.
* 3. AlarmManager
* 4.
*
*
* - context: Android访
* - intent: 广
*
*
* - Cursor使
* -
* - AlarmManager
*
* @param context Android
* @param intent 广
*/
@Override
public void onReceive(Context context, Intent intent) {
/**
*
*
*
* 使System.currentTimeMillis()
*
*
*
* - alertDate > currentDate
* -
* -
*/
long currentDate = System.currentTimeMillis();
/**
*
*
*
* ContentResolver
* 使ID
*
*
* - Notes.CONTENT_NOTE_URI: URI
* - PROJECTION: ID
* - : NoteColumns.ALERTED_DATE > currentDate AND NoteColumns.TYPE = Notes.TYPE_NOTE
* -
* -
* - : [String.valueOf(currentDate)] -
* - : null - 使
*
*
* - Cursor
* - Cursor
*/
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);
/**
*
*
*
* CursorAlarmManager
* AlarmReceiver
*
*
* 1. Cursor
* 2.
* 3.
* - ID
* - AlarmReceiverPendingIntent
* - AlarmManager
* 4. Cursor
*
*
* - Cursor使
* - AlarmManager
* - PendingIntent
*/
if (c != null) {
/**
*
*
*
* Cursor
*
*
*
* - c != null:
* - c == null:
*/
if (c.moveToFirst()) {
/**
*
*
*
* 使do-whileCursor
* 使
*
*
* - moveToFirst():
* - do-while:
* - moveToNext():
*/
do {
/**
*
*
*
* Cursor
* AlarmManager
*
*
* - COLUMN_ALERTED_DATE:
* - getLong():
*/
long alertDate = c.getLong(COLUMN_ALERTED_DATE);
/**
* AlarmReceiverIntent
*
*
* AlarmReceiverIntent
* Intent
*
* Intent
* - context:
* - AlarmReceiver.class:
* - setData(): URIID
*
*
* - ContentUris.withAppendedId()IDURI
* - AlarmReceiverURIID
*/
Intent sender = new Intent(context, AlarmReceiver.class);
sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID)));
/**
* PendingIntent
*
*
* PendingIntent AlarmManager
* PendingIntentIntent
*
*
* - context:
* - 0: 0Intent
* - sender: Intent
* - 0: 0
*
*
* - 使PendingIntent
* - Intent
*/
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0);
/**
* AlarmManager
*
*
* AlarmManager
*
*
*
* - Context.ALARM_SERVICE:
* - AlarmManager
*/
AlarmManager alermManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
/**
*
*
*
* AlarmManager
* AlarmReceiver
*
*
* - AlarmManager.RTC_WAKEUP:
* * RTC: 使
* * WAKEUP:
* - alertDate:
* - pendingIntent: PendingIntent
*
*
* - 使
* - AlarmReceiver
* -
*/
alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent);
} while (c.moveToNext());
}
/**
* Cursor
*
*
* Cursor
* Android
*
*
* -
* -
* -
*
*
* - Cursor
* - finally
*/
c.close();
}
}
}

@ -1,155 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
/**
*
*
*
* 广
* AlarmAlertActivity
*
*
* - 广
* - Intent
* - AlarmAlertActivity
* -
*
*
* - Android BroadcastReceiver
* - Activity
* - Activity
* - UI
*
*
* 1. AlarmManager
* 2. onReceive()
* 3. IntentAlarmAlertActivity
* 4.
* 5.
*
*
* -
* -
* -
* - AlarmInitReceiver
*
* 线
* - onReceive()线
* - 广
* - Activity线
*
* @author MiCode
* @version 1.0
* @see AlarmAlertActivity
* @see AlarmInitReceiver
*/
public class AlarmReceiver extends BroadcastReceiver {
/**
* 广
*
*
*
* IntentAlarmAlertActivity
*
*
* 1.
* 2. IntentActivityAlarmAlertActivity
* 3. Activity
* 4. AlarmAlertActivity
*
*
* - context: AndroidActivity
* - intent: IDIntent
*
*
* - Intent
* - Activity
* -
*
*
* -
* - Activity
* - 广
*
* @param context Android
* @param intent Intent
*/
@Override
public void onReceive(Context context, Intent intent) {
/**
* IntentAlarmAlertActivity
*
*
* IntentAlarmAlertActivity
* Activity
*
* Intent
* - AlarmInitReceiver
* - Content URIID
* -
*
*
* -
* -
* - UI
*/
intent.setClass(context, AlarmAlertActivity.class);
/**
*
*
*
* IntentFLAG_ACTIVITY_NEW_TASK
* ActivityActivity
*
*
* - FLAG_ACTIVITY_NEW_TASK: Activity
* - ServiceBroadcastReceiverActivity
* - Activity
*
*
* - 广Activity
* -
* -
*/
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
/**
*
*
*
* ContextAlarmAlertActivity
*
*
*
* - Activity
* -
* -
* -
* -
*
*
* - AlarmAlertActivity
* -
* -
* -
*/
context.startActivity(intent);
}
}

@ -1,90 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import java.util.Calendar;
import net.micode.notes.R;
import net.micode.notes.ui.DateTimePicker;
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {
private Calendar mDate = Calendar.getInstance();
private boolean mIs24HourView;
private OnDateTimeSetListener mOnDateTimeSetListener;
private DateTimePicker mDateTimePicker;
public interface OnDateTimeSetListener {
void OnDateTimeSet(AlertDialog dialog, long date);
}
public DateTimePickerDialog(Context context, long date) {
super(context);
mDateTimePicker = new DateTimePicker(context);
setView(mDateTimePicker);
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
public void onDateTimeChanged(DateTimePicker view, int year, int month,
int dayOfMonth, int hourOfDay, int minute) {
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month);
mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
mDate.set(Calendar.MINUTE, minute);
updateTitle(mDate.getTimeInMillis());
}
});
mDate.setTimeInMillis(date);
mDate.set(Calendar.SECOND, 0);
mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());
setButton(context.getString(R.string.datetime_dialog_ok), this);
setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null);
set24HourView(DateFormat.is24HourFormat(this.getContext()));
updateTitle(mDate.getTimeInMillis());
}
public void set24HourView(boolean is24HourView) {
mIs24HourView = is24HourView;
}
public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
mOnDateTimeSetListener = callBack;
}
private void updateTitle(long date) {
int flag =
DateUtils.FORMAT_SHOW_YEAR |
DateUtils.FORMAT_SHOW_DATE |
DateUtils.FORMAT_SHOW_TIME;
flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}
public void onClick(DialogInterface arg0, int arg1) {
if (mOnDateTimeSetListener != null) {
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}

@ -1,61 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import net.micode.notes.R;
public class DropdownMenu {
private Button mButton;
private PopupMenu mPopupMenu;
private Menu mMenu;
public DropdownMenu(Context context, Button button, int menuId) {
mButton = button;
mButton.setBackgroundResource(R.drawable.dropdown_icon);
mPopupMenu = new PopupMenu(context, mButton);
mMenu = mPopupMenu.getMenu();
mPopupMenu.getMenuInflater().inflate(menuId, mMenu);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPopupMenu.show();
}
});
}
public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) {
if (mPopupMenu != null) {
mPopupMenu.setOnMenuItemClickListener(listener);
}
}
public MenuItem findItem(int id) {
return mMenu.findItem(id);
}
public void setTitle(CharSequence title) {
mButton.setText(title);
}
}

@ -1,80 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
public class FoldersListAdapter extends CursorAdapter {
public static final String [] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET
};
public static final int ID_COLUMN = 0;
public static final int NAME_COLUMN = 1;
public FoldersListAdapter(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new FolderListItem(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view instanceof FolderListItem) {
String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
((FolderListItem) view).bind(folderName);
}
}
public String getFolderName(Context context, int position) {
Cursor cursor = (Cursor) getItem(position);
return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context
.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);
}
private class FolderListItem extends LinearLayout {
private TextView mName;
public FolderListItem(Context context) {
super(context);
inflate(context, R.layout.folder_list_item, this);
mName = (TextView) findViewById(R.id.tv_folder_name);
}
public void bind(String name) {
mName.setText(name);
}
}
}

@ -1,873 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.SearchManager;
import android.appwidget.AppWidgetManager;
import android.content.ContentUris;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Paint;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.style.BackgroundColorSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.TextNote;
import net.micode.notes.model.WorkingNote;
import net.micode.notes.model.WorkingNote.NoteSettingChangedListener;
import net.micode.notes.tool.DataUtils;
import net.micode.notes.tool.ResourceParser;
import net.micode.notes.tool.ResourceParser.TextAppearanceResources;
import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener;
import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener;
import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NoteEditActivity extends Activity implements OnClickListener,
NoteSettingChangedListener, OnTextViewChangeListener {
private class HeadViewHolder {
public TextView tvModified;
public ImageView ivAlertIcon;
public TextView tvAlertDate;
public ImageView ibSetBgColor;
}
private static final Map<Integer, Integer> sBgSelectorBtnsMap = new HashMap<Integer, Integer>();
static {
sBgSelectorBtnsMap.put(R.id.iv_bg_yellow, ResourceParser.YELLOW);
sBgSelectorBtnsMap.put(R.id.iv_bg_red, ResourceParser.RED);
sBgSelectorBtnsMap.put(R.id.iv_bg_blue, ResourceParser.BLUE);
sBgSelectorBtnsMap.put(R.id.iv_bg_green, ResourceParser.GREEN);
sBgSelectorBtnsMap.put(R.id.iv_bg_white, ResourceParser.WHITE);
}
private static final Map<Integer, Integer> sBgSelectorSelectionMap = new HashMap<Integer, Integer>();
static {
sBgSelectorSelectionMap.put(ResourceParser.YELLOW, R.id.iv_bg_yellow_select);
sBgSelectorSelectionMap.put(ResourceParser.RED, R.id.iv_bg_red_select);
sBgSelectorSelectionMap.put(ResourceParser.BLUE, R.id.iv_bg_blue_select);
sBgSelectorSelectionMap.put(ResourceParser.GREEN, R.id.iv_bg_green_select);
sBgSelectorSelectionMap.put(ResourceParser.WHITE, R.id.iv_bg_white_select);
}
private static final Map<Integer, Integer> sFontSizeBtnsMap = new HashMap<Integer, Integer>();
static {
sFontSizeBtnsMap.put(R.id.ll_font_large, ResourceParser.TEXT_LARGE);
sFontSizeBtnsMap.put(R.id.ll_font_small, ResourceParser.TEXT_SMALL);
sFontSizeBtnsMap.put(R.id.ll_font_normal, ResourceParser.TEXT_MEDIUM);
sFontSizeBtnsMap.put(R.id.ll_font_super, ResourceParser.TEXT_SUPER);
}
private static final Map<Integer, Integer> sFontSelectorSelectionMap = new HashMap<Integer, Integer>();
static {
sFontSelectorSelectionMap.put(ResourceParser.TEXT_LARGE, R.id.iv_large_select);
sFontSelectorSelectionMap.put(ResourceParser.TEXT_SMALL, R.id.iv_small_select);
sFontSelectorSelectionMap.put(ResourceParser.TEXT_MEDIUM, R.id.iv_medium_select);
sFontSelectorSelectionMap.put(ResourceParser.TEXT_SUPER, R.id.iv_super_select);
}
private static final String TAG = "NoteEditActivity";
private HeadViewHolder mNoteHeaderHolder;
private View mHeadViewPanel;
private View mNoteBgColorSelector;
private View mFontSizeSelector;
private EditText mNoteEditor;
private View mNoteEditorPanel;
private WorkingNote mWorkingNote;
private SharedPreferences mSharedPrefs;
private int mFontSizeId;
private static final String PREFERENCE_FONT_SIZE = "pref_font_size";
private static final int SHORTCUT_ICON_TITLE_MAX_LEN = 10;
public static final String TAG_CHECKED = String.valueOf('\u221A');
public static final String TAG_UNCHECKED = String.valueOf('\u25A1');
private LinearLayout mEditTextList;
private String mUserQuery;
private Pattern mPattern;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.note_edit);
if (savedInstanceState == null && !initActivityState(getIntent())) {
finish();
return;
}
initResources();
}
/**
* Current activity may be killed when the memory is low. Once it is killed, for another time
* user load this activity, we should restore the former state
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(Intent.EXTRA_UID)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra(Intent.EXTRA_UID, savedInstanceState.getLong(Intent.EXTRA_UID));
if (!initActivityState(intent)) {
finish();
return;
}
Log.d(TAG, "Restoring from killed activity");
}
}
private boolean initActivityState(Intent intent) {
/**
* If the user specified the {@link Intent#ACTION_VIEW} but not provided with id,
* then jump to the NotesListActivity
*/
mWorkingNote = null;
if (TextUtils.equals(Intent.ACTION_VIEW, intent.getAction())) {
long noteId = intent.getLongExtra(Intent.EXTRA_UID, 0);
mUserQuery = "";
/**
* Starting from the searched result
*/
if (intent.hasExtra(SearchManager.EXTRA_DATA_KEY)) {
noteId = Long.parseLong(intent.getStringExtra(SearchManager.EXTRA_DATA_KEY));
mUserQuery = intent.getStringExtra(SearchManager.USER_QUERY);
}
if (!DataUtils.visibleInNoteDatabase(getContentResolver(), noteId, Notes.TYPE_NOTE)) {
Intent jump = new Intent(this, NotesListActivity.class);
startActivity(jump);
showToast(R.string.error_note_not_exist);
finish();
return false;
} else {
mWorkingNote = WorkingNote.load(this, noteId);
if (mWorkingNote == null) {
Log.e(TAG, "load note failed with note id" + noteId);
finish();
return false;
}
}
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN
| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
} else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) {
// New note
long folderId = intent.getLongExtra(Notes.INTENT_EXTRA_FOLDER_ID, 0);
int widgetId = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
int widgetType = intent.getIntExtra(Notes.INTENT_EXTRA_WIDGET_TYPE,
Notes.TYPE_WIDGET_INVALIDE);
int bgResId = intent.getIntExtra(Notes.INTENT_EXTRA_BACKGROUND_ID,
ResourceParser.getDefaultBgId(this));
// Parse call-record note
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
long callDate = intent.getLongExtra(Notes.INTENT_EXTRA_CALL_DATE, 0);
if (callDate != 0 && phoneNumber != null) {
if (TextUtils.isEmpty(phoneNumber)) {
Log.w(TAG, "The call record number is null");
}
long noteId = 0;
if ((noteId = DataUtils.getNoteIdByPhoneNumberAndCallDate(getContentResolver(),
phoneNumber, callDate)) > 0) {
mWorkingNote = WorkingNote.load(this, noteId);
if (mWorkingNote == null) {
Log.e(TAG, "load call note failed with note id" + noteId);
finish();
return false;
}
} else {
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId,
widgetType, bgResId);
mWorkingNote.convertToCallNote(phoneNumber, callDate);
}
} else {
mWorkingNote = WorkingNote.createEmptyNote(this, folderId, widgetId, widgetType,
bgResId);
}
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
| WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
} else {
Log.e(TAG, "Intent not specified action, should not support");
finish();
return false;
}
mWorkingNote.setOnSettingStatusChangedListener(this);
return true;
}
@Override
protected void onResume() {
super.onResume();
initNoteScreen();
}
private void initNoteScreen() {
mNoteEditor.setTextAppearance(this, TextAppearanceResources
.getTexAppearanceResource(mFontSizeId));
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
switchToListMode(mWorkingNote.getContent());
} else {
mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery));
mNoteEditor.setSelection(mNoteEditor.getText().length());
}
for (Integer id : sBgSelectorSelectionMap.keySet()) {
findViewById(sBgSelectorSelectionMap.get(id)).setVisibility(View.GONE);
}
mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
mNoteHeaderHolder.tvModified.setText(DateUtils.formatDateTime(this,
mWorkingNote.getModifiedDate(), DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_NUMERIC_DATE | DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_YEAR));
/**
* TODO: Add the menu for setting alert. Currently disable it because the DateTimePicker
* is not ready
*/
showAlertHeader();
}
private void showAlertHeader() {
if (mWorkingNote.hasClockAlert()) {
long time = System.currentTimeMillis();
if (time > mWorkingNote.getAlertDate()) {
mNoteHeaderHolder.tvAlertDate.setText(R.string.note_alert_expired);
} else {
mNoteHeaderHolder.tvAlertDate.setText(DateUtils.getRelativeTimeSpanString(
mWorkingNote.getAlertDate(), time, DateUtils.MINUTE_IN_MILLIS));
}
mNoteHeaderHolder.tvAlertDate.setVisibility(View.VISIBLE);
mNoteHeaderHolder.ivAlertIcon.setVisibility(View.VISIBLE);
} else {
mNoteHeaderHolder.tvAlertDate.setVisibility(View.GONE);
mNoteHeaderHolder.ivAlertIcon.setVisibility(View.GONE);
};
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
initActivityState(intent);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
/**
* For new note without note id, we should firstly save it to
* generate a id. If the editing note is not worth saving, there
* is no id which is equivalent to create new note
*/
if (!mWorkingNote.existInDatabase()) {
saveNote();
}
outState.putLong(Intent.EXTRA_UID, mWorkingNote.getNoteId());
Log.d(TAG, "Save working note id: " + mWorkingNote.getNoteId() + " onSaveInstanceState");
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mNoteBgColorSelector.getVisibility() == View.VISIBLE
&& !inRangeOfView(mNoteBgColorSelector, ev)) {
mNoteBgColorSelector.setVisibility(View.GONE);
return true;
}
if (mFontSizeSelector.getVisibility() == View.VISIBLE
&& !inRangeOfView(mFontSizeSelector, ev)) {
mFontSizeSelector.setVisibility(View.GONE);
return true;
}
return super.dispatchTouchEvent(ev);
}
private boolean inRangeOfView(View view, MotionEvent ev) {
int []location = new int[2];
view.getLocationOnScreen(location);
int x = location[0];
int y = location[1];
if (ev.getX() < x
|| ev.getX() > (x + view.getWidth())
|| ev.getY() < y
|| ev.getY() > (y + view.getHeight())) {
return false;
}
return true;
}
private void initResources() {
mHeadViewPanel = findViewById(R.id.note_title);
mNoteHeaderHolder = new HeadViewHolder();
mNoteHeaderHolder.tvModified = (TextView) findViewById(R.id.tv_modified_date);
mNoteHeaderHolder.ivAlertIcon = (ImageView) findViewById(R.id.iv_alert_icon);
mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date);
mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color);
mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this);
mNoteEditor = (EditText) findViewById(R.id.note_edit_view);
mNoteEditorPanel = findViewById(R.id.sv_note_edit);
mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector);
for (int id : sBgSelectorBtnsMap.keySet()) {
ImageView iv = (ImageView) findViewById(id);
iv.setOnClickListener(this);
}
mFontSizeSelector = findViewById(R.id.font_size_selector);
for (int id : sFontSizeBtnsMap.keySet()) {
View view = findViewById(id);
view.setOnClickListener(this);
};
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mFontSizeId = mSharedPrefs.getInt(PREFERENCE_FONT_SIZE, ResourceParser.BG_DEFAULT_FONT_SIZE);
/**
* HACKME: Fix bug of store the resource id in shared preference.
* The id may larger than the length of resources, in this case,
* return the {@link ResourceParser#BG_DEFAULT_FONT_SIZE}
*/
if(mFontSizeId >= TextAppearanceResources.getResourcesSize()) {
mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE;
}
mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list);
}
@Override
protected void onPause() {
super.onPause();
if(saveNote()) {
Log.d(TAG, "Note data was saved with length:" + mWorkingNote.getContent().length());
}
clearSettingState();
}
private void updateWidget() {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_2X) {
intent.setClass(this, NoteWidgetProvider_2x.class);
} else if (mWorkingNote.getWidgetType() == Notes.TYPE_WIDGET_4X) {
intent.setClass(this, NoteWidgetProvider_4x.class);
} else {
Log.e(TAG, "Unspported widget type");
return;
}
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
mWorkingNote.getWidgetId()
});
sendBroadcast(intent);
setResult(RESULT_OK, intent);
}
public void onClick(View v) {
int id = v.getId();
if (id == R.id.btn_set_bg_color) {
mNoteBgColorSelector.setVisibility(View.VISIBLE);
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
- View.VISIBLE);
} else if (sBgSelectorBtnsMap.containsKey(id)) {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.GONE);
mWorkingNote.setBgColorId(sBgSelectorBtnsMap.get(id));
mNoteBgColorSelector.setVisibility(View.GONE);
} else if (sFontSizeBtnsMap.containsKey(id)) {
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.GONE);
mFontSizeId = sFontSizeBtnsMap.get(id);
mSharedPrefs.edit().putInt(PREFERENCE_FONT_SIZE, mFontSizeId).commit();
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
getWorkingText();
switchToListMode(mWorkingNote.getContent());
} else {
mNoteEditor.setTextAppearance(this,
TextAppearanceResources.getTexAppearanceResource(mFontSizeId));
}
mFontSizeSelector.setVisibility(View.GONE);
}
}
@Override
public void onBackPressed() {
if(clearSettingState()) {
return;
}
saveNote();
super.onBackPressed();
}
private boolean clearSettingState() {
if (mNoteBgColorSelector.getVisibility() == View.VISIBLE) {
mNoteBgColorSelector.setVisibility(View.GONE);
return true;
} else if (mFontSizeSelector.getVisibility() == View.VISIBLE) {
mFontSizeSelector.setVisibility(View.GONE);
return true;
}
return false;
}
public void onBackgroundColorChanged() {
findViewById(sBgSelectorSelectionMap.get(mWorkingNote.getBgColorId())).setVisibility(
View.VISIBLE);
mNoteEditorPanel.setBackgroundResource(mWorkingNote.getBgColorResId());
mHeadViewPanel.setBackgroundResource(mWorkingNote.getTitleBgResId());
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (isFinishing()) {
return true;
}
clearSettingState();
menu.clear();
if (mWorkingNote.getFolderId() == Notes.ID_CALL_RECORD_FOLDER) {
getMenuInflater().inflate(R.menu.call_note_edit, menu);
} else {
getMenuInflater().inflate(R.menu.note_edit, menu);
}
if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) {
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_normal_mode);
} else {
menu.findItem(R.id.menu_list_mode).setTitle(R.string.menu_list_mode);
}
if (mWorkingNote.hasClockAlert()) {
menu.findItem(R.id.menu_alert).setVisible(false);
} else {
menu.findItem(R.id.menu_delete_remind).setVisible(false);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_new_note:
createNewNote();
break;
case R.id.menu_delete:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_note));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
deleteCurrentNote();
finish();
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
break;
case R.id.menu_font_size:
mFontSizeSelector.setVisibility(View.VISIBLE);
findViewById(sFontSelectorSelectionMap.get(mFontSizeId)).setVisibility(View.VISIBLE);
break;
case R.id.menu_list_mode:
mWorkingNote.setCheckListMode(mWorkingNote.getCheckListMode() == 0 ?
TextNote.MODE_CHECK_LIST : 0);
break;
case R.id.menu_share:
getWorkingText();
sendTo(this, mWorkingNote.getContent());
break;
case R.id.menu_send_to_desktop:
sendToDesktop();
break;
case R.id.menu_alert:
setReminder();
break;
case R.id.menu_delete_remind:
mWorkingNote.setAlertDate(0, false);
break;
default:
break;
}
return true;
}
private void setReminder() {
DateTimePickerDialog d = new DateTimePickerDialog(this, System.currentTimeMillis());
d.setOnDateTimeSetListener(new OnDateTimeSetListener() {
public void OnDateTimeSet(AlertDialog dialog, long date) {
mWorkingNote.setAlertDate(date , true);
}
});
d.show();
}
/**
* Share note to apps that support {@link Intent#ACTION_SEND} action
* and {@text/plain} type
*/
private void sendTo(Context context, String info) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, info);
intent.setType("text/plain");
context.startActivity(intent);
}
private void createNewNote() {
// Firstly, save current editing notes
saveNote();
// For safety, start a new NoteEditActivity
finish();
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mWorkingNote.getFolderId());
startActivity(intent);
}
private void deleteCurrentNote() {
if (mWorkingNote.existInDatabase()) {
HashSet<Long> ids = new HashSet<Long>();
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();
}
}

@ -1,217 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.graphics.Rect;
import android.text.Layout;
import android.text.Selection;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.URLSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.widget.EditText;
import net.micode.notes.R;
import java.util.HashMap;
import java.util.Map;
public class NoteEditText extends EditText {
private static final String TAG = "NoteEditText";
private int mIndex;
private int mSelectionStartBeforeDelete;
private static final String SCHEME_TEL = "tel:" ;
private static final String SCHEME_HTTP = "http:" ;
private static final String SCHEME_EMAIL = "mailto:" ;
private static final Map<String, Integer> sSchemaActionResMap = new HashMap<String, Integer>();
static {
sSchemaActionResMap.put(SCHEME_TEL, R.string.note_link_tel);
sSchemaActionResMap.put(SCHEME_HTTP, R.string.note_link_web);
sSchemaActionResMap.put(SCHEME_EMAIL, R.string.note_link_email);
}
/**
* Call by the {@link NoteEditActivity} to delete or add edit text
*/
public interface OnTextViewChangeListener {
/**
* Delete current edit text when {@link KeyEvent#KEYCODE_DEL} happens
* and the text is null
*/
void onEditTextDelete(int index, String text);
/**
* Add edit text after current edit text when {@link KeyEvent#KEYCODE_ENTER}
* happen
*/
void onEditTextEnter(int index, String text);
/**
* Hide or show item option when text change
*/
void onTextChange(int index, boolean hasText);
}
private OnTextViewChangeListener mOnTextViewChangeListener;
public NoteEditText(Context context) {
super(context, null);
mIndex = 0;
}
public void setIndex(int index) {
mIndex = index;
}
public void setOnTextViewChangeListener(OnTextViewChangeListener listener) {
mOnTextViewChangeListener = listener;
}
public NoteEditText(Context context, AttributeSet attrs) {
super(context, attrs, android.R.attr.editTextStyle);
}
public NoteEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
y -= getTotalPaddingTop();
x += getScrollX();
y += getScrollY();
Layout layout = getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
Selection.setSelection(getText(), off);
break;
}
return super.onTouchEvent(event);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_ENTER:
if (mOnTextViewChangeListener != null) {
return false;
}
break;
case KeyEvent.KEYCODE_DEL:
mSelectionStartBeforeDelete = getSelectionStart();
break;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch(keyCode) {
case KeyEvent.KEYCODE_DEL:
if (mOnTextViewChangeListener != null) {
if (0 == mSelectionStartBeforeDelete && mIndex != 0) {
mOnTextViewChangeListener.onEditTextDelete(mIndex, getText().toString());
return true;
}
} else {
Log.d(TAG, "OnTextViewChangeListener was not seted");
}
break;
case KeyEvent.KEYCODE_ENTER:
if (mOnTextViewChangeListener != null) {
int selectionStart = getSelectionStart();
String text = getText().subSequence(selectionStart, length()).toString();
setText(getText().subSequence(0, selectionStart));
mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text);
} else {
Log.d(TAG, "OnTextViewChangeListener was not seted");
}
break;
default:
break;
}
return super.onKeyUp(keyCode, event);
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if (mOnTextViewChangeListener != null) {
if (!focused && TextUtils.isEmpty(getText())) {
mOnTextViewChangeListener.onTextChange(mIndex, false);
} else {
mOnTextViewChangeListener.onTextChange(mIndex, true);
}
}
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
protected void onCreateContextMenu(ContextMenu menu) {
if (getText() instanceof Spanned) {
int selStart = getSelectionStart();
int selEnd = getSelectionEnd();
int min = Math.min(selStart, selEnd);
int max = Math.max(selStart, selEnd);
final URLSpan[] urls = ((Spanned) getText()).getSpans(min, max, URLSpan.class);
if (urls.length == 1) {
int defaultResId = 0;
for(String schema: sSchemaActionResMap.keySet()) {
if(urls[0].getURL().indexOf(schema) >= 0) {
defaultResId = sSchemaActionResMap.get(schema);
break;
}
}
if (defaultResId == 0) {
defaultResId = R.string.note_link_other;
}
menu.add(0, 0, 0, defaultResId).setOnMenuItemClickListener(
new OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
// goto a new intent
urls[0].onClick(NoteEditText.this);
return true;
}
});
}
}
super.onCreateContextMenu(menu);
}
}

@ -1,224 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.database.Cursor;
import android.text.TextUtils;
import net.micode.notes.data.Contact;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.tool.DataUtils;
public class NoteItemData {
static final String [] PROJECTION = new String [] {
NoteColumns.ID,
NoteColumns.ALERTED_DATE,
NoteColumns.BG_COLOR_ID,
NoteColumns.CREATED_DATE,
NoteColumns.HAS_ATTACHMENT,
NoteColumns.MODIFIED_DATE,
NoteColumns.NOTES_COUNT,
NoteColumns.PARENT_ID,
NoteColumns.SNIPPET,
NoteColumns.TYPE,
NoteColumns.WIDGET_ID,
NoteColumns.WIDGET_TYPE,
};
private static final int ID_COLUMN = 0;
private static final int ALERTED_DATE_COLUMN = 1;
private static final int BG_COLOR_ID_COLUMN = 2;
private static final int CREATED_DATE_COLUMN = 3;
private static final int HAS_ATTACHMENT_COLUMN = 4;
private static final int MODIFIED_DATE_COLUMN = 5;
private static final int NOTES_COUNT_COLUMN = 6;
private static final int PARENT_ID_COLUMN = 7;
private static final int SNIPPET_COLUMN = 8;
private static final int TYPE_COLUMN = 9;
private static final int WIDGET_ID_COLUMN = 10;
private static final int WIDGET_TYPE_COLUMN = 11;
private long mId;
private long mAlertDate;
private int mBgColorId;
private long mCreatedDate;
private boolean mHasAttachment;
private long mModifiedDate;
private int mNotesCount;
private long mParentId;
private String mSnippet;
private int mType;
private int mWidgetId;
private int mWidgetType;
private String mName;
private String mPhoneNumber;
private boolean mIsLastItem;
private boolean mIsFirstItem;
private boolean mIsOnlyOneItem;
private boolean mIsOneNoteFollowingFolder;
private boolean mIsMultiNotesFollowingFolder;
public NoteItemData(Context context, Cursor cursor) {
mId = cursor.getLong(ID_COLUMN);
mAlertDate = cursor.getLong(ALERTED_DATE_COLUMN);
mBgColorId = cursor.getInt(BG_COLOR_ID_COLUMN);
mCreatedDate = cursor.getLong(CREATED_DATE_COLUMN);
mHasAttachment = (cursor.getInt(HAS_ATTACHMENT_COLUMN) > 0) ? true : false;
mModifiedDate = cursor.getLong(MODIFIED_DATE_COLUMN);
mNotesCount = cursor.getInt(NOTES_COUNT_COLUMN);
mParentId = cursor.getLong(PARENT_ID_COLUMN);
mSnippet = cursor.getString(SNIPPET_COLUMN);
mSnippet = mSnippet.replace(NoteEditActivity.TAG_CHECKED, "").replace(
NoteEditActivity.TAG_UNCHECKED, "");
mType = cursor.getInt(TYPE_COLUMN);
mWidgetId = cursor.getInt(WIDGET_ID_COLUMN);
mWidgetType = cursor.getInt(WIDGET_TYPE_COLUMN);
mPhoneNumber = "";
if (mParentId == Notes.ID_CALL_RECORD_FOLDER) {
mPhoneNumber = DataUtils.getCallNumberByNoteId(context.getContentResolver(), mId);
if (!TextUtils.isEmpty(mPhoneNumber)) {
mName = Contact.getContact(context, mPhoneNumber);
if (mName == null) {
mName = mPhoneNumber;
}
}
}
if (mName == null) {
mName = "";
}
checkPostion(cursor);
}
private void checkPostion(Cursor cursor) {
mIsLastItem = cursor.isLast() ? true : false;
mIsFirstItem = cursor.isFirst() ? true : false;
mIsOnlyOneItem = (cursor.getCount() == 1);
mIsMultiNotesFollowingFolder = false;
mIsOneNoteFollowingFolder = false;
if (mType == Notes.TYPE_NOTE && !mIsFirstItem) {
int position = cursor.getPosition();
if (cursor.moveToPrevious()) {
if (cursor.getInt(TYPE_COLUMN) == Notes.TYPE_FOLDER
|| cursor.getInt(TYPE_COLUMN) == Notes.TYPE_SYSTEM) {
if (cursor.getCount() > (position + 1)) {
mIsMultiNotesFollowingFolder = true;
} else {
mIsOneNoteFollowingFolder = true;
}
}
if (!cursor.moveToNext()) {
throw new IllegalStateException("cursor move to previous but can't move back");
}
}
}
}
public boolean isOneFollowingFolder() {
return mIsOneNoteFollowingFolder;
}
public boolean isMultiFollowingFolder() {
return mIsMultiNotesFollowingFolder;
}
public boolean isLast() {
return mIsLastItem;
}
public String getCallName() {
return mName;
}
public boolean isFirst() {
return mIsFirstItem;
}
public boolean isSingle() {
return mIsOnlyOneItem;
}
public long getId() {
return mId;
}
public long getAlertDate() {
return mAlertDate;
}
public long getCreatedDate() {
return mCreatedDate;
}
public boolean hasAttachment() {
return mHasAttachment;
}
public long getModifiedDate() {
return mModifiedDate;
}
public int getBgColorId() {
return mBgColorId;
}
public long getParentId() {
return mParentId;
}
public int getNotesCount() {
return mNotesCount;
}
public long getFolderId () {
return mParentId;
}
public int getType() {
return mType;
}
public int getWidgetType() {
return mWidgetType;
}
public int getWidgetId() {
return mWidgetId;
}
public String getSnippet() {
return mSnippet;
}
public boolean hasAlert() {
return (mAlertDate > 0);
}
public boolean isCallRecord() {
return (mParentId == Notes.ID_CALL_RECORD_FOLDER && !TextUtils.isEmpty(mPhoneNumber));
}
public static int getNoteType(Cursor cursor) {
return cursor.getInt(TYPE_COLUMN);
}
}

@ -1,954 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.appwidget.AppWidgetManager;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
import net.micode.notes.gtask.remote.GTaskSyncService;
import net.micode.notes.model.WorkingNote;
import net.micode.notes.tool.BackupUtils;
import net.micode.notes.tool.DataUtils;
import net.micode.notes.tool.ResourceParser;
import net.micode.notes.ui.NotesListAdapter.AppWidgetAttribute;
import net.micode.notes.widget.NoteWidgetProvider_2x;
import net.micode.notes.widget.NoteWidgetProvider_4x;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
public class NotesListActivity extends Activity implements OnClickListener, OnItemLongClickListener {
private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0;
private static final int FOLDER_LIST_QUERY_TOKEN = 1;
private static final int MENU_FOLDER_DELETE = 0;
private static final int MENU_FOLDER_VIEW = 1;
private static final int MENU_FOLDER_CHANGE_NAME = 2;
private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction";
private enum ListEditState {
NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER
};
private ListEditState mState;
private BackgroundQueryHandler mBackgroundQueryHandler;
private NotesListAdapter mNotesListAdapter;
private ListView mNotesListView;
private Button mAddNewNote;
private boolean mDispatch;
private int mOriginY;
private int mDispatchY;
private TextView mTitleBar;
private long mCurrentFolderId;
private ContentResolver mContentResolver;
private ModeCallback mModeCallBack;
private static final String TAG = "NotesListActivity";
public static final int NOTES_LISTVIEW_SCROLL_RATE = 30;
private NoteItemData mFocusNoteDataItem;
private static final String NORMAL_SELECTION = NoteColumns.PARENT_ID + "=?";
private static final String ROOT_FOLDER_SELECTION = "(" + NoteColumns.TYPE + "<>"
+ Notes.TYPE_SYSTEM + " AND " + NoteColumns.PARENT_ID + "=?)" + " OR ("
+ NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND "
+ NoteColumns.NOTES_COUNT + ">0)";
private final static int REQUEST_CODE_OPEN_NODE = 102;
private final static int REQUEST_CODE_NEW_NODE = 103;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.note_list);
initResources();
/**
* Insert an introduction when user firstly use this application
*/
setAppInfoFromRawRes();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK
&& (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) {
mNotesListAdapter.changeCursor(null);
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void setAppInfoFromRawRes() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) {
StringBuilder sb = new StringBuilder();
InputStream in = null;
try {
in = getResources().openRawResource(R.raw.introduction);
if (in != null) {
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
char [] buf = new char[1024];
int len = 0;
while ((len = br.read(buf)) > 0) {
sb.append(buf, 0, len);
}
} else {
Log.e(TAG, "Read introduction file error");
return;
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
if(in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER,
AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE,
ResourceParser.RED);
note.setWorkingText(sb.toString());
if (note.saveNote()) {
sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit();
} else {
Log.e(TAG, "Save introduction note error");
return;
}
}
}
@Override
protected void onStart() {
super.onStart();
startAsyncNotesListQuery();
}
private void initResources() {
mContentResolver = this.getContentResolver();
mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver());
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mNotesListView = (ListView) findViewById(R.id.notes_list);
mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null),
null, false);
mNotesListView.setOnItemClickListener(new OnListItemClickListener());
mNotesListView.setOnItemLongClickListener(this);
mNotesListAdapter = new NotesListAdapter(this);
mNotesListView.setAdapter(mNotesListAdapter);
mAddNewNote = (Button) findViewById(R.id.btn_new_note);
mAddNewNote.setOnClickListener(this);
mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener());
mDispatch = false;
mDispatchY = 0;
mOriginY = 0;
mTitleBar = (TextView) findViewById(R.id.tv_title_bar);
mState = ListEditState.NOTE_LIST;
mModeCallBack = new ModeCallback();
}
private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener {
private DropdownMenu mDropDownMenu;
private ActionMode mActionMode;
private MenuItem mMoveMenu;
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
getMenuInflater().inflate(R.menu.note_list_options, menu);
menu.findItem(R.id.delete).setOnMenuItemClickListener(this);
mMoveMenu = menu.findItem(R.id.move);
if (mFocusNoteDataItem.getParentId() == Notes.ID_CALL_RECORD_FOLDER
|| DataUtils.getUserFolderCount(mContentResolver) == 0) {
mMoveMenu.setVisible(false);
} else {
mMoveMenu.setVisible(true);
mMoveMenu.setOnMenuItemClickListener(this);
}
mActionMode = mode;
mNotesListAdapter.setChoiceMode(true);
mNotesListView.setLongClickable(false);
mAddNewNote.setVisibility(View.GONE);
View customView = LayoutInflater.from(NotesListActivity.this).inflate(
R.layout.note_list_dropdown_menu, null);
mode.setCustomView(customView);
mDropDownMenu = new DropdownMenu(NotesListActivity.this,
(Button) customView.findViewById(R.id.selection_menu),
R.menu.note_list_dropdown);
mDropDownMenu.setOnDropdownMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
public boolean onMenuItemClick(MenuItem item) {
mNotesListAdapter.selectAll(!mNotesListAdapter.isAllSelected());
updateMenu();
return true;
}
});
return true;
}
private void updateMenu() {
int selectedCount = mNotesListAdapter.getSelectedCount();
// Update dropdown menu
String format = getResources().getString(R.string.menu_select_title, selectedCount);
mDropDownMenu.setTitle(format);
MenuItem item = mDropDownMenu.findItem(R.id.action_select_all);
if (item != null) {
if (mNotesListAdapter.isAllSelected()) {
item.setChecked(true);
item.setTitle(R.string.menu_deselect_all);
} else {
item.setChecked(false);
item.setTitle(R.string.menu_select_all);
}
}
}
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
return false;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// TODO Auto-generated method stub
return false;
}
public void onDestroyActionMode(ActionMode mode) {
mNotesListAdapter.setChoiceMode(false);
mNotesListView.setLongClickable(true);
mAddNewNote.setVisibility(View.VISIBLE);
}
public void finishActionMode() {
mActionMode.finish();
}
public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
boolean checked) {
mNotesListAdapter.setCheckedItem(position, checked);
updateMenu();
}
public boolean onMenuItemClick(MenuItem item) {
if (mNotesListAdapter.getSelectedCount() == 0) {
Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none),
Toast.LENGTH_SHORT).show();
return true;
}
switch (item.getItemId()) {
case R.id.delete:
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(getString(R.string.alert_title_delete));
builder.setIcon(android.R.drawable.ic_dialog_alert);
builder.setMessage(getString(R.string.alert_message_delete_notes,
mNotesListAdapter.getSelectedCount()));
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
batchDelete();
}
});
builder.setNegativeButton(android.R.string.cancel, null);
builder.show();
break;
case R.id.move:
startQueryDestinationFolders();
break;
default:
return false;
}
return true;
}
}
private class NewNoteOnTouchListener implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
Display display = getWindowManager().getDefaultDisplay();
int screenHeight = display.getHeight();
int newNoteViewHeight = mAddNewNote.getHeight();
int start = screenHeight - newNoteViewHeight;
int eventY = start + (int) event.getY();
/**
* Minus TitleBar's height
*/
if (mState == ListEditState.SUB_FOLDER) {
eventY -= mTitleBar.getHeight();
start -= mTitleBar.getHeight();
}
/**
* HACKME:When click the transparent part of "New Note" button, dispatch
* the event to the list view behind this button. The transparent part of
* "New Note" button could be expressed by formula y=-0.12x+94Unit:pixel
* and the line top of the button. The coordinate based on left of the "New
* Note" button. The 94 represents maximum height of the transparent part.
* Notice that, if the background of the button changes, the formula should
* also change. This is very bad, just for the UI designer's strong requirement.
*/
if (event.getY() < (event.getX() * (-0.12) + 94)) {
View view = mNotesListView.getChildAt(mNotesListView.getChildCount() - 1
- mNotesListView.getFooterViewsCount());
if (view != null && view.getBottom() > start
&& (view.getTop() < (start + 94))) {
mOriginY = (int) event.getY();
mDispatchY = eventY;
event.setLocation(event.getX(), mDispatchY);
mDispatch = true;
return mNotesListView.dispatchTouchEvent(event);
}
}
break;
}
case MotionEvent.ACTION_MOVE: {
if (mDispatch) {
mDispatchY += (int) event.getY() - mOriginY;
event.setLocation(event.getX(), mDispatchY);
return mNotesListView.dispatchTouchEvent(event);
}
break;
}
default: {
if (mDispatch) {
event.setLocation(event.getX(), mDispatchY);
mDispatch = false;
return mNotesListView.dispatchTouchEvent(event);
}
break;
}
}
return false;
}
};
private void startAsyncNotesListQuery() {
String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION
: NORMAL_SELECTION;
mBackgroundQueryHandler.startQuery(FOLDER_NOTE_LIST_QUERY_TOKEN, null,
Notes.CONTENT_NOTE_URI, NoteItemData.PROJECTION, selection, new String[] {
String.valueOf(mCurrentFolderId)
}, NoteColumns.TYPE + " DESC," + NoteColumns.MODIFIED_DATE + " DESC");
}
private final class BackgroundQueryHandler extends AsyncQueryHandler {
public BackgroundQueryHandler(ContentResolver contentResolver) {
super(contentResolver);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
switch (token) {
case FOLDER_NOTE_LIST_QUERY_TOKEN:
mNotesListAdapter.changeCursor(cursor);
break;
case FOLDER_LIST_QUERY_TOKEN:
if (cursor != null && cursor.getCount() > 0) {
showFolderListMenu(cursor);
} else {
Log.e(TAG, "Query folder failed");
}
break;
default:
return;
}
}
}
private void showFolderListMenu(Cursor cursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(R.string.menu_title_select_folder);
final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
DataUtils.batchMoveToFolder(mContentResolver,
mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which));
Toast.makeText(
NotesListActivity.this,
getString(R.string.format_move_notes_to_folder,
mNotesListAdapter.getSelectedCount(),
adapter.getFolderName(NotesListActivity.this, which)),
Toast.LENGTH_SHORT).show();
mModeCallBack.finishActionMode();
}
});
builder.show();
}
private void createNewNote() {
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_INSERT_OR_EDIT);
intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId);
this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE);
}
private void batchDelete() {
new AsyncTask<Void, Void, HashSet<AppWidgetAttribute>>() {
protected HashSet<AppWidgetAttribute> doInBackground(Void... unused) {
HashSet<AppWidgetAttribute> widgets = mNotesListAdapter.getSelectedWidget();
if (!isSyncMode()) {
// if not synced, delete notes directly
if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter
.getSelectedItemIds())) {
} else {
Log.e(TAG, "Delete notes error, should not happens");
}
} else {
// in sync mode, we'll move the deleted note into the trash
// folder
if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter
.getSelectedItemIds(), Notes.ID_TRASH_FOLER)) {
Log.e(TAG, "Move notes to trash folder error, should not happens");
}
}
return widgets;
}
@Override
protected void onPostExecute(HashSet<AppWidgetAttribute> widgets) {
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
&& widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
updateWidget(widget.widgetId, widget.widgetType);
}
}
}
mModeCallBack.finishActionMode();
}
}.execute();
}
private void deleteFolder(long folderId) {
if (folderId == Notes.ID_ROOT_FOLDER) {
Log.e(TAG, "Wrong folder id, should not happen " + folderId);
return;
}
HashSet<Long> ids = new HashSet<Long>();
ids.add(folderId);
HashSet<AppWidgetAttribute> widgets = DataUtils.getFolderNoteWidget(mContentResolver,
folderId);
if (!isSyncMode()) {
// if not synced, delete folder directly
DataUtils.batchDeleteNotes(mContentResolver, ids);
} else {
// in sync mode, we'll move the deleted folder into the trash folder
DataUtils.batchMoveToFolder(mContentResolver, ids, Notes.ID_TRASH_FOLER);
}
if (widgets != null) {
for (AppWidgetAttribute widget : widgets) {
if (widget.widgetId != AppWidgetManager.INVALID_APPWIDGET_ID
&& widget.widgetType != Notes.TYPE_WIDGET_INVALIDE) {
updateWidget(widget.widgetId, widget.widgetType);
}
}
}
}
private void openNode(NoteItemData data) {
Intent intent = new Intent(this, NoteEditActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(Intent.EXTRA_UID, data.getId());
this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE);
}
private void openFolder(NoteItemData data) {
mCurrentFolderId = data.getId();
startAsyncNotesListQuery();
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mState = ListEditState.CALL_RECORD_FOLDER;
mAddNewNote.setVisibility(View.GONE);
} else {
mState = ListEditState.SUB_FOLDER;
}
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mTitleBar.setText(R.string.call_record_folder_name);
} else {
mTitleBar.setText(data.getSnippet());
}
mTitleBar.setVisibility(View.VISIBLE);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_new_note:
createNewNote();
break;
default:
break;
}
}
private void showSoftInput() {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethodManager != null) {
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
}
private void hideSoftInput(View view) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
private void showCreateOrModifyFolderDialog(final boolean create) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null);
final EditText etName = (EditText) view.findViewById(R.id.et_foler_name);
showSoftInput();
if (!create) {
if (mFocusNoteDataItem != null) {
etName.setText(mFocusNoteDataItem.getSnippet());
builder.setTitle(getString(R.string.menu_folder_change_name));
} else {
Log.e(TAG, "The long click data item is null");
return;
}
} else {
etName.setText("");
builder.setTitle(this.getString(R.string.menu_create_folder));
}
builder.setPositiveButton(android.R.string.ok, null);
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
hideSoftInput(etName);
}
});
final Dialog dialog = builder.setView(view).show();
final Button positive = (Button)dialog.findViewById(android.R.id.button1);
positive.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
hideSoftInput(etName);
String name = etName.getText().toString();
if (DataUtils.checkVisibleFolderName(mContentResolver, name)) {
Toast.makeText(NotesListActivity.this, getString(R.string.folder_exist, name),
Toast.LENGTH_LONG).show();
etName.setSelection(0, etName.length());
return;
}
if (!create) {
if (!TextUtils.isEmpty(name)) {
ContentValues values = new ContentValues();
values.put(NoteColumns.SNIPPET, name);
values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
values.put(NoteColumns.LOCAL_MODIFIED, 1);
mContentResolver.update(Notes.CONTENT_NOTE_URI, values, NoteColumns.ID
+ "=?", new String[] {
String.valueOf(mFocusNoteDataItem.getId())
});
}
} else if (!TextUtils.isEmpty(name)) {
ContentValues values = new ContentValues();
values.put(NoteColumns.SNIPPET, name);
values.put(NoteColumns.TYPE, Notes.TYPE_FOLDER);
mContentResolver.insert(Notes.CONTENT_NOTE_URI, values);
}
dialog.dismiss();
}
});
if (TextUtils.isEmpty(etName.getText())) {
positive.setEnabled(false);
}
/**
* When the name edit text is null, disable the positive button
*/
etName.addTextChangedListener(new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(etName.getText())) {
positive.setEnabled(false);
} else {
positive.setEnabled(true);
}
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
}
@Override
public void onBackPressed() {
switch (mState) {
case SUB_FOLDER:
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mState = ListEditState.NOTE_LIST;
startAsyncNotesListQuery();
mTitleBar.setVisibility(View.GONE);
break;
case CALL_RECORD_FOLDER:
mCurrentFolderId = Notes.ID_ROOT_FOLDER;
mState = ListEditState.NOTE_LIST;
mAddNewNote.setVisibility(View.VISIBLE);
mTitleBar.setVisibility(View.GONE);
startAsyncNotesListQuery();
break;
case NOTE_LIST:
super.onBackPressed();
break;
default:
break;
}
}
private void updateWidget(int appWidgetId, int appWidgetType) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
if (appWidgetType == Notes.TYPE_WIDGET_2X) {
intent.setClass(this, NoteWidgetProvider_2x.class);
} else if (appWidgetType == Notes.TYPE_WIDGET_4X) {
intent.setClass(this, NoteWidgetProvider_4x.class);
} else {
Log.e(TAG, "Unspported widget type");
return;
}
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {
appWidgetId
});
sendBroadcast(intent);
setResult(RESULT_OK, intent);
}
private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
if (mFocusNoteDataItem != null) {
menu.setHeaderTitle(mFocusNoteDataItem.getSnippet());
menu.add(0, MENU_FOLDER_VIEW, 0, R.string.menu_folder_view);
menu.add(0, MENU_FOLDER_DELETE, 0, R.string.menu_folder_delete);
menu.add(0, MENU_FOLDER_CHANGE_NAME, 0, R.string.menu_folder_change_name);
}
}
};
@Override
public void onContextMenuClosed(Menu menu) {
if (mNotesListView != null) {
mNotesListView.setOnCreateContextMenuListener(null);
}
super.onContextMenuClosed(menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
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<Void, Void, Integer>() {
@Override
protected Integer doInBackground(Void... unused) {
return backup.exportToText();
}
@Override
protected void onPostExecute(Integer result) {
if (result == BackupUtils.STATE_SD_CARD_UNMOUONTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.failed_sdcard_export));
builder.setMessage(NotesListActivity.this
.getString(R.string.error_sdcard_unmounted));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SUCCESS) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.success_sdcard_export));
builder.setMessage(NotesListActivity.this.getString(
R.string.format_exported_file_location, backup
.getExportedTextFileName(), backup.getExportedTextFileDir()));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
} else if (result == BackupUtils.STATE_SYSTEM_ERROR) {
AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this);
builder.setTitle(NotesListActivity.this
.getString(R.string.failed_sdcard_export));
builder.setMessage(NotesListActivity.this
.getString(R.string.error_sdcard_export));
builder.setPositiveButton(android.R.string.ok, null);
builder.show();
}
}
}.execute();
}
private boolean isSyncMode() {
return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0;
}
private void startPreferenceActivity() {
Activity from = getParent() != null ? getParent() : this;
Intent intent = new Intent(from, NotesPreferenceActivity.class);
from.startActivityIfNeeded(intent, -1);
}
private class OnListItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (view instanceof NotesListItem) {
NoteItemData item = ((NotesListItem) view).getItemData();
if (mNotesListAdapter.isInChoiceMode()) {
if (item.getType() == Notes.TYPE_NOTE) {
position = position - mNotesListView.getHeaderViewsCount();
mModeCallBack.onItemCheckedStateChanged(null, position, id,
!mNotesListAdapter.isSelectedItem(position));
}
return;
}
switch (mState) {
case NOTE_LIST:
if (item.getType() == Notes.TYPE_FOLDER
|| item.getType() == Notes.TYPE_SYSTEM) {
openFolder(item);
} else if (item.getType() == Notes.TYPE_NOTE) {
openNode(item);
} else {
Log.e(TAG, "Wrong note type in NOTE_LIST");
}
break;
case SUB_FOLDER:
case CALL_RECORD_FOLDER:
if (item.getType() == Notes.TYPE_NOTE) {
openNode(item);
} else {
Log.e(TAG, "Wrong note type in SUB_FOLDER");
}
break;
default:
break;
}
}
}
}
private void startQueryDestinationFolders() {
String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?";
selection = (mState == ListEditState.NOTE_LIST) ? selection:
"(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")";
mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN,
null,
Notes.CONTENT_NOTE_URI,
FoldersListAdapter.PROJECTION,
selection,
new String[] {
String.valueOf(Notes.TYPE_FOLDER),
String.valueOf(Notes.ID_TRASH_FOLER),
String.valueOf(mCurrentFolderId)
},
NoteColumns.MODIFIED_DATE + " DESC");
}
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (view instanceof NotesListItem) {
mFocusNoteDataItem = ((NotesListItem) view).getItemData();
if (mFocusNoteDataItem.getType() == Notes.TYPE_NOTE && !mNotesListAdapter.isInChoiceMode()) {
if (mNotesListView.startActionMode(mModeCallBack) != null) {
mModeCallBack.onItemCheckedStateChanged(null, position, id, true);
mNotesListView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
} else {
Log.e(TAG, "startActionMode fails");
}
} else if (mFocusNoteDataItem.getType() == Notes.TYPE_FOLDER) {
mNotesListView.setOnCreateContextMenuListener(mFolderOnCreateContextMenuListener);
}
}
return false;
}
}

@ -1,184 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import net.micode.notes.data.Notes;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
public class NotesListAdapter extends CursorAdapter {
private static final String TAG = "NotesListAdapter";
private Context mContext;
private HashMap<Integer, Boolean> mSelectedIndex;
private int mNotesCount;
private boolean mChoiceMode;
public static class AppWidgetAttribute {
public int widgetId;
public int widgetType;
};
public NotesListAdapter(Context context) {
super(context, null);
mSelectedIndex = new HashMap<Integer, Boolean>();
mContext = context;
mNotesCount = 0;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new NotesListItem(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
if (view instanceof NotesListItem) {
NoteItemData itemData = new NoteItemData(context, cursor);
((NotesListItem) view).bind(context, itemData, mChoiceMode,
isSelectedItem(cursor.getPosition()));
}
}
public void setCheckedItem(final int position, final boolean checked) {
mSelectedIndex.put(position, checked);
notifyDataSetChanged();
}
public boolean isInChoiceMode() {
return mChoiceMode;
}
public void setChoiceMode(boolean mode) {
mSelectedIndex.clear();
mChoiceMode = mode;
}
public void selectAll(boolean checked) {
Cursor cursor = getCursor();
for (int i = 0; i < getCount(); i++) {
if (cursor.moveToPosition(i)) {
if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) {
setCheckedItem(i, checked);
}
}
}
}
public HashSet<Long> getSelectedItemIds() {
HashSet<Long> itemSet = new HashSet<Long>();
for (Integer position : mSelectedIndex.keySet()) {
if (mSelectedIndex.get(position) == true) {
Long id = getItemId(position);
if (id == Notes.ID_ROOT_FOLDER) {
Log.d(TAG, "Wrong item id, should not happen");
} else {
itemSet.add(id);
}
}
}
return itemSet;
}
public HashSet<AppWidgetAttribute> getSelectedWidget() {
HashSet<AppWidgetAttribute> itemSet = new HashSet<AppWidgetAttribute>();
for (Integer position : mSelectedIndex.keySet()) {
if (mSelectedIndex.get(position) == true) {
Cursor c = (Cursor) getItem(position);
if (c != null) {
AppWidgetAttribute widget = new AppWidgetAttribute();
NoteItemData item = new NoteItemData(mContext, c);
widget.widgetId = item.getWidgetId();
widget.widgetType = item.getWidgetType();
itemSet.add(widget);
/**
* Don't close cursor here, only the adapter could close it
*/
} else {
Log.e(TAG, "Invalid cursor");
return null;
}
}
}
return itemSet;
}
public int getSelectedCount() {
Collection<Boolean> values = mSelectedIndex.values();
if (null == values) {
return 0;
}
Iterator<Boolean> iter = values.iterator();
int count = 0;
while (iter.hasNext()) {
if (true == iter.next()) {
count++;
}
}
return count;
}
public boolean isAllSelected() {
int checkedCount = getSelectedCount();
return (checkedCount != 0 && checkedCount == mNotesCount);
}
public boolean isSelectedItem(final int position) {
if (null == mSelectedIndex.get(position)) {
return false;
}
return mSelectedIndex.get(position);
}
@Override
protected void onContentChanged() {
super.onContentChanged();
calcNotesCount();
}
@Override
public void changeCursor(Cursor cursor) {
super.changeCursor(cursor);
calcNotesCount();
}
private void calcNotesCount() {
mNotesCount = 0;
for (int i = 0; i < getCount(); i++) {
Cursor c = (Cursor) getItem(i);
if (c != null) {
if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) {
mNotesCount++;
}
} else {
Log.e(TAG, "Invalid cursor");
return;
}
}
}
}

@ -1,122 +0,0 @@
/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.micode.notes.ui;
import android.content.Context;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.tool.DataUtils;
import net.micode.notes.tool.ResourceParser.NoteItemBgResources;
public class NotesListItem extends LinearLayout {
private ImageView mAlert;
private TextView mTitle;
private TextView mTime;
private TextView mCallName;
private NoteItemData mItemData;
private CheckBox mCheckBox;
public NotesListItem(Context context) {
super(context);
inflate(context, R.layout.note_item, this);
mAlert = (ImageView) findViewById(R.id.iv_alert_icon);
mTitle = (TextView) findViewById(R.id.tv_title);
mTime = (TextView) findViewById(R.id.tv_time);
mCallName = (TextView) findViewById(R.id.tv_name);
mCheckBox = (CheckBox) findViewById(android.R.id.checkbox);
}
public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) {
if (choiceMode && data.getType() == Notes.TYPE_NOTE) {
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setChecked(checked);
} else {
mCheckBox.setVisibility(View.GONE);
}
mItemData = data;
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
mCallName.setVisibility(View.GONE);
mAlert.setVisibility(View.VISIBLE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));
mAlert.setImageResource(R.drawable.call_record);
} else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
} else {
mCallName.setVisibility(View.GONE);
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
if (data.getType() == Notes.TYPE_FOLDER) {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));
mAlert.setVisibility(View.GONE);
} else {
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
}
}
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
setBackground(data);
}
private void setBackground(NoteItemData data) {
int id = data.getBgColorId();
if (data.getType() == Notes.TYPE_NOTE) {
if (data.isSingle() || data.isOneFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
} else if (data.isLast()) {
setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
} else if (data.isFirst() || data.isMultiFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
} else {
setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
}
} else {
setBackgroundResource(NoteItemBgResources.getFolderBgRes());
}
}
public NoteItemData getItemData() {
return mItemData;
}
}

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

Loading…
Cancel
Save