├── .gitignore ├── CHANGES.md ├── LICENSE ├── README.md ├── build-config ├── checkstyle │ └── checkstyle.xml ├── findbugs │ └── findbugs-filter.xml ├── gradle-push.gradle ├── gradle-quality.gradle └── pmd │ └── pmd-ruleset.xml ├── build.gradle ├── demo ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── notes.enex │ ├── java │ └── com │ │ └── evernote │ │ └── android │ │ └── intent │ │ └── demo │ │ └── MainActivity.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── raw │ └── image.png │ ├── values │ ├── dimens.xml │ └── strings.xml │ └── xml │ └── file_paths.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── evernote │ └── android │ └── intent │ ├── CreateNewNoteIntentBuilder.java │ ├── EvernoteIntent.java │ ├── EvernoteIntentResult.java │ ├── ImportEnexIntentBuilder.java │ ├── IntentBuilder.java │ ├── NoArgsIntentBuilder.java │ ├── SearchNotesIntentBuilder.java │ └── ViewNoteIntentBuilder.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | #Android generated 2 | bin 3 | gen 4 | target 5 | out 6 | build 7 | 8 | #Eclipse 9 | .project 10 | .classpath 11 | .settings 12 | 13 | #IntelliJ IDEA 14 | .idea 15 | *.iml 16 | classes 17 | *.ipr 18 | *.iws 19 | gen-external-apklibs 20 | 21 | #Maven 22 | release.properties 23 | pom.xml.* 24 | 25 | #Ant 26 | build.xml 27 | ant.properties 28 | local.properties 29 | 30 | #Gradle 31 | .gradle 32 | 33 | #Command line 34 | proguard-project.txt 35 | .DS_Store 36 | .tmp -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | ## 1.0.3 (2015-11-11) 2 | 3 | * remove option to set the 'author' 4 | 5 | ## 1.0.2 (2015-09-07) 6 | 7 | * add concrete intent builder for enex import 8 | 9 | ## 1.0.1 (2015-05-26) 10 | 11 | * pick note 12 | * add attachment in new note in demo 13 | 14 | ## 1.0.0 (2015-05-13) 15 | 16 | * create new note 17 | * search with query parameter 18 | * view an existing note 19 | * take new snapshot 20 | * record voice note 21 | * open search UI -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Evernote Android-Intent 2 | ======================= 3 | 4 | This tiny library lets you easily send Android Intents to the main Evernote app. 5 | 6 | Download 7 | -------- 8 | 9 | Add the library as a dependency in your build.gradle file. 10 | 11 | ```groovy 12 | dependencies { 13 | compile 'com.evernote:android-intent:1.0.3' 14 | } 15 | ``` 16 | 17 | Usage 18 | ----- 19 | 20 | `EvernoteIntent` serves as entry point and provides all possible Intent builders, e.g. you can create a new note, view an existing note or make a new snapshot. 21 | 22 | Some returned builders provide additional parameters. 23 | 24 | ```java 25 | private void sharePlainTextNote() { 26 | Intent intent = EvernoteIntent.createNewNote() 27 | .setTitle("Intent Demo Title") 28 | .addTags("Intent Demo Tag") 29 | .setTextPlain("This note is created by the Evernote intent demo application. https://github.com/evernote/android-intent") 30 | .setSourceApp(getPackageName()) 31 | .setAppVisibility(CreateNewNoteIntentBuilder.AppVisibility.QUICK_SEND) 32 | .create(); 33 | 34 | startActivity(intent); 35 | } 36 | ``` 37 | 38 | For some Intents the Evernote app returns a result, e.g. if you pick note. In this case you can use `EvernoteIntentResult` to parse the data. 39 | 40 | ```java 41 | @Override 42 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 43 | switch (requestCode) { 44 | case REQ_PICK_NOTE: 45 | if (resultCode != RESULT_OK || data == null) { 46 | Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show(); 47 | } else { 48 | mNoteGuid = EvernoteIntentResult.getNoteGuid(data); 49 | } 50 | break; 51 | 52 | default: 53 | super.onActivityResult(requestCode, resultCode, data); 54 | break; 55 | } 56 | } 57 | 58 | ``` 59 | 60 | License 61 | ------- 62 | Copyright (c) 2007-2015 by Evernote Corporation, All rights reserved. 63 | 64 | Use of the source code and binary libraries included in this package 65 | is permitted under the following terms: 66 | 67 | Redistribution and use in source and binary forms, with or without 68 | modification, are permitted provided that the following conditions 69 | are met: 70 | 71 | 1. Redistributions of source code must retain the above copyright 72 | notice, this list of conditions and the following disclaimer. 73 | 2. Redistributions in binary form must reproduce the above copyright 74 | notice, this list of conditions and the following disclaimer in the 75 | documentation and/or other materials provided with the distribution. 76 | 77 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 78 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 79 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 80 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 81 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 82 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 83 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 84 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 85 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 86 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 87 | -------------------------------------------------------------------------------- /build-config/checkstyle/checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /build-config/findbugs/findbugs-filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /build-config/gradle-push.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'maven' 2 | apply plugin: 'signing' 3 | 4 | def isReleaseBuild() { 5 | return VERSION_NAME.contains("SNAPSHOT") == false 6 | } 7 | 8 | def isLocal() { 9 | return hasProperty('local') ? Boolean.parseBoolean(getProperty('local')) : true; 10 | } 11 | 12 | def getReleaseRepositoryUrl() { 13 | if (isLocal()) { 14 | return hasProperty('RELEASE_REPOSITORY_LOCAL') ? RELEASE_REPOSITORY_LOCAL : "file://${System.env.HOME}/.m2/repository" 15 | } else { 16 | return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL : "https://oss.sonatype.org/service/local/staging/deploy/maven2/" 17 | } 18 | } 19 | 20 | def getSnapshotRepositoryUrl() { 21 | if (isLocal()) { 22 | return hasProperty('SNAPSHOT_REPOSITORY_LOCAL') ? SNAPSHOT_REPOSITORY_LOCAL : "file://${System.env.HOME}/.m2/repository" 23 | } else { 24 | return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL : "https://oss.sonatype.org/content/repositories/snapshots/" 25 | } 26 | } 27 | 28 | def getRepositoryUsername() { 29 | return hasProperty('SONATYPE_USERNAME') ? SONATYPE_USERNAME : "" 30 | } 31 | 32 | def getRepositoryPassword() { 33 | return hasProperty('SONATYPE_PASSWORD') ? SONATYPE_PASSWORD : "" 34 | } 35 | 36 | afterEvaluate { project -> 37 | uploadArchives { 38 | //noinspection GradleMisplacedStatement 39 | repositories { 40 | mavenDeployer { 41 | beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } 42 | 43 | pom.groupId = 'com.evernote' 44 | pom.artifactId = 'android-intent' 45 | pom.version = VERSION_NAME 46 | 47 | repository(url: getReleaseRepositoryUrl()) { 48 | authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) 49 | } 50 | snapshotRepository(url: getSnapshotRepositoryUrl()) { 51 | authentication(userName: getRepositoryUsername(), password: getRepositoryPassword()) 52 | } 53 | 54 | pom.project { 55 | name 'Android-Evernote Intent' 56 | packaging 'aar' 57 | description 'Android library to share information with the Android Evernote app.' 58 | url 'https://github.com/evernote/android-intent' 59 | inceptionYear '2015' 60 | 61 | scm { 62 | url 'http://github.com/Evernote/android-intent/' 63 | connection 'scm:git:git://github.com/Evernote/android-intent.git' 64 | developerConnection 'scm:git:git@github.com:Evernote/android-intent.git' 65 | } 66 | 67 | developers { 68 | developer { 69 | name 'Ralf Wondratschek' 70 | email 'rwondratschek@evernote.com' 71 | id 'rwondratschek' 72 | url 'http://vrallev.net' 73 | timezone '+1' 74 | roles { 75 | role 'developer' 76 | } 77 | } 78 | } 79 | 80 | licenses { 81 | license { 82 | name 'Evernote SDK License Agreement' 83 | url 'https://github.com/evernote/android-intent/blob/master/README.md' 84 | distribution 'repo' 85 | } 86 | } 87 | 88 | organization { 89 | name 'Evernote' 90 | url 'http://evernote.com' 91 | } 92 | 93 | issueManagement { 94 | system 'GitHub Issues' 95 | url 'https://github.com/Evernote/android-intent/issues' 96 | } 97 | } 98 | } 99 | } 100 | } 101 | 102 | signing { 103 | required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") } 104 | sign configurations.archives 105 | } 106 | 107 | task androidJavadocs2(type: Javadoc) { 108 | failOnError = false 109 | source = android.sourceSets.main.java.sourceFiles 110 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 111 | } 112 | 113 | task androidJavadocsJar2(type: Jar, dependsOn: androidJavadocs2) { 114 | classifier = 'javadoc' 115 | //basename = artifact_id 116 | from androidJavadocs2.destinationDir 117 | } 118 | 119 | task androidSourcesJar2(type: Jar) { 120 | classifier = 'sources' 121 | //basename = artifact_id 122 | from android.sourceSets.main.java.sourceFiles 123 | } 124 | 125 | artifacts { 126 | //archives packageReleaseJar 127 | archives androidSourcesJar2 128 | archives androidJavadocsJar2 129 | } 130 | } -------------------------------------------------------------------------------- /build-config/gradle-quality.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'checkstyle' 2 | apply plugin: 'findbugs' 3 | apply plugin: 'pmd' 4 | 5 | check.dependsOn 'checkstyle', 'findbugs', 'pmd' 6 | 7 | task checkstyle(type: Checkstyle) { 8 | configFile file("${project.rootDir}/build-config/checkstyle/checkstyle.xml") 9 | source 'src' 10 | include '**/*.java' 11 | exclude '**/gen/**' 12 | 13 | classpath = files() 14 | // 15 | // reports { 16 | // xml { 17 | // destination "$project.buildDir/outputs/checkstyle-results.xml" 18 | // } 19 | // } 20 | } 21 | 22 | task findbugs(type: FindBugs) { 23 | ignoreFailures = true 24 | effort = "max" 25 | reportLevel = "high" 26 | excludeFilter = new File("${project.rootDir}/build-config/findbugs/findbugs-filter.xml") 27 | classes = files("$project.buildDir/intermediates/classes/") 28 | 29 | source 'src' 30 | include '**/*.java' 31 | exclude '**/gen/**' 32 | 33 | reports { 34 | xml.enabled = false 35 | html.enabled = true 36 | 37 | xml { 38 | destination "$project.buildDir/reports/findbugs/findbugs.xml" 39 | xml.withMessages true 40 | } 41 | html { 42 | destination "$project.buildDir/reports/findbugs/findbugs.html" 43 | } 44 | } 45 | 46 | classpath = files() 47 | } 48 | 49 | task pmd(type: Pmd) { 50 | ruleSetFiles = files("${project.rootDir}/build-config/pmd/pmd-ruleset.xml") 51 | ignoreFailures = true 52 | ruleSets = ["java-basic", "java-braces", "java-strings"] 53 | 54 | source 'src' 55 | include '**/*.java' 56 | exclude '**/gen/**' 57 | 58 | reports { 59 | xml.enabled = true 60 | html.enabled = true 61 | 62 | xml { 63 | destination "$project.buildDir/reports/pmd/pmd.xml" 64 | } 65 | html { 66 | destination "$project.buildDir/reports/pmd/pmd.html" 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /build-config/pmd/pmd-ruleset.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | This ruleset checks my code for bad stuff 8 | 9 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | repositories { 3 | jcenter() 4 | } 5 | dependencies { 6 | classpath 'com.android.tools.build:gradle:1.3.1' 7 | } 8 | } 9 | 10 | allprojects { 11 | repositories { 12 | jcenter() 13 | } 14 | } 15 | 16 | ext { 17 | compileSdkVersion = 23 18 | targetSdkVersion = compileSdkVersion 19 | minSdkVersion = 4 20 | buildToolsVersion = "23.0.2" 21 | } 22 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply from: '../build-config/gradle-quality.gradle' 3 | 4 | android { 5 | compileSdkVersion rootProject.ext.compileSdkVersion 6 | buildToolsVersion rootProject.ext.buildToolsVersion 7 | 8 | defaultConfig { 9 | applicationId "com.evernote.android.intent.demo" 10 | 11 | minSdkVersion rootProject.ext.minSdkVersion 12 | targetSdkVersion rootProject.ext.targetSdkVersion 13 | 14 | versionName project.VERSION_NAME 15 | versionCode Integer.parseInt(project.VERSION_CODE) 16 | } 17 | 18 | compileOptions { 19 | sourceCompatibility JavaVersion.VERSION_1_7 20 | targetCompatibility JavaVersion.VERSION_1_7 21 | } 22 | 23 | lintOptions { 24 | abortOnError true 25 | 26 | htmlOutput file("$project.buildDir/reports/lint/lint.html") 27 | xmlOutput file("$project.buildDir/reports/lint/lint.xml") 28 | } 29 | } 30 | 31 | dependencies { 32 | compile project(':library') 33 | compile 'com.android.support:support-v4:23.1.0' 34 | } 35 | -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /demo/src/main/java/com/evernote/android/intent/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.evernote.android.intent.demo; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.support.annotation.NonNull; 8 | import android.support.v4.content.FileProvider; 9 | import android.text.TextUtils; 10 | import android.util.Log; 11 | import android.view.View; 12 | import android.widget.Toast; 13 | 14 | import com.evernote.android.intent.CreateNewNoteIntentBuilder; 15 | import com.evernote.android.intent.EvernoteIntent; 16 | import com.evernote.android.intent.EvernoteIntentResult; 17 | 18 | import java.io.BufferedInputStream; 19 | import java.io.File; 20 | import java.io.FileOutputStream; 21 | import java.io.IOException; 22 | import java.io.InputStream; 23 | import java.util.ArrayList; 24 | 25 | /** 26 | * @author rwondratschek 27 | */ 28 | public class MainActivity extends Activity { 29 | 30 | private static final String KEY_NOTE_GUID = "KEY_NOTE_GUID"; 31 | 32 | private static final int REQ_PICK_NOTE = 200; 33 | 34 | private String mNoteGuid; 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.activity_main); 40 | 41 | if (savedInstanceState != null) { 42 | mNoteGuid = savedInstanceState.getString(KEY_NOTE_GUID); 43 | } 44 | } 45 | 46 | @Override 47 | protected void onSaveInstanceState(@NonNull Bundle outState) { 48 | super.onSaveInstanceState(outState); 49 | if (!TextUtils.isEmpty(mNoteGuid)) { 50 | outState.putString(KEY_NOTE_GUID, mNoteGuid); 51 | } 52 | } 53 | 54 | @Override 55 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 56 | switch (requestCode) { 57 | case REQ_PICK_NOTE: 58 | if (resultCode != RESULT_OK || data == null) { 59 | Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show(); 60 | } else { 61 | mNoteGuid = EvernoteIntentResult.getNoteGuid(data); 62 | } 63 | break; 64 | 65 | default: 66 | super.onActivityResult(requestCode, resultCode, data); 67 | break; 68 | } 69 | } 70 | 71 | public void onButtonClick(View view) { 72 | if (!EvernoteIntent.isEvernoteInstalled(this)) { 73 | Toast.makeText(this, R.string.evernote_not_installed, Toast.LENGTH_LONG).show(); 74 | return; 75 | } 76 | 77 | switch (view.getId()) { 78 | case R.id.button_share_plain_text: 79 | sharePlainTextNote(); 80 | break; 81 | 82 | case R.id.button_share_html: 83 | shareHtml(); 84 | break; 85 | 86 | case R.id.button_share_enex: 87 | shareEnex(); 88 | break; 89 | 90 | case R.id.button_search: 91 | search(); 92 | break; 93 | 94 | case R.id.button_pick_note: 95 | pickNote(); 96 | break; 97 | 98 | case R.id.button_view_note: 99 | viewNote(); 100 | break; 101 | 102 | case R.id.button_new_snapshot: 103 | newSnapshot(); 104 | break; 105 | 106 | case R.id.button_new_voice_note: 107 | newVoiceNote(); 108 | break; 109 | 110 | case R.id.button_new_search: 111 | newSearch(); 112 | break; 113 | 114 | case R.id.button_is_installed: 115 | checkIsInstalled(); 116 | break; 117 | 118 | default: 119 | throw new IllegalStateException("not implemented"); 120 | } 121 | } 122 | 123 | private void sharePlainTextNote() { 124 | ArrayList images = new ArrayList<>(); 125 | 126 | try { 127 | Uri uri = createLocalFile("test1.jpeg", new InputStreamCreator() { 128 | @Override 129 | public InputStream open(String fileName) throws IOException { 130 | return getResources().openRawResource(R.raw.image); 131 | } 132 | }); 133 | 134 | grantUriPermission(EvernoteIntent.PACKAGE_NAME, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 135 | 136 | for (int i = 0; i < 3; i++) { 137 | images.add(uri); 138 | } 139 | 140 | } catch (IOException e) { 141 | Toast.makeText(this, "Could not attach image", Toast.LENGTH_SHORT).show(); 142 | Log.e("Demo", "IOException", e); 143 | } 144 | 145 | Intent intent = EvernoteIntent.createNewNote() 146 | .setTitle("Intent Demo Title") 147 | .addTags("Intent Demo Tag") 148 | .setTextPlain("This note is created by the Evernote intent demo application. https://github.com/evernote/android-intent") 149 | .setSourceApp(getPackageName()) 150 | .setAppVisibility(CreateNewNoteIntentBuilder.AppVisibility.QUICK_SEND) 151 | .setUris(images, "image/*") 152 | .create(); 153 | 154 | startActivity(intent); 155 | } 156 | 157 | private void shareHtml() { 158 | String html = "

Share HTML - Intent Demo

\n" 159 | + "

Many HTML features are supported, e.g.

" 160 | + "
    \n" 161 | + "
  • Styled text
  • \n" 162 | + "
  • Full HTML pages or HTML snippets
  • \n" 163 | + "
  • Relative URLs
  • \n" 164 | + "
  • Referenced images
  • \n" 165 | + "
  • Referenced web resources
  • \n" 166 | + "
  • ...
  • \n" 167 | + "
\n" 168 | + "
" 169 | + "

The image below is embedded into a link, so feel free to click on it.

"; 170 | 171 | 172 | html += "\n" 173 | + "\t\"Evernote\""; 174 | 175 | Intent intent = EvernoteIntent.createNewNote() 176 | .setTitle("Share HTML") 177 | .addTags("Intent Demo Tag") 178 | .setTextHtml(html, "https://blogassets.evernote.com") 179 | .setSourceApp(getPackageName()) 180 | .setAppVisibility(CreateNewNoteIntentBuilder.AppVisibility.QUICK_SEND) 181 | .create(); 182 | 183 | startActivity(intent); 184 | } 185 | 186 | private void shareEnex() { 187 | Uri localEnexFile; 188 | try { 189 | localEnexFile = createLocalFile("notes.enex", new InputStreamCreator() { 190 | @Override 191 | public InputStream open(String fileName) throws IOException { 192 | return getAssets().open(fileName); 193 | } 194 | }); 195 | 196 | grantUriPermission(EvernoteIntent.PACKAGE_NAME, localEnexFile, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 197 | 198 | } catch (IOException e) { 199 | Toast.makeText(this, "Could not create local file", Toast.LENGTH_SHORT).show(); 200 | Log.e("Demo", "IOException", e); 201 | return; 202 | } 203 | 204 | Intent intent = EvernoteIntent.importEnexFile() 205 | .setEnexFile(localEnexFile) 206 | .setAppVisibility(CreateNewNoteIntentBuilder.AppVisibility.QUICK_SEND) 207 | .create(); 208 | 209 | startActivity(intent); 210 | } 211 | 212 | private void search() { 213 | Intent intent = EvernoteIntent.searchNotes() 214 | .setQuery("Intent Demo") 215 | .create(); 216 | 217 | startActivity(intent); 218 | } 219 | 220 | private void pickNote() { 221 | startActivityForResult(EvernoteIntent.pickNote().create(), REQ_PICK_NOTE); 222 | } 223 | 224 | private void viewNote() { 225 | if (TextUtils.isEmpty(mNoteGuid)) { 226 | Toast.makeText(this, "Pick a note first", Toast.LENGTH_SHORT).show(); 227 | return; 228 | } 229 | 230 | Intent intent = EvernoteIntent.viewNote() 231 | .setNoteGuid(mNoteGuid) 232 | .setFullScreen(true) 233 | .create(); 234 | 235 | startActivity(intent); 236 | } 237 | 238 | private void newSnapshot() { 239 | startActivity(EvernoteIntent.newSnapshot().create()); 240 | } 241 | 242 | private void newVoiceNote() { 243 | startActivity(EvernoteIntent.newVoiceNote().create()); 244 | } 245 | 246 | private void newSearch() { 247 | startActivity(EvernoteIntent.newSearch().create()); 248 | } 249 | 250 | private void checkIsInstalled() { 251 | Toast.makeText(this, EvernoteIntent.isEvernoteInstalled(this) ? "Evernote is installed" : "Evernote is not installed", Toast.LENGTH_SHORT).show(); 252 | } 253 | 254 | private Uri createLocalFile(String fileName, InputStreamCreator inputStreamCreator) throws IOException { 255 | File file = new File(new File(getCacheDir(), "share"), fileName); 256 | if (file.exists()) { 257 | return FileProvider.getUriForFile(this, "com.evernote.android.intent.demo.fileprovider", file); 258 | } 259 | 260 | if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()) { 261 | throw new IOException(); 262 | } 263 | 264 | if (!file.exists() && !file.createNewFile()) { 265 | throw new IOException(); 266 | } 267 | 268 | FileOutputStream fileOutputStream = null; 269 | InputStream inputStream = null; 270 | 271 | try { 272 | fileOutputStream = new FileOutputStream(file); 273 | inputStream = new BufferedInputStream(inputStreamCreator.open(fileName)); 274 | 275 | byte[] buffer = new byte[2048]; 276 | int read; 277 | 278 | while ((read = inputStream.read(buffer)) != -1) { 279 | fileOutputStream.write(buffer, 0, read); 280 | } 281 | 282 | return createLocalFile(fileName, inputStreamCreator); 283 | 284 | } finally { 285 | if (fileOutputStream != null) { 286 | fileOutputStream.close(); 287 | } 288 | if (inputStream != null) { 289 | inputStream.close(); 290 | } 291 | } 292 | } 293 | 294 | private interface InputStreamCreator { 295 | InputStream open(String fileName) throws IOException; 296 | } 297 | } 298 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 |