diff --git a/.gitignore b/.gitignore index 0b518e45b4460e898a0859f203bba2b8a23a0945..ef1edd2ca442adc7ebda54cac2a5a077161ef959 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ build.xml proguard-project.txt .idea/ *.iml +*.apk diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..0826a8cf2daca4ed52ebb0a9afa264c28a5a1f96 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,21 @@ +image: "registry.gitlab.e.foundation:5000/e/apps/docker-android-apps-cicd:legacy" + +stages: +- build + +before_script: +- export GRADLE_USER_HOME=$(pwd)/.gradle +- chmod +x ./gradlew + +cache: + key: ${CI_PROJECT_ID} + paths: + - .gradle/ + +build: + stage: build + script: + - ./gradlew build -x test + artifacts: + paths: + - k9mail/build/outputs/apk/ diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000000000000000000000000000000000000..afc6a6a0863a42c33316f45ea8c45f7217dc2055 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,6 @@ +Specific authors for Mail, the /e/ fork of K9-Mail: +© 2018-2019 - Author: Nihar Thakkar +© ECORP SAS 2018-2020 - Author: Romain Hunault, Alexandre Roux, Mohit Mali + +Note: original K9-mail are not listed here. +Please refer to the source code an/or to the commit history for the complete list of authors. \ No newline at end of file diff --git a/Android.mk b/Android.mk new file mode 100644 index 0000000000000000000000000000000000000000..c8bae7f2edbc19ddfc26b04e5f33506a9e997cf5 --- /dev/null +++ b/Android.mk @@ -0,0 +1,154 @@ +LOCAL_PATH := $(call my-dir) + + +#################################################################################################### + + +# Build the k9mail-library module +include $(CLEAR_VARS) + +LOCAL_MODULE := k9mail-library + +LOCAL_MANIFEST_FILE := k9mail-library/src/main/AndroidManifest.xml + +LOCAL_SRC_FILES := \ + $(call all-java-files-under, k9mail-library/src/main) + +LOCAL_AAPT_FLAGS := \ + --auto-add-overlay \ + --extra-packages com.jakewharton.timber:timber + +LOCAL_STATIC_JAVA_LIBRARIES += \ + android-support-annotations \ + apache-mime4j-core \ + apache-mime4j-dom \ + okio \ + commons-io \ + jzlib \ + jutf7 + +LOCAL_STATIC_JAVA_AAR_LIBRARIES := timber + +include $(BUILD_STATIC_JAVA_LIBRARY) + + +#################################################################################################### + + +# Build the HoloColorPicker module +include $(CLEAR_VARS) + +LOCAL_MODULE := HoloColorPicker + +LOCAL_MANIFEST_FILE := plugins/HoloColorPicker/AndroidManifest.xml + +LOCAL_SRC_FILES := \ + $(call all-java-files-under, plugins/HoloColorPicker/src) + +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/plugins/HoloColorPicker/res + +include $(BUILD_STATIC_JAVA_LIBRARY) + + +#################################################################################################### + + +# Build the openpgp-api module +include $(CLEAR_VARS) + +LOCAL_MODULE := openpgp-api + +LOCAL_MANIFEST_FILE := plugins/openpgp-api-lib/openpgp-api/src/main/AndroidManifest.xml + +LOCAL_SRC_FILES := \ + $(call all-java-files-under, plugins/openpgp-api-lib/openpgp-api/src/main) $(call all-Iaidl-files-under, plugins/openpgp-api-lib/openpgp-api/src/main) + +LOCAL_AIDL_INCLUDES := $(call all-Iaidl-files-under, plugins/openpgp-api-lib/openpgp-api/src/main) + +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/plugins/openpgp-api-lib/openpgp-api/src/main/res + +include $(BUILD_STATIC_JAVA_LIBRARY) + + +#################################################################################################### + + +# Build everything and generate the APK +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_PACKAGE_NAME := Mail + +LOCAL_CERTIFICATE := platform +LOCAL_DEX_PREOPT := false + +LOCAL_PROGUARD_ENABLED := disabled + +LOCAL_MANIFEST_FILE := k9mail/src/main/AndroidManifest.xml + +LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/k9mail/src/main/res + +LOCAL_SRC_FILES := \ + $(call all-java-files-under, k9mail/src/main) + +LOCAL_STATIC_JAVA_AAR_LIBRARIES := ckchangelog \ + tokenautocomplete \ + safe-content-resolver-v14 \ + library \ + timber + +LOCAL_STATIC_JAVA_LIBRARIES += \ + android-support-v4 \ + kotlin-stdlib-jre7 \ + okio \ + commons-io \ + jsoup \ + glide \ + moshi \ + jcip-annotations + +LOCAL_SDK_VERSION := current + +LOCAL_AAPT_FLAGS := \ + --auto-add-overlay \ + --extra-packages de.cketti.library.changelog:ckchangelog \ + --extra-packages com.splitwise:tokenautocomplete \ + --extra-packages de.cketti.safecontentresolver:safe-content-resolver-v14 \ + --extra-packages com.github.amlcurran.showcaseview:library \ + --extra-packages com.jakewharton.timber:timber + +include $(BUILD_PACKAGE) + + +#################################################################################################### + + +include $(CLEAR_VARS) + +LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := apache-mime4j-core:libs/apache-mime4j-core-0.8.1.jar \ +apache-mime4j-dom:libs/apache-mime4j-dom-0.8.1.jar \ +ckchangelog:libs/ckchangelog-1.2.1.aar \ +commons-io:libs/commons-io-2.4.jar \ +glide:libs/glide-3.6.1.jar \ +jcip-annotations:libs/jcip-annotations-1.0.jar \ +jsoup:libs/jsoup-1.11.2.jar \ +jutf7:libs/jutf7-1.0.0.jar \ +jzlib:libs/jzlib-1.0.7.jar \ +kotlin-stdlib:libs/kotlin-stdlib-1.1.4-3.jar \ +kotlin-stdlib-jre7:libs/kotlin-stdlib-jre7-1.1.4-3.jar \ +library:libs/library-5.4.1.aar \ +moshi:libs/moshi-1.2.0.jar \ +okio:libs/okio-1.11.0.jar \ +pg:libs/pg-1.51.0.0.jar \ +safe-content-resolver-v14:libs/safe-content-resolver-v14-0.9.0.aar \ +timber:libs/timber-4.5.1.aar \ +tokenautocomplete:libs/tokenautocomplete-2.0.7.aar + +include $(BUILD_MULTI_PREBUILT) + + +#################################################################################################### + + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/README.md b/README.md index 03ad1505c650fc7fd351711fb47071515e9b864c..601bf8bdc24bc06a4a9eb895fc3c85e4648cd5db 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,21 @@ -# K-9 Mail -[![Build Status](https://k9mail.ci.cloudbees.com/job/master/badge/icon)](https://k9mail.ci.cloudbees.com/job/master/) -[![Join the chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/k9mail/k-9) +# Mail -K-9 Mail is an open-source email client for Android. +Mail is an open-source email client for Android. +Mail is forked from [k9 Mail](https://github.com/k9mail/k-9) +## Authors -## Download - -K-9 Mail can be downloaded from a couple of sources: - -- [Google Play](https://play.google.com/store/apps/details?id=com.fsck.k9) -- [F-Droid](https://f-droid.org/repository/browse/?fdid=com.fsck.k9) -- [Github Releases](https://github.com/k9mail/k-9/releases) -- [Amazon Appstore for Android](http://www.amazon.com/dp/B004JK61K0) - -You might also be interested in becoming a [tester](https://play.google.com/apps/testing/com.fsck.k9) to get an early look at new versions. - +[Authors](https://gitlab.e.foundation/e/apps/Mail/-/blob/master/AUTHORS) ## Release Notes -Check out the [Release Notes](https://github.com/k9mail/k-9/wiki/ReleaseNotes) to find out what changed -in each version of K-9 Mail. - - -## Need Help? - -If the app is not behaving like it should, you might find these resources helpful: - -- [User Manual](https://k9mail.github.io/documentation.html) -- [Frequently Asked Questions](https://k9mail.github.io/documentation/faq.html) -- [Support Forum/Mailing List](http://groups.google.com/group/k-9-mail) -- [Google+ Community](https://plus.google.com/communities/109228641058741937099) - - -## Translations - -Interested in helping to translate K-9 Mail? Contribute here: - -https://www.transifex.com/projects/p/k9mail/ - - -## Design +Check out the [Release Notes](https://gitlab.e.foundation/e/apps/Mail/-/releases) to find out what changed +in each version of Mail. -A re-design is underway. You can contribute, view updates and access design files here: - -https://github.com/k9mail/k-9-design - - -## Contributing - -Please fork this repository and contribute back using [pull requests](https://github.com/k9mail/k-9/pulls). - -Any contributions, large or small, major features, bug fixes, unit/integration tests are welcomed and appreciated -but will be thoroughly reviewed and discussed. -Please make sure you read the [Code Style Guidelines](https://github.com/k9mail/k-9/wiki/CodeStyle). - - -## Communication - -Aside from discussing changes in [pull requests](https://github.com/k9mail/k-9/pulls) and -[issues](https://github.com/k9mail/k-9/issues) we use the following communication services: - -- IRC chat, [#k-9 on the Freenode network](http://webchat.freenode.net/?channels=%23k-9) -- [Gitter](https://gitter.im/k9mail/k-9) -- [Developer mailing list](https://groups.google.com/forum/#!forum/k-9-dev) +## Privacy Policy +[Privacy Policy](https://e.foundation/legal-notice-privacy) +[Terms of service](https://e.foundation/legal-notice-privacy) ## License @@ -80,10 +31,3 @@ Aside from discussing changes in [pull requests](https://github.com/k9mail/k-9/p See the License for the specific language governing permissions and limitations under the License. - -## Sponsors - -CloudBees' [FOSS program](https://www.cloudbees.com/resources/foss) allows us to use their DEV@cloud service for free. - -![built on DEV@cloud](https://www.cloudbees.com/sites/default/files/styles/large/public/Button-Built-on-CB-1.png) - diff --git a/build.gradle b/build.gradle index 3b5687f50c8a1afc3a72a71c7e657c5baf45527a..123685cdce0a9ddbee9feb88fa2250f71dbb5210 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" } } diff --git a/gradle.properties b/gradle.properties index 5cf256ac90ebd7e15cfc4dd93cda9bbf19f3aa79..466c5b5521bd729e9fd571824ffc8d18855fa3dc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,3 +9,5 @@ junitVersion=4.12 mockitoVersion=1.10.19 okioVersion=1.11.0 truthVersion=0.35 + +android.enableAapt2=false diff --git a/k9mail-library/build.gradle b/k9mail-library/build.gradle index 6ddc193aaf91bdba0c785fb5683ea8f8299a2e22..4dff27024a27215551e88f8b9117cb8665ced790 100644 --- a/k9mail-library/build.gradle +++ b/k9mail-library/build.gradle @@ -10,6 +10,11 @@ if (rootProject.testCoverage) { apply plugin: 'jacoco' } +repositories { + jcenter() + google() +} + dependencies { implementation 'org.apache.james:apache-mime4j-core:0.8.1' implementation 'org.apache.james:apache-mime4j-dom:0.8.1' @@ -19,13 +24,16 @@ dependencies { implementation 'com.beetstra.jutf7:jutf7:1.0.0' implementation "com.android.support:support-annotations:${androidSupportLibraryVersion}" implementation "com.jakewharton.timber:timber:${timberVersion}" + + compile 'dnsjava:dnsjava:2.1.7' + compile 'org.jsoup:jsoup:1.10.2' androidTestImplementation 'com.android.support.test:runner:0.4.1' androidTestImplementation 'com.madgag.spongycastle:pg:1.51.0.0' testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}" testImplementation "org.robolectric:robolectric:${robolectricVersion}" - testImplementation "junit:junit:${junitVersion}" + compile "junit:junit:${junitVersion}" testImplementation "com.google.truth:truth:${truthVersion}" testImplementation "org.mockito:mockito-core:${mockitoVersion}" @@ -39,7 +47,7 @@ android { buildToolsVersion androidBuildToolsVersion defaultConfig { - minSdkVersion 15 + minSdkVersion 21 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } @@ -71,4 +79,5 @@ android { exclude 'META-INF/NOTICE.txt' exclude 'LICENSE.txt' } + buildToolsVersion '26.0.2' } diff --git a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/PgpMimeMessageTest.java b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/PgpMimeMessageTest.java similarity index 99% rename from k9mail-library/src/androidTest/java/com/fsck/k9/mail/PgpMimeMessageTest.java rename to k9mail-library/src/androidTest/java/foundation/e/mail/mail/PgpMimeMessageTest.java index dc973718b5351bf4954b0344f6b1ab63e7a0b7c0..5b0bc1adc09fafa456cd34147eae6963a076945b 100644 --- a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/PgpMimeMessageTest.java +++ b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/PgpMimeMessageTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.ByteArrayInputStream; @@ -9,8 +9,8 @@ import java.io.InputStream; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MimeMessage; import org.junit.Test; import org.junit.runner.RunWith; import org.spongycastle.openpgp.PGPCompressedData; diff --git a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/ReconstructMessageTest.java b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/ReconstructMessageTest.java similarity index 94% rename from k9mail-library/src/androidTest/java/com/fsck/k9/mail/ReconstructMessageTest.java rename to k9mail-library/src/androidTest/java/foundation/e/mail/mail/ReconstructMessageTest.java index 634eaf2847d71846d35aeff90e3a51625043a64b..d82c02610e904ecfd49d310fcd4d405a3f52dbd3 100644 --- a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/ReconstructMessageTest.java +++ b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/ReconstructMessageTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.ByteArrayInputStream; @@ -9,8 +9,8 @@ import java.io.InputStream; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MimeMessage; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/ssl/TrustManagerFactoryTest.java b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/ssl/TrustManagerFactoryTest.java similarity index 99% rename from k9mail-library/src/androidTest/java/com/fsck/k9/mail/ssl/TrustManagerFactoryTest.java rename to k9mail-library/src/androidTest/java/foundation/e/mail/mail/ssl/TrustManagerFactoryTest.java index c184fd498d2591970ed831aa2dee87b39db2a3a5..d85ef5f9e177b95cbc0f8b0e688483e39e86951b 100644 --- a/k9mail-library/src/androidTest/java/com/fsck/k9/mail/ssl/TrustManagerFactoryTest.java +++ b/k9mail-library/src/androidTest/java/foundation/e/mail/mail/ssl/TrustManagerFactoryTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; import java.io.ByteArrayInputStream; import java.io.File; diff --git a/k9mail-library/src/main/AndroidManifest.xml b/k9mail-library/src/main/AndroidManifest.xml index 147efd7d700a89dbdc1b33b395a99e4c2eb1ed32..e7831064c8253e4356d31a9bf9a74b5e7994035a 100644 --- a/k9mail-library/src/main/AndroidManifest.xml +++ b/k9mail-library/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ - + diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/OAuth2TokenProvider.java b/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/OAuth2TokenProvider.java deleted file mode 100644 index 5e0c27b7dca9abd08798792af5e685e38b34f018..0000000000000000000000000000000000000000 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/OAuth2TokenProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.fsck.k9.mail.oauth; - - -import java.util.List; - -import android.app.Activity; - -import com.fsck.k9.mail.AuthenticationFailedException; - - -public interface OAuth2TokenProvider { - /** - * A default timeout value to use when fetching tokens. - */ - int OAUTH2_TIMEOUT = 30000; - - - /** - * @return Accounts suitable for OAuth 2.0 token provision. - */ - List getAccounts(); - - /** - * Request API authorization. This is a foreground action that may produce a dialog to interact with. - * - * @param username - * Username - * @param activity - * The responsible activity - * @param callback - * A callback to process the asynchronous response - */ - void authorizeApi(String username, Activity activity, OAuth2TokenProviderAuthCallback callback); - - /** - * Fetch a token. No guarantees are provided for validity. - */ - String getToken(String username, long timeoutMillis) throws AuthenticationFailedException; - - /** - * Invalidate the token for this username. - * - *

- * Note that the token should always be invalidated on credential failure. However invalidating a token every - * single time is not recommended. - *

- * Invalidating a token and then failure with a new token should be treated as a permanent failure. - */ - void invalidateToken(String username); - - - /** - * Provides an asynchronous response to an - * {@link OAuth2TokenProvider#authorizeApi(String, Activity, OAuth2TokenProviderAuthCallback)} request. - */ - interface OAuth2TokenProviderAuthCallback { - void success(); - void failure(AuthorizationException e); - } -} diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Address.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Address.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Address.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Address.java index f06714c57fa151e58d21e060e233c5125a443f36..f7f6b7fc3faf478247e255d8df82f8234a0620f1 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Address.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Address.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import android.support.annotation.VisibleForTesting; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/AuthType.java b/k9mail-library/src/main/java/foundation/e/mail/mail/AuthType.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/AuthType.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/AuthType.java index 70c1967ff18069ea684758574cedbd5d8f4be816..ca5526ec9312cbacff4f33132f8e8a3eed93cbe2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/AuthType.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/AuthType.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public enum AuthType { /* diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Authentication.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Authentication.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Authentication.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Authentication.java index 08ab4a881596604d1e5518561be54b67ae80a671..872f36a8d3546036bb9effda0544dc39cbec9438 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Authentication.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Authentication.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.filter.Hex; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.filter.Hex; public class Authentication { private static final String US_ASCII = "US-ASCII"; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/AuthenticationFailedException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/AuthenticationFailedException.java similarity index 62% rename from k9mail-library/src/main/java/com/fsck/k9/mail/AuthenticationFailedException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/AuthenticationFailedException.java index 006063a145d55f86d7d0415f5de30f8d2d09bca9..a4c2008d5ac69d9bfa953054c226680ed6f39559 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/AuthenticationFailedException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/AuthenticationFailedException.java @@ -1,8 +1,10 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public class AuthenticationFailedException extends MessagingException { public static final long serialVersionUID = -1; + public static final String OAUTH2_ERROR_INVALID_REFRESH_TOKEN = "oauth2-invalid refresh token"; + public static final String OAUTH2_ERROR_UNKNOWN = "oauth2-unknown"; public AuthenticationFailedException(String message) { super(message); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Body.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Body.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Body.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Body.java index d86746d6602feb82722907b2c5355cf4a667b54e..7bb23a4bc9dd25df04cb6e134be13aaaea5ec0f2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Body.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Body.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; import java.io.InputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/BodyFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/BodyFactory.java similarity index 86% rename from k9mail-library/src/main/java/com/fsck/k9/mail/BodyFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/BodyFactory.java index c11a74e0a3ca2a0c3a05c8c2fd17342b6dc29593..57b64fa02ffa2e41101a3df543623ba47b6e13e8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/BodyFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/BodyFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/BodyPart.java b/k9mail-library/src/main/java/foundation/e/mail/mail/BodyPart.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/BodyPart.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/BodyPart.java index ef48dce8fa68f92cd67479ad1c1d1abf8ef12552..720947f1ea79cfa48e89c10b6594f03ee7bb36fa 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/BodyPart.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/BodyPart.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public abstract class BodyPart implements Part { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/BoundaryGenerator.java b/k9mail-library/src/main/java/foundation/e/mail/mail/BoundaryGenerator.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/BoundaryGenerator.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/BoundaryGenerator.java index 772ad065346cf1115b010479b4b35f09c5d2ad9e..ea1dbed8f6ed6f28462d3a5e9c85ca5725e0e6ea 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/BoundaryGenerator.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/BoundaryGenerator.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.Random; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/CertificateChainException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/CertificateChainException.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/CertificateChainException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/CertificateChainException.java index 2dc1af2049c0941d4d65a9c0635d31b8e637949a..1e140b2eb4f2d095b38099ff97dbb351c34d6a60 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/CertificateChainException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/CertificateChainException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/CertificateValidationException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/CertificateValidationException.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/CertificateValidationException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/CertificateValidationException.java index 18bd457f18aff5b283314f26351eef5809cb7ed3..bdd8f7ae4545fd18471ce7568040ed149be6d6ad 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/CertificateValidationException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/CertificateValidationException.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.security.cert.CertPathValidatorException; import java.security.cert.CertificateException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ConnectionSecurity.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ConnectionSecurity.java similarity index 73% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ConnectionSecurity.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ConnectionSecurity.java index d4a49268eb60dfe2bfb818367ffd178253eb99a8..6b37678612e1cdf9870a6cf17bac142b59b217c9 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ConnectionSecurity.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ConnectionSecurity.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public enum ConnectionSecurity { NONE, diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/DefaultBodyFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/DefaultBodyFactory.java similarity index 84% rename from k9mail-library/src/main/java/com/fsck/k9/mail/DefaultBodyFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/DefaultBodyFactory.java index 1cbffbe35c37e8f871a169b1c18d7a896ef2853f..e85fef7b1ef4223aa357f6d5cd818d3dd2b21da2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/DefaultBodyFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/DefaultBodyFactory.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.BinaryTempFileMessageBody; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.BinaryTempFileMessageBody; +import foundation.e.mail.mail.internet.MimeUtility; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/FetchProfile.java b/k9mail-library/src/main/java/foundation/e/mail/mail/FetchProfile.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/FetchProfile.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/FetchProfile.java index e1cfba8b5e190dfc2ace58e82a0f4c36b4a46d3f..487feae29b13a2d75f2e3203b405f830ec3c43c4 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/FetchProfile.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/FetchProfile.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.ArrayList; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Flag.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Flag.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Flag.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Flag.java index 0ade76386107ef4c1f385c58883b125d42a77415..365d3f4cd29b456668c3c94359b4c2ef843fb7ca 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Flag.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Flag.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; /** * Flags that can be applied to Messages. diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Folder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Folder.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Folder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Folder.java index 10f0449c9dd5b9d0bb5ba38de34ea4f32c4bc041..e815f841387977eb034e5f1a33becc37b6a84575 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Folder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Folder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; import java.util.Date; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/K9MailLib.java b/k9mail-library/src/main/java/foundation/e/mail/mail/K9MailLib.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/K9MailLib.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/K9MailLib.java index b8ce8ef1a629dde20752354441053441c875c6fb..8463d82cba286d2a82dbaf2fb52d4518279206cc 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/K9MailLib.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/K9MailLib.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public class K9MailLib { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Message.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Message.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Message.java index 72d2830d6fe1e40651100c63e8eb03c4733d06bb..6bac14c5d3ba3d69988e10f47cbcad821b30348c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Message.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; import java.util.Collections; @@ -9,8 +9,8 @@ import java.util.Set; import android.support.annotation.NonNull; -import com.fsck.k9.mail.filter.CountingOutputStream; -import com.fsck.k9.mail.filter.EOLConvertingOutputStream; +import foundation.e.mail.mail.filter.CountingOutputStream; +import foundation.e.mail.mail.filter.EOLConvertingOutputStream; import timber.log.Timber; @@ -233,7 +233,7 @@ public abstract class Message implements Part, Body { * Note: * This method was introduced as a hack to prevent {@code ConcurrentModificationException}s. It * shouldn't be used unless absolutely necessary. See the comment in - * {@link com.fsck.k9.activity.MessageView.Listener#loadMessageForViewHeadersAvailable(com.fsck.k9.Account, String, String, Message)} + * {@link foundation.e.mail.activity.MessageView.Listener#loadMessageForViewHeadersAvailable(foundation.e.mail.Account, String, String, Message)} * for more information. *

*/ diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/MessageRetrievalListener.java b/k9mail-library/src/main/java/foundation/e/mail/mail/MessageRetrievalListener.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/MessageRetrievalListener.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/MessageRetrievalListener.java index 273898acc4d4904a96c58fe1ad0ae02103d959a7..48262fcd1e7017e93184914fa4df7e155dd9ed09 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/MessageRetrievalListener.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/MessageRetrievalListener.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public interface MessageRetrievalListener { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/MessagingException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/MessagingException.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/MessagingException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/MessagingException.java index bdb24ab4261e0d3baf4c991a94554b1f6bf2d83a..307fff00a6d1fe6dbff8707e940528c6e98b2efa 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/MessagingException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/MessagingException.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public class MessagingException extends Exception { public static final long serialVersionUID = -1; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Multipart.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Multipart.java similarity index 92% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Multipart.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Multipart.java index 2e3dbaf7a1fc9e4a8e550d5ccc09c2d2e0aa5825..8b09afbf86e7078143fcade277a6dc45e7a296d0 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Multipart.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Multipart.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.ArrayList; import java.util.Collections; @@ -7,8 +7,8 @@ import java.util.List; import org.apache.james.mime4j.util.MimeUtil; -import com.fsck.k9.mail.internet.CharsetSupport; -import com.fsck.k9.mail.internet.TextBody; +import foundation.e.mail.mail.internet.CharsetSupport; +import foundation.e.mail.mail.internet.TextBody; public abstract class Multipart implements Body { private Part mParent; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/NetworkType.java b/k9mail-library/src/main/java/foundation/e/mail/mail/NetworkType.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/NetworkType.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/NetworkType.java index 769858213ccba15fe7bf5a2182573a5d7e44193a..bdb4e39dec2e0e3bd5dce80d558bbf20007bc549 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/NetworkType.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/NetworkType.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import android.net.ConnectivityManager; diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/OAuth2NeedUserPromptException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/OAuth2NeedUserPromptException.java new file mode 100644 index 0000000000000000000000000000000000000000..df7b4f940220c8097c5a99b2dff0b00967729010 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/OAuth2NeedUserPromptException.java @@ -0,0 +1,9 @@ +package foundation.e.mail.mail; + +public class OAuth2NeedUserPromptException extends MessagingException { + + public OAuth2NeedUserPromptException() { + super("Need user's prompt for xoauth2"); + } +} + diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Part.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Part.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Part.java index 220dbb5a499f164c0b9fcea36d46ef3d5d3d47b1..0321e8988a7b1481672d69fa8d9d50e11b31bfde 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Part.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.IOException; import java.io.OutputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/PushReceiver.java b/k9mail-library/src/main/java/foundation/e/mail/mail/PushReceiver.java similarity index 84% rename from k9mail-library/src/main/java/com/fsck/k9/mail/PushReceiver.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/PushReceiver.java index 931ccb9267b97e0c50c17f90a1f4b6972b723b16..1a12029e25f395217b44d6c7b8a693827cdbac2e 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/PushReceiver.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/PushReceiver.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.List; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; import android.content.Context; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Pusher.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Pusher.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Pusher.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Pusher.java index 6381ccbe46244973bf42758b896e5fd8605b7afa..d0c6de21c3d3c52ef0d6ed2a39cbdda9d9dc9bf8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Pusher.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Pusher.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.List; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ServerSettings.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ServerSettings.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ServerSettings.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ServerSettings.java index a6a51984906213e7dcd696beb2cadb954991be5e..a123a98c98c35af23d19df83fa4534fbf4394126 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ServerSettings.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ServerSettings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.Collections; import java.util.HashMap; @@ -12,8 +12,8 @@ import java.util.Map; * store/transport URIs altogether. *

* - * @see com.fsck.k9.mail.store.StoreConfig#getStoreUri() - * @see com.fsck.k9.mail.store.StoreConfig#getTransportUri() + * @see foundation.e.mail.mail.store.StoreConfig#getStoreUri() + * @see foundation.e.mail.mail.store.StoreConfig#getTransportUri() */ public class ServerSettings { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Store.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Store.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Store.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Store.java index 370b12c507837fbca999f8c7568cdf035e3694f7..70543e066117e9e370add1aae9193888c21db74d 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Store.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Store.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.List; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Transport.java b/k9mail-library/src/main/java/foundation/e/mail/mail/Transport.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/Transport.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/Transport.java index 6b60e524377fdcfccfafbcb4d07ed802fcf91f70..8a9afb1fa095c6e91ff582daaae3ce07fcec3624 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Transport.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/Transport.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; public abstract class Transport { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/TransportProvider.java b/k9mail-library/src/main/java/foundation/e/mail/mail/TransportProvider.java similarity index 51% rename from k9mail-library/src/main/java/com/fsck/k9/mail/TransportProvider.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/TransportProvider.java index 7d9d70cae5ab2c5acbb6514eb82fc80c6981deb4..70a4b9d9c62ddeaf991c694bcb14b167cc02544a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/TransportProvider.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/TransportProvider.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import android.content.Context; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.DefaultTrustedSocketFactory; -import com.fsck.k9.mail.store.StoreConfig; -import com.fsck.k9.mail.transport.smtp.SmtpTransport; -import com.fsck.k9.mail.transport.WebDavTransport; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.ssl.DefaultTrustedSocketFactory; +import foundation.e.mail.mail.store.StoreConfig; +import foundation.e.mail.mail.transport.smtp.SmtpTransport; +import foundation.e.mail.mail.transport.WebDavTransport; public class TransportProvider { private static TransportProvider transportProvider = new TransportProvider(); @@ -18,11 +18,17 @@ public class TransportProvider { public synchronized Transport getTransport(Context context, StoreConfig storeConfig) throws MessagingException { + return getTransport(context, storeConfig, null); + } + + public synchronized Transport getTransport(Context context, StoreConfig storeConfig, + OAuth2TokenProvider oAuth2TokenProvider) throws MessagingException { + String uri = storeConfig.getTransportUri(); if (uri.startsWith("smtp")) { - OAuth2TokenProvider oauth2TokenProvider = null; - return new SmtpTransport(storeConfig, new DefaultTrustedSocketFactory(context), oauth2TokenProvider); - } else if (uri.startsWith("webdav")) { + return new SmtpTransport(storeConfig, new DefaultTrustedSocketFactory(context), + oAuth2TokenProvider); + } else if (uri.startsWith("webdav")) { return new WebDavTransport(storeConfig); } else { throw new MessagingException("Unable to locate an applicable Transport for " + uri); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/TransportUris.java b/k9mail-library/src/main/java/foundation/e/mail/mail/TransportUris.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/TransportUris.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/TransportUris.java index 3e88327020641add6f40142a6a8679c471e7fd20..a63bdac9c729a2c7ffaa611d5c37f96ccf930661 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/TransportUris.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/TransportUris.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.io.UnsupportedEncodingException; @@ -7,8 +7,8 @@ import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.store.webdav.WebDavStore; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.store.webdav.WebDavStore; public class TransportUris { @@ -143,7 +143,7 @@ public class TransportUris { * * @return A SmtpTransport URI that holds the same information as the {@code server} parameter. * - * @see com.fsck.k9.mail.store.StoreConfig#getTransportUri() + * @see foundation.e.mail.mail.store.StoreConfig#getTransportUri() */ private static String createSmtpUri(ServerSettings server) { String userEnc = (server.username != null) ? diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigure.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigure.java new file mode 100644 index 0000000000000000000000000000000000000000..89505e60708780413c4df4a66780c55312d47633 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigure.java @@ -0,0 +1,156 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * An interface for autoconfiguration + */ + +public interface AutoConfigure { + ProviderInfo findProviderInfo(String email); + + public static class ProviderInfo { + public String incomingUsernameTemplate = ""; + + public String outgoingUsernameTemplate = ""; + + public String incomingType = ""; + public String incomingSocketType = ""; + public String incomingAddr = ""; + public int incomingPort = -1; + public String outgoingType = ""; + public String outgoingSocketType = ""; + public String outgoingAddr = ""; + public int outgoingPort = -1; + + public static String USERNAME_TEMPLATE_EMAIL = "$email"; + public static String USERNAME_TEMPLATE_USER = "$user"; + public static String USERNAME_TEMPLATE_DOMAIN = "$domain"; + public static String USERNAME_TEMPLATE_SRV = "$srv"; + + public static String INCOMING_TYPE_IMAP = "imap"; + public static String INCOMING_TYPE_POP3 = "pop3"; + public static String OUTGOING_TYPE_SMTP = "smtp"; + + public static List INCOMING_TYPES = new ArrayList<>( + Arrays.asList(INCOMING_TYPE_IMAP, INCOMING_TYPE_POP3) + ); + + public static String SOCKET_TYPE_SSL_OR_TLS = "ssl"; + public static String SOCKET_TYPE_STARTTLS = "tls"; + + public static int IMAP_SSL_OR_TLS_DEFAULT_PORT = 993; + public static int IMAP_STARTTLS_DEFAULT_PORT = 143; + public static int POP3_SSL_OR_TLS_DEFAULT_PORT = 995; + public static int POP3_STARTTLS_DEFAULT_PORT = 110; + public static int SMTP_SSL_OR_TLS_DEFAULT_PORT = 465; + public static int SMTP_STARTTLS_DEFAULT_PORT = 587; + + public ProviderInfo fillDefaultPorts() { + if (incomingPort == -1) { + if (incomingType.equals(INCOMING_TYPE_IMAP)) { + if (incomingSocketType.equals(SOCKET_TYPE_SSL_OR_TLS)) { + incomingPort = IMAP_SSL_OR_TLS_DEFAULT_PORT; + } else if (incomingSocketType.equals(SOCKET_TYPE_STARTTLS)) { + incomingPort = IMAP_STARTTLS_DEFAULT_PORT; + } + } else if (incomingType.equals(INCOMING_TYPE_POP3)) { + if (incomingSocketType.equals(SOCKET_TYPE_SSL_OR_TLS)) { + incomingPort = POP3_SSL_OR_TLS_DEFAULT_PORT; + } else if (incomingSocketType.equals(SOCKET_TYPE_STARTTLS)) { + incomingPort = POP3_STARTTLS_DEFAULT_PORT; + } + } + } + + if (outgoingPort == -1) { + if (outgoingType.equals(OUTGOING_TYPE_SMTP)) { + if (outgoingSocketType.equals(SOCKET_TYPE_SSL_OR_TLS)) { + outgoingPort = SMTP_SSL_OR_TLS_DEFAULT_PORT; + } else if (outgoingSocketType.equals(SOCKET_TYPE_STARTTLS)) { + outgoingPort = SMTP_STARTTLS_DEFAULT_PORT; + } + } + } + + return this; + } + + @Override + public String toString() { + return "ProviderInfo{" + + "incomingUsernameTemplate='" + incomingUsernameTemplate + '\'' + + ", outgoingUsernameTemplate='" + outgoingUsernameTemplate + '\'' + + ", incomingType='" + incomingType + '\'' + + ", incomingSocketType='" + incomingSocketType + '\'' + + ", incomingAddr='" + incomingAddr + '\'' + + ", incomingPort=" + incomingPort + + ", outgoingType='" + outgoingType + '\'' + + ", outgoingSocketType='" + outgoingSocketType + '\'' + + ", outgoingAddr='" + outgoingAddr + '\'' + + ", outgoingPort=" + outgoingPort + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + ProviderInfo that = (ProviderInfo) o; + + if (incomingPort != that.incomingPort) { + return false; + } + if (outgoingPort != that.outgoingPort) { + return false; + } + if (!incomingUsernameTemplate.equals(that.incomingUsernameTemplate)) { + return false; + } + if (!outgoingUsernameTemplate.equals(that.outgoingUsernameTemplate)) { + return false; + } + if (!incomingType.equals(that.incomingType)) { + return false; + } + if (!incomingSocketType.equals(that.incomingSocketType)) { + return false; + } + if (!incomingAddr.equals(that.incomingAddr)) { + return false; + } + if (!outgoingType.equals(that.outgoingType)) { + return false; + } + if (!outgoingSocketType.equals(that.outgoingSocketType)) { + return false; + } + return outgoingAddr.equals(that.outgoingAddr); + + } + + @Override + public int hashCode() { + int result = incomingUsernameTemplate.hashCode(); + result = 31 * result + outgoingUsernameTemplate.hashCode(); + result = 31 * result + incomingType.hashCode(); + result = 31 * result + incomingSocketType.hashCode(); + result = 31 * result + incomingAddr.hashCode(); + result = 31 * result + incomingPort; + result = 31 * result + outgoingType.hashCode(); + result = 31 * result + outgoingSocketType.hashCode(); + result = 31 * result + outgoingAddr.hashCode(); + result = 31 * result + outgoingPort; + return result; + } + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigureAutodiscover.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigureAutodiscover.java new file mode 100644 index 0000000000000000000000000000000000000000..c04e10efbbfee7c78f17928d14ac181946718454 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoConfigureAutodiscover.java @@ -0,0 +1,250 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.io.IOException; +import java.net.UnknownHostException; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.xbill.DNS.SRVRecord; +import org.xbill.DNS.TextParseException; +import timber.log.Timber; + + +/** + * "Autodiscover" is Microsoft Exchange's autoconfiguration mechanism + * Not support redirectAddr + */ + +public class AutoConfigureAutodiscover implements AutoConfigure { + private final static String AUTODISCOVER_URL1 = "https://%s/autodiscover/autodiscover.xml"; + private final static String AUTODISCOVER_URL2 = "https://autodiscover.%s/autodiscover/autodiscover.xml"; + private final static String AUTODISCOVER_URL3 = "http://autodiscover.%s/autodiscover/autodiscover.xml"; + private final static String AUTODISCOVER_SRV = "_autodiscover._tcp.%s"; + + private final static String AUTODISCOVER_POST_BODY = "\n" + + "\n" + + "\n" + + "http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a\n" + + "\n" + + "%s\n" + + "\n" + + ""; + + @Override + public ProviderInfo findProviderInfo(String email) { + String[] parts = email.split("@"); + if (parts.length < 2) return null; + String domain = parts[1]; + + ProviderInfo providerInfo; + + String url = String.format(AUTODISCOVER_URL1, domain); + providerInfo = findProviderInfoByUrl(url, email); + + if (providerInfo != null) return providerInfo; + + url = String.format(AUTODISCOVER_URL2, domain); + providerInfo = findProviderInfoByUrl(url, email); + + if (providerInfo != null) return providerInfo; + + url = String.format(AUTODISCOVER_URL3, domain); + providerInfo = findProviderInfoByUrl(url, email, true); + + url = String.format(AUTODISCOVER_SRV, domain); + DNSOperation dnsOperation = new DNSOperation(); + try { + SRVRecord srvRecord = dnsOperation.choose(dnsOperation.srvLookup(url)); + if (srvRecord != null) { + url = srvRecord.getTarget().toString(true); + providerInfo = findProviderInfoByUrl(url, email); + } + } catch (TextParseException e) { + Timber.e(e, "Error while trying to do SRV lookup"); + } catch (UnknownHostException e) { + Timber.w(e, "No valid SRV record for " + domain); + } + + return providerInfo; + } + + private ProviderInfo findProviderInfoByUrl(String url, String email) { + return findProviderInfoByUrl(url, email, false); + } + + private ProviderInfo findProviderInfoByUrl(String url, String email, boolean followRedirects) { + ProviderInfo providerInfo = null; + try { + Document document = Jsoup.connect(url).timeout(5000).requestBody(String.format(AUTODISCOVER_POST_BODY, email)) + .followRedirects(followRedirects).post(); + Element account = document.select("Account").first(); + if (account == null) { + return null; + } + Element accountType = account.select("AccountType").first(); + if (accountType == null || !accountType.text().equals("email")) { + return null; + } + Element action = account.select("Action").first(); + if (action.text().equalsIgnoreCase("settings")) { + providerInfo = parse(account); + } else if (account.text().equalsIgnoreCase("redirectUrl")) { + Element redirectUrl = account.select("RedirectUrl").first(); + if (redirectUrl != null) { + providerInfo = findProviderInfoByUrl(redirectUrl.text(), email); + } + } + + } catch (IOException e) { + Timber.w(e, "No information at " + url); + } + return providerInfo; + } + + public ProviderInfo parse(Element account) { + ProviderInfo providerInfo = new ProviderInfo(); + Elements protocols = account.select("Protocol"); + for (Element protocol : protocols) { + Element type = protocol.select("Type").first(); + + if ((type.text().equalsIgnoreCase("POP3") || + type.text().equalsIgnoreCase("IMAP"))) { + + Element server = protocol.select("Server").first(); + if (server == null) { + continue; + } + + if (type.text().equalsIgnoreCase("POP3")) { + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + } else { + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + } + + + providerInfo.incomingAddr = server.text(); + + Element port = protocol.select("Port").first(); + if (port != null) { + providerInfo.incomingPort = Integer.valueOf(port.text()); + } + + Element loginName = protocol.select("LoginName").first(); + if (loginName != null) { + providerInfo.incomingUsernameTemplate = loginName.text(); + } else { + providerInfo.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + } + + Element domainRequired = protocol.select("DomainRequired").first(); + if (domainRequired != null && domainRequired.text().equalsIgnoreCase("on")) { + Element domainName = protocol.select("DomainName").first(); + if (!providerInfo.incomingUsernameTemplate.isEmpty()) { + providerInfo.incomingUsernameTemplate += "@" + + ((domainName != null && !domainName.text().isEmpty()) ? + domainName.text() : ProviderInfo.USERNAME_TEMPLATE_DOMAIN); + } else { + providerInfo.incomingUsernameTemplate = + domainName != null && !domainName.text().isEmpty() ? + domainName.text() : ProviderInfo.USERNAME_TEMPLATE_DOMAIN; + } + } + + Element SSL = protocol.select("SSL").first(); + if (SSL != null && SSL.text().equalsIgnoreCase("on")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + } else { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + } + + Element TLS = protocol.select("TLS").first(); + if (TLS != null && TLS.text().equalsIgnoreCase("on")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + } + + break; + } + } + + for (Element protocol : protocols) { + Element type = protocol.select("Type").first(); + + if (type.text().equalsIgnoreCase("SMTP")) { + providerInfo.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + + Element usePopAuth = protocol.select("UsePOPAuth").first(); + if (usePopAuth != null && usePopAuth.text().equalsIgnoreCase("on")) { + providerInfo.outgoingAddr = providerInfo.incomingAddr; + providerInfo.outgoingSocketType = providerInfo.incomingSocketType; + providerInfo.outgoingUsernameTemplate = providerInfo.incomingUsernameTemplate; + } + + Element server = protocol.select("Server").first(); + if (server == null && providerInfo.outgoingAddr.equals("")) { + providerInfo.outgoingUsernameTemplate = ""; + providerInfo.outgoingAddr = ""; + providerInfo.outgoingSocketType = ""; + providerInfo.outgoingPort = -1; + + continue; + } + if (server != null) { + providerInfo.outgoingAddr = server.text(); + } + + Element port = protocol.select("Port").first(); + if (port != null) { + providerInfo.outgoingPort = Integer.valueOf(port.text()); + } + + Element loginName = protocol.select("LoginName").first(); + if (loginName != null) { + providerInfo.outgoingUsernameTemplate = loginName.text(); + } else { + providerInfo.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + } + + Element domainRequired = protocol.select("DomainRequired").first(); + if (domainRequired != null && domainRequired.text().equalsIgnoreCase("on")) { + Element domainName = protocol.select("DomainName").first(); + if (!providerInfo.outgoingUsernameTemplate.isEmpty()) { + providerInfo.outgoingUsernameTemplate += "@" + + ((domainName != null && !domainName.text().isEmpty()) ? + domainName.text() : ProviderInfo.USERNAME_TEMPLATE_DOMAIN); + } else { + providerInfo.outgoingUsernameTemplate = + domainName != null && !domainName.text().isEmpty() ? + domainName.text() : ProviderInfo.USERNAME_TEMPLATE_DOMAIN; + } + } + + Element SSL = protocol.select("SSL").first(); + if (SSL != null && SSL.text().equalsIgnoreCase("on") && + providerInfo.outgoingSocketType.isEmpty()) { + providerInfo.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + } + + Element TLS = protocol.select("TLS").first(); + if (TLS != null && TLS.text().equalsIgnoreCase("on") && + providerInfo.outgoingSocketType.isEmpty()) { + providerInfo.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + } + + Element encryption = protocol.select("Encryption").first(); + if (encryption != null && providerInfo.outgoingSocketType.isEmpty()) { + providerInfo.outgoingSocketType = encryption.text(); + } + } + } + + if (providerInfo.incomingAddr.equals("") || providerInfo.outgoingAddr.equals("")) { + return null; + } + + return providerInfo; + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureMozilla.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureMozilla.java new file mode 100644 index 0000000000000000000000000000000000000000..facfb8e9d305d147aac50705b0e93d24b8e56d33 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureMozilla.java @@ -0,0 +1,110 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.io.IOException; + +import android.support.annotation.Nullable; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import timber.log.Timber; + + +/** + * Search in ISPDB + */ + +public class AutoconfigureMozilla implements AutoConfigure { + private static final String ISPDB_URL = "https://autoconfig.thunderbird.net/v1.1/%s"; + + @Nullable + public ProviderInfo parse(Document document) { + ProviderInfo providerInfo = new ProviderInfo(); + + Element incomingElement = null; + for(Element element: document.select("incomingServer")){ + if(ProviderInfo.INCOMING_TYPES.contains(element.attr("type"))){ + incomingElement = element; + break; + } + } + if (incomingElement == null) return null; + Element incomingHostnameElement = incomingElement.select("hostname").first(); + if (incomingHostnameElement == null) return null; + providerInfo.incomingAddr = incomingHostnameElement.text(); + providerInfo.incomingType = incomingElement.attr("type").toLowerCase(); + Element incomingPortElement = incomingElement.select("port").first(); + if (incomingPortElement != null) providerInfo.incomingPort = Integer.valueOf(incomingPortElement.text()); + Element incomingSocketTypeElement = incomingElement.select("socketType").first(); + String incomingSocketType = incomingSocketTypeElement != null ? + incomingSocketTypeElement.text().toLowerCase() : + ""; + switch (incomingSocketType) { + case "ssl": + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + break; + case "starttls": + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + break; + default: + providerInfo.incomingSocketType = ""; + break; + } + final Element usernameElement = incomingElement.select("username").first(); + if (usernameElement == null) return null; + final String incomingUsername = usernameElement.text(); + // "\\" to escape '$' + providerInfo.incomingUsernameTemplate = incomingUsername + .replaceAll("%EMAILDOMAIN%", "\\" + ProviderInfo.USERNAME_TEMPLATE_DOMAIN) + .replaceAll("%EMAILADDRESS%", "\\" + ProviderInfo.USERNAME_TEMPLATE_EMAIL) + .replaceAll("%EMAILLOCALPART%", "\\" + ProviderInfo.USERNAME_TEMPLATE_USER); + + Element outgoingElement = document.select("outgoingServer").first(); + final Element outgoingHostnameElement = outgoingElement.select("hostname").first(); + if (outgoingHostnameElement == null) return null; + providerInfo.outgoingAddr = outgoingHostnameElement.text(); + providerInfo.outgoingType = outgoingElement.attr("type").toLowerCase(); + Element outgoingPortElement = outgoingElement.select("port").first(); + if (outgoingPortElement != null) providerInfo.outgoingPort = Integer.valueOf(outgoingPortElement.text()); + final String outgoingSocketType = outgoingElement.select("socketType").first().text().toLowerCase(); + switch (outgoingSocketType) { + case "ssl": + providerInfo.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + break; + case "starttls": + providerInfo.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + break; + default: + providerInfo.outgoingSocketType = ""; + break; + } + final Element outgoingUsernameElement = outgoingElement.select("username").first(); + if (outgoingUsernameElement != null) { + providerInfo.outgoingUsernameTemplate = outgoingUsernameElement.text() + .replaceAll("%EMAILDOMAIN%", "\\" + ProviderInfo.USERNAME_TEMPLATE_DOMAIN) + .replaceAll("%EMAILADDRESS%", "\\" + ProviderInfo.USERNAME_TEMPLATE_EMAIL) + .replaceAll("%EMAILLOCALPART%", "\\" + ProviderInfo.USERNAME_TEMPLATE_USER); + } + return providerInfo; + } + + @Override + public ProviderInfo findProviderInfo(String email) { + String[] parts = email.split("@"); + if (parts.length < 2) return null; + String domain = parts[1]; + + try { + String url = String.format(ISPDB_URL, domain); + Document document = Jsoup.connect(url).timeout(5000).get(); + + return parse(document); + } catch (IOException e) { + Timber.w(e, "No information in ISPDB"); + return null; + } + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureSrv.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureSrv.java new file mode 100644 index 0000000000000000000000000000000000000000..081a5c861be465e551ab1ec66f09c8f4fe4c7766 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutoconfigureSrv.java @@ -0,0 +1,104 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.List; + +import org.xbill.DNS.SRVRecord; +import org.xbill.DNS.TextParseException; +import timber.log.Timber; + + +/** + * According to RFC 6186 + */ + +public class AutoconfigureSrv implements AutoConfigure { + public ProviderInfo parse(List imapRecords, List pop3Records, + List submissionRecords) { + ProviderInfo providerInfo = new ProviderInfo(); + + DNSOperation dnsOperation = new DNSOperation(); + + SRVRecord imapRecord = dnsOperation.choose(imapRecords); + SRVRecord pop3Record = dnsOperation.choose(pop3Records); + + SRVRecord incomingRecord; + if (imapRecord != null && pop3Record != null) { + incomingRecord = imapRecord.getPriority() <= pop3Record.getPriority() ? imapRecord : pop3Record; + } else if (imapRecord != null) { + incomingRecord = imapRecord; + } else if (pop3Record != null) { + incomingRecord = pop3Record; + } else { + return null; + } + + providerInfo.incomingPort = incomingRecord.getPort(); + + providerInfo.incomingAddr = incomingRecord.getTarget().toString(true); + if (incomingRecord.getName().toString().startsWith("_imaps")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + } else if (incomingRecord.getName().toString().startsWith("_imap")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + } else if (incomingRecord.getName().toString().startsWith("_pop3s")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + } else if (incomingRecord.getName().toString().startsWith("_pop3")) { + providerInfo.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + providerInfo.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + } + + SRVRecord outgoingRecord = dnsOperation.choose(submissionRecords); + if (outgoingRecord != null) { + providerInfo.outgoingAddr = outgoingRecord.getTarget().toString(true); + providerInfo.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + providerInfo.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + providerInfo.outgoingPort = outgoingRecord.getPort(); + } else { + return null; + } + + providerInfo.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + providerInfo.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + + return providerInfo; + } + + @Override + public ProviderInfo findProviderInfo(String email) { + String[] parts = email.split("@"); + if (parts.length < 2) return null; + String domain = parts[1]; + + DNSOperation dnsOperation = new DNSOperation(); + + ProviderInfo providerInfo; + try { + List imapRecords = new ArrayList<>(); + imapRecords.addAll(dnsOperation.srvLookup("_imaps._tcp." + domain)); + imapRecords.addAll(dnsOperation.srvLookup("_imap._tcp." + domain)); + + List pop3Records = new ArrayList<>(); + pop3Records.addAll(dnsOperation.srvLookup("_pop3s._tcp." + domain)); + pop3Records.addAll(dnsOperation.srvLookup("_pop3._tcp." + domain)); + + List outgoingRecords = dnsOperation.srvLookup("_submission._tcp." + domain); + + providerInfo = parse(imapRecords, pop3Records, outgoingRecords); + + } catch (TextParseException e) { + Timber.e(e, "Error while trying to do SRV lookup"); + return null; + } catch (UnknownHostException e) { + Timber.w(e, "No valid SRV record for " + domain); + return null; + } + + return providerInfo; + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutodiscoverTest.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutodiscoverTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5254997fbfef9898bfe8276faa118d280ea2a633 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/AutodiscoverTest.java @@ -0,0 +1,316 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import foundation.e.mail.mail.autoconfiguration.AutoConfigure.ProviderInfo; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; +import org.junit.Assert; +import org.junit.Test; + + +public class AutodiscoverTest { + @Test + public void test() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "POP3\n" + + "mail.contoso.com\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "mail.contoso.com\n" + + "587\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account).fillDefaultPorts(); + + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "mail.contoso.com"; + expected.incomingPort = 995; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "mail.contoso.com"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + + Assert.assertEquals(expected, actual); + } + @Test + public void testSocketTypeAndDefaultPort() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "IMAP\n" + + "mail.contoso.com\n" + + "off\n" + + "off\n" + + "off\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "smtp.contoso.com\n" + + "587\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account).fillDefaultPorts(); + + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.incomingAddr = "mail.contoso.com"; + expected.incomingPort = ProviderInfo.IMAP_STARTTLS_DEFAULT_PORT; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "smtp.contoso.com"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + + Assert.assertEquals(expected, actual); + } + @Test + public void testProtocolPreference() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "POP3\n" + + "mail.contoso.com\n" + + "995\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "IMAP\n" + + "mail.contoso.com\n" + + "993\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "mail.contoso.com\n" + + "587\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account).fillDefaultPorts(); + + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "mail.contoso.com"; + expected.incomingPort = 995; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "mail.contoso.com"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + + Assert.assertEquals(expected, actual); + } + @Test + public void testDomainRequiredAndCustomLoginNameAndDomainName() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "IMAP\n" + + "mail.contoso.com\n" + + "on\n" + + "off\n" + + "off\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "smtp.contoso.com\n" + + "587\n" + + "abc\n" + + "on\n" + + "def.com\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account).fillDefaultPorts(); + + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.incomingAddr = "mail.contoso.com"; + expected.incomingPort = ProviderInfo.IMAP_STARTTLS_DEFAULT_PORT; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER + "@" + + ProviderInfo.USERNAME_TEMPLATE_DOMAIN; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "smtp.contoso.com"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = "abc@def.com"; + + Assert.assertEquals(expected, actual); + } + @Test + public void testUnusualPorts() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "POP3\n" + + "mail.contoso.com\n" + + "123\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "mail.contoso.com\n" + + "456\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account).fillDefaultPorts(); + + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "mail.contoso.com"; + expected.incomingPort = 123; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "mail.contoso.com"; + expected.outgoingPort = 456; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + + Assert.assertEquals(expected, actual); + } + @Test + public void testMalformedXml() { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "email\n" + + "settings\n" + + "\n" + + "POP3\n" + + "mail.contoso.com\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "SMTP\n" + + "587\n" + + "off\n" + + "off\n" + + "on\n" + + "on\n" + + "on\n" + + "\n" + + "\n" + + "\n" + + ""; + + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + Element account = Jsoup.parse(xml).select("Account").first(); + ProviderInfo actual = autodiscover.parse(account); + + Assert.assertNull(actual); + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DNSOperation.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DNSOperation.java new file mode 100644 index 0000000000000000000000000000000000000000..3853db5448c99f7838ab486fc6cff95df5d0a056 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DNSOperation.java @@ -0,0 +1,107 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.xbill.DNS.DClass; +import org.xbill.DNS.Lookup; +import org.xbill.DNS.MXRecord; +import org.xbill.DNS.Record; +import org.xbill.DNS.Resolver; +import org.xbill.DNS.SRVRecord; +import org.xbill.DNS.SimpleResolver; +import org.xbill.DNS.TextParseException; +import org.xbill.DNS.Type; + + +/** + * Util class for DNS operations + */ + +class DNSOperation { + MXRecord mxLookup(String domain) throws TextParseException, UnknownHostException { + Lookup lookup = new Lookup(domain, Type.MX, DClass.IN); + Resolver resolver = new SimpleResolver(); + lookup.setResolver(resolver); + lookup.setCache(null); + Record[] records = lookup.run(); + if (records == null) return null; + + MXRecord[] mxRecords = Arrays.copyOf(records, records.length, MXRecord[].class); + + MXRecord res = null; + if (lookup.getResult() == Lookup.SUCCESSFUL) { + for (MXRecord record : mxRecords) { + if (res == null || record.getPriority() < res.getPriority()) { + res = record; + } + } + } + + return res; + } + + @NonNull + List srvLookup(String serviceName) throws TextParseException, UnknownHostException { + Lookup lookup = new Lookup(serviceName, Type.SRV, DClass.IN); + Resolver resolver = new SimpleResolver(); + lookup.setResolver(resolver); + lookup.setCache(null); + + List res = new ArrayList<>(); + + Record[] records = lookup.run(); + if (records == null) return res; + + SRVRecord[] srvRecords = Arrays.copyOf(records, records.length, SRVRecord[].class); + + if (lookup.getResult() == Lookup.SUCCESSFUL) { + res = Arrays.asList(srvRecords); + } + + return res; + } + + @Nullable + SRVRecord choose(@NonNull List srvRecords) { + ArrayList recordsWithLowestPriority = new ArrayList<>(); + int lowestPriority = -1; + int totalWeights = 0; + + for (SRVRecord record : srvRecords) { + if ((lowestPriority == -1 || lowestPriority > record.getPriority()) && + !record.getTarget().toString().equals(".")) { + lowestPriority = record.getPriority(); + } + } + + for (SRVRecord record : srvRecords) { + if (record.getPriority() == lowestPriority) { + recordsWithLowestPriority.add(record); + totalWeights += record.getWeight(); + } + } + + if (recordsWithLowestPriority.size() == 1) { + return recordsWithLowestPriority.get(0); + } + + // weight selection algorithm is from rfc2782 + int randomNum = (int) Math.round(totalWeights * Math.random()); + for (SRVRecord record : recordsWithLowestPriority) { + randomNum -= record.getWeight(); + if (randomNum <= 0) { + return record; + } + } + + return null; + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DnsHelper.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DnsHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..f53beff5f36475f1f85397e6af7b33714b67f4c7 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/DnsHelper.java @@ -0,0 +1,32 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.net.UnknownHostException; + +import org.xbill.DNS.MXRecord; +import org.xbill.DNS.TextParseException; + + +public class DnsHelper { + public static String getMxDomain(String domain) throws UnknownHostException { + DNSOperation dnsOperation = new DNSOperation(); + MXRecord mxRecord; + try { + mxRecord = dnsOperation.mxLookup(domain); + } catch (TextParseException e) { + return null; + } + if (mxRecord != null) { + final String target = mxRecord.getTarget().toString(true); + return getDomainFromFqdn(target); + } + return null; + } + + private static String getDomainFromFqdn(String fqdn) { + final String[] parts = fqdn.split("\\."); + + return parts[parts.length - 2] + "." + parts[parts.length - 1]; + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/ISPDBTest.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/ISPDBTest.java new file mode 100644 index 0000000000000000000000000000000000000000..219bd57fbfc05c7a0137f5e2b572751b4f27d314 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/ISPDBTest.java @@ -0,0 +1,370 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import foundation.e.mail.mail.autoconfiguration.AutoConfigure.ProviderInfo; +import junit.framework.Assert; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.junit.Test; + + +public class ISPDBTest { + @Test + public void testImap() { + String xml = "\n" + + " \n" + + " a1.net\n" + + " aon.at\n" + + " a1.net\n" + + " a1.net\n" + + " \n" + + " securemail.a1.net\n" + + " 993\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " securemail.a1.net\n" + + " 587\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + ""; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "securemail.a1.net"; + expected.incomingPort = 993; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingAddr = "securemail.a1.net"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + + Assert.assertEquals(expected, actual); + } + @Test + public void testPop3() { + String xml = "\n" + + " \n" + + " elpasotel.net\n" + + " Elpasotel.net\n" + + " Elpasotel\n" + + " \n" + + " pop3.elpasotel.net\n" + + " 995\n" + + " SSL\n" + + " password-cleartext\n" + + " %EMAILADDRESS%\n" + + " \n" + + " true\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " mail.elpasotel.net\n" + + " 993\n" + + " SSL\n" + + " password-cleartext\n" + + " %EMAILADDRESS%\n" + + " \n" + + " \n" + + " \n" + + " smtp.elpasotel.net\n" + + " 587\n" + + " STARTTLS\n" + + " password-cleartext\n" + + " %EMAILADDRESS%\n" + + " \n" + + " \n" + + " CenturyLink | How to set up your email to go through POP3 and SMTP\n" + + " \n" + + " \n" + + " CenturyLink | How to set up your email to go through POP3 and SMTP #Elpasotel.net\n" + + " \n" + + " \n" + + "\n"; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "pop3.elpasotel.net"; + expected.incomingPort = 995; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingAddr = "smtp.elpasotel.net"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + + Assert.assertEquals(expected, actual); + } + @Test + public void testManyItems() { + String xml = "\n" + + "\n" + + " \n" + + " \n" + + " imap.mail.com\n" + + " 993\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " imap.mail.com\n" + + " 143\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " pop.mail.com\n" + + " 995\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " pop.mail.com\n" + + " 110\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " smtp.mail.com\n" + + " 465\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " smtp.mail.com\n" + + " 587\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + "\n"; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "imap.mail.com"; + expected.incomingPort = 993; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.outgoingAddr = "smtp.mail.com"; + expected.outgoingPort = 465; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + + Assert.assertEquals(expected, actual); + } + @Test + public void testAnonymousSMTP() { + String xml = "\n" + + "\n" + + " \n" + + " iiyama-catv.ne.jp\n" + + " ケーブルテレビiネット飯山\n" + + " iネット飯山\n" + + " \n" + + " mail.iiyama-catv.ne.jp\n" + + " 110\n" + + " plain\n" + + " %EMAILLOCALPART%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " smtp.iiyama-catv.ne.jp\n" + + " 25\n" + + " plain\n" + + " none\n" + + " \n" + + " \n" + + "\n"; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ""; + expected.incomingAddr = "mail.iiyama-catv.ne.jp"; + expected.incomingPort = 110; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ""; + expected.outgoingAddr = "smtp.iiyama-catv.ne.jp"; + expected.outgoingPort = 25; + expected.outgoingUsernameTemplate = ""; + + Assert.assertEquals(expected, actual); + } + @Test + public void testUnusualUsername() { + String xml = "\n" + + "\n" + + " \n" + + " IIJmio セーフティメール\n" + + " IIJmio\n" + + " \n" + + " mbox.iijmio-mail.jp\n" + + " 110\n" + + " STARTTLS\n" + + " %EMAILLOCALPART%.%EMAILDOMAIN%\n" + + " password-encrypted\n" + + " \n" + + " \n" + + " mbox.iijmio-mail.jp\n" + + " 587\n" + + " STARTTLS\n" + + " %EMAILLOCALPART%.%EMAILDOMAIN%\n" + + " password-encrypted\n" + + " \n" + + " \n" + + ""; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.incomingAddr = "mbox.iijmio-mail.jp"; + expected.incomingPort = 110; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER + "." + + ProviderInfo.USERNAME_TEMPLATE_DOMAIN; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingAddr = "mbox.iijmio-mail.jp"; + expected.outgoingPort = 587; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_USER + "." + + ProviderInfo.USERNAME_TEMPLATE_DOMAIN; + + Assert.assertEquals(expected, actual); + } + @Test + public void testUnusualPorts() { + String xml = "\n" + + " \n" + + " a1.net\n" + + " aon.at\n" + + " a1.net\n" + + " a1.net\n" + + " \n" + + " securemail.a1.net\n" + + " 123\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " securemail.a1.net\n" + + " 456\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + ""; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document).fillDefaultPorts(); + ProviderInfo expected = new ProviderInfo(); + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingAddr = "securemail.a1.net"; + expected.incomingPort = 123; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingAddr = "securemail.a1.net"; + expected.outgoingPort = 456; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_EMAIL; + + Assert.assertEquals(expected, actual); + } + @Test + public void testMalformedXmlWithoutIncoming() { + String xml = "\n" + + " \n" + + " a1.net\n" + + " aon.at\n" + + " a1.net\n" + + " a1.net\n" + + " \n" + + " securemail.a1.net\n" + + " 456\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + ""; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document); + + Assert.assertNull(actual); + } + @Test + public void testMalformedXmlWithoutHostname() { + String xml = "\n" + + " \n" + + " a1.net\n" + + " aon.at\n" + + " a1.net\n" + + " a1.net\n" + + " \n" + + " 123\n" + + " SSL\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + " securemail.a1.net\n" + + " 456\n" + + " STARTTLS\n" + + " %EMAILADDRESS%\n" + + " password-cleartext\n" + + " \n" + + " \n" + + ""; + + Document document = Jsoup.parse(xml); + + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + ProviderInfo actual = autoconfigureMozilla.parse(document); + + Assert.assertNull(actual); + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/SRVTest.java b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/SRVTest.java new file mode 100644 index 0000000000000000000000000000000000000000..35bd6db3e38d17771fc91cd8fcf837fb27641317 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/autoconfiguration/SRVTest.java @@ -0,0 +1,281 @@ +package foundation.e.mail.mail.autoconfiguration; + + +import java.util.ArrayList; +import java.util.List; + +import foundation.e.mail.mail.autoconfiguration.AutoConfigure.ProviderInfo; +import org.junit.Assert; +import org.junit.Test; +import org.xbill.DNS.Name; +import org.xbill.DNS.SRVRecord; +import org.xbill.DNS.TextParseException; + + +public class SRVTest { + @Test + public void test() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add(new SRVRecord(new Name("_imaps._tcp.test.com."), 0, 0, 5, 0, 993, new Name("imap.test.com."))); + + pop3Records.add(new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 5, 0, 995, new Name("pop3.test.com."))); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 5, 0, 587, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected = new ProviderInfo(); + + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.incomingPort = 993; + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingAddr = "imap.test.com"; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.outgoingPort = 587; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingAddr = "smtp.test.com"; + + Assert.assertEquals(expected, actual); + } + @Test + public void testPriority() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 1, 0, 5, 0, 993, new Name("imap.test.com.")) + ); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 0, 0, 3, 0, 993, new Name("mail.test.com.")) + ); + + pop3Records.add( + new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 5, 0, 995, new Name("pop3.test.com.")) + ); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 3, 0, 587, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected = new ProviderInfo(); + + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.incomingPort = 993; + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingAddr = "mail.test.com"; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.outgoingPort = 587; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingAddr = "smtp.test.com"; + + Assert.assertEquals(expected, actual); + } + @Test + public void testPop3() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 1, 0, 5, 0, 993, new Name("imap.test.com.")) + ); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 0, 0, 5, 0, 993, new Name("mail.test.com.")) + ); + + pop3Records.add( + new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 3, 0, 995, new Name("pop3.test.com.")) + ); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 3, 0, 587, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected = new ProviderInfo(); + + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.incomingPort = 995; + expected.incomingType = ProviderInfo.INCOMING_TYPE_POP3; + expected.incomingAddr = "pop3.test.com"; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.outgoingPort = 587; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingAddr = "smtp.test.com"; + + Assert.assertEquals(expected, actual); + } + @Test + public void testTLS() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 1, 0, 5, 0, 993, new Name("imap.test.com.")) + ); + + imapRecords.add( + new SRVRecord(new Name("_imap._tcp.test.com."), 0, 0, 3, 0, 143, new Name("mail.test.com.")) + ); + + pop3Records.add( + new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 10, 0, 995, new Name("pop3.test.com.")) + ); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 3, 0, 587, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected = new ProviderInfo(); + + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.incomingPort = 143; + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingAddr = "mail.test.com"; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.outgoingPort = 587; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingAddr = "smtp.test.com"; + + Assert.assertEquals(expected, actual); + } + @Test + public void testWeightSelection() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 1, 0, 5, 10, 993, new Name("imap.test.com.")) + ); + + imapRecords.add( + new SRVRecord(new Name("_imap._tcp.test.com."), 0, 0, 5, 10, 143, new Name("mail.test.com.")) + ); + + pop3Records.add( + new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 10, 0, 995, new Name("pop3.test.com.")) + ); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 3, 0, 587, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected1 = new ProviderInfo(); + + expected1.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected1.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected1.incomingPort = 993; + expected1.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected1.incomingAddr = "imap.test.com"; + expected1.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected1.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected1.outgoingPort = 587; + expected1.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected1.outgoingAddr = "smtp.test.com"; + + ProviderInfo expected2 = new ProviderInfo(); + + expected2.incomingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected2.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected2.incomingPort = 143; + expected2.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected2.incomingAddr = "mail.test.com"; + expected2.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected2.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected2.outgoingPort = 587; + expected2.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected2.outgoingAddr = "smtp.test.com"; + + Assert.assertTrue(expected1.equals(actual) || expected2.equals(actual)); + } + @Test + public void testRecordsWithOnlyADot() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add( + new SRVRecord(new Name("_imaps._tcp.test.com."), 1, 0, 5, 10, 993, new Name(".")) + ); + + imapRecords.add( + new SRVRecord(new Name("_imap._tcp.test.com."), 0, 0, 5, 10, 143, new Name(".")) + ); + + pop3Records.add( + new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 10, 0, 995, new Name(".")) + ); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 3, 0, 587, new Name(".")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + Assert.assertNull(actual); + } + @Test + public void testUnusualPorts() throws TextParseException { + List imapRecords = new ArrayList<>(); + List pop3Records = new ArrayList<>(); + List submissionRecords = new ArrayList<>(); + + imapRecords.add(new SRVRecord(new Name("_imaps._tcp.test.com."), 0, 0, 5, 0, 123, new Name("imap.test.com."))); + + pop3Records.add(new SRVRecord(new Name("_pop3s._tcp.test.com."), 0, 0, 5, 0, 456, new Name("pop3.test.com."))); + + submissionRecords.add( + new SRVRecord(new Name("_submission._tcp.test.com."), 0, 0, 5, 0, 789, new Name("smtp.test.com.")) + ); + + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + ProviderInfo actual = autoconfigureSrv.parse(imapRecords, pop3Records, submissionRecords); + + ProviderInfo expected = new ProviderInfo(); + + expected.incomingSocketType = ProviderInfo.SOCKET_TYPE_SSL_OR_TLS; + expected.incomingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.incomingPort = 123; + expected.incomingType = ProviderInfo.INCOMING_TYPE_IMAP; + expected.incomingAddr = "imap.test.com"; + expected.outgoingSocketType = ProviderInfo.SOCKET_TYPE_STARTTLS; + expected.outgoingUsernameTemplate = ProviderInfo.USERNAME_TEMPLATE_SRV; + expected.outgoingPort = 789; + expected.outgoingType = ProviderInfo.OUTGOING_TYPE_SMTP; + expected.outgoingAddr = "smtp.test.com"; + + Assert.assertEquals(expected, actual); + } +} + diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64.java index 9f7cadfa5b497cf5de79fc77e80fa0f4b9a1bbf8..2e1650e7a103d002d0b814f961cf0926a5c52ec0 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.math.BigInteger; import java.nio.charset.Charset; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64OutputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64OutputStream.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64OutputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64OutputStream.java index f37551f4b085ef1f76f7609c3eb484c664afdb9f..6a087bba3d95046de935b92d5f837cdf9b896ef5 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Base64OutputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Base64OutputStream.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/CountingOutputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/CountingOutputStream.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/CountingOutputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/CountingOutputStream.java index 06b335b4282e67959740c0540a3e5d48bf6f1650..e9c3ae4baee55bc3097d424db7756e7e2d829789 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/CountingOutputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/CountingOutputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.IOException; import java.io.OutputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/EOLConvertingOutputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/EOLConvertingOutputStream.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/EOLConvertingOutputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/EOLConvertingOutputStream.java index 66ed5ef06af8aec1a7b0c985aab7633a4e52b5fc..6307ba7218d819ebd7fd2192657faa306166bd55 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/EOLConvertingOutputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/EOLConvertingOutputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/FixedLengthInputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/FixedLengthInputStream.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/FixedLengthInputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/FixedLengthInputStream.java index 9535822e0001f01929b6866ec6ede96e709b163a..beadbc5e6d5e0d66aee5bc836aa5b64cc942f728 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/FixedLengthInputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/FixedLengthInputStream.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.IOException; import java.io.InputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Hex.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Hex.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/Hex.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/Hex.java index 4ed2acfd7f8a9b2b607690f780716f4851339254..d49caefc1164205daa4aa2aa52ef393ab7c48e14 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/Hex.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/Hex.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; /** * This code was copied from the Apache Commons project. diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/LineWrapOutputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/LineWrapOutputStream.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/LineWrapOutputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/LineWrapOutputStream.java index 1656103e51445144a63eb488f4f00807698aaec3..4bdd2f03fb0a93207c4f8ca188d5499cad864fe8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/LineWrapOutputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/LineWrapOutputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/PeekableInputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/PeekableInputStream.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/PeekableInputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/PeekableInputStream.java index 4d8836fbb3fde23fa8216ccd8103fb404ddcce67..062cf39877d992a388f64b82335d07ec8e7bc801 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/PeekableInputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/PeekableInputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterInputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/SignSafeOutputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/SignSafeOutputStream.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/SignSafeOutputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/SignSafeOutputStream.java index 4b29f4276e62f4dde470fa635a7e21b0b7eea956..6ae3ffe9da4fd4a22e3f5fbdc9b2377bf064a5ae 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/SignSafeOutputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/SignSafeOutputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterOutputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/SmtpDataStuffing.java b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/SmtpDataStuffing.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/filter/SmtpDataStuffing.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/filter/SmtpDataStuffing.java index dfd7afd47233c0ca779ff640a476d30f68937ecf..703d944c226ce7091f5ee810a694a9bef27a6262 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/filter/SmtpDataStuffing.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/filter/SmtpDataStuffing.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.FilterOutputStream; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/helper/UrlEncodingHelper.java b/k9mail-library/src/main/java/foundation/e/mail/mail/helper/UrlEncodingHelper.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/helper/UrlEncodingHelper.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/helper/UrlEncodingHelper.java index 7523077d7bf37cf78acc2c3f44ac0fca8a9450fc..565cab2560afc2ca38c553c60f5f17eede9ea38a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/helper/UrlEncodingHelper.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/helper/UrlEncodingHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.helper; +package foundation.e.mail.mail.helper; import java.io.UnsupportedEncodingException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileBody.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileBody.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileBody.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileBody.java index 2c664bbfb428f493113f73104f0e1c81eec72a36..a5e122c30d8a94be8de70d599998fabcefbf9154 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileBody.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.File; @@ -9,8 +9,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.Base64OutputStream; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.Base64OutputStream; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.codec.QuotedPrintableOutputStream; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileMessageBody.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileMessageBody.java similarity index 84% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileMessageBody.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileMessageBody.java index e283fc5fd1f4ccd9f0f3fcfe1b9c803e8bcaa8ff..e8423972bfe1fafec30fbdc8bd584123862c56fe 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/BinaryTempFileMessageBody.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/BinaryTempFileMessageBody.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; import org.apache.james.mime4j.util.MimeUtil; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/CharsetSupport.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/CharsetSupport.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/CharsetSupport.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/CharsetSupport.java index 361957d67d768bad480fe72b27d8eff01ec06509..8297dded31a439daa52e0a12e480d2671b5bcf19 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/CharsetSupport.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/CharsetSupport.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; import org.apache.commons.io.IOUtils; import timber.log.Timber; @@ -13,7 +13,7 @@ import java.nio.charset.Charset; import java.nio.charset.IllegalCharsetNameException; import java.util.Locale; -import static com.fsck.k9.mail.internet.JisSupport.SHIFT_JIS; +import static foundation.e.mail.mail.internet.JisSupport.SHIFT_JIS; public class CharsetSupport { /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/DecoderUtil.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/DecoderUtil.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/DecoderUtil.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/DecoderUtil.java index 176b132f3ccf19ff72c4dd8e3bba07377377b5fd..4c23ac1a3b8a472c91b9ca5305bf2065d7785a00 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/DecoderUtil.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/DecoderUtil.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.ByteArrayInputStream; @@ -7,8 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; import okio.Buffer; import okio.ByteString; import okio.Okio; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/EncoderUtil.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/EncoderUtil.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/EncoderUtil.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/EncoderUtil.java index c271c090d25899228c1f346c72626ffe1a3c465e..b8f8d22c3d3425381460ee0fd19974523013d00a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/EncoderUtil.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/EncoderUtil.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.nio.ByteBuffer; import java.nio.charset.Charset; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/FlowedMessageUtils.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/FlowedMessageUtils.java similarity index 83% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/FlowedMessageUtils.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/FlowedMessageUtils.java index debc3e2d744a81e9857a02f84a7b378809f8462a..f76564c79cee89c78c9fd7ffcda7739afc44e83f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/FlowedMessageUtils.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/FlowedMessageUtils.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import static com.fsck.k9.mail.internet.MimeUtility.getHeaderParameter; -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; +import static foundation.e.mail.mail.internet.MimeUtility.getHeaderParameter; +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; class FlowedMessageUtils { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/Iso2022JpToShiftJisInputStream.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/Iso2022JpToShiftJisInputStream.java index 1078074c529efa512ab75d627dd7f2cede697e80..c877d920b83c94edf5aa814d3e72c7b491119755 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/Iso2022JpToShiftJisInputStream.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/Iso2022JpToShiftJisInputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.IOException; import java.io.InputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/JisSupport.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/JisSupport.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/JisSupport.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/JisSupport.java index 279d9bb3449e226b5e98266cc800e6ca1bd58993..1dafc1e8a4293763271ed2afac2766293f353e58 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/JisSupport.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/JisSupport.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; class JisSupport { public static final String SHIFT_JIS = "shift_jis"; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/ListHeaders.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/ListHeaders.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/ListHeaders.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/ListHeaders.java index f827225a836977c4756b3090b08cd10de1c78445..9d75387f8d291b039088b38727c73dd2ebbe14f1 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/ListHeaders.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/ListHeaders.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.util.ArrayList; @@ -8,8 +8,8 @@ import java.util.regex.Pattern; import android.net.MailTo; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageExtractor.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageExtractor.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageExtractor.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageExtractor.java index d7236851484071f2dc0015bea7da80c458894fba..f39527ace04310ded9a35651935af20eb90e519b 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageExtractor.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageExtractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.IOException; @@ -13,25 +13,25 @@ import java.util.regex.Pattern; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.Viewable.Flowed; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.Viewable.Flowed; import org.apache.commons.io.input.BoundedInputStream; import timber.log.Timber; -import static com.fsck.k9.mail.internet.CharsetSupport.fixupCharset; -import static com.fsck.k9.mail.internet.MimeUtility.getHeaderParameter; -import static com.fsck.k9.mail.internet.FlowedMessageUtils.isFormatFlowed; -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; -import static com.fsck.k9.mail.internet.Viewable.Alternative; -import static com.fsck.k9.mail.internet.Viewable.Html; -import static com.fsck.k9.mail.internet.Viewable.MessageHeader; -import static com.fsck.k9.mail.internet.Viewable.Text; -import static com.fsck.k9.mail.internet.Viewable.Textual; +import static foundation.e.mail.mail.internet.CharsetSupport.fixupCharset; +import static foundation.e.mail.mail.internet.MimeUtility.getHeaderParameter; +import static foundation.e.mail.mail.internet.FlowedMessageUtils.isFormatFlowed; +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; +import static foundation.e.mail.mail.internet.Viewable.Alternative; +import static foundation.e.mail.mail.internet.Viewable.Html; +import static foundation.e.mail.mail.internet.Viewable.MessageHeader; +import static foundation.e.mail.mail.internet.Viewable.Text; +import static foundation.e.mail.mail.internet.Viewable.Textual; public class MessageExtractor { public static final long NO_TEXT_SIZE_LIMIT = -1L; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageIdGenerator.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageIdGenerator.java similarity index 90% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageIdGenerator.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageIdGenerator.java index b2579ca378594a0145c27586979201e555d4c2d5..9a185f7b0de2e54bfa9940a359c16f34f320643c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MessageIdGenerator.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MessageIdGenerator.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.util.Locale; @@ -6,8 +6,8 @@ import java.util.UUID; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; public class MessageIdGenerator { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeBodyPart.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeBodyPart.java index 2b5a90667e1be32a32fb40a2f574c4ba0cf12d8e..79bf24b2d4e75be72c9348b303bd64fd957b2e96 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeBodyPart.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; import java.io.BufferedWriter; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeHeader.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeHeader.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeHeader.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeHeader.java index 2d9c4d23184caedba1bf639377ba84b8f11c2438..4f5b56db309d15cef5a7662b07af0dd2ac1d43e3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeHeader.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeHeader.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.BufferedWriter; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessage.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessage.java index 491b19f1c00f011e532edf3f506b9dca898a0d0e..5b72df60ed05722070d7fbaa34dd2e58f584f4ae 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessage.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.BufferedWriter; @@ -17,15 +17,15 @@ import java.util.TimeZone; import android.support.annotation.NonNull; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyFactory; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.DefaultBodyFactory; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyFactory; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.DefaultBodyFactory; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.dom.field.DateTimeField; @@ -143,7 +143,7 @@ public class MimeMessage extends Message { * * @see #mSentDate * @param sentDate - * @throws com.fsck.k9.mail.MessagingException + * @throws foundation.e.mail.mail.MessagingException */ public void addSentDate(Date sentDate, boolean hideTimeZone) { if (mDateFormat == null) { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessageHelper.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessageHelper.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessageHelper.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessageHelper.java index 4171dba64f6993c784f80975c23255a0347a4d42..ffa5077ffa6dffc6d2d9a072cafb45f869c444d2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessageHelper.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMessageHelper.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMultipart.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMultipart.java similarity index 92% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMultipart.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMultipart.java index 22a7ff98a16a66cfe07adfc0642eb0f081f3dc3c..38af5a82db548ccecbd05b0ed781b5e71182bf86 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMultipart.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeMultipart.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.BufferedWriter; @@ -8,10 +8,10 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.BoundaryGenerator; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.BoundaryGenerator; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; public class MimeMultipart extends Multipart { private String mimeType; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeUtility.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeUtility.java index fa544f3a4ae4790fa26fbbf6724a6d6c3b916b6c..12628afc32d422eb32763015f9d90af705eba7bb 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/MimeUtility.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.IOException; @@ -11,12 +11,12 @@ import java.util.regex.Pattern; import android.support.annotation.NonNull; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; import org.apache.james.mime4j.codec.Base64InputStream; import org.apache.james.mime4j.codec.QuotedPrintableInputStream; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/RawDataBody.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/RawDataBody.java similarity index 62% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/RawDataBody.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/RawDataBody.java index e3dee616e070a3d143d125ad012427e6fd81111c..9ef76a94bd7ae76dd8f482edf51340bfbfb9ea1f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/RawDataBody.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/RawDataBody.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Body; +import foundation.e.mail.mail.Body; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/SizeAware.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/SizeAware.java similarity index 56% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/SizeAware.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/SizeAware.java index 07d5fdef9d02f721d19cf44d6bdb0296ee175919..9ecf879de93f49f5722b5cab0540b983871cc11c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/SizeAware.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/SizeAware.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; public interface SizeAware { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/TextBody.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/TextBody.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/TextBody.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/TextBody.java index b0df752eb81c267d1083ad63269d590f92fc5e5c..b33f35ffbfce5dc6ca53dbe8f4dcbbe3db4249db 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/TextBody.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/TextBody.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.ByteArrayInputStream; @@ -10,10 +10,10 @@ import java.io.UnsupportedEncodingException; import android.support.annotation.Nullable; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.CountingOutputStream; -import com.fsck.k9.mail.filter.SignSafeOutputStream; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.CountingOutputStream; +import foundation.e.mail.mail.filter.SignSafeOutputStream; import org.apache.james.mime4j.codec.QuotedPrintableOutputStream; import org.apache.james.mime4j.util.MimeUtil; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/Viewable.java b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/Viewable.java similarity index 88% rename from k9mail-library/src/main/java/com/fsck/k9/mail/internet/Viewable.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/internet/Viewable.java index 40e6b6d3f48e3edf5a8a4f41952a9520807d84f4..abdb53095c9877c79d9e42d34cf4d9df501c85fb 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/Viewable.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/internet/Viewable.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; import java.util.List; /** * Empty marker class interface the class hierarchy used by - * {@link MessageExtractor#findViewablesAndAttachments(com.fsck.k9.mail.Part, java.util.List)} + * {@link MessageExtractor#findViewablesAndAttachments(foundation.e.mail.mail.Part, java.util.List)} * * @see Viewable.Text * @see Viewable.Html @@ -18,7 +18,7 @@ public interface Viewable { /** * Class representing textual parts of a message that aren't marked as attachments. * - * @see com.fsck.k9.mail.internet.MessageExtractor#isPartTextualBody(com.fsck.k9.mail.Part) + * @see foundation.e.mail.mail.internet.MessageExtractor#isPartTextualBody(foundation.e.mail.mail.Part) */ abstract class Textual implements Viewable { private Part mPart; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/message/MessageHeaderParser.java b/k9mail-library/src/main/java/foundation/e/mail/mail/message/MessageHeaderParser.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/message/MessageHeaderParser.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/message/MessageHeaderParser.java index 3e69c25f273399b7953e0177b18c0df70390b7bf..8f7f7200e4ff8bcea774047ac9a757faa19609bb 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/message/MessageHeaderParser.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/message/MessageHeaderParser.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mail.message; +package foundation.e.mail.mail.message; import java.io.IOException; import java.io.InputStream; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.parser.ContentHandler; import org.apache.james.mime4j.parser.MimeStreamParser; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/AuthorizationException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/AuthorizationException.java similarity index 88% rename from k9mail-library/src/main/java/com/fsck/k9/mail/oauth/AuthorizationException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/oauth/AuthorizationException.java index d43ed233178ba219f61c2ffc16d3d73ab3be6776..5fdd3934843cabce988e5a46d3cf44177f0af224 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/AuthorizationException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/AuthorizationException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.oauth; +package foundation.e.mail.mail.oauth; public class AuthorizationException extends Exception { public AuthorizationException(String detailMessage, Throwable throwable) { diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2AuthorizationCodeFlowTokenProvider.java b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2AuthorizationCodeFlowTokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..1abb4106b9ed03cf925cce7cbc64538f6ae4248e --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2AuthorizationCodeFlowTokenProvider.java @@ -0,0 +1,102 @@ +package foundation.e.mail.mail.oauth; + + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.OAuth2NeedUserPromptException; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class OAuth2AuthorizationCodeFlowTokenProvider { + /** + * A default timeout value to use when fetching tokens. + */ + public static int OAUTH2_TIMEOUT = 30000; + + private Map authTokens = new HashMap<>(); + + public void exchangeCode(String email, String code) throws AuthenticationFailedException { + SpecificOAuth2TokenProvider specificProvider = getSpecificProviderFromEmail(email); + Tokens tokens = specificProvider.exchangeCode(email, code); + + authTokens.put(email, tokens.accessToken); + saveRefreshToken(email, tokens.refreshToken); + } + + protected abstract void saveRefreshToken(String email, String refreshToken); + + /** + * Fetch a token. No guarantees are provided for validity. + * @param email Username + * @return Token string + * @throws AuthenticationFailedException throw when error occurs + * @throws OAuth2NeedUserPromptException throw it when user haven't allow us to login + */ + public String getToken(String email, long timeoutMillis) + throws AuthenticationFailedException, OAuth2NeedUserPromptException { + if (!authTokens.containsKey(email)) { + String refreshToken = getRefreshToken(email); + if (refreshToken != null) { + try { + refreshToken(email, refreshToken); + } catch (Exception e) { + throw new AuthenticationFailedException(e.getMessage()); + } + } else { + showAuthDialog(email); + throw new OAuth2NeedUserPromptException(); + } + } + return authTokens.get(email); + } + + protected abstract void showAuthDialog(String email) throws AuthenticationFailedException; + + /** + * get refresh token got before + * @param username username (usually email address) + * @return refresh token + */ + protected abstract String getRefreshToken(String username); + + /** + * refresh access token with refresh token + * @param email email address + * @param refreshToken refresh token got before + * @throws AuthenticationFailedException throws it when error occurs + */ + private void refreshToken(String email, String refreshToken) throws AuthenticationFailedException { + SpecificOAuth2TokenProvider provider = getSpecificProviderFromEmail(email); + String newToken = provider.refreshToken(email, refreshToken); + authTokens.put(email, newToken); + } + + /** + * Invalidate the token for this email. + * + *

+ * Note that the token should always be invalidated on credential failure. However invalidating a token every + * single time is not recommended. + *

+ * Invalidating a token and then failure with a new token should be treated as a permanent failure. + */ + public void invalidateAccessToken(String email) { + authTokens.remove(email); + } + + public abstract void invalidateRefreshToken(String username); + + protected abstract SpecificOAuth2TokenProvider getSpecificProviderFromEmail(String email); + + public static class Tokens { + String accessToken; + String refreshToken; + + public Tokens(String accessToken, String refreshToken) { + this.accessToken = accessToken; + this.refreshToken = refreshToken; + } + } +} + diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2TokenProvider.java b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2TokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..d4ae52ba0059fd3fcdcb2bc51c69bee441361473 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/OAuth2TokenProvider.java @@ -0,0 +1,19 @@ +package foundation.e.mail.mail.oauth; + + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.OAuth2NeedUserPromptException; + +public abstract class OAuth2TokenProvider { + /** + * A default timeout value to use when fetching tokens. + */ + public static int OAUTH2_TIMEOUT = 30000; + + public abstract String getToken(String email, long timeoutMillis) throws AuthenticationFailedException, + OAuth2NeedUserPromptException; + + public abstract void invalidateToken(String email); + public abstract void disconnectEmailWithK9(String email); + +} diff --git a/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/SpecificOAuth2TokenProvider.java b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/SpecificOAuth2TokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..07b5fde0a54a9fee7e000300d75a8658260fcf25 --- /dev/null +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/SpecificOAuth2TokenProvider.java @@ -0,0 +1,14 @@ +package foundation.e.mail.mail.oauth; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.MessagingException; + +public abstract class SpecificOAuth2TokenProvider { + + public abstract OAuth2AuthorizationCodeFlowTokenProvider.Tokens exchangeCode(String username, String code) throws AuthenticationFailedException; + + public abstract String refreshToken(String username, String refreshToken) throws AuthenticationFailedException; + + public abstract void showAuthDialog() throws AuthenticationFailedException; +} + diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/XOAuth2ChallengeParser.java b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/XOAuth2ChallengeParser.java similarity index 88% rename from k9mail-library/src/main/java/com/fsck/k9/mail/oauth/XOAuth2ChallengeParser.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/oauth/XOAuth2ChallengeParser.java index 9ec8665d35dbb593dba673641d540927ead68192..367ddc74b5a5f042ebc3ea0c26dbd47be80cedd2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/oauth/XOAuth2ChallengeParser.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/oauth/XOAuth2ChallengeParser.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.oauth; +package foundation.e.mail.mail.oauth; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.filter.Base64; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.filter.Base64; import org.json.JSONException; import org.json.JSONObject; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/power/TracingPowerManager.java b/k9mail-library/src/main/java/foundation/e/mail/mail/power/TracingPowerManager.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/power/TracingPowerManager.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/power/TracingPowerManager.java index e2ce4abdecb0893106ef7ede88654114f79b6b4b..3cecacb25750665a87005b6d14e79da180906b90 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/power/TracingPowerManager.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/power/TracingPowerManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.power; +package foundation.e.mail.mail.power; import java.util.Timer; @@ -10,7 +10,7 @@ import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.SystemClock; -import com.fsck.k9.mail.K9MailLib; +import foundation.e.mail.mail.K9MailLib; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/DefaultTrustedSocketFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/DefaultTrustedSocketFactory.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ssl/DefaultTrustedSocketFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ssl/DefaultTrustedSocketFactory.java index ff7f7374df1c85467ad46590d2c3bac890a21940..ae57ef1d935864dd9ddc1bdec0837656f99eb384 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/DefaultTrustedSocketFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/DefaultTrustedSocketFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; import java.io.IOException; @@ -14,7 +14,7 @@ import android.net.SSLCertificateSocketFactory; import android.os.Build; import android.text.TextUtils; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/KeyChainKeyManager.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/KeyChainKeyManager.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ssl/KeyChainKeyManager.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ssl/KeyChainKeyManager.java index 8611ac328c807ac4e4bc7e5a066298d95217bc56..7f567a90b5d4ce12b14264d4eda073fef23132ee 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/KeyChainKeyManager.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/KeyChainKeyManager.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; import java.net.Socket; import java.security.Principal; @@ -19,12 +19,12 @@ import android.os.Build; import android.security.KeyChain; import android.security.KeyChainException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.MessagingException; import timber.log.Timber; -import static com.fsck.k9.mail.CertificateValidationException.Reason; -import static com.fsck.k9.mail.CertificateValidationException.Reason.RetrievalFailure; +import static foundation.e.mail.mail.CertificateValidationException.Reason; +import static foundation.e.mail.mail.CertificateValidationException.Reason.RetrievalFailure; /** * For client certificate authentication! Provide private keys and certificates diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/LocalKeyStore.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/LocalKeyStore.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ssl/LocalKeyStore.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ssl/LocalKeyStore.java index 30fdd8e0ccb531b64d73f53545a78f478fe7c671..5bd386d9126fb802116431697b915d5e7dd9ff91 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/LocalKeyStore.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/LocalKeyStore.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; import java.io.File; import java.io.FileInputStream; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustManagerFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustManagerFactory.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustManagerFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustManagerFactory.java index cbdbfde6946d091516302674403505bf5409950f..397cdc3d0a35062136bcce6aa17d08567c8f1889 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustManagerFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustManagerFactory.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; -import com.fsck.k9.mail.CertificateChainException; +import foundation.e.mail.mail.CertificateChainException; import javax.net.ssl.SSLException; import javax.net.ssl.TrustManager; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustedSocketFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustedSocketFactory.java similarity index 81% rename from k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustedSocketFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustedSocketFactory.java index c3ce808fd0d23935a775633c283c6780dd57cf4d..6f7ad6ae9aef86852b874b4564af8081edc7d5a6 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/ssl/TrustedSocketFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/ssl/TrustedSocketFactory.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mail.ssl; +package foundation.e.mail.mail.ssl; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; import java.io.IOException; import java.net.Socket; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/RemoteStore.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/RemoteStore.java similarity index 54% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/RemoteStore.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/RemoteStore.java index 40dd0604168646ef9cfeaf1fc42e03c2ea9e8518..fd1c2ecac5301005cd2e49e9e41b8f12262a215b 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/RemoteStore.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/RemoteStore.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store; +package foundation.e.mail.mail.store; import java.util.HashMap; @@ -7,17 +7,18 @@ import java.util.Map; import android.content.Context; import android.net.ConnectivityManager; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.DefaultTrustedSocketFactory; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.imap.ImapStore; -import com.fsck.k9.mail.store.pop3.Pop3Store; -import com.fsck.k9.mail.store.webdav.WebDavHttpClient; -import com.fsck.k9.mail.store.webdav.WebDavStore; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.ssl.DefaultTrustedSocketFactory; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.imap.ImapStore; +import foundation.e.mail.mail.store.pop3.Pop3Store; +import foundation.e.mail.mail.store.webdav.WebDavHttpClient; +import foundation.e.mail.mail.store.webdav.WebDavStore; public abstract class RemoteStore extends Store { @@ -41,28 +42,31 @@ public abstract class RemoteStore extends Store { /** * Get an instance of a remote mail store. */ - public static synchronized Store getInstance(Context context, StoreConfig storeConfig) throws MessagingException { + public static synchronized Store getInstance(Context context, StoreConfig storeConfig, + OAuth2TokenProvider oAuth2TokenProvider) + throws MessagingException + { String uri = storeConfig.getStoreUri(); - if (uri.startsWith("local")) { + if (uri != null && uri.startsWith("local")) { throw new RuntimeException("Asked to get non-local Store object but given LocalStore URI"); } Store store = sStores.get(uri); if (store == null) { - if (uri.startsWith("imap")) { - OAuth2TokenProvider oAuth2TokenProvider = null; - store = new ImapStore( - storeConfig, - new DefaultTrustedSocketFactory(context), - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), - oAuth2TokenProvider); - } else if (uri.startsWith("pop3")) { - store = new Pop3Store(storeConfig, new DefaultTrustedSocketFactory(context)); - } else if (uri.startsWith("webdav")) { - store = new WebDavStore(storeConfig, new WebDavHttpClient.WebDavHttpClientFactory()); + if (uri != null) { + if (uri.startsWith("imap")) { + store = new ImapStore( + storeConfig, + new DefaultTrustedSocketFactory(context), + (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), + oAuth2TokenProvider); + } else if (uri.startsWith("pop3")) { + store = new Pop3Store(storeConfig, new DefaultTrustedSocketFactory(context)); + } else if (uri.startsWith("webdav")) { + store = new WebDavStore(storeConfig, new WebDavHttpClient.WebDavHttpClientFactory()); + } } - if (store != null) { sStores.put(uri, store); } @@ -78,7 +82,7 @@ public abstract class RemoteStore extends Store { /** * Release reference to a remote mail store instance. * - * @param storeConfig {@link com.fsck.k9.mail.store.StoreConfig} instance that is used to get the remote mail store instance. + * @param storeConfig {@link foundation.e.mail.mail.store.StoreConfig} instance that is used to get the remote mail store instance. */ public static void removeInstance(StoreConfig storeConfig) { String uri = storeConfig.getStoreUri(); @@ -90,17 +94,17 @@ public abstract class RemoteStore extends Store { } /** - * Decodes the contents of store-specific URIs and puts them into a {@link com.fsck.k9.mail.ServerSettings} + * Decodes the contents of store-specific URIs and puts them into a {@link foundation.e.mail.mail.ServerSettings} * object. * * @param uri * the store-specific URI to decode * - * @return A {@link com.fsck.k9.mail.ServerSettings} object holding the settings contained in the URI. + * @return A {@link foundation.e.mail.mail.ServerSettings} object holding the settings contained in the URI. * - * @see com.fsck.k9.mail.store.imap.ImapStore#decodeUri(String) - * @see com.fsck.k9.mail.store.pop3.Pop3Store#decodeUri(String) - * @see com.fsck.k9.mail.store.webdav.WebDavStore#decodeUri(String) + * @see foundation.e.mail.mail.store.imap.ImapStore#decodeUri(String) + * @see foundation.e.mail.mail.store.pop3.Pop3Store#decodeUri(String) + * @see foundation.e.mail.mail.store.webdav.WebDavStore#decodeUri(String) */ public static ServerSettings decodeStoreUri(String uri) { if (uri.startsWith("imap")) { @@ -115,16 +119,16 @@ public abstract class RemoteStore extends Store { } /** - * Creates a store URI from the information supplied in the {@link com.fsck.k9.mail.ServerSettings} object. + * Creates a store URI from the information supplied in the {@link foundation.e.mail.mail.ServerSettings} object. * * @param server - * The {@link com.fsck.k9.mail.ServerSettings} object that holds the server settings. + * The {@link foundation.e.mail.mail.ServerSettings} object that holds the server settings. * * @return A store URI that holds the same information as the {@code server} parameter. * - * @see com.fsck.k9.mail.store.imap.ImapStore#createUri(com.fsck.k9.mail.ServerSettings) - * @see com.fsck.k9.mail.store.pop3.Pop3Store#createUri(com.fsck.k9.mail.ServerSettings) - * @see com.fsck.k9.mail.store.webdav.WebDavStore#createUri(com.fsck.k9.mail.ServerSettings) + * @see foundation.e.mail.mail.store.imap.ImapStore#createUri(foundation.e.mail.mail.ServerSettings) + * @see foundation.e.mail.mail.store.pop3.Pop3Store#createUri(foundation.e.mail.mail.ServerSettings) + * @see foundation.e.mail.mail.store.webdav.WebDavStore#createUri(foundation.e.mail.mail.ServerSettings) */ public static String createStoreUri(ServerSettings server) { if (Type.IMAP == server.type) { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/StoreConfig.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/StoreConfig.java similarity index 70% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/StoreConfig.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/StoreConfig.java index aae86daf4e44025df894b6893298ef961f58cce8..d3899e3c90269ef4831cb5d956813725c5e8aae4 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/StoreConfig.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/StoreConfig.java @@ -1,11 +1,13 @@ -package com.fsck.k9.mail.store; +package foundation.e.mail.mail.store; -import com.fsck.k9.mail.NetworkType; +import foundation.e.mail.mail.NetworkType; public interface StoreConfig { String getStoreUri(); String getTransportUri(); + void setStoreUri(String storeUri); + void setTransportUri(String transportUri); boolean subscribedFoldersOnly(); boolean useCompression(NetworkType type); @@ -13,6 +15,11 @@ public interface StoreConfig { String getInboxFolderName(); String getOutboxFolderName(); String getDraftsFolderName(); + String getArchiveFolderName(); + String getTrashFolderName(); + String getSpamFolderName(); + String getSentFolderName(); + String getAutoExpandFolderName(); void setArchiveFolderName(String name); void setDraftsFolderName(String name); @@ -32,6 +39,4 @@ public interface StoreConfig { int getDisplayCount(); int getIdleRefreshMinutes(); - - boolean shouldHideHostname(); } diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/AlertResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/AlertResponse.java similarity index 80% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/AlertResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/AlertResponse.java index 49d4c8086f6de506cff494a40ba74eb43df54489..9f4c030ffa318bd045502bcb0b3be61d918bc08e 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/AlertResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/AlertResponse.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class AlertResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Capabilities.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Capabilities.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Capabilities.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Capabilities.java index a50a21d3b7ebd55f4a1f2c9123ae0233cf2c1cae..b24a2efd14d70aee9c84f4633397b84d90d18553 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Capabilities.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Capabilities.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; class Capabilities { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/CapabilityResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/CapabilityResponse.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/CapabilityResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/CapabilityResponse.java index 01b2b7ff603fb9d9d631dd146cdbdccce6d8b125..2e45f5cec5a9a3e2e850813a502cc6eff0396dca 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/CapabilityResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/CapabilityResponse.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; @@ -7,7 +7,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class CapabilityResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Commands.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Commands.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Commands.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Commands.java index c5137cae272005a2aba0c1c88383b929ed05901b..36b2fc8019f746dd2430fcd62d5cacd5651fc7c5 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Commands.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Commands.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; class Commands { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchBodyCallback.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchBodyCallback.java similarity index 82% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchBodyCallback.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchBodyCallback.java index f276337d1117dd6d7ecc1aa6882ff13c0f40e734..2e57e5af27c956358aa4d38000e89501a07d1016 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchBodyCallback.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchBodyCallback.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; import java.util.Map; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.FixedLengthInputStream; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.FixedLengthInputStream; class FetchBodyCallback implements ImapResponseCallback { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchPartCallback.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchPartCallback.java similarity index 79% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchPartCallback.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchPartCallback.java index 3b38ee5799aa0e43a12d312b52def2dbc47dcacc..b41d134ae1eb2e2a7fd750f054cb5ea1cb07f503 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FetchPartCallback.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FetchPartCallback.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; -import com.fsck.k9.mail.BodyFactory; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.filter.FixedLengthInputStream; -import com.fsck.k9.mail.internet.MimeHeader; +import foundation.e.mail.mail.BodyFactory; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.filter.FixedLengthInputStream; +import foundation.e.mail.mail.internet.MimeHeader; class FetchPartCallback implements ImapResponseCallback { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FolderNameCodec.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FolderNameCodec.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FolderNameCodec.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FolderNameCodec.java index 948b036741b85cecf5b5ba33bd27f2faf1ba704b..8a7f2995c338e1c68dc55e5c6c72fc145bf935a8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/FolderNameCodec.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/FolderNameCodec.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.nio.ByteBuffer; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/IdGrouper.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/IdGrouper.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/IdGrouper.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/IdGrouper.java index a33f9e07f37960d07628b40ac26badad43f5b089..5147b91ee6f3c31fe593edede31d55930c41242a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/IdGrouper.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/IdGrouper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapCommandSplitter.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapCommandSplitter.java similarity index 92% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapCommandSplitter.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapCommandSplitter.java index 486b6a83846461e95bc71eae170a1d1cb197e09a..43d50e71da4ce044065affb5b51c369c6badb258 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapCommandSplitter.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapCommandSplitter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; @@ -6,8 +6,8 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import com.fsck.k9.mail.store.imap.IdGrouper.ContiguousIdGroup; -import com.fsck.k9.mail.store.imap.IdGrouper.GroupedIds; +import foundation.e.mail.mail.store.imap.IdGrouper.ContiguousIdGroup; +import foundation.e.mail.mail.store.imap.IdGrouper.GroupedIds; class ImapCommandSplitter { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapConnection.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapConnection.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapConnection.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapConnection.java index 9a687466fbb070f28d59157d178afe732086641b..091a3cec82504f41553180446f943f426c050b46 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapConnection.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapConnection.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.BufferedInputStream; @@ -30,30 +30,31 @@ import java.util.zip.InflaterInputStream; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import com.fsck.k9.mail.Authentication; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.NetworkType; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.filter.PeekableInputStream; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.oauth.XOAuth2ChallengeParser; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.imap.IdGrouper.GroupedIds; +import foundation.e.mail.mail.Authentication; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.filter.PeekableInputStream; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.oauth.XOAuth2ChallengeParser; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.imap.IdGrouper.GroupedIds; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import javax.net.ssl.SSLException; import org.apache.commons.io.IOUtils; import timber.log.Timber; -import static com.fsck.k9.mail.ConnectionSecurity.STARTTLS_REQUIRED; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_IMAP; -import static com.fsck.k9.mail.store.RemoteStore.SOCKET_CONNECT_TIMEOUT; -import static com.fsck.k9.mail.store.RemoteStore.SOCKET_READ_TIMEOUT; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.ConnectionSecurity.STARTTLS_REQUIRED; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_IMAP; +import static foundation.e.mail.mail.store.RemoteStore.SOCKET_CONNECT_TIMEOUT; +import static foundation.e.mail.mail.store.RemoteStore.SOCKET_READ_TIMEOUT; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; /** @@ -396,8 +397,9 @@ class ImapConnection { return attemptXOAuth2(); } catch (NegativeImapResponseException e) { //TODO: Check response code so we don't needlessly invalidate the token. + if(e.getMessage().contains("Too many simultaneous connections")) + throw new MessagingException("Too many simultaneous connections"); oauthTokenProvider.invalidateToken(settings.getUsername()); - if (!retryXoauth2WithNewToken) { throw handlePermanentXoauth2Failure(e); } else { @@ -425,12 +427,13 @@ class ImapConnection { //Invalidate the token anyway but assume it's permanent. Timber.v(e, "Authentication exception for new token, permanent error assumed"); oauthTokenProvider.invalidateToken(settings.getUsername()); + oauthTokenProvider.disconnectEmailWithK9(settings.getUsername()); throw handlePermanentXoauth2Failure(e2); } } private List attemptXOAuth2() throws MessagingException, IOException { - String token = oauthTokenProvider.getToken(settings.getUsername(), OAuth2TokenProvider.OAUTH2_TIMEOUT); + String token = oauthTokenProvider.getToken(settings.getUsername(), OAuth2AuthorizationCodeFlowTokenProvider.OAUTH2_TIMEOUT); String authString = Authentication.computeXoauth(settings.getUsername(), token); String tag = sendSaslIrCommand(Commands.AUTHENTICATE_XOAUTH2, authString, true); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolder.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolder.java index 14cec2a311db68369d481abb37cb6d2fea4f6a1b..c658f28eb920cc92c8eba46cf3bae49fc62b673c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.ByteArrayInputStream; @@ -19,25 +19,25 @@ import java.util.concurrent.ConcurrentHashMap; import android.text.TextUtils; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyFactory; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.filter.EOLConvertingOutputStream; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeMessageHelper; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyFactory; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.filter.EOLConvertingOutputStream; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeMessageHelper; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; import timber.log.Timber; -import static com.fsck.k9.mail.store.imap.ImapUtility.getLastResponse; +import static foundation.e.mail.mail.store.imap.ImapUtility.getLastResponse; class ImapFolder extends Folder { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolderPusher.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolderPusher.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolderPusher.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolderPusher.java index 5c5274b1d8fba83a6a292c10fd4bebf15993b771..f44e3a2be792615ae2fc36858bbb8828316a9cd4 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapFolderPusher.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapFolderPusher.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -14,19 +14,19 @@ import java.util.Set; import android.content.Context; import android.os.PowerManager; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; -import com.fsck.k9.mail.store.RemoteStore; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.store.RemoteStore; import timber.log.Timber; -import static com.fsck.k9.mail.K9MailLib.PUSH_WAKE_LOCK_TIMEOUT; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.K9MailLib.PUSH_WAKE_LOCK_TIMEOUT; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class ImapFolderPusher extends ImapFolder { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapList.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapList.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapList.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapList.java index 10ee086f835278da3feb098032b95745a37a3a62..cdcfcbcfd8602f59bce8f6e844d1140646f467c0 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapList.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapList.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; import java.text.DateFormat; import java.text.ParseException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapMessage.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapMessage.java similarity index 78% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapMessage.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapMessage.java index e533cac6dd156844facc164fb3b788e7c322cf2a..ca64407360590e1c62ec4698f246dd89553c174b 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapMessage.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapMessage.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; class ImapMessage extends MimeMessage { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPushState.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPushState.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPushState.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPushState.java index b784e7f4b10598f3434675e9d9056d1df518c657..4e81daa58c3af7f0cd5e8306b25fe12ed83acbfe 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPushState.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPushState.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPusher.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPusher.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPusher.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPusher.java index 7e8da541322ade34541b591e3d3f9d9922869205..ae9082c2b1bac9366246549d37836103bdeda9a2 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapPusher.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapPusher.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; import java.util.List; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mail.Pusher; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mail.Pusher; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponse.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponse.java index f5ce67f03be343bb3eba98f9d07ed08e9fceb9df..32861d2d73b82012fb84610dd7c0bc37b112cd83 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponse.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; /** * Represents a single response from the IMAP server. diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseCallback.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseCallback.java similarity index 90% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseCallback.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseCallback.java index 79256a21818696ee47823f9bf08f79869e4f2f5d..a850148dc774aedc7bad815e44d41aae04266b35 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseCallback.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseCallback.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.filter.FixedLengthInputStream; +import foundation.e.mail.mail.filter.FixedLengthInputStream; interface ImapResponseCallback { /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParser.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParser.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParser.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParser.java index c22f87384ccc4e098e219ffc14d549ffa854a032..68b9e52212778c101f22f87a5eb1ea2f9e59b35f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParser.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -6,12 +6,12 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.filter.FixedLengthInputStream; -import com.fsck.k9.mail.filter.PeekableInputStream; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.filter.FixedLengthInputStream; +import foundation.e.mail.mail.filter.PeekableInputStream; import timber.log.Timber; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_IMAP; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_IMAP; class ImapResponseParser { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParserException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParserException.java similarity index 80% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParserException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParserException.java index 0238d9d5bbc976382e9d16450e02cf86b9da5fdb..8e156d28904f360fec7c7aea0a3435f5b13b9a41 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapResponseParserException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapResponseParserException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; public class ImapResponseParserException extends RuntimeException { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSearcher.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSearcher.java similarity index 62% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSearcher.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSearcher.java index e10150eede314be8a56ad5d2f23a492b5ab1a155..4e57a55d10ed6655c6041426e220f06762571dd7 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSearcher.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSearcher.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; import java.util.List; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; interface ImapSearcher { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSettings.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSettings.java similarity index 78% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSettings.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSettings.java index f822ccf4b42fa5841bc91a8bee660b144f9f3c71..ab2e99d82816c924c36a88a09db6bcfac41174e3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapSettings.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapSettings.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.NetworkType; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.NetworkType; /** * Settings source for IMAP. Implemented in order to remove coupling between {@link ImapStore} and {@link ImapConnection}. diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStore.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStore.java index 9888dff00492021ddb8c7eb34cfddac89fd14ef3..bf0c23d3f397a7263e4795729b7a2d466a646074 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStore.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -17,19 +17,20 @@ import java.util.Set; import android.net.ConnectivityManager; import android.support.annotation.Nullable; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.NetworkType; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mail.Pusher; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mail.Pusher; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mail.store.StoreConfig; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreSettings.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreSettings.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreSettings.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreSettings.java index 1321babebffcb9df1afcb2fb2185fce6b8dc942f..fa5299eff6fbf6ed57b7e04cd291bbcd12c0d9db 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreSettings.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreSettings.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.HashMap; import java.util.Map; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriCreator.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriCreator.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriCreator.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriCreator.java index b5d9ced4834b271e197c84fe55d719de2f913732..d7391015abfe46b9f656d74c4cd7a7bbe73f3c31 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriCreator.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriCreator.java @@ -1,14 +1,14 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ServerSettings; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ServerSettings; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; class ImapStoreUriCreator { @@ -20,7 +20,7 @@ class ImapStoreUriCreator { * * @return An ImapStore URI that holds the same information as the {@code server} parameter. * - * @see com.fsck.k9.mail.store.StoreConfig#getStoreUri() + * @see foundation.e.mail.mail.store.StoreConfig#getStoreUri() * @see ImapStore#decodeUri(String) */ public static String create(ServerSettings server) { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriDecoder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriDecoder.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriDecoder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriDecoder.java index c343028025a80d95db1ddc9f8251be22a7fe07fb..2a8667c3411b28553fb7c47edeaaebf99205f159 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStoreUriDecoder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapStoreUriDecoder.java @@ -1,15 +1,15 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.net.URI; import java.net.URISyntaxException; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.ServerSettings.Type; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; class ImapStoreUriDecoder { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapUtility.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapUtility.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapUtility.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapUtility.java index 29f619a6f0c93714b96d45f99441d1fe9f48e7c1..d05f3a926b01caebe8eef3aa4b811570d8cde522 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapUtility.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ImapUtility.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; import timber.log.Timber; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ListResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ListResponse.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ListResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ListResponse.java index caf28837e4bd91c5741e7b39e31a01320a0d3e0e..b8e8adddb805f8f63169f38bd616d47595342d14 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ListResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ListResponse.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; @@ -7,7 +7,7 @@ import java.util.List; import android.support.annotation.Nullable; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class ListResponse { private final List attributes; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NamespaceResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NamespaceResponse.java similarity index 92% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NamespaceResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NamespaceResponse.java index 85ee2cdfacc54dfaa1285e9579697143e6c37d60..048714f64d640795defa2f2ca2797e577cb240fc 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NamespaceResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NamespaceResponse.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.List; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class NamespaceResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NegativeImapResponseException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NegativeImapResponseException.java similarity index 85% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NegativeImapResponseException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NegativeImapResponseException.java index 6a1c44f0c4585101f0152e9f61323b93df38e190..44965fb36505d835e3a29e19bfbbf67dfb1dc995 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/NegativeImapResponseException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/NegativeImapResponseException.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.List; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class NegativeImapResponseException extends MessagingException { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponse.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponse.java index 40f3d5b54dbb0a1f06be3beedc030ba2e9507a61..cb2423ad51d8fd297b6ab424c43328df713ad061 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponse.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; @@ -6,9 +6,9 @@ import java.util.HashSet; import java.util.Locale; import java.util.Set; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class PermanentFlagsResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractor.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractor.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractor.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractor.java index 2f622c4d472879c109375176443b08933b00c448..57742029fbf2e0c82ad540c77ee698329449a788 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractor.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; class ResponseCodeExtractor { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Responses.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Responses.java similarity index 94% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Responses.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Responses.java index 3647d6d6212b28babc4b8a90b455f71620188ac2..23a6b082486d911633316e2616fbfff9455523e5 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/Responses.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/Responses.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; class Responses { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SearchResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SearchResponse.java similarity index 90% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SearchResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SearchResponse.java index 3fac2905df571a0f528f2b3edaf8190cc31d0977..1406514843dd37c77f4336f5c83302efe7e7aab3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SearchResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SearchResponse.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; import java.util.List; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class SearchResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponse.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponse.java index 8c09a9c295e1542c7c1386c372a3e80ce8636afc..795fade8956d030517cfe10c99e364a8be43ed44 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponse.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.Folder; +import foundation.e.mail.mail.Folder; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; class SelectOrExamineResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidCopyResponse.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidCopyResponse.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidCopyResponse.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidCopyResponse.java index 9d17389a3e54d17b9f35f4d448f6576996c46450..3ae4dcd4fc60a88e6ee8726c516337852cce0182 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidCopyResponse.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidCopyResponse.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import static com.fsck.k9.mail.store.imap.ImapResponseParser.equalsIgnoreCase; -import static com.fsck.k9.mail.store.imap.ImapUtility.getImapSequenceValues; +import static foundation.e.mail.mail.store.imap.ImapResponseParser.equalsIgnoreCase; +import static foundation.e.mail.mail.store.imap.ImapUtility.getImapSequenceValues; class UidCopyResponse { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilder.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilder.java index 631986b4913ddf88a899b21a714be12affaaf8d9..d1ed7e1dc1eb4cdb1e5f8b7db4a4e5307fad4bac 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilder.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Set; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; class UidSearchCommandBuilder { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UntaggedHandler.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UntaggedHandler.java similarity index 76% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UntaggedHandler.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UntaggedHandler.java index 7dc724499578506669aef13639111399548b1d89..3b5e478943dc8b2aefc9e4105b1d41529f4d27f4 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/UntaggedHandler.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/imap/UntaggedHandler.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/pop3/Pop3Store.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/pop3/Pop3Store.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/pop3/Pop3Store.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/pop3/Pop3Store.java index ad5a8f9698f3b2a220e1a803d2d82b14902c5b54..54ff1ad61d223ead493af90249180bb60cb8e7f8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/pop3/Pop3Store.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/pop3/Pop3Store.java @@ -1,16 +1,16 @@ -package com.fsck.k9.mail.store.pop3; +package foundation.e.mail.mail.store.pop3; import android.annotation.SuppressLint; -import com.fsck.k9.mail.*; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.filter.Hex; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.*; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.filter.Hex; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mail.store.StoreConfig; import javax.net.ssl.SSLException; import timber.log.Timber; @@ -33,10 +33,10 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_POP3; -import static com.fsck.k9.mail.CertificateValidationException.Reason.MissingCapability; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_POP3; +import static foundation.e.mail.mail.CertificateValidationException.Reason.MissingCapability; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; public class Pop3Store extends RemoteStore { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ConnectionInfo.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ConnectionInfo.java similarity index 83% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ConnectionInfo.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ConnectionInfo.java index e7eb69d4e203cd7714c07b670af150521d56ab83..7b2cf6b417f5462828001fffd305dd681109fc5c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ConnectionInfo.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ConnectionInfo.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; /** * Simple data container for passing connection information. diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/DataSet.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/DataSet.java similarity index 99% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/DataSet.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/DataSet.java index 7685ae74924bab153ca3ff10b8f7851dcdb046c5..caaa87ec0a14f8a419d665e6f5a04d5e649d962a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/DataSet.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/DataSet.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import java.text.DateFormat; import java.text.SimpleDateFormat; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/HttpGeneric.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/HttpGeneric.java similarity index 87% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/HttpGeneric.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/HttpGeneric.java index 008b2aa4325bd276aa3134938ffd7d14cb57c552..d8a6c886e9d978bfcb383e1e014d6fbb38aa7213 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/HttpGeneric.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/HttpGeneric.java @@ -1,15 +1,15 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.K9MailLib; +import foundation.e.mail.mail.K9MailLib; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import timber.log.Timber; import java.net.URI; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; /** * New HTTP Method that allows changing of the method and generic handling Needed for WebDAV custom methods such as diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ParsedMessageEnvelope.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ParsedMessageEnvelope.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ParsedMessageEnvelope.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ParsedMessageEnvelope.java index f4d8a23e631cc311bb1f5c95d81fa25c40fe2575..9920a73aba8e3a3bc1ad59fdb8ee7d5c943213cb 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/ParsedMessageEnvelope.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/ParsedMessageEnvelope.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import java.util.ArrayList; import java.util.Collections; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavConstants.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavConstants.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavConstants.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavConstants.java index 43da179673eb25d916c6cde9e6488588e5b72fd7..d24fc8029637bbd40bc0ed0ff3ca05f7a7ea2c4c 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavConstants.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavConstants.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; /** * WebDAV constants diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavFolder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavFolder.java similarity index 97% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavFolder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavFolder.java index 165f566b298617022030e9cd61a250662d0a193e..3b8b73b411c3e462ea00a7f0fd6716d5351ac413 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavFolder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavFolder.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.EOLConvertingOutputStream; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.EOLConvertingOutputStream; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; @@ -33,8 +33,8 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; /** * A WebDav Folder diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHandler.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHandler.java similarity index 96% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHandler.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHandler.java index 76ebd903b875b60df904caf7868648f54a96e816..045b9951c03ddc741b9ac25ece0ca8c130b85afd 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHandler.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHandler.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import org.xml.sax.Attributes; import org.xml.sax.SAXException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHttpClient.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHttpClient.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHttpClient.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHttpClient.java index 05bda8a81e78032072778e3d10e085b0bb4edefe..86772a5c4b5705cc86a5d404eccbebc525904818 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavHttpClient.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavHttpClient.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import org.apache.http.Header; import org.apache.http.HttpEntity; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavMessage.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavMessage.java similarity index 89% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavMessage.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavMessage.java index 1c4f3ee4b5ab4708ed5d20e7b7d8da841eb22916..921a5464879c15117e8ad98abc09e769e82e6db3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavMessage.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavMessage.java @@ -1,17 +1,17 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; import timber.log.Timber; import java.util.Collections; import java.util.Locale; import java.util.Map; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; /** * A WebDav Message diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavSocketFactory.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavSocketFactory.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavSocketFactory.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavSocketFactory.java index 003707b32dd8122069de711410fa3e66c03383e1..5eae928f6edde99d1a4281262c99507783698cff 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavSocketFactory.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavSocketFactory.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.ssl.DefaultTrustedSocketFactory; +import foundation.e.mail.mail.ssl.DefaultTrustedSocketFactory; import org.apache.http.conn.ConnectTimeoutException; import org.apache.http.conn.scheme.LayeredSocketFactory; import org.apache.http.params.HttpParams; -import com.fsck.k9.mail.ssl.TrustManagerFactory; +import foundation.e.mail.mail.ssl.TrustManagerFactory; import java.io.IOException; import java.net.InetAddress; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStore.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStore.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStore.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStore.java index 5a0a2d421c75b830a7d80901bd9fd991636cff5d..677242102328894ee1fc59fb87652a5899be0ab3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStore.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStore.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import java.io.BufferedReader; @@ -16,16 +16,16 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mail.store.StoreConfig; import javax.net.ssl.SSLException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -48,8 +48,8 @@ import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import timber.log.Timber; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_WEBDAV; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreSettings.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreSettings.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreSettings.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreSettings.java index 4afc1b23d5cb3c1145aebff7a04715e718f99f50..5c616a7700fd2970c2f9823e9cc2a2831518c25f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreSettings.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreSettings.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; import java.util.HashMap; import java.util.Map; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriCreator.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriCreator.java similarity index 90% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriCreator.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriCreator.java index ef62f808e6f8341fddfc09fbfd167362b388b616..7ed7597ccb0caad6ac790fd13a08d3d85ece6d37 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriCreator.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriCreator.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.store.StoreConfig; import java.net.URI; import java.net.URISyntaxException; import java.util.Map; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.encodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.encodeUtf8; public class WebDavStoreUriCreator { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriDecoder.java b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriDecoder.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriDecoder.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriDecoder.java index 698ffbef9e9c1865137c9e72486c4854db94cd3c..6cfde827425b03e31ae7397ad5c94c50b4192019 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/webdav/WebDavStoreUriDecoder.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/store/webdav/WebDavStoreUriDecoder.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.ConnectionSecurity; +import foundation.e.mail.mail.ConnectionSecurity; import java.net.URI; import java.net.URISyntaxException; -import static com.fsck.k9.mail.helper.UrlEncodingHelper.decodeUtf8; +import static foundation.e.mail.mail.helper.UrlEncodingHelper.decodeUtf8; public class WebDavStoreUriDecoder { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/WebDavTransport.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/WebDavTransport.java similarity index 68% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/WebDavTransport.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/WebDavTransport.java index 1054818fc2367beb62fef89dbdb7d55cd0f85db8..62bf38701222fcaba1cc095521573aae425c7036 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/WebDavTransport.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/WebDavTransport.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail.transport; - -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Transport; -import com.fsck.k9.mail.store.StoreConfig; -import com.fsck.k9.mail.store.webdav.WebDavHttpClient; -import com.fsck.k9.mail.store.webdav.WebDavStore; +package foundation.e.mail.mail.transport; + +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Transport; +import foundation.e.mail.mail.store.StoreConfig; +import foundation.e.mail.mail.store.webdav.WebDavHttpClient; +import foundation.e.mail.mail.store.webdav.WebDavStore; import timber.log.Timber; import java.util.Collections; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java index 7be1e11f739864398525c19de5226e2d8e4c1c5f..5a5111493e497eeddd45c55b592dfabb9459fa3f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/EnhancedNegativeSmtpReplyException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; class EnhancedNegativeSmtpReplyException extends NegativeSmtpReplyException { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/NegativeSmtpReplyException.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/NegativeSmtpReplyException.java similarity index 91% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/NegativeSmtpReplyException.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/NegativeSmtpReplyException.java index 4a822030fbbdfd4f7de757b3eaa768d9e26aaa8c..7ff9900cab66fc7a5f3916e3435fbce9d2dfa7df 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/NegativeSmtpReplyException.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/NegativeSmtpReplyException.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; import android.text.TextUtils; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; /** diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/SmtpTransport.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/SmtpTransport.java similarity index 95% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/SmtpTransport.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/SmtpTransport.java index 1a3a7e13452cdf2b2ab6426dcc0a9af66d75fd10..6ebdd29cedb7f185a90de0bd8d6303a19bbc3737 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/SmtpTransport.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/SmtpTransport.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; import java.io.BufferedInputStream; @@ -25,36 +25,37 @@ import java.util.Queue; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.Authentication; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.Transport; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.filter.EOLConvertingOutputStream; -import com.fsck.k9.mail.filter.LineWrapOutputStream; -import com.fsck.k9.mail.filter.PeekableInputStream; -import com.fsck.k9.mail.filter.SmtpDataStuffing; -import com.fsck.k9.mail.internet.CharsetSupport; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.oauth.XOAuth2ChallengeParser; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.Authentication; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.Transport; +import foundation.e.mail.mail.TransportUris; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.filter.EOLConvertingOutputStream; +import foundation.e.mail.mail.filter.LineWrapOutputStream; +import foundation.e.mail.mail.filter.PeekableInputStream; +import foundation.e.mail.mail.filter.SmtpDataStuffing; +import foundation.e.mail.mail.internet.CharsetSupport; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.oauth.XOAuth2ChallengeParser; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.StoreConfig; import javax.net.ssl.SSLException; import org.apache.commons.io.IOUtils; import timber.log.Timber; -import static com.fsck.k9.mail.CertificateValidationException.Reason.MissingCapability; -import static com.fsck.k9.mail.K9MailLib.DEBUG_PROTOCOL_SMTP; +import static foundation.e.mail.mail.CertificateValidationException.Reason.MissingCapability; +import static foundation.e.mail.mail.K9MailLib.DEBUG_PROTOCOL_SMTP; public class SmtpTransport extends Transport { private static final int SMTP_CONTINUE_REQUEST = 334; @@ -85,7 +86,7 @@ public class SmtpTransport extends Transport { public SmtpTransport(StoreConfig storeConfig, TrustedSocketFactory trustedSocketFactory, - OAuth2TokenProvider oauthTokenProvider) throws MessagingException { + OAuth2TokenProvider oAuth2TokenProvider) throws MessagingException { ServerSettings settings; try { settings = TransportUris.decodeTransportUri(storeConfig.getTransportUri()); @@ -108,8 +109,7 @@ public class SmtpTransport extends Transport { clientCertificateAlias = settings.clientCertificateAlias; this.trustedSocketFactory = trustedSocketFactory; - this.oauthTokenProvider = oauthTokenProvider; - this.shouldHideHostname = storeConfig.shouldHideHostname(); + this.oauthTokenProvider = oAuth2TokenProvider; } @Override @@ -818,7 +818,7 @@ public class SmtpTransport extends Transport { } private void attemptXoauth2(String username) throws MessagingException, IOException { - String token = oauthTokenProvider.getToken(username, OAuth2TokenProvider.OAUTH2_TIMEOUT); + String token = oauthTokenProvider.getToken(username, OAuth2AuthorizationCodeFlowTokenProvider.OAUTH2_TIMEOUT); String authString = Authentication.computeXoauth(username, token); CommandResponse response = executeSensitiveCommand("AUTH XOAUTH2 %s", authString); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeClass.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeClass.java similarity index 92% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeClass.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeClass.java index f56f28942357b5de704acb011de421a78b879ae9..a26c26b028e3e26134c3c1f6d36397821734113f 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeClass.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeClass.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; enum StatusCodeClass { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeDetail.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeDetail.java similarity index 98% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeDetail.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeDetail.java index 2ea73fe3c6150e7418604175c7d75b1bcb76d9fe..c1a6fe6004672cb647f5fdee84ff688e431616e8 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeDetail.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeDetail.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; enum StatusCodeDetail { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeSubject.java b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeSubject.java similarity index 93% rename from k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeSubject.java rename to k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeSubject.java index ff004f3068fc9240b7fd781621db76bc8d076c4f..f75acb74e8cd417a2c9d084c7cfd64502d7c638a 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/smtp/StatusCodeSubject.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mail/transport/smtp/StatusCodeSubject.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.transport.smtp; +package foundation.e.mail.mail.transport.smtp; enum StatusCodeSubject { diff --git a/k9mail-library/src/main/java/com/fsck/k9/mailstore/BinaryMemoryBody.java b/k9mail-library/src/main/java/foundation/e/mail/mailstore/BinaryMemoryBody.java similarity index 81% rename from k9mail-library/src/main/java/com/fsck/k9/mailstore/BinaryMemoryBody.java rename to k9mail-library/src/main/java/foundation/e/mail/mailstore/BinaryMemoryBody.java index a2de736e91a451fadc6a036ae7f96fc1644bb962..49e028ec9f0a15d995eecb141aea1a6d1f205ca3 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mailstore/BinaryMemoryBody.java +++ b/k9mail-library/src/main/java/foundation/e/mail/mailstore/BinaryMemoryBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; @@ -6,10 +6,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.RawDataBody; -import com.fsck.k9.mail.internet.SizeAware; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.RawDataBody; +import foundation.e.mail.mail.internet.SizeAware; public class BinaryMemoryBody implements Body, RawDataBody, SizeAware { diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeMessageParseTest.java b/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeMessageParseTest.java deleted file mode 100644 index a6e827477e124d77ace2fcd369603cc388b559dc..0000000000000000000000000000000000000000 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeMessageParseTest.java +++ /dev/null @@ -1,335 +0,0 @@ -package com.fsck.k9.mail.internet; - - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.junit.Before; -import org.junit.Test; - -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.Multipart; - -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - - -@RunWith(K9LibRobolectricTestRunner.class) -public class MimeMessageParseTest { - @Before - public void setup() { - BinaryTempFileBody.setTempDirectory(new File(System.getProperty("java.io.tmpdir"))); - } - - @Test - public void testSinglePart7BitNoRecurse() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: 7bit\r\n" + - "\r\n" + - "this is some test text.")); - - checkAddresses(msg.getFrom(), "adam@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "eva@example.org"); - assertEquals("Testmail", msg.getSubject()); - assertEquals("text/plain", msg.getContentType()); - assertEquals("this is some test text.", streamToString(MimeUtility.decodeBody(msg.getBody()))); - } - - @Test - public void headerFieldNameWithSpace() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream("" + - "From : \r\n" + - "\r\n" + - "Body")); - - assertEquals("", msg.getHeader("From")[0]); - } - - @Test - public void testSinglePart8BitRecurse() throws Exception { - MimeMessage msg = parseWithRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain; encoding=ISO-8859-1\r\n" + - "Content-Transfer-Encoding: 8bit\r\n" + - "\r\n" + - "gefährliche Umlaute")); - - checkAddresses(msg.getFrom(), "adam@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "eva@example.org"); - assertEquals("Testmail", msg.getSubject()); - assertEquals("text/plain; encoding=ISO-8859-1", msg.getContentType()); - assertEquals("gefährliche Umlaute", streamToString(MimeUtility.decodeBody(msg.getBody()))); - } - - @Test - public void testSinglePartBase64NoRecurse() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: base64\r\n" + - "\r\n" + - "dGhpcyBpcyBzb21lIG1vcmUgdGVzdCB0ZXh0Lg==\r\n")); - - checkAddresses(msg.getFrom(), "adam@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "eva@example.org"); - assertEquals("Testmail", msg.getSubject()); - assertEquals("text/plain", msg.getContentType()); - assertEquals("this is some more test text.", streamToString(MimeUtility.decodeBody(msg.getBody()))); - } - - @Test - public void testMultipartSingleLayerNoRecurse() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail 2\r\n" + - "MIME-Version: 1.0\n" + - "Content-Type: multipart/mixed; boundary=frontier\n" + - "\n" + - "This is a message with multiple parts in MIME format.\n" + - "--frontier\n" + - "Content-Type: text/plain\n" + - "\n" + - "This is the body of the message.\n" + - "--frontier\n" + - "Content-Type: application/octet-stream\n" + - "Content-Transfer-Encoding: base64\n" + - "\n" + - "PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg\n" + - "Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\n" + - "--frontier--")); - - checkAddresses(msg.getFrom(), "x@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "y@example.org"); - assertEquals("Testmail 2", msg.getSubject()); - assertEquals("multipart/mixed; boundary=frontier", msg.getContentType()); - checkLeafParts(msg, - "This is the body of the message.", - "\n" + - " \n" + - " \n" + - " \n" + - "

This is the body of the message.

\n" + - " \n" + - "\n" + - ""); - } - - @Test - public void decodeBody_withUnknownEncoding_shouldReturnUnmodifiedBodyContents() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: utf-8\r\n" + - "\r\n" + - "dGhpcyBpcyBzb21lIG1vcmUgdGVzdCB0ZXh0Lg==\r\n")); - - InputStream inputStream = MimeUtility.decodeBody(msg.getBody()); - - assertEquals("dGhpcyBpcyBzb21lIG1vcmUgdGVzdCB0ZXh0Lg==\r\n", streamToString(inputStream)); - } - - @Test - public void testMultipartSingleLayerRecurse() throws Exception { - MimeMessage msg = parseWithRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail 2\r\n" + - "MIME-Version: 1.0\n" + - "Content-Type: multipart/mixed; boundary=frontier\n" + - "\n" + - "This is a message with multiple parts in MIME format.\n" + - "--frontier\n" + - "Content-Type: text/plain\n" + - "\n" + - "This is the body of the message.\n" + - "--frontier\n" + - "Content-Type: application/octet-stream\n" + - "Content-Transfer-Encoding: base64\n" + - "\n" + - "PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg\n" + - "Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg=\n" + - "--frontier--")); - - checkAddresses(msg.getFrom(), "x@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "y@example.org"); - assertEquals("Testmail 2", msg.getSubject()); - assertEquals("multipart/mixed; boundary=frontier", msg.getContentType()); - checkLeafParts(msg, - "This is the body of the message.", - "\n" + - " \n" + - " \n" + - " \n" + - "

This is the body of the message.

\n" + - " \n" + - "\n" + - ""); - } - - @Test - public void testMultipartTwoLayersRecurse() throws Exception { - MimeMessage msg = parseWithRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Subject: Testmail 2\r\n" + - "MIME-Version: 1.0\n" + - "Content-Type: multipart/mixed; boundary=1\n" + - "\n" + - "This is a message with multiple parts in MIME format.\n" + - "--1\n" + - "Content-Type: text/plain\n" + - "\n" + - "some text in the first part\n" + - "--1\n" + - "Content-Type: multipart/alternative; boundary=2\n" + - "\n" + - "--2\n" + - "Content-Type: text/plain\n" + - "\n" + - "alternative 1\n" + - "--2\n" + - "Content-Type: text/plain\n" + - "\n" + - "alternative 2\n" + - "--2--\n" + - "--1--")); - - checkAddresses(msg.getFrom(), "x@example.org"); - checkAddresses(msg.getRecipients(RecipientType.TO), "y@example.org"); - assertEquals("Testmail 2", msg.getSubject()); - assertEquals("multipart/mixed; boundary=1", msg.getContentType()); - checkLeafParts(msg, - "some text in the first part", - "alternative 1", - "alternative 2"); - } - - - private static ByteArrayInputStream toStream(String rawMailData) throws Exception { - return new ByteArrayInputStream(rawMailData.getBytes("ISO-8859-1")); - } - - private static MimeMessage parseWithoutRecurse(InputStream data) throws Exception { - return MimeMessage.parseMimeMessage(data, false); - } - - private static MimeMessage parseWithRecurse(InputStream data) throws Exception { - return MimeMessage.parseMimeMessage(data, true); - } - - private static void checkAddresses(Address[] actual, String... expected) { - for (int i = 0; i < actual.length; i++) { - assertEquals(actual[i].toEncodedString(), expected[i]); - } - assertEquals(expected.length, actual.length); - } - - private static String streamToString(InputStream stream) throws Exception { - return IOUtils.toString(stream, "ISO-8859-1"); - } - - private static List getLeafParts(Body body) { - if (body instanceof Multipart) { - List ret = new ArrayList(); - for (BodyPart child : ((Multipart) body).getBodyParts()) { - ret.addAll(getLeafParts(child.getBody())); - } - return ret; - } else { - return Collections.singletonList(body); - } - } - - private static void checkLeafParts(MimeMessage msg, String... expectedParts) throws Exception { - List actual = new ArrayList(); - for (Body leaf : getLeafParts(msg.getBody())) { - actual.add(streamToString(MimeUtility.decodeBody(leaf))); - } - assertEquals(Arrays.asList(expectedParts), actual); - } - - @Test - public void getRecipients_withXOriginalTo() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "X-Original-To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: 7bit\r\n" + - "\r\n" + - "this is some test text.")); - - Address[] xOriginalAddresses = msg.getRecipients(RecipientType.X_ORIGINAL_TO); - - assertEquals(1, xOriginalAddresses.length); - assertEquals(new Address(""), xOriginalAddresses[0]); - } - - @Test - public void getRecipients_withDeliveredTo() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "Delivered-To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: 7bit\r\n" + - "\r\n" + - "this is some test text.")); - - Address[] deliveredToAddresses = msg.getRecipients(RecipientType.DELIVERED_TO); - - assertEquals(1, deliveredToAddresses.length); - assertEquals(new Address(""), deliveredToAddresses[0]); - } - - @Test - public void getRecipients_withXEnvelopeTo() throws Exception { - MimeMessage msg = parseWithoutRecurse(toStream( - "From: \r\n" + - "To: \r\n" + - "X-Envelope-To: \r\n" + - "Subject: Testmail\r\n" + - "MIME-Version: 1.0\r\n" + - "Content-type: text/plain\r\n" + - "Content-Transfer-Encoding: 7bit\r\n" + - "\r\n" + - "this is some test text.")); - - Address[] xEnvelopeToAddresses = msg.getRecipients(RecipientType.X_ENVELOPE_TO); - - assertEquals(1, xEnvelopeToAddresses.length); - assertEquals(new Address(""), xEnvelopeToAddresses[0]); - } - - -} diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/transport/smtp/SmtpTransportTest.java b/k9mail-library/src/test/java/com/fsck/k9/mail/transport/smtp/SmtpTransportTest.java deleted file mode 100644 index bdfa73ce0d3c71a5edd468ee7ad21df3657590f7..0000000000000000000000000000000000000000 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/transport/smtp/SmtpTransportTest.java +++ /dev/null @@ -1,1029 +0,0 @@ -package com.fsck.k9.mail.transport.smtp; - - -import java.io.IOException; -import java.net.InetAddress; - -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.mail.XOAuth2ChallengeParserTest; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.helpers.TestMessageBuilder; -import com.fsck.k9.mail.helpers.TestTrustedSocketFactory; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.StoreConfig; -import com.fsck.k9.mail.transport.mockServer.MockSmtpServer; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InOrder; - -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; -import static org.junit.Assert.assertEquals; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - - -@RunWith(K9LibRobolectricTestRunner.class) -public class SmtpTransportTest { - private static final String USERNAME = "user"; - private static final String PASSWORD = "password"; - private static final String CLIENT_CERTIFICATE_ALIAS = null; - - - private TrustedSocketFactory socketFactory; - private OAuth2TokenProvider oAuth2TokenProvider; - private StoreConfig storeConfig = mock(StoreConfig.class); - - - @Before - public void before() throws AuthenticationFailedException { - socketFactory = TestTrustedSocketFactory.newInstance(); - oAuth2TokenProvider = mock(OAuth2TokenProvider.class); - when(oAuth2TokenProvider.getToken(eq(USERNAME), anyInt())) - .thenReturn("oldToken").thenReturn("newToken"); - } - - @Test - public void SmtpTransport_withValidTransportUri() throws Exception { - StoreConfig storeConfig = setupStoreConfigWithTransportUri("smtp://user:password:CRAM_MD5@server:123456"); - - new SmtpTransport(storeConfig, socketFactory, oAuth2TokenProvider); - } - - @Test(expected = MessagingException.class) - public void SmtpTransport_withInvalidTransportUri_shouldThrow() throws Exception { - StoreConfig storeConfig = setupStoreConfigWithTransportUri("smpt://"); - - new SmtpTransport(storeConfig, socketFactory, oAuth2TokenProvider); - } - - @Test - public void open_withShouldHideHostnameTrue_shouldProvideLocalhost() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 OK"); - when(storeConfig.shouldHideHostname()).thenReturn(true); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE, null, - "private.host.org", "127.0.0.1"); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withShouldHideHostnameFalse_shouldProvideHostname() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO visible.host.org"); - server.output("250-localhost Hello client.localhost"); - server.output("250 OK"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE, null, - "visible.host.org", "127.0.0.1"); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withEmptyHostname_shouldProvideIPAddress() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO [127.0.0.1]"); - server.output("250-localhost Hello client.localhost"); - server.output("250 OK"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE, null, - "", "127.0.0.1"); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withEmptyHostnameAndIP_shouldProvideSensibleDefault() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO android"); - server.output("250-localhost Hello client.localhost"); - server.output("250 OK"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE, null, - "", ""); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withoutAuthLoginExtension_shouldConnectWithoutAuthentication() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 OK"); - SmtpTransport transport = startServerAndCreateSmtpTransportWithoutPassword(server); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withAuthPlainExtension() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH PLAIN LOGIN"); - server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withAuthLoginExtension() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH LOGIN"); - server.expect("AUTH LOGIN"); - server.output("250 OK"); - server.expect("dXNlcg=="); - server.output("250 OK"); - server.expect("cGFzc3dvcmQ="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withoutLoginAndPlainAuthExtensions_shouldThrow() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (MessagingException e) { - assertEquals("Authentication methods SASL PLAIN and LOGIN are unavailable.", e.getMessage()); - } - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withCramMd5AuthExtension() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH CRAM-MD5"); - server.expect("AUTH CRAM-MD5"); - server.output(Base64.encode("<24609.1047914046@localhost>")); - server.expect("dXNlciA3NmYxNWEzZmYwYTNiOGI1NzcxZmNhODZlNTcyMDk2Zg=="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.CRAM_MD5, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withoutCramMd5AuthExtension_shouldThrow() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH PLAIN LOGIN"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.CRAM_MD5, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (MessagingException e) { - assertEquals("Authentication method CRAM-MD5 is unavailable.", e.getMessage()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldThrowOn401Response() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 "+ XOAuth2ChallengeParserTest.STATUS_401_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (AuthenticationFailedException e) { - assertEquals( - "5.7.1 Username and Password not accepted. Learn more at " + - "5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68", - e.getMessage()); - } - - InOrder inOrder = inOrder(oAuth2TokenProvider); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - inOrder.verify(oAuth2TokenProvider).invalidateToken(USERNAME); - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldInvalidateAndRetryOn400Response() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 "+ XOAuth2ChallengeParserTest.STATUS_400_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG5ld1Rva2VuAQE="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - transport.open(); - - InOrder inOrder = inOrder(oAuth2TokenProvider); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - inOrder.verify(oAuth2TokenProvider).invalidateToken(USERNAME); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldInvalidateAndRetryOnInvalidJsonResponse() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 "+ XOAuth2ChallengeParserTest.INVALID_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG5ld1Rva2VuAQE="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - transport.open(); - - InOrder inOrder = inOrder(oAuth2TokenProvider); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - inOrder.verify(oAuth2TokenProvider).invalidateToken(USERNAME); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldInvalidateAndRetryOnMissingStatusJsonResponse() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 "+ XOAuth2ChallengeParserTest.MISSING_STATUS_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG5ld1Rva2VuAQE="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - transport.open(); - - InOrder inOrder = inOrder(oAuth2TokenProvider); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - inOrder.verify(oAuth2TokenProvider).invalidateToken(USERNAME); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldThrowOnMultipleFailure() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 " + XOAuth2ChallengeParserTest.STATUS_400_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG5ld1Rva2VuAQE="); - server.output("334 " + XOAuth2ChallengeParserTest.STATUS_400_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("QUIT"); - server.output("221 BYE"); - - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (AuthenticationFailedException e) { - assertEquals( - "5.7.1 Username and Password not accepted. Learn more at " + - "5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68", - e.getMessage()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withXoauth2Extension_shouldThrowOnFailure_fetchingToken() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH XOAUTH2"); - server.expect("QUIT"); - server.output("221 BYE"); - when(oAuth2TokenProvider.getToken(anyString(), anyInt())).thenThrow(new AuthenticationFailedException("Failed to fetch token")); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (AuthenticationFailedException e) { - assertEquals("Failed to fetch token", e.getMessage()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withoutXoauth2Extension_shouldThrow() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH PLAIN LOGIN"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (MessagingException e) { - assertEquals("Authentication method XOAUTH2 is unavailable.", e.getMessage()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withAuthExternalExtension() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH EXTERNAL"); - server.expect("AUTH EXTERNAL dXNlcg=="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.EXTERNAL, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withoutAuthExternalExtension_shouldThrow() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.EXTERNAL, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (CertificateValidationException e) { - assertEquals(CertificateValidationException.Reason.MissingCapability, e.getReason()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withAutomaticAuthAndNoTransportSecurityAndAuthCramMd5Extension_shouldUseAuthCramMd5() - throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH CRAM-MD5"); - server.expect("AUTH CRAM-MD5"); - server.output(Base64.encode("<24609.1047914046@localhost>")); - server.expect("dXNlciA3NmYxNWEzZmYwYTNiOGI1NzcxZmNhODZlNTcyMDk2Zg=="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.AUTOMATIC, - ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withAutomaticAuthAndNoTransportSecurityAndAuthPlainExtension_shouldThrow() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250 AUTH PLAIN LOGIN"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.AUTOMATIC, - ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (MessagingException e) { - assertEquals("Update your outgoing server authentication setting. AUTOMATIC auth. is unavailable.", - e.getMessage()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withEhloFailing_shouldTryHelo() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("502 5.5.1, Unrecognized command."); - server.expect("HELO localhost"); - server.output("250 localhost"); - SmtpTransport transport = startServerAndCreateSmtpTransportWithoutPassword(server); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withSupportWithEnhancedStatusCodesOnAuthFailure_shouldThrowEncodedMessage() - throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - server.output("250-ENHANCEDSTATUSCODES"); - server.output("250 AUTH XOAUTH2"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("334 " + XOAuth2ChallengeParserTest.STATUS_401_RESPONSE); - server.expect(""); - server.output("535-5.7.1 Username and Password not accepted. Learn more at"); - server.output("535 5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68"); - server.expect("QUIT"); - server.output("221 BYE"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - try { - transport.open(); - fail("Exception expected"); - } catch (AuthenticationFailedException e) { - assertEquals( - "Username and Password not accepted. " + - "Learn more at http://support.google.com/mail/bin/answer.py?answer=14257 hx9sm5317360pbc.68", - e.getMessage()); - } - - InOrder inOrder = inOrder(oAuth2TokenProvider); - inOrder.verify(oAuth2TokenProvider).getToken(eq(USERNAME), anyInt()); - inOrder.verify(oAuth2TokenProvider).invalidateToken(USERNAME); - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void open_withManyExtensions_shouldParseAll() throws Exception { - MockSmtpServer server = new MockSmtpServer(); - server.output("220 smtp.gmail.com ESMTP x25sm19117693wrx.27 - gsmtp"); - server.expect("EHLO localhost"); - server.output("250-smtp.gmail.com at your service, [86.147.34.216]"); - server.output("250-SIZE 35882577"); - server.output("250-8BITMIME"); - server.output("250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"); - server.output("250-ENHANCEDSTATUSCODES"); - server.output("250-PIPELINING"); - server.output("250-CHUNKING"); - server.output("250 SMTPUTF8"); - server.expect("AUTH XOAUTH2 dXNlcj11c2VyAWF1dGg9QmVhcmVyIG9sZFRva2VuAQE="); - server.output("235 2.7.0 Authentication successful"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server, AuthType.XOAUTH2, ConnectionSecurity.NONE); - - transport.open(); - - server.verifyConnectionStillOpen(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_withoutAddressToSendTo_shouldNotOpenConnection() throws Exception { - MimeMessage message = new MimeMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionNeverCreated(); - } - - @Test - public void sendMessage_withSingleRecipient() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication(); - server.expect("MAIL FROM:"); - server.output("250 OK"); - server.expect("RCPT TO:"); - server.output("250 OK"); - server.expect("DATA"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("250 OK: queued as 12345"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_with8BitEncoding() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("8BITMIME"); - server.expect("MAIL FROM: BODY=8BITMIME"); - server.output("250 OK"); - server.expect("RCPT TO:"); - server.output("250 OK"); - server.expect("DATA"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("250 OK: queued as 12345"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_with8BitEncodingExtensionNotCaseSensitive() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("8bitmime"); - server.expect("MAIL FROM: BODY=8BITMIME"); - server.output("250 OK"); - server.expect("RCPT TO:"); - server.output("250 OK"); - server.expect("DATA"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("250 OK: queued as 12345"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_withMessageTooLarge_shouldThrow() throws Exception { - Message message = getDefaultMessageBuilder() - .setHasAttachments(true) - .messageSize(1234L) - .build(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("SIZE 1000"); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected message too large error"); - } catch (MessagingException e) { - assertTrue(e.isPermanentFailure()); - assertEquals("Message too large for server", e.getMessage()); - } - - //FIXME: Make sure connection was closed - //server.verifyConnectionClosed(); - } - - @Test - public void sendMessage_withNegativeReply_shouldThrow() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication(); - server.expect("MAIL FROM:"); - server.output("250 OK"); - server.expect("RCPT TO:"); - server.output("250 OK"); - server.expect("DATA"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("421 4.7.0 Temporary system problem"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected exception"); - } catch (NegativeSmtpReplyException e) { - assertEquals(421, e.getReplyCode()); - assertEquals("4.7.0 Temporary system problem", e.getReplyText()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_withPipelining() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("PIPELINING"); - server.expect("MAIL FROM:"); - server.expect("RCPT TO:"); - server.expect("DATA"); - server.output("250 OK"); - server.output("250 OK"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("250 OK: queued as 12345"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessage_withoutPipelining() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication(); - server.expect("MAIL FROM:"); - server.output("250 OK"); - server.expect("RCPT TO:"); - server.output("250 OK"); - server.expect("DATA"); - server.output("354 End data with ."); - server.expect("[message data]"); - server.expect("."); - server.output("250 OK: queued as 12345"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - transport.sendMessage(message); - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessagePipelining_withNegativeReply() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("PIPELINING"); - server.expect("MAIL FROM:"); - server.expect("RCPT TO:"); - server.expect("DATA"); - server.output("250 OK"); - server.output("550 remote mail to not allowed"); - server.output("354 End data with ."); - server.expect("."); - server.output("554 no valid recipients"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected exception"); - } catch (NegativeSmtpReplyException e) { - assertEquals(550, e.getReplyCode()); - assertEquals("remote mail to not allowed", e.getReplyText()); - } - - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessagePipelining_without354ReplyforData_shouldThrow() throws Exception { - Message message = getDefaultMessage(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("PIPELINING"); - server.expect("MAIL FROM:"); - server.expect("RCPT TO:"); - server.expect("DATA"); - server.output("250 OK"); - server.output("550 remote mail to not allowed"); - server.output("554 no valid recipients given"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected exception"); - } catch (NegativeSmtpReplyException e) { - assertEquals(554, e.getReplyCode()); - assertEquals("no valid recipients given", e.getReplyText()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessagePipelining_with250and550ReplyforRecipients_shouldThrow() throws Exception { - Message message = getMessageWithTwoRecipients(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("PIPELINING"); - server.expect("MAIL FROM:"); - server.expect("RCPT TO:"); - server.expect("RCPT TO:"); - server.expect("DATA"); - server.output("250 OK"); - server.output("250 OK"); - server.output("550 remote mail to not allowed"); - server.output("354 End data with ."); - server.expect("."); - server.output("554 no valid recipients given"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected exception"); - } catch (NegativeSmtpReplyException e) { - assertEquals(550, e.getReplyCode()); - assertEquals("remote mail to not allowed", e.getReplyText()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - @Test - public void sendMessagePipelining_with250and550ReplyforRecipientsAnd250ForMessage_shouldThrow() throws Exception { - Message message = getMessageWithTwoRecipients(); - MockSmtpServer server = createServerAndSetupForPlainAuthentication("PIPELINING"); - server.expect("MAIL FROM:"); - server.expect("RCPT TO:"); - server.expect("RCPT TO:"); - server.expect("DATA"); - server.output("250 OK"); - server.output("250 OK"); - server.output("550 remote mail to not allowed"); - server.output("354 End data with ."); - server.expect("."); - server.output("250 OK"); - server.expect("QUIT"); - server.output("221 BYE"); - server.closeConnection(); - SmtpTransport transport = startServerAndCreateSmtpTransport(server); - - try { - transport.sendMessage(message); - fail("Expected exception"); - } catch (NegativeSmtpReplyException e) { - assertEquals(550, e.getReplyCode()); - assertEquals("remote mail to not allowed", e.getReplyText()); - } - - server.verifyConnectionClosed(); - server.verifyInteractionCompleted(); - } - - - private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server) throws IOException, - MessagingException { - return startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE); - } - - private SmtpTransport startServerAndCreateSmtpTransportWithoutPassword(MockSmtpServer server) throws IOException, - MessagingException { - return startServerAndCreateSmtpTransport(server, AuthType.PLAIN, ConnectionSecurity.NONE, null, - "localhost", "127.0.0.1"); - } - - private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server, AuthType authenticationType, - ConnectionSecurity connectionSecurity) throws IOException, MessagingException { - return startServerAndCreateSmtpTransport(server, authenticationType, connectionSecurity, PASSWORD, - "localhost", "127.0.0.1"); - } - - private SmtpTransport startServerAndCreateSmtpTransport(MockSmtpServer server, AuthType authenticationType, - ConnectionSecurity connectionSecurity, String password, - String injectedHostname, String injectedIP) throws IOException, MessagingException { - server.start(); - - String host = server.getHost(); - int port = server.getPort(); - ServerSettings serverSettings = new ServerSettings( - Type.SMTP, - host, - port, - connectionSecurity, - authenticationType, - USERNAME, - password, - CLIENT_CERTIFICATE_ALIAS); - String uri = TransportUris.createTransportUri(serverSettings); - StoreConfig storeConfig = setupStoreConfigWithTransportUri(uri); - - return new TestSmtpTransport(storeConfig, socketFactory, oAuth2TokenProvider, injectedHostname, injectedIP); - } - - private StoreConfig setupStoreConfigWithTransportUri(String value) { - when(storeConfig.getTransportUri()).thenReturn(value); - return storeConfig; - } - - private TestMessageBuilder getDefaultMessageBuilder() { - return new TestMessageBuilder() - .from("user@localhost") - .to("user2@localhost"); - } - - private Message getDefaultMessage() { - return getDefaultMessageBuilder().build(); - } - - private Message getMessageWithTwoRecipients() { - return new TestMessageBuilder() - .from("user@localhost") - .to("user2@localhost", "user3@localhost") - .build(); - } - - private MockSmtpServer createServerAndSetupForPlainAuthentication(String... extensions) { - MockSmtpServer server = new MockSmtpServer(); - - server.output("220 localhost Simple Mail Transfer Service Ready"); - server.expect("EHLO localhost"); - server.output("250-localhost Hello client.localhost"); - - for (String extension : extensions) { - server.output("250-" + extension); - } - - server.output("250 AUTH LOGIN PLAIN CRAM-MD5"); - server.expect("AUTH PLAIN AHVzZXIAcGFzc3dvcmQ="); - server.output("235 2.7.0 Authentication successful"); - - return server; - } - - - static class TestSmtpTransport extends SmtpTransport { - private final String injectedHostname; - private final String injectedIP; - - TestSmtpTransport(StoreConfig storeConfig, TrustedSocketFactory trustedSocketFactory, - OAuth2TokenProvider oAuth2TokenProvider, - String injectedHostname, String injectedIP) - throws MessagingException { - super(storeConfig, trustedSocketFactory, oAuth2TokenProvider); - this.injectedHostname = injectedHostname; - this.injectedIP = injectedIP; - } - - @Override - protected String getCanonicalHostName(InetAddress localAddress) { - return injectedHostname; - } - - @Override - protected String getHostAddress(InetAddress localAddress) { - return injectedIP; - } - } -} diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/AddressTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/AddressTest.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/AddressTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/AddressTest.java index 1fa329163cb605f44aa8099846ba19eb7a093b02..216ee816e46feb1518a6a1b6fbcffc86eb4bdc08 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/AddressTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/AddressTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/Address_quoteAtoms.java b/k9mail-library/src/test/java/foundation/e/mail/mail/Address_quoteAtoms.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/Address_quoteAtoms.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/Address_quoteAtoms.java index 8c8698425e1f450b0fd8209618037c68327dc1c7..71006d2a361a1728b9c010ce06900a5fd86ee23d 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/Address_quoteAtoms.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/Address_quoteAtoms.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/BoundaryGeneratorTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/BoundaryGeneratorTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/BoundaryGeneratorTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/BoundaryGeneratorTest.java index eca4606b7e610f06fe1f905a18cd27b75814ee77..2fd3439bd12cd8df59d86336e2b5e729083285e8 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/BoundaryGeneratorTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/BoundaryGeneratorTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import java.util.Random; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/K9LibRobolectricTestRunner.java b/k9mail-library/src/test/java/foundation/e/mail/mail/K9LibRobolectricTestRunner.java similarity index 94% rename from k9mail-library/src/test/java/com/fsck/k9/mail/K9LibRobolectricTestRunner.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/K9LibRobolectricTestRunner.java index 561c594e87727cbfe6ffc1b5d08b8d89889bd276..ede621a94a0b2893ba4a3cfc77cb9c017dc24f98 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/K9LibRobolectricTestRunner.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/K9LibRobolectricTestRunner.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import org.junit.runners.model.InitializationError; import org.robolectric.RobolectricTestRunner; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/MessageTest.kt b/k9mail-library/src/test/java/foundation/e/mail/mail/MessageTest.kt similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/MessageTest.kt rename to k9mail-library/src/test/java/foundation/e/mail/mail/MessageTest.kt index 706db42f4a621f702868d2369140d4485a73f495..5c9d0f451f5b37a119eee3fd0e20446937318585 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/MessageTest.kt +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/MessageTest.kt @@ -1,8 +1,8 @@ -package com.fsck.k9.mail +package foundation.e.mail.mail -import com.fsck.k9.mail.Message.RecipientType -import com.fsck.k9.mail.internet.* +import foundation.e.mail.mail.Message.RecipientType +import foundation.e.mail.mail.internet.* import com.google.common.truth.Truth.assertThat import okio.Buffer import org.apache.james.mime4j.util.MimeUtil diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/TransportUrisTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/TransportUrisTest.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/TransportUrisTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/TransportUrisTest.java index ce13af539b686b234f1069673177f3df0cb97f7a..3ee547a95a770650f51cebb5c58b1140b8525040 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/TransportUrisTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/TransportUrisTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; import android.annotation.SuppressLint; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/XOAuth2ChallengeParserTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/XOAuth2ChallengeParserTest.java similarity index 90% rename from k9mail-library/src/test/java/com/fsck/k9/mail/XOAuth2ChallengeParserTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/XOAuth2ChallengeParserTest.java index e1308940e1476205f5489ce3aee83a7749149ede..97003b4b7996436c67511e6fb57ee74daaba0112 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/XOAuth2ChallengeParserTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/XOAuth2ChallengeParserTest.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mail; +package foundation.e.mail.mail; -import com.fsck.k9.mail.filter.Base64; +import foundation.e.mail.mail.filter.Base64; public class XOAuth2ChallengeParserTest { diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/EOLConvertingOutputStreamTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/EOLConvertingOutputStreamTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/filter/EOLConvertingOutputStreamTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/filter/EOLConvertingOutputStreamTest.java index 5091e626f35161fdc8630ad3eef2772ecb3f873a..4f8da65f2fb50eb49e8bb995c3358b47a0672819 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/EOLConvertingOutputStreamTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/EOLConvertingOutputStreamTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import org.junit.Before; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/FixedLengthInputStreamTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/FixedLengthInputStreamTest.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/filter/FixedLengthInputStreamTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/filter/FixedLengthInputStreamTest.java index b750b5dc349e652f92d58854b5f52f000e111cab..8fdbeab985ff96883cecbd85568fd9abcf0c0c13 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/FixedLengthInputStreamTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/FixedLengthInputStreamTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.IOException; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/SignSafeOutputStreamTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/SignSafeOutputStreamTest.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/filter/SignSafeOutputStreamTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/filter/SignSafeOutputStreamTest.java index c9013a68a627c3b930c27647edf6b3a5838a62a6..2a52d37ec102c34ce18c7e2b8977081dd8c8eda3 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/SignSafeOutputStreamTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/SignSafeOutputStreamTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.ByteArrayOutputStream; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/SmtpDataStuffingTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/SmtpDataStuffingTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/filter/SmtpDataStuffingTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/filter/SmtpDataStuffingTest.java index 1b20217b8106b63d66a3905f6f7645e268c0223e..ae8a6ad0244e4459c8ef6385f48b5b6b5e85c873 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/filter/SmtpDataStuffingTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/filter/SmtpDataStuffingTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.filter; +package foundation.e.mail.mail.filter; import java.io.IOException; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/KeyStoreProvider.java b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/KeyStoreProvider.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/helpers/KeyStoreProvider.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/helpers/KeyStoreProvider.java index 493e4afa89c8f40b4fb34653595ffdf363bfbcb7..e05391407597bf1d6093511daf338ba948c88e94 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/KeyStoreProvider.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/KeyStoreProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.helpers; +package foundation.e.mail.mail.helpers; import java.io.InputStream; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessage.java b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessage.java similarity index 90% rename from k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessage.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessage.java index c867b0fbab79f95663e492a830b45d630255cc6e..9ef174952b288a30014e0ac1b23b308814ca48fa 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessage.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessage.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.helpers; +package foundation.e.mail.mail.helpers; import java.io.IOException; import java.io.OutputStream; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; import okio.BufferedSink; import okio.Okio; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessageBuilder.java b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessageBuilder.java similarity index 89% rename from k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessageBuilder.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessageBuilder.java index f8d545e2e5b30c0f0a9ff8922f75b29ce3a91ba3..e55143c7a5d9d132c59d8352c2fd0ded6b2865f2 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestMessageBuilder.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestMessageBuilder.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.helpers; +package foundation.e.mail.mail.helpers; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Message; public class TestMessageBuilder { diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestTrustedSocketFactory.java b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestTrustedSocketFactory.java similarity index 91% rename from k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestTrustedSocketFactory.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestTrustedSocketFactory.java index 1d32b1a26192603fcb59fbf09b6d851befb053b3..92d914996c0e709e9f11504e11159211ade1beec 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/TestTrustedSocketFactory.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/TestTrustedSocketFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.helpers; +package foundation.e.mail.mail.helpers; import java.io.IOException; @@ -7,8 +7,8 @@ import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/VeryTrustingTrustManager.java b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/VeryTrustingTrustManager.java similarity index 95% rename from k9mail-library/src/test/java/com/fsck/k9/mail/helpers/VeryTrustingTrustManager.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/helpers/VeryTrustingTrustManager.java index a455d55326de3a5b625e7ff1f12a38ce627825be..ba6622f2bfe31ac2a510ee931a28f6f3187598ba 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/helpers/VeryTrustingTrustManager.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/helpers/VeryTrustingTrustManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.helpers; +package foundation.e.mail.mail.helpers; import android.annotation.SuppressLint; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/CharsetSupportTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/CharsetSupportTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/CharsetSupportTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/CharsetSupportTest.java index c9205be7817899db1039e7ceb5f7ba0444fe3f5f..e74543275220e97eabd7637e90f07433d6ebd582 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/CharsetSupportTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/CharsetSupportTest.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/DecoderUtilTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/DecoderUtilTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/DecoderUtilTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/DecoderUtilTest.java index 877499b55497d40cf4c49595a60e0a08d46998b9..327d594a7eec43cd33ba26d4db71fb80214bb3f4 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/DecoderUtilTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/DecoderUtilTest.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/FlowedMessageUtilsTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/FlowedMessageUtilsTest.java similarity index 87% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/FlowedMessageUtilsTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/FlowedMessageUtilsTest.java index 5092734045bda76f43d20956df5ad6ee1a2bb125..a55099d001fffbcda27a16d1261c1eeaac67d43b 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/FlowedMessageUtilsTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/FlowedMessageUtilsTest.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import org.junit.Test; -import static com.fsck.k9.mail.internet.FlowedMessageUtils.isDelSp; -import static com.fsck.k9.mail.internet.FlowedMessageUtils.isFormatFlowed; +import static foundation.e.mail.mail.internet.FlowedMessageUtils.isDelSp; +import static foundation.e.mail.mail.internet.FlowedMessageUtils.isFormatFlowed; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/ListHeadersTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/ListHeadersTest.java similarity index 95% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/ListHeadersTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/ListHeadersTest.java index ed73cff4c0f4fdf79dcd3190e2e013724c154aaa..2383eaf61ece7c62ec7b67d4969e9b80a6ea82c5 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/ListHeadersTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/ListHeadersTest.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageExtractorTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageExtractorTest.java similarity index 94% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageExtractorTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageExtractorTest.java index 828e2c007ae043962c2de928e81c1e86d06d52ce..bbc3f7af520b362d62ee799543248150eeef996f 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageExtractorTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageExtractorTest.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.BinaryMemoryBody; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.BinaryMemoryBody; import org.apache.james.mime4j.util.MimeUtil; import org.junit.Before; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageIdGeneratorTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageIdGeneratorTest.java similarity index 90% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageIdGeneratorTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageIdGeneratorTest.java index 9b8c19a0b27f28d0d4b848ab7c0c388badf5621d..898e21c09bfdb0046492eaf37ce13c2a9433cb8d 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MessageIdGeneratorTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MessageIdGeneratorTest.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.Message; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeUtilityTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MimeUtilityTest.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeUtilityTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/MimeUtilityTest.java index df95df315869ca800ad29ba4ff479da8046183df..b4193cc06224a176a6c2d4bbb72505dcf8472fc1 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/MimeUtilityTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/MimeUtilityTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/TextBodyTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/TextBodyTest.java similarity index 89% rename from k9mail-library/src/test/java/com/fsck/k9/mail/internet/TextBodyTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/internet/TextBodyTest.java index c96b7ae669506e1d6762144cf3d5b2e1c916af46..f3533ffe1be086d8f4fbda78561919bf8716a288 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/internet/TextBodyTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/internet/TextBodyTest.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.internet; +package foundation.e.mail.mail.internet; import java.io.IOException; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; import okio.Buffer; import org.apache.james.mime4j.util.MimeUtil; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/AlertResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/AlertResponseTest.java similarity index 93% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/AlertResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/AlertResponseTest.java index 3617dead8c703416b4310f9271d5e5d17cd11587..925ff890c2126ebbca424355ddfaee6d7b601e47 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/AlertResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/AlertResponseTest.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/CapabilityResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/CapabilityResponseTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/CapabilityResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/CapabilityResponseTest.java index e82670cf6c5516b0ebddc15c71bad22ba6124fa6..3bfb1cb5993c16d8c1b24cac9b75d7a61a4cfa4c 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/CapabilityResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/CapabilityResponseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -9,7 +9,7 @@ import java.util.List; import org.junit.Test; import org.mockito.internal.util.collections.Sets; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/FolderNameCodecTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/FolderNameCodecTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/FolderNameCodecTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/FolderNameCodecTest.java index 78c0aa976dd866e26b1add06c7177bd255e6ee81..cc8f9c426000a2cd4321d2ec5d8180d963230878 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/FolderNameCodecTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/FolderNameCodecTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.nio.charset.CharacterCodingException; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/IdGrouperTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/IdGrouperTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/IdGrouperTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/IdGrouperTest.java index 375c510aa0b02efc6eecf24f8e28f64556169be9..36147cd0d2923020efe4e6796551975fabc97bea 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/IdGrouperTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/IdGrouperTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Arrays; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapCommandSplitterTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapCommandSplitterTest.java similarity index 94% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapCommandSplitterTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapCommandSplitterTest.java index 1c4e66f90de6d4e1bacf29877f5f776888904512..7c4b648fde1b567e436de8b038021d30a7b63913 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapCommandSplitterTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapCommandSplitterTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; @@ -6,11 +6,11 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import com.fsck.k9.mail.store.imap.IdGrouper.GroupedIds; +import foundation.e.mail.mail.store.imap.IdGrouper.GroupedIds; import com.google.common.collect.Sets; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createNonContiguousIdSet; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createNonContiguousIdSet; import static java.util.Collections.singletonList; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapConnectionTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapConnectionTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapConnectionTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapConnectionTest.java index 3d26c9cd3cfa2cd9f2574cd9247fae957c800d97..1dfdb95a7a55638b9f8991741151c8f25465d709 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapConnectionTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapConnectionTest.java @@ -1,26 +1,25 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; import java.net.UnknownHostException; import java.util.List; -import android.app.Activity; import android.net.ConnectivityManager; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.CertificateValidationException.Reason; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.XOAuth2ChallengeParserTest; -import com.fsck.k9.mail.helpers.TestTrustedSocketFactory; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.imap.mockserver.MockImapServer; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.CertificateValidationException.Reason; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.XOAuth2ChallengeParserTest; +import foundation.e.mail.mail.helpers.TestTrustedSocketFactory; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.imap.mockserver.MockImapServer; import okio.ByteString; import org.junit.Before; import org.junit.Test; @@ -61,7 +60,6 @@ public class ImapConnectionTest { @Before public void setUp() throws Exception { connectivityManager = mock(ConnectivityManager.class); - oAuth2TokenProvider = createOAuth2TokenProvider(); socketFactory = TestTrustedSocketFactory.newInstance(); settings = new SimpleImapSettings(); @@ -1010,14 +1008,15 @@ public class ImapConnectionTest { private OAuth2TokenProvider createOAuth2TokenProvider() { return new OAuth2TokenProvider() { - private int invalidationCount = 0; + + private int accessTokenInvalidationCount = 0; @Override - public String getToken(String username, long timeoutMillis) throws AuthenticationFailedException { - assertEquals(USERNAME, username); + public String getToken(String email, long timeoutMillis) throws AuthenticationFailedException { + assertEquals(USERNAME, email); assertEquals(OAUTH2_TIMEOUT, timeoutMillis); - switch (invalidationCount) { + switch (accessTokenInvalidationCount) { case 0: { return XOAUTH_TOKEN; } @@ -1025,26 +1024,22 @@ public class ImapConnectionTest { return XOAUTH_ANOTHER_TOKEN; } default: { - throw new AuthenticationFailedException("Ran out of auth tokens. invalidateToken() called too often?"); + throw new AssertionError("Ran out of auth tokens. invalidateAccessToken() called too often?"); } } } @Override - public void invalidateToken(String username) { - assertEquals(USERNAME, username); - invalidationCount++; + public void invalidateToken(String mail) { + assertEquals(USERNAME, mail); + accessTokenInvalidationCount++; } @Override - public List getAccounts() { - throw new UnsupportedOperationException(); + public void disconnectEmailWithK9(String email) { + assertEquals(USERNAME, email); } - @Override - public void authorizeApi(String username, Activity activity, OAuth2TokenProviderAuthCallback callback) { - throw new UnsupportedOperationException(); - } }; } } diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapFolderTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapFolderTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapFolderTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapFolderTest.java index 0add60dbbd23f2aefd2bda80f44cf91349b72fb8..f5764daaa653b64a7843bab4a983cb3a00abbfe8 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapFolderTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapFolderTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -11,21 +11,21 @@ import java.util.Map; import java.util.Set; import java.util.TimeZone; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.DefaultBodyFactory; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.FetchProfile.Item; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Folder.FolderType; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.DefaultBodyFactory; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.FetchProfile.Item; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Folder.FolderType; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.store.StoreConfig; import okio.Buffer; import org.apache.james.mime4j.util.MimeUtil; import org.junit.Before; @@ -36,9 +36,9 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RuntimeEnvironment; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RO; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RW; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RO; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RW; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapListTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapListTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapListTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapListTest.java index ca9d5bd57ea9257b6f00e70c52de453493463be2..660aec91edc1d41b19891559a98cac4fc64da415 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapListTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapListTest.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPushStateTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPushStateTest.java similarity index 95% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPushStateTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPushStateTest.java index c66854e47de8e827d2d39c1c93f198187657874c..561f9e237f1347a7118d6ccdd3186ee8d7d4a5e6 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPushStateTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPushStateTest.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPusherTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPusherTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPusherTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPusherTest.java index 55a185bbbcd4659bdde6019d3f00f87a3fcf3776..11131c6228bbbc6252bb1bec073a735ed3e80139 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapPusherTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapPusherTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.ArrayList; @@ -6,9 +6,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mail.store.StoreConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseHelper.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseHelper.java similarity index 91% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseHelper.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseHelper.java index 5eb48ecc67dad3efb249fa01c3faa31173924f49..da4f373fef1a5f07b8db6efd441a9cec897a164b 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseHelper.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.ByteArrayInputStream; @@ -8,7 +8,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import com.fsck.k9.mail.filter.PeekableInputStream; +import foundation.e.mail.mail.filter.PeekableInputStream; public class ImapResponseHelper { diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseParserTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseParserTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseParserTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseParserTest.java index 281c119a731920fc29f4421333d692d8be797da0..6c43cc92e827134ecb5d5c9be1a021e7b9c9d552 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapResponseParserTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapResponseParserTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.ByteArrayInputStream; @@ -6,9 +6,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.filter.FixedLengthInputStream; -import com.fsck.k9.mail.filter.PeekableInputStream; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.filter.FixedLengthInputStream; +import foundation.e.mail.mail.filter.PeekableInputStream; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreTest.java index 3140ffa1ab667f623e16c6ac4aa5873ca41c8062..aa91c001afb925e6b097c78af9ec786ac7e8cc84 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -12,16 +12,17 @@ import java.util.Set; import android.net.ConnectivityManager; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.oauth.OAuth2TokenProvider; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.StoreConfig; import org.junit.Before; import org.junit.Test; import org.mockito.internal.util.collections.Sets; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; @@ -380,8 +381,8 @@ public class ImapStoreTest { private String testCombinedPrefix; public TestImapStore(StoreConfig storeConfig, TrustedSocketFactory trustedSocketFactory, - ConnectivityManager connectivityManager, OAuth2TokenProvider oauth2TokenProvider) throws MessagingException { - super(storeConfig, trustedSocketFactory, connectivityManager, oauth2TokenProvider); + ConnectivityManager connectivityManager, OAuth2TokenProvider oAuth2TokenProvider) throws MessagingException { + super(storeConfig, trustedSocketFactory, connectivityManager, oAuth2TokenProvider); } @Override diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreUriTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreUriTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreUriTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreUriTest.java index b28a974257a6dfeeb9b2a55658db6f419bb7fca8..022f8132be2d3b786784a4ab6b7645645b468ff1 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapStoreUriTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapStoreUriTest.java @@ -1,13 +1,13 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.HashMap; import java.util.Map; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.store.RemoteStore; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.store.RemoteStore; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapUtilityTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapUtilityTest.java similarity index 98% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapUtilityTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapUtilityTest.java index 5f83ae2e7436a33f3f81bdd1bd3588106232ff21..5cc13489e2c9de154a9ee8283c1d18491e3ca3c5 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ImapUtilityTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ImapUtilityTest.java @@ -15,9 +15,9 @@ * limitations under the License. */ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ListResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ListResponseTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ListResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ListResponseTest.java index d27ec6f0578a45c01a1165d8b6704fe18654a415..5104c95d2aa8e522577ef9ee8fd0dbd84feda292 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ListResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ListResponseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -6,7 +6,7 @@ import java.util.List; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/NamespaceResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/NamespaceResponseTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/NamespaceResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/NamespaceResponseTest.java index 2c157ffcda1b523600e5f8c8ae347a8c511943b8..aa36f429f54606116f831d4fb4c7a1d21d9954df 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/NamespaceResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/NamespaceResponseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.io.IOException; @@ -7,7 +7,7 @@ import java.util.Collections; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponseTest.java similarity index 95% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponseTest.java index bad8a46ef54ab16a9ca977bbd55712d11ae47440..4762038cf794b56ffa20c5586b8dc9e35c88eeed 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/PermanentFlagsResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/PermanentFlagsResponseTest.java @@ -1,10 +1,10 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractorTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractorTest.java similarity index 88% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractorTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractorTest.java index df5b92dc31ed61219f9635c3f2bac518267c5912..4c1c9dfd2be518fca0c6d367e3f788508625e4e2 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/ResponseCodeExtractorTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/ResponseCodeExtractorTest.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SearchResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SearchResponseTest.java similarity index 95% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SearchResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SearchResponseTest.java index ec7bc2c7346a49244f572ec68c4b8ff08f6e5069..d6d9252c608b11f3be743697fa851f64a9801cf6 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SearchResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SearchResponseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; @@ -6,7 +6,7 @@ import java.util.List; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponseList; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponseList; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponseTest.java similarity index 92% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponseTest.java index dbff70ab954b7cd8b94ef0ecc3966f549e13da5c..bdec82f20d51e14e34bcf8300191239ae5d71f2d 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SelectOrExamineResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SelectOrExamineResponseTest.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import org.junit.Test; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RO; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RW; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponse; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RO; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RW; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponse; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SimpleImapSettings.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SimpleImapSettings.java similarity index 92% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SimpleImapSettings.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SimpleImapSettings.java index 60936e98872db3fec3d23d9b698894eca0ff6697..b33d6d2322a813edc0a07e23d600b3eb7462240b 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/SimpleImapSettings.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/SimpleImapSettings.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.NetworkType; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.NetworkType; class SimpleImapSettings implements ImapSettings { diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidCopyResponseTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidCopyResponseTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidCopyResponseTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidCopyResponseTest.java index cb929b81b29c56199b0a95b26e636ba57921032d..bcb4e1e3452f230a63434c2a4aadc4886d70ef0a 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidCopyResponseTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidCopyResponseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.HashMap; @@ -7,7 +7,7 @@ import java.util.Map; import org.junit.Test; -import static com.fsck.k9.mail.store.imap.ImapResponseHelper.createImapResponseList; +import static foundation.e.mail.mail.store.imap.ImapResponseHelper.createImapResponseList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilderTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilderTest.java similarity index 92% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilderTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilderTest.java index eef6e46268e2d6e4ed241511cfd0f29c116c0805..17299eead2a2f2a774005046078585d0de47b8b3 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/UidSearchCommandBuilderTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/UidSearchCommandBuilderTest.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mail.store.imap; +package foundation.e.mail.mail.store.imap; import java.util.Collections; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; import org.junit.Test; import static org.junit.Assert.assertEquals; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/mockserver/MockImapServer.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/mockserver/MockImapServer.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/mockserver/MockImapServer.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/mockserver/MockImapServer.java index c9cf9e5bba1d1b8cee6ecbd2bcaa0a7846b97626..af48209356f46395a8b682cab9b7a4bd94fd8843 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/imap/mockserver/MockImapServer.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/imap/mockserver/MockImapServer.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.imap.mockserver; +package foundation.e.mail.mail.store.imap.mockserver; import java.io.EOFException; @@ -23,7 +23,7 @@ import java.util.zip.InflaterInputStream; import android.annotation.SuppressLint; -import com.fsck.k9.mail.helpers.KeyStoreProvider; +import foundation.e.mail.mail.helpers.KeyStoreProvider; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import javax.net.ssl.KeyManagerFactory; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/pop3/Pop3StoreTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/pop3/Pop3StoreTest.java similarity index 94% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/pop3/Pop3StoreTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/pop3/Pop3StoreTest.java index 977648a9fd3d67e92d515d4875d18519583fa9e8..2d3a2b1d6061bcd4bb8dd9f035de8d3ca84cdb72 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/pop3/Pop3StoreTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/pop3/Pop3StoreTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.pop3; +package foundation.e.mail.mail.store.pop3; import java.io.ByteArrayInputStream; @@ -7,13 +7,13 @@ import java.io.OutputStream; import java.net.Socket; import java.util.List; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Folder.FolderType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.ssl.TrustedSocketFactory; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Folder.FolderType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.ssl.TrustedSocketFactory; +import foundation.e.mail.mail.store.StoreConfig; import org.junit.Before; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavFolderTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavFolderTest.java similarity index 97% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavFolderTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavFolderTest.java index 010d8b6e328c550261dc937fa6b959b4f4d1f647..dbe380bfadef2b59d5b6f7f5c3a0f28560a2edd4 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavFolderTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavFolderTest.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.store.StoreConfig; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; @@ -27,8 +27,8 @@ import org.mockito.stubbing.Answer; import static java.util.Collections.singletonList; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RW; -import static com.fsck.k9.mail.Folder.OPEN_MODE_RO; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RW; +import static foundation.e.mail.mail.Folder.OPEN_MODE_RO; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavMessageTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavMessageTest.java similarity index 93% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavMessageTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavMessageTest.java index 33f8e01e276b7d019c3a6eaf9c98757dca320bbb..d967e9fae5491f3beaf6900d52c7a032ae0e9cd8 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavMessageTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavMessageTest.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.MessagingException; import org.junit.Before; import org.junit.Test; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavStoreTest.java b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavStoreTest.java similarity index 96% rename from k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavStoreTest.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavStoreTest.java index 9c7e9d7446ffdf941a9a6bcd783c9c9cde3b901c..d3877b6b4124ebcf4f2e52e18ca1d378c3cbbeb2 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/store/webdav/WebDavStoreTest.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/store/webdav/WebDavStoreTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.store.webdav; +package foundation.e.mail.mail.store.webdav; import java.io.ByteArrayInputStream; @@ -6,16 +6,16 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.K9LibRobolectricTestRunner; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.store.StoreConfig; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.K9LibRobolectricTestRunner; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.store.StoreConfig; import javax.net.ssl.SSLException; diff --git a/k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/MockSmtpServer.java b/k9mail-library/src/test/java/foundation/e/mail/mail/transport/mockServer/MockSmtpServer.java similarity index 99% rename from k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/MockSmtpServer.java rename to k9mail-library/src/test/java/foundation/e/mail/mail/transport/mockServer/MockSmtpServer.java index 0a88d21110f01745f7e384859efdbab9901a2400..7575eae9944c6e25ea21f63bb9fa9158bedcfd60 100644 --- a/k9mail-library/src/test/java/com/fsck/k9/mail/transport/mockServer/MockSmtpServer.java +++ b/k9mail-library/src/test/java/foundation/e/mail/mail/transport/mockServer/MockSmtpServer.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mail.transport.mockServer; +package foundation.e.mail.mail.transport.mockServer; import java.io.EOFException; @@ -23,7 +23,7 @@ import java.util.zip.InflaterInputStream; import android.annotation.SuppressLint; -import com.fsck.k9.mail.helpers.KeyStoreProvider; +import foundation.e.mail.mail.helpers.KeyStoreProvider; import com.jcraft.jzlib.JZlib; import com.jcraft.jzlib.ZOutputStream; import javax.net.ssl.KeyManagerFactory; diff --git a/k9mail/build.gradle b/k9mail/build.gradle index 479d1641542864b2876743707aa15f1d31a786cd..6c49f740e9513cb76d4224e1aea784e3d72d1974 100644 --- a/k9mail/build.gradle +++ b/k9mail/build.gradle @@ -10,6 +10,12 @@ if (rootProject.testCoverage) { apply plugin: 'jacoco' } +repositories { + maven { + url 'https://maven.google.com' + } +} + //noinspection GroovyAssignabilityCheck configurations.all { resolutionStrategy { @@ -23,8 +29,10 @@ dependencies { implementation project(':plugins:openpgp-api-lib:openpgp-api') implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:${kotlinVersion}" implementation "com.squareup.okio:okio:${okioVersion}" + implementation 'me.zhanghai.android.materialprogressbar:library:1.4.1' implementation 'commons-io:commons-io:2.4' implementation "com.android.support:support-v4:${androidSupportLibraryVersion}" + implementation "com.android.support:design:${androidSupportLibraryVersion}" implementation 'org.jsoup:jsoup:1.11.2' implementation 'de.cketti.library.changelog:ckchangelog:1.2.1' implementation 'com.github.bumptech.glide:glide:3.6.1' @@ -36,10 +44,14 @@ dependencies { implementation 'net.jcip:jcip-annotations:1.0' implementation 'org.apache.james:apache-mime4j-core:0.8.1' + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.0.0-beta3' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2' testImplementation "org.robolectric:robolectric:${robolectricVersion}" - testImplementation "junit:junit:${junitVersion}" + compile "junit:junit:${junitVersion}" testImplementation "com.google.truth:truth:${truthVersion}" testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.jdom:jdom2:2.0.6" @@ -50,14 +62,14 @@ android { buildToolsVersion androidBuildToolsVersion defaultConfig { - applicationId "com.fsck.k9" - testApplicationId "com.fsck.k9.tests" + applicationId "foundation.e.mail" + testApplicationId "foundation.e.mail.tests" - versionCode 25000 - versionName '5.500-SNAPSHOT' + versionCode 26000 + versionName '5.600' - minSdkVersion 15 - targetSdkVersion 22 + minSdkVersion 21 + targetSdkVersion 29 generatedDensities = ['mdpi', 'hdpi', 'xhdpi'] @@ -108,6 +120,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } + buildToolsVersion '26.0.2' } if (project.hasProperty('keyAlias')) { diff --git a/k9mail/proguard-rules.pro b/k9mail/proguard-rules.pro index 3cbaf1676c75013ac03572b885fa4fbdc11a821f..b094a2958c2f45497c2f3e1958dbc1feabd3dc05 100644 --- a/k9mail/proguard-rules.pro +++ b/k9mail/proguard-rules.pro @@ -17,7 +17,45 @@ -dontwarn okio.** -dontwarn com.squareup.moshi.** +# This dnsjava class uses old Sun API +-dontnote org.xbill.DNS.spi.DNSJavaNameServiceDescriptor +-dontwarn org.xbill.DNS.spi.DNSJavaNameServiceDescriptor +-dontnote org.xbill.DNS.ResolverConfig + +# See http://stackoverflow.com/questions/5701126, happens in dnsjava +-optimizations !code/allocation/variable + +-dontwarn javax.annotation.** +-dontwarn retrofit2.Platform$Java8 + +# OkHttp +-dontwarn okio.** +-dontwarn com.squareup.okhttp3.** +-dontwarn javax.annotation.Nullable +-dontwarn javax.annotation.ParametersAreNonnullByDefault +-dontnote okhttp3.internal.** + # Project specific rules --dontnote com.fsck.k9.PRNGFixes --dontnote com.fsck.k9.ui.messageview.** --dontnote com.fsck.k9.view.** +-dontnote foundation.e.mail.PRNGFixes +-dontnote foundation.e.mail.ui.messageview.** +-dontnote foundation.e.mail.view.** + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-keep public class org.openintents.openpgp.** + +# Kotlin +-keep class kotlin.Metadata { *; } +-dontnote kotlin.internal.** +-dontnote kotlin.reflect.jvm.internal.** + +-dontnote sun.misc.Unsafe + +-dontwarn java.lang.management.** + +-dontnote junit.framework.** +-dontnote junit.runner.** + +-dontwarn android.test.** diff --git a/k9mail/release/k9mail-release.apk b/k9mail/release/k9mail-release.apk new file mode 100644 index 0000000000000000000000000000000000000000..faf42079bcb28cdea1d0968f13f2768d860455b8 Binary files /dev/null and b/k9mail/release/k9mail-release.apk differ diff --git a/k9mail/release/output.json b/k9mail/release/output.json new file mode 100644 index 0000000000000000000000000000000000000000..6ebb7763bd15269b93257fdc12d4ddb7cc7dfc5d --- /dev/null +++ b/k9mail/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":25000,"versionName":"5.500-SNAPSHOT","enabled":true,"outputFile":"k9mail-release.apk","fullName":"release","baseName":"release"},"path":"k9mail-release.apk","properties":{}}] diff --git a/k9mail/src/androidTest/java/com/fsck/k9/helper/FileHelperTest.java b/k9mail/src/androidTest/java/foundation/e/mail/helper/FileHelperTest.java similarity index 96% rename from k9mail/src/androidTest/java/com/fsck/k9/helper/FileHelperTest.java rename to k9mail/src/androidTest/java/foundation/e/mail/helper/FileHelperTest.java index 3431262090bb6a4759a8b269e3ab6cb544f2ab31..aaefbc96ade4816ced5465217e159309c761a18a 100644 --- a/k9mail/src/androidTest/java/com/fsck/k9/helper/FileHelperTest.java +++ b/k9mail/src/androidTest/java/foundation/e/mail/helper/FileHelperTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.support.test.runner.AndroidJUnit4; diff --git a/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java b/k9mail/src/androidTest/java/foundation/e/mail/mailstore/ReconstructMessageFromDatabaseTest.java similarity index 93% rename from k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java rename to k9mail/src/androidTest/java/foundation/e/mail/mailstore/ReconstructMessageFromDatabaseTest.java index 621c60280e01ed30ea368256bb6ad8c16064f1ec..81c9c7a2901d6ec9b506d291bfbc28b4c74a8f7f 100644 --- a/k9mail/src/androidTest/java/com/fsck/k9/mailstore/ReconstructMessageFromDatabaseTest.java +++ b/k9mail/src/androidTest/java/foundation/e/mail/mailstore/ReconstructMessageFromDatabaseTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; @@ -11,14 +11,14 @@ import android.content.Context; import android.test.ApplicationTestCase; import android.test.RenamingDelegatingContext; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeMessage; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail/src/androidTest/java/com/fsck/k9/provider/EmailProviderTest.java b/k9mail/src/androidTest/java/foundation/e/mail/provider/EmailProviderTest.java similarity index 98% rename from k9mail/src/androidTest/java/com/fsck/k9/provider/EmailProviderTest.java rename to k9mail/src/androidTest/java/foundation/e/mail/provider/EmailProviderTest.java index bb5bc44ac7d2d9f0d25ed308843f3d6a6226a23e..8549b8176d99397ae5a26517a8fd9650dfba99b7 100644 --- a/k9mail/src/androidTest/java/com/fsck/k9/provider/EmailProviderTest.java +++ b/k9mail/src/androidTest/java/foundation/e/mail/provider/EmailProviderTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.util.Arrays; @@ -12,11 +12,11 @@ import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/k9mail/src/androidTest/java/com/fsck/k9/provider/MessageProviderTest.java b/k9mail/src/androidTest/java/foundation/e/mail/provider/MessageProviderTest.java similarity index 96% rename from k9mail/src/androidTest/java/com/fsck/k9/provider/MessageProviderTest.java rename to k9mail/src/androidTest/java/foundation/e/mail/provider/MessageProviderTest.java index 0ca660285db46313ce70a64beadfc9c21434c2aa..8e0dd73c066f07d6d737819e5c209d8e1f2cc2f1 100644 --- a/k9mail/src/androidTest/java/com/fsck/k9/provider/MessageProviderTest.java +++ b/k9mail/src/androidTest/java/foundation/e/mail/provider/MessageProviderTest.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import android.database.Cursor; import android.net.Uri; @@ -6,9 +6,9 @@ import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; import android.test.mock.MockContentResolver; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; import org.junit.After; import org.junit.Before; diff --git a/k9mail/src/debug/res/drawable-hdpi/icon.png b/k9mail/src/debug/res/drawable-hdpi/icon.png deleted file mode 100644 index 67b558087e0bc3fc01dc8c80943e6e57800ff2a0..0000000000000000000000000000000000000000 Binary files a/k9mail/src/debug/res/drawable-hdpi/icon.png and /dev/null differ diff --git a/k9mail/src/debug/res/drawable-mdpi/icon.png b/k9mail/src/debug/res/drawable-mdpi/icon.png deleted file mode 100644 index 9fceb468f4951c6834df3b0bacf98b6a07574630..0000000000000000000000000000000000000000 Binary files a/k9mail/src/debug/res/drawable-mdpi/icon.png and /dev/null differ diff --git a/k9mail/src/debug/res/drawable-xhdpi/icon.png b/k9mail/src/debug/res/drawable-xhdpi/icon.png deleted file mode 100644 index 1157ecf00a6960df18a3635d10ec0877bbb74b1d..0000000000000000000000000000000000000000 Binary files a/k9mail/src/debug/res/drawable-xhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/debug/res/drawable-xxhdpi/icon.png b/k9mail/src/debug/res/drawable-xxhdpi/icon.png deleted file mode 100644 index 2e95b25f6a71ad25f92d5947ccae74f394d39ad3..0000000000000000000000000000000000000000 Binary files a/k9mail/src/debug/res/drawable-xxhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/debug/res/drawable-xxxhdpi/icon.png b/k9mail/src/debug/res/drawable-xxxhdpi/icon.png deleted file mode 100644 index 8154ffcf3562d314ee8f8bf642d47e01f158ffe1..0000000000000000000000000000000000000000 Binary files a/k9mail/src/debug/res/drawable-xxxhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/AndroidManifest.xml b/k9mail/src/main/AndroidManifest.xml index bd35d884fbb2bf2e93627e79130fcceb8323eec3..d0e7f4a4008028609203292730c53254f932f825 100644 --- a/k9mail/src/main/AndroidManifest.xml +++ b/k9mail/src/main/AndroidManifest.xml @@ -1,68 +1,78 @@ - + + + + android:required="false" /> - - - - - - - - - - - - - + android:smallScreens="true" /> + + + + + + + + + + + + + + + - + android:protectionLevel="dangerous" /> + + - + android:protectionLevel="dangerous" /> + + - + android:protectionLevel="dangerous" /> + + android:roundIcon="@mipmap/ic_launcher" + android:theme="@android:style/Theme.Material.Light.NoActionBar"> + + android:value="foundation.e.mail.activity.Search" /> - + - - + + - - + android:taskAffinity="${applicationId}.activity.setup.Prefs" /> - + android:label="@string/welcome_message_title" /> - + android:theme="@style/Theme.K9.Transparent" /> - - - - - + android:label="@string/font_size_settings_title" /> - + android:theme="@style/Theme.K9.Material.Light" /> - - - - - - - + android:label="@string/account_settings_composition_title" /> - + android:theme="@style/Theme.K9Dialog" /> - + android:theme="@style/Theme.K9Dialog" /> - + android:theme="@style/Theme.K9Dialog" /> - + android:label="@string/manage_identities_title" /> - + android:label="@string/edit_identity_title" /> - - - - + android:theme="@android:style/Theme.Translucent.NoTitleBar" /> + - + android:label="@string/account_settings_title_fmt" /> - + android:theme="@android:style/Theme.Dialog" /> + - + - + - + - + + - + android:scheme="email" /> + + - - - - + + + + + - - - + + + + + - - - + + + + + - - + - - + + + + - - - - + - + + + - - + + + + + android:resource="@xml/searchable" /> - - - + + + - - + android:configChanges="locale" /> - + - + android:label="@string/upgrade_databases_title" /> - + - + - + - + - + - + - - + - + - - + android:exported="false" /> + - + --> + - + --> + - - + + + android:resource="@xml/unread_widget_info" /> - + @@ -382,59 +350,46 @@ android:name=".widget.list.MessageListWidgetService" android:enabled="true" android:permission="android.permission.BIND_REMOTEVIEWS" /> - - + android:enabled="true" /> - + android:enabled="true" /> - + android:enabled="true" /> - + android:enabled="true" /> - + android:permission="${applicationId}.permission.REMOTE_CONTROL" /> - + android:enabled="true" /> + android:exported="false" /> - - - - - - - + android:writePermission="${applicationId}.permission.DELETE_MESSAGES" /> - + android:exported="false" /> - - - - + - + + \ No newline at end of file diff --git a/k9mail/src/main/assets/icon.png b/k9mail/src/main/assets/icon.png deleted file mode 100644 index 56efaad953a089edafa7055e083f062f037ab5fc..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/assets/icon.png and /dev/null differ diff --git a/k9mail/src/main/assets/mail_icon.png b/k9mail/src/main/assets/mail_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1070639589023f20f353d198e66b7c7699ffe207 Binary files /dev/null and b/k9mail/src/main/assets/mail_icon.png differ diff --git a/k9mail/src/main/java/com/fsck/k9/Globals.java b/k9mail/src/main/java/com/fsck/k9/Globals.java deleted file mode 100644 index 31e74e898f52f953f585faeb3166d7c38a708f43..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/Globals.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.fsck.k9; - - -import android.content.Context; - - -public class Globals { - private static Context context; - - static void setContext(Context context) { - Globals.context = context; - } - - public static Context getContext() { - if (context == null) { - throw new IllegalStateException("No context provided"); - } - - return context; - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupAccountType.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupAccountType.java deleted file mode 100644 index fab53f933d561460e5259f8a88477e4c7e6e53dc..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupAccountType.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.fsck.k9.activity.setup; - - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import timber.log.Timber; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.helper.EmailHelper; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.setup.ServerNameSuggester; - -import java.net.URI; -import java.net.URISyntaxException; - -import static com.fsck.k9.mail.ServerSettings.Type.IMAP; -import static com.fsck.k9.mail.ServerSettings.Type.POP3; -import static com.fsck.k9.mail.ServerSettings.Type.SMTP; -import static com.fsck.k9.mail.ServerSettings.Type.WebDAV; - - -/** - * Prompts the user to select an account type. The account type, along with the - * passed in email address, password and makeDefault are then passed on to the - * AccountSetupIncoming activity. - */ -public class AccountSetupAccountType extends K9Activity implements OnClickListener { - private static final String EXTRA_ACCOUNT = "account"; - private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; - - private final ServerNameSuggester serverNameSuggester = new ServerNameSuggester(); - private Account mAccount; - private boolean mMakeDefault; - - public static void actionSelectAccountType(Context context, Account account, boolean makeDefault) { - Intent i = new Intent(context, AccountSetupAccountType.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); - context.startActivity(i); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_account_type); - findViewById(R.id.pop).setOnClickListener(this); - findViewById(R.id.imap).setOnClickListener(this); - findViewById(R.id.webdav).setOnClickListener(this); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - mMakeDefault = getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false); - } - - private void setupStoreAndSmtpTransport(Type serverType, String schemePrefix) throws URISyntaxException { - String domainPart = EmailHelper.getDomainFromEmailAddress(mAccount.getEmail()); - - String suggestedStoreServerName = serverNameSuggester.suggestServerName(serverType, domainPart); - URI storeUriForDecode = new URI(mAccount.getStoreUri()); - URI storeUri = new URI(schemePrefix, storeUriForDecode.getUserInfo(), suggestedStoreServerName, - storeUriForDecode.getPort(), null, null, null); - mAccount.setStoreUri(storeUri.toString()); - - String suggestedTransportServerName = serverNameSuggester.suggestServerName(SMTP, domainPart); - URI transportUriForDecode = new URI(mAccount.getTransportUri()); - URI transportUri = new URI("smtp+tls+", transportUriForDecode.getUserInfo(), suggestedTransportServerName, - transportUriForDecode.getPort(), null, null, null); - mAccount.setTransportUri(transportUri.toString()); - } - - private void setupDav() throws URISyntaxException { - URI uriForDecode = new URI(mAccount.getStoreUri()); - - /* - * The user info we have been given from - * AccountSetupBasics.onManualSetup() is encoded as an IMAP store - * URI: AuthType:UserName:Password (no fields should be empty). - * However, AuthType is not applicable to WebDAV nor to its store - * URI. Re-encode without it, using just the UserName and Password. - */ - String userPass = ""; - String[] userInfo = uriForDecode.getUserInfo().split(":"); - if (userInfo.length > 1) { - userPass = userInfo[1]; - } - if (userInfo.length > 2) { - userPass = userPass + ":" + userInfo[2]; - } - - String domainPart = EmailHelper.getDomainFromEmailAddress(mAccount.getEmail()); - String suggestedServerName = serverNameSuggester.suggestServerName(WebDAV, domainPart); - URI uri = new URI("webdav+ssl+", userPass, suggestedServerName, uriForDecode.getPort(), null, null, null); - mAccount.setStoreUri(uri.toString()); - } - - public void onClick(View v) { - try { - switch (v.getId()) { - case R.id.pop: { - setupStoreAndSmtpTransport(POP3, "pop3+ssl+"); - break; - } - case R.id.imap: { - setupStoreAndSmtpTransport(IMAP, "imap+ssl+"); - break; - } - case R.id.webdav: { - setupDav(); - break; - } - } - } catch (Exception ex) { - failure(ex); - } - - AccountSetupIncoming.actionIncomingSettings(this, mAccount, mMakeDefault); - finish(); - } - - private void failure(Exception use) { - Timber.e(use, "Failure"); - String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); - - Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_LONG); - toast.show(); - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java deleted file mode 100644 index cdb6cb5c16c9c95305589e89bf266466e618e21a..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupBasics.java +++ /dev/null @@ -1,531 +0,0 @@ - -package com.fsck.k9.activity.setup; - - -import java.io.Serializable; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Locale; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.text.Editable; -import android.text.InputType; -import android.text.TextWatcher; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; - -import com.fsck.k9.Account; -import com.fsck.k9.EmailAddressValidator; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.account.AccountCreator; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; -import com.fsck.k9.helper.UrlEncodingHelper; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.view.ClientCertificateSpinner; -import com.fsck.k9.view.ClientCertificateSpinner.OnClientCertificateChangedListener; -import timber.log.Timber; - -/** - * Prompts the user for the email address and password. - * Attempts to lookup default settings for the domain the user specified. If the - * domain is known the settings are handed off to the AccountSetupCheckSettings - * activity. If no settings are found the settings are handed off to the - * AccountSetupAccountType activity. - */ -public class AccountSetupBasics extends K9Activity - implements OnClickListener, TextWatcher, OnCheckedChangeListener, OnClientCertificateChangedListener { - private final static String EXTRA_ACCOUNT = "com.fsck.k9.AccountSetupBasics.account"; - private final static int DIALOG_NOTE = 1; - private final static String STATE_KEY_PROVIDER = - "com.fsck.k9.AccountSetupBasics.provider"; - private final static String STATE_KEY_CHECKED_INCOMING = - "com.fsck.k9.AccountSetupBasics.checkedIncoming"; - - private EditText mEmailView; - private EditText mPasswordView; - private CheckBox mClientCertificateCheckBox; - private ClientCertificateSpinner mClientCertificateSpinner; - private Button mNextButton; - private Button mManualSetupButton; - private Account mAccount; - private Provider mProvider; - - private EmailAddressValidator mEmailValidator = new EmailAddressValidator(); - private boolean mCheckedIncoming = false; - private CheckBox mShowPasswordCheckBox; - - public static void actionNewAccount(Context context) { - Intent i = new Intent(context, AccountSetupBasics.class); - context.startActivity(i); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_basics); - mEmailView = (EditText)findViewById(R.id.account_email); - mPasswordView = (EditText)findViewById(R.id.account_password); - mClientCertificateCheckBox = (CheckBox)findViewById(R.id.account_client_certificate); - mClientCertificateSpinner = (ClientCertificateSpinner)findViewById(R.id.account_client_certificate_spinner); - mNextButton = (Button)findViewById(R.id.next); - mManualSetupButton = (Button)findViewById(R.id.manual_setup); - mShowPasswordCheckBox = (CheckBox) findViewById(R.id.show_password); - mNextButton.setOnClickListener(this); - mManualSetupButton.setOnClickListener(this); - } - - private void initializeViewListeners() { - mEmailView.addTextChangedListener(this); - mPasswordView.addTextChangedListener(this); - mClientCertificateCheckBox.setOnCheckedChangeListener(this); - mClientCertificateSpinner.setOnClientCertificateChangedListener(this); - mShowPasswordCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - showPassword(isChecked); - } - }); - - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mAccount != null) { - outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); - } - if (mProvider != null) { - outState.putSerializable(STATE_KEY_PROVIDER, mProvider); - } - outState.putBoolean(STATE_KEY_CHECKED_INCOMING, mCheckedIncoming); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - - if (savedInstanceState.containsKey(EXTRA_ACCOUNT)) { - String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - } - - if (savedInstanceState.containsKey(STATE_KEY_PROVIDER)) { - mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER); - } - - mCheckedIncoming = savedInstanceState.getBoolean(STATE_KEY_CHECKED_INCOMING); - - updateViewVisibility(mClientCertificateCheckBox.isChecked()); - - showPassword(mShowPasswordCheckBox.isChecked()); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - /* - * We wait until now to initialize the listeners because we didn't want - * the OnCheckedChangeListener active while the - * mClientCertificateCheckBox state was being restored because it could - * trigger the pop-up of a ClientCertificateSpinner.chooseCertificate() - * dialog. - */ - initializeViewListeners(); - validateFields(); - } - - public void afterTextChanged(Editable s) { - validateFields(); - } - - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void onClientCertificateChanged(String alias) { - validateFields(); - } - - /** - * Called when checking the client certificate CheckBox - */ - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - updateViewVisibility(isChecked); - validateFields(); - - // Have the user select (or confirm) the client certificate - if (isChecked) { - mClientCertificateSpinner.chooseCertificate(); - } - } - - private void updateViewVisibility(boolean usingCertificates) { - if (usingCertificates) { - // hide password fields, show client certificate spinner - mPasswordView.setVisibility(View.GONE); - mShowPasswordCheckBox.setVisibility(View.GONE); - mClientCertificateSpinner.setVisibility(View.VISIBLE); - } else { - // show password fields, hide client certificate spinner - mPasswordView.setVisibility(View.VISIBLE); - mShowPasswordCheckBox.setVisibility(View.VISIBLE); - mClientCertificateSpinner.setVisibility(View.GONE); - } - } - - private void showPassword(boolean show) { - int cursorPosition = mPasswordView.getSelectionStart(); - if (show) { - mPasswordView.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); - } else { - mPasswordView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); - } - mPasswordView.setSelection(cursorPosition); - } - - private void validateFields() { - boolean clientCertificateChecked = mClientCertificateCheckBox.isChecked(); - String clientCertificateAlias = mClientCertificateSpinner.getAlias(); - String email = mEmailView.getText().toString(); - - boolean valid = Utility.requiredFieldValid(mEmailView) - && ((!clientCertificateChecked && Utility.requiredFieldValid(mPasswordView)) - || (clientCertificateChecked && clientCertificateAlias != null)) - && mEmailValidator.isValidAddressOnly(email); - - mNextButton.setEnabled(valid); - mManualSetupButton.setEnabled(valid); - /* - * Dim the next button's icon to 50% if the button is disabled. - * TODO this can probably be done with a stateful drawable. Check into it. - * android:state_enabled - */ - Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); - } - - private String getOwnerName() { - String name = null; - try { - name = getDefaultAccountName(); - } catch (Exception e) { - Timber.e(e, "Could not get default account name"); - } - - if (name == null) { - name = ""; - } - return name; - } - - private String getDefaultAccountName() { - String name = null; - Account account = Preferences.getPreferences(this).getDefaultAccount(); - if (account != null) { - name = account.getName(); - } - return name; - } - - @Override - public Dialog onCreateDialog(int id) { - if (id == DIALOG_NOTE) { - if (mProvider != null && mProvider.note != null) { - return new AlertDialog.Builder(this) - .setMessage(mProvider.note) - .setPositiveButton( - getString(R.string.okay_action), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - finishAutoSetup(); - } - }) - .setNegativeButton( - getString(R.string.cancel_action), - null) - .create(); - } - } - return null; - } - - private void finishAutoSetup() { - String email = mEmailView.getText().toString(); - String password = mPasswordView.getText().toString(); - String[] emailParts = splitEmail(email); - String user = emailParts[0]; - String domain = emailParts[1]; - try { - String userEnc = UrlEncodingHelper.encodeUtf8(user); - String passwordEnc = UrlEncodingHelper.encodeUtf8(password); - - String incomingUsername = mProvider.incomingUsernameTemplate; - incomingUsername = incomingUsername.replaceAll("\\$email", email); - incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); - incomingUsername = incomingUsername.replaceAll("\\$domain", domain); - - URI incomingUriTemplate = mProvider.incomingUriTemplate; - URI incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":" + passwordEnc, - incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, null, null); - - String outgoingUsername = mProvider.outgoingUsernameTemplate; - - URI outgoingUriTemplate = mProvider.outgoingUriTemplate; - - - URI outgoingUri; - if (outgoingUsername != null) { - outgoingUsername = outgoingUsername.replaceAll("\\$email", email); - outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); - outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); - outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":" - + passwordEnc, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, - null, null); - - } else { - outgoingUri = new URI(outgoingUriTemplate.getScheme(), - null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, - null, null); - - - } - if (mAccount == null) { - mAccount = Preferences.getPreferences(this).newAccount(); - } - mAccount.setName(getOwnerName()); - mAccount.setEmail(email); - mAccount.setStoreUri(incomingUri.toString()); - mAccount.setTransportUri(outgoingUri.toString()); - - setupFolderNames(incomingUriTemplate.getHost().toLowerCase(Locale.US)); - - ServerSettings incomingSettings = RemoteStore.decodeStoreUri(incomingUri.toString()); - mAccount.setDeletePolicy(AccountCreator.getDefaultDeletePolicy(incomingSettings.type)); - - // Check incoming here. Then check outgoing in onActivityResult() - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.INCOMING); - } catch (URISyntaxException use) { - /* - * If there is some problem with the URI we give up and go on to - * manual setup. - */ - onManualSetup(); - } - } - - private void onNext() { - if (mClientCertificateCheckBox.isChecked()) { - - // Auto-setup doesn't support client certificates. - onManualSetup(); - return; - } - - String email = mEmailView.getText().toString(); - String[] emailParts = splitEmail(email); - String domain = emailParts[1]; - mProvider = findProviderForDomain(domain); - if (mProvider == null) { - /* - * We don't have default settings for this account, start the manual - * setup process. - */ - onManualSetup(); - return; - } - - if (mProvider.note != null) { - showDialog(DIALOG_NOTE); - } else { - finishAutoSetup(); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - if (!mCheckedIncoming) { - //We've successfully checked incoming. Now check outgoing. - mCheckedIncoming = true; - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING); - } else { - //We've successfully checked outgoing as well. - mAccount.setDescription(mAccount.getEmail()); - mAccount.save(Preferences.getPreferences(this)); - K9.setServicesEnabled(this); - AccountSetupNames.actionSetNames(this, mAccount); - finish(); - } - } - } - - private void onManualSetup() { - String email = mEmailView.getText().toString(); - String[] emailParts = splitEmail(email); - String domain = emailParts[1]; - - String password = null; - String clientCertificateAlias = null; - AuthType authenticationType; - if (mClientCertificateCheckBox.isChecked()) { - authenticationType = AuthType.EXTERNAL; - clientCertificateAlias = mClientCertificateSpinner.getAlias(); - } else { - authenticationType = AuthType.PLAIN; - password = mPasswordView.getText().toString(); - } - - if (mAccount == null) { - mAccount = Preferences.getPreferences(this).newAccount(); - } - mAccount.setName(getOwnerName()); - mAccount.setEmail(email); - - // set default uris - // NOTE: they will be changed again in AccountSetupAccountType! - ServerSettings storeServer = new ServerSettings(ServerSettings.Type.IMAP, "mail." + domain, -1, - ConnectionSecurity.SSL_TLS_REQUIRED, authenticationType, email, password, clientCertificateAlias); - ServerSettings transportServer = new ServerSettings(ServerSettings.Type.SMTP, "mail." + domain, -1, - ConnectionSecurity.SSL_TLS_REQUIRED, authenticationType, email, password, clientCertificateAlias); - String storeUri = RemoteStore.createStoreUri(storeServer); - String transportUri = TransportUris.createTransportUri(transportServer); - mAccount.setStoreUri(storeUri); - mAccount.setTransportUri(transportUri); - - setupFolderNames(domain); - - AccountSetupAccountType.actionSelectAccountType(this, mAccount, false); - - finish(); - } - - private void setupFolderNames(String domain) { - mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts)); - mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash)); - mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent)); - mAccount.setArchiveFolderName(getString(R.string.special_mailbox_name_archive)); - - // Yahoo! has a special folder for Spam, called "Bulk Mail". - if (domain.endsWith(".yahoo.com")) { - mAccount.setSpamFolderName("Bulk Mail"); - } else { - mAccount.setSpamFolderName(getString(R.string.special_mailbox_name_spam)); - } - } - - - public void onClick(View v) { - switch (v.getId()) { - case R.id.next: - onNext(); - break; - case R.id.manual_setup: - onManualSetup(); - break; - } - } - - /** - * Attempts to get the given attribute as a String resource first, and if it fails - * returns the attribute as a simple String value. - * @param xml - * @param name - * @return - */ - private String getXmlAttribute(XmlResourceParser xml, String name) { - int resId = xml.getAttributeResourceValue(null, name, 0); - if (resId == 0) { - return xml.getAttributeValue(null, name); - } else { - return getString(resId); - } - } - - private Provider findProviderForDomain(String domain) { - try { - XmlResourceParser xml = getResources().getXml(R.xml.providers); - int xmlEventType; - Provider provider = null; - while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { - if (xmlEventType == XmlResourceParser.START_TAG - && "provider".equals(xml.getName()) - && domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) { - provider = new Provider(); - provider.id = getXmlAttribute(xml, "id"); - provider.label = getXmlAttribute(xml, "label"); - provider.domain = getXmlAttribute(xml, "domain"); - provider.note = getXmlAttribute(xml, "note"); - } else if (xmlEventType == XmlResourceParser.START_TAG - && "incoming".equals(xml.getName()) - && provider != null) { - provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri")); - provider.incomingUsernameTemplate = getXmlAttribute(xml, "username"); - } else if (xmlEventType == XmlResourceParser.START_TAG - && "outgoing".equals(xml.getName()) - && provider != null) { - provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri")); - provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username"); - } else if (xmlEventType == XmlResourceParser.END_TAG - && "provider".equals(xml.getName()) - && provider != null) { - return provider; - } - } - } catch (Exception e) { - Timber.e(e, "Error while trying to load provider settings."); - } - return null; - } - - private String[] splitEmail(String email) { - String[] retParts = new String[2]; - String[] emailParts = email.split("@"); - retParts[0] = (emailParts.length > 0) ? emailParts[0] : ""; - retParts[1] = (emailParts.length > 1) ? emailParts[1] : ""; - return retParts; - } - - static class Provider implements Serializable { - private static final long serialVersionUID = 8511656164616538989L; - - public String id; - - public String label; - - public String domain; - - public URI incomingUriTemplate; - - public String incomingUsernameTemplate; - - public URI outgoingUriTemplate; - - public String outgoingUsernameTemplate; - - public String note; - } - -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java deleted file mode 100644 index 94cf71d5c372dee626efddda46ae971fded891eb..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupCheckSettings.java +++ /dev/null @@ -1,512 +0,0 @@ - -package com.fsck.k9.activity.setup; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.DialogFragment; -import android.app.FragmentTransaction; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import timber.log.Timber; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ProgressBar; -import android.widget.TextView; - -import com.fsck.k9.*; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.fragment.ConfirmationDialogFragment; -import com.fsck.k9.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.Transport; -import com.fsck.k9.mail.TransportProvider; -import com.fsck.k9.mail.store.webdav.WebDavStore; -import com.fsck.k9.mail.filter.Hex; -import java.security.cert.CertificateException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.X509Certificate; -import java.security.NoSuchAlgorithmException; -import java.security.MessageDigest; -import java.util.Collection; -import java.util.List; -import java.util.Locale; - -/** - * Checks the given settings to make sure that they can be used to send and - * receive mail. - * - * XXX NOTE: The manifest for this app has it ignore config changes, because - * it doesn't correctly deal with restarting while its thread is running. - */ -public class AccountSetupCheckSettings extends K9Activity implements OnClickListener, - ConfirmationDialogFragmentListener{ - - public static final int ACTIVITY_REQUEST_CODE = 1; - - private static final String EXTRA_ACCOUNT = "account"; - - private static final String EXTRA_CHECK_DIRECTION ="checkDirection"; - - public enum CheckDirection { - INCOMING, - OUTGOING - } - - private Handler mHandler = new Handler(); - - private ProgressBar mProgressBar; - - private TextView mMessageView; - - private Account mAccount; - - private CheckDirection mDirection; - - private boolean mCanceled; - - private boolean mDestroyed; - - public static void actionCheckSettings(Activity context, Account account, - CheckDirection direction) { - Intent i = new Intent(context, AccountSetupCheckSettings.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - i.putExtra(EXTRA_CHECK_DIRECTION, direction); - context.startActivityForResult(i, ACTIVITY_REQUEST_CODE); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_check_settings); - mMessageView = (TextView)findViewById(R.id.message); - mProgressBar = (ProgressBar)findViewById(R.id.progress); - findViewById(R.id.cancel).setOnClickListener(this); - - setMessage(R.string.account_setup_check_settings_retr_info_msg); - mProgressBar.setIndeterminate(true); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - mDirection = (CheckDirection) getIntent().getSerializableExtra(EXTRA_CHECK_DIRECTION); - - new CheckAccountTask(mAccount).execute(mDirection); - } - - private void handleCertificateValidationException(CertificateValidationException cve) { - Timber.e(cve, "Error while testing settings"); - - X509Certificate[] chain = cve.getCertChain(); - // Avoid NullPointerException in acceptKeyDialog() - if (chain != null) { - acceptKeyDialog( - R.string.account_setup_failed_dlg_certificate_message_fmt, - cve); - } else { - showErrorDialog( - R.string.account_setup_failed_dlg_server_message_fmt, - errorMessageForCertificateException(cve)); - } - } - - - @Override - public void onDestroy() { - super.onDestroy(); - mDestroyed = true; - mCanceled = true; - } - - private void setMessage(final int resId) { - mMessageView.setText(getString(resId)); - } - - private void acceptKeyDialog(final int msgResId, final CertificateValidationException ex) { - mHandler.post(new Runnable() { - public void run() { - if (mDestroyed) { - return; - } - String exMessage = "Unknown Error"; - - if (ex != null) { - if (ex.getCause() != null) { - if (ex.getCause().getCause() != null) { - exMessage = ex.getCause().getCause().getMessage(); - - } else { - exMessage = ex.getCause().getMessage(); - } - } else { - exMessage = ex.getMessage(); - } - } - - mProgressBar.setIndeterminate(false); - StringBuilder chainInfo = new StringBuilder(100); - MessageDigest sha1 = null; - try { - sha1 = MessageDigest.getInstance("SHA-1"); - } catch (NoSuchAlgorithmException e) { - Timber.e(e, "Error while initializing MessageDigest"); - } - - final X509Certificate[] chain = ex.getCertChain(); - // We already know chain != null (tested before calling this method) - for (int i = 0; i < chain.length; i++) { - // display certificate chain information - //TODO: localize this strings - chainInfo.append("Certificate chain[").append(i).append("]:\n"); - chainInfo.append("Subject: ").append(chain[i].getSubjectDN().toString()).append("\n"); - - // display SubjectAltNames too - // (the user may be mislead into mistrusting a certificate - // by a subjectDN not matching the server even though a - // SubjectAltName matches) - try { - final Collection < List> subjectAlternativeNames = chain[i].getSubjectAlternativeNames(); - if (subjectAlternativeNames != null) { - // The list of SubjectAltNames may be very long - //TODO: localize this string - StringBuilder altNamesText = new StringBuilder(); - altNamesText.append("Subject has ").append(subjectAlternativeNames.size()).append(" alternative names\n"); - - // we need these for matching - String storeURIHost = (Uri.parse(mAccount.getStoreUri())).getHost(); - String transportURIHost = (Uri.parse(mAccount.getTransportUri())).getHost(); - - for (List subjectAlternativeName : subjectAlternativeNames) { - Integer type = (Integer)subjectAlternativeName.get(0); - Object value = subjectAlternativeName.get(1); - String name; - switch (type) { - case 0: - Timber.w("SubjectAltName of type OtherName not supported."); - continue; - case 1: // RFC822Name - name = (String)value; - break; - case 2: // DNSName - name = (String)value; - break; - case 3: - Timber.w("unsupported SubjectAltName of type x400Address"); - continue; - case 4: - Timber.w("unsupported SubjectAltName of type directoryName"); - continue; - case 5: - Timber.w("unsupported SubjectAltName of type ediPartyName"); - continue; - case 6: // Uri - name = (String)value; - break; - case 7: // ip-address - name = (String)value; - break; - default: - Timber.w("unsupported SubjectAltName of unknown type"); - continue; - } - - // if some of the SubjectAltNames match the store or transport -host, - // display them - if (name.equalsIgnoreCase(storeURIHost) || name.equalsIgnoreCase(transportURIHost)) { - //TODO: localize this string - altNamesText.append("Subject(alt): ").append(name).append(",...\n"); - } else if (name.startsWith("*.") && ( - storeURIHost.endsWith(name.substring(2)) || - transportURIHost.endsWith(name.substring(2)))) { - //TODO: localize this string - altNamesText.append("Subject(alt): ").append(name).append(",...\n"); - } - } - chainInfo.append(altNamesText); - } - } catch (Exception e1) { - // don't fail just because of subjectAltNames - Timber.w(e1, "cannot display SubjectAltNames in dialog"); - } - - chainInfo.append("Issuer: ").append(chain[i].getIssuerDN().toString()).append("\n"); - if (sha1 != null) { - sha1.reset(); - try { - String sha1sum = Hex.encodeHex(sha1.digest(chain[i].getEncoded())); - chainInfo.append("Fingerprint (SHA-1): ").append(sha1sum).append("\n"); - } catch (CertificateEncodingException e) { - Timber.e(e, "Error while encoding certificate"); - } - } - } - - // TODO: refactor with DialogFragment. - // This is difficult because we need to pass through chain[0] for onClick() - new AlertDialog.Builder(AccountSetupCheckSettings.this) - .setTitle(getString(R.string.account_setup_failed_dlg_invalid_certificate_title)) - //.setMessage(getString(R.string.account_setup_failed_dlg_invalid_certificate) - .setMessage(getString(msgResId, exMessage) - + " " + chainInfo.toString() - ) - .setCancelable(true) - .setPositiveButton( - getString(R.string.account_setup_failed_dlg_invalid_certificate_accept), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - acceptCertificate(chain[0]); - } - }) - .setNegativeButton( - getString(R.string.account_setup_failed_dlg_invalid_certificate_reject), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }) - .show(); - } - }); - } - - /** - * Permanently accepts a certificate for the INCOMING or OUTGOING direction - * by adding it to the local key store. - * - * @param certificate - */ - private void acceptCertificate(X509Certificate certificate) { - try { - mAccount.addCertificate(mDirection, certificate); - } catch (CertificateException e) { - showErrorDialog( - R.string.account_setup_failed_dlg_certificate_message_fmt, - e.getMessage() == null ? "" : e.getMessage()); - } - AccountSetupCheckSettings.actionCheckSettings(AccountSetupCheckSettings.this, mAccount, - mDirection); - } - - @Override - public void onActivityResult(int reqCode, int resCode, Intent data) { - setResult(resCode); - finish(); - } - - private void onCancel() { - mCanceled = true; - setMessage(R.string.account_setup_check_settings_canceling_msg); - setResult(RESULT_CANCELED); - finish(); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.cancel: - onCancel(); - break; - } - } - - private void showErrorDialog(final int msgResId, final Object... args) { - mHandler.post(new Runnable() { - public void run() { - showDialogFragment(R.id.dialog_account_setup_error, getString(msgResId, args)); - } - }); - } - - private void showDialogFragment(int dialogId, String customMessage) { - if (mDestroyed) { - return; - } - mProgressBar.setIndeterminate(false); - - DialogFragment fragment; - switch (dialogId) { - case R.id.dialog_account_setup_error: { - fragment = ConfirmationDialogFragment.newInstance(dialogId, - getString(R.string.account_setup_failed_dlg_title), - customMessage, - getString(R.string.account_setup_failed_dlg_edit_details_action), - getString(R.string.account_setup_failed_dlg_continue_action) - ); - break; - } - default: { - throw new RuntimeException("Called showDialog(int) with unknown dialog id."); - } - } - - FragmentTransaction ta = getFragmentManager().beginTransaction(); - ta.add(fragment, getDialogTag(dialogId)); - ta.commitAllowingStateLoss(); - - // TODO: commitAllowingStateLoss() is used to prevent https://code.google.com/p/android/issues/detail?id=23761 - // but is a bad... - //fragment.show(ta, getDialogTag(dialogId)); - } - - private String getDialogTag(int dialogId) { - return String.format(Locale.US, "dialog-%d", dialogId); - } - - @Override - public void doPositiveClick(int dialogId) { - switch (dialogId) { - case R.id.dialog_account_setup_error: { - finish(); - break; - } - } - } - - @Override - public void doNegativeClick(int dialogId) { - switch (dialogId) { - case R.id.dialog_account_setup_error: { - mCanceled = false; - setResult(RESULT_OK); - finish(); - break; - } - } - } - - @Override - public void dialogCancelled(int dialogId) { - // nothing to do here... - } - - private String errorMessageForCertificateException(CertificateValidationException e) { - switch (e.getReason()) { - case Expired: return getString(R.string.client_certificate_expired, e.getAlias(), e.getMessage()); - case MissingCapability: return getString(R.string.auth_external_error); - case RetrievalFailure: return getString(R.string.client_certificate_retrieval_failure, e.getAlias()); - case UseMessage: return e.getMessage(); - case Unknown: - default: return ""; - } - } - - /** - * FIXME: Don't use an AsyncTask to perform network operations. - * See also discussion in https://github.com/k9mail/k-9/pull/560 - */ - private class CheckAccountTask extends AsyncTask { - private final Account account; - - private CheckAccountTask(Account account) { - this.account = account; - } - - @Override - protected Void doInBackground(CheckDirection... params) { - final CheckDirection direction = params[0]; - try { - /* - * This task could be interrupted at any point, but network operations can block, - * so relying on InterruptedException is not enough. Instead, check after - * each potentially long-running operation. - */ - if (cancelled()) { - return null; - } - - clearCertificateErrorNotifications(direction); - - checkServerSettings(direction); - - if (cancelled()) { - return null; - } - - setResult(RESULT_OK); - finish(); - - } catch (AuthenticationFailedException afe) { - Timber.e(afe, "Error while testing settings"); - showErrorDialog( - R.string.account_setup_failed_dlg_auth_message_fmt, - afe.getMessage() == null ? "" : afe.getMessage()); - } catch (CertificateValidationException cve) { - handleCertificateValidationException(cve); - } catch (Exception e) { - Timber.e(e, "Error while testing settings"); - String message = e.getMessage() == null ? "" : e.getMessage(); - showErrorDialog(R.string.account_setup_failed_dlg_server_message_fmt, message); - } - return null; - } - - private void clearCertificateErrorNotifications(CheckDirection direction) { - final MessagingController ctrl = MessagingController.getInstance(getApplication()); - ctrl.clearCertificateErrorNotifications(account, direction); - } - - private boolean cancelled() { - if (mDestroyed) { - return true; - } - if (mCanceled) { - finish(); - return true; - } - return false; - } - - private void checkServerSettings(CheckDirection direction) throws MessagingException { - switch (direction) { - case INCOMING: { - checkIncoming(); - break; - } - case OUTGOING: { - checkOutgoing(); - break; - } - } - } - - private void checkOutgoing() throws MessagingException { - if (!(account.getRemoteStore() instanceof WebDavStore)) { - publishProgress(R.string.account_setup_check_settings_check_outgoing_msg); - } - Transport transport = TransportProvider.getInstance().getTransport(K9.app, account); - transport.close(); - try { - transport.open(); - } finally { - transport.close(); - } - } - - private void checkIncoming() throws MessagingException { - Store store = account.getRemoteStore(); - if (store instanceof WebDavStore) { - publishProgress(R.string.account_setup_check_settings_authenticate); - } else { - publishProgress(R.string.account_setup_check_settings_check_incoming_msg); - } - store.checkSettings(); - - if (store instanceof WebDavStore) { - publishProgress(R.string.account_setup_check_settings_fetch); - } - MessagingController.getInstance(getApplication()).listFoldersSynchronous(account, true, null); - MessagingController.getInstance(getApplication()) - .synchronizeMailbox(account, account.getInboxFolderName(), null, null); - } - - @Override - protected void onProgressUpdate(Integer... values) { - setMessage(values[0]); - } - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.java deleted file mode 100644 index 49f62907a969391c74aebadbba95759f2fd46ef3..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupComposition.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.fsck.k9.activity.setup; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import android.widget.CompoundButton; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.K9Activity; - -public class AccountSetupComposition extends K9Activity { - - private static final String EXTRA_ACCOUNT = "account"; - - private Account mAccount; - - private EditText mAccountSignature; - private EditText mAccountEmail; - private EditText mAccountAlwaysBcc; - private EditText mAccountName; - private CheckBox mAccountSignatureUse; - private RadioButton mAccountSignatureBeforeLocation; - private RadioButton mAccountSignatureAfterLocation; - private LinearLayout mAccountSignatureLayout; - - public static void actionEditCompositionSettings(Activity context, Account account) { - Intent i = new Intent(context, AccountSetupComposition.class); - i.setAction(Intent.ACTION_EDIT); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - context.startActivity(i); - } - - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - - setContentView(R.layout.account_setup_composition); - - /* - * If we're being reloaded we override the original account with the one - * we saved - */ - if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) { - accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - } - - mAccountName = (EditText)findViewById(R.id.account_name); - mAccountName.setText(mAccount.getName()); - - mAccountEmail = (EditText)findViewById(R.id.account_email); - mAccountEmail.setText(mAccount.getEmail()); - - mAccountAlwaysBcc = (EditText)findViewById(R.id.account_always_bcc); - mAccountAlwaysBcc.setText(mAccount.getAlwaysBcc()); - - mAccountSignatureLayout = (LinearLayout)findViewById(R.id.account_signature_layout); - - mAccountSignatureUse = (CheckBox)findViewById(R.id.account_signature_use); - boolean useSignature = mAccount.getSignatureUse(); - mAccountSignatureUse.setChecked(useSignature); - mAccountSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) { - mAccountSignatureLayout.setVisibility(View.VISIBLE); - mAccountSignature.setText(mAccount.getSignature()); - boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText(); - mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); - mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); - } else { - mAccountSignatureLayout.setVisibility(View.GONE); - } - } - }); - - mAccountSignature = (EditText)findViewById(R.id.account_signature); - - mAccountSignatureBeforeLocation = (RadioButton)findViewById(R.id.account_signature_location_before_quoted_text); - mAccountSignatureAfterLocation = (RadioButton)findViewById(R.id.account_signature_location_after_quoted_text); - - if (useSignature) { - mAccountSignature.setText(mAccount.getSignature()); - - boolean isSignatureBeforeQuotedText = mAccount.isSignatureBeforeQuotedText(); - mAccountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); - mAccountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); - } else { - mAccountSignatureLayout.setVisibility(View.GONE); - } - } - - private void saveSettings() { - mAccount.setEmail(mAccountEmail.getText().toString()); - mAccount.setAlwaysBcc(mAccountAlwaysBcc.getText().toString()); - mAccount.setName(mAccountName.getText().toString()); - mAccount.setSignatureUse(mAccountSignatureUse.isChecked()); - if (mAccountSignatureUse.isChecked()) { - mAccount.setSignature(mAccountSignature.getText().toString()); - boolean isSignatureBeforeQuotedText = mAccountSignatureBeforeLocation.isChecked(); - mAccount.setSignatureBeforeQuotedText(isSignatureBeforeQuotedText); - } - - mAccount.save(Preferences.getPreferences(this)); - } - - @Override - public void onBackPressed() { - saveSettings(); - super.onBackPressed(); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putSerializable(EXTRA_ACCOUNT, mAccount.getUuid()); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - mAccount.save(Preferences.getPreferences(this)); - finish(); - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java deleted file mode 100644 index 3bf0cb660f7429eb959a73131ab0d27c814ebc70..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java +++ /dev/null @@ -1,657 +0,0 @@ - -package com.fsck.k9.activity.setup; - - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.Map; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.method.DigitsKeyListener; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.TextView; -import android.widget.Toast; - -import com.fsck.k9.Account; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.account.AccountCreator; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.NetworkType; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mail.store.imap.ImapStoreSettings; -import com.fsck.k9.mail.store.webdav.WebDavStoreSettings; -import com.fsck.k9.service.MailService; -import com.fsck.k9.view.ClientCertificateSpinner; -import com.fsck.k9.view.ClientCertificateSpinner.OnClientCertificateChangedListener; -import timber.log.Timber; - -public class AccountSetupIncoming extends K9Activity implements OnClickListener { - private static final String EXTRA_ACCOUNT = "account"; - private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; - private static final String STATE_SECURITY_TYPE_POSITION = "stateSecurityTypePosition"; - private static final String STATE_AUTH_TYPE_POSITION = "authTypePosition"; - - private Type mStoreType; - private EditText mUsernameView; - private EditText mPasswordView; - private ClientCertificateSpinner mClientCertificateSpinner; - private TextView mClientCertificateLabelView; - private TextView mPasswordLabelView; - private EditText mServerView; - private EditText mPortView; - private String mCurrentPortViewSetting; - private Spinner mSecurityTypeView; - private int mCurrentSecurityTypeViewPosition; - private Spinner mAuthTypeView; - private int mCurrentAuthTypeViewPosition; - private CheckBox mImapAutoDetectNamespaceView; - private EditText mImapPathPrefixView; - private EditText mWebdavPathPrefixView; - private EditText mWebdavAuthPathView; - private EditText mWebdavMailboxPathView; - private Button mNextButton; - private Account mAccount; - private boolean mMakeDefault; - private CheckBox mCompressionMobile; - private CheckBox mCompressionWifi; - private CheckBox mCompressionOther; - private CheckBox mSubscribedFoldersOnly; - private AuthTypeAdapter mAuthTypeAdapter; - private ConnectionSecurity[] mConnectionSecurityChoices = ConnectionSecurity.values(); - - public static void actionIncomingSettings(Activity context, Account account, boolean makeDefault) { - Intent i = new Intent(context, AccountSetupIncoming.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); - context.startActivity(i); - } - - public static void actionEditIncomingSettings(Activity context, Account account) { - context.startActivity(intentActionEditIncomingSettings(context, account)); - } - - public static Intent intentActionEditIncomingSettings(Context context, Account account) { - Intent i = new Intent(context, AccountSetupIncoming.class); - i.setAction(Intent.ACTION_EDIT); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - return i; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_incoming); - - mUsernameView = (EditText)findViewById(R.id.account_username); - mPasswordView = (EditText)findViewById(R.id.account_password); - mClientCertificateSpinner = (ClientCertificateSpinner)findViewById(R.id.account_client_certificate_spinner); - mClientCertificateLabelView = (TextView)findViewById(R.id.account_client_certificate_label); - mPasswordLabelView = (TextView)findViewById(R.id.account_password_label); - TextView serverLabelView = (TextView) findViewById(R.id.account_server_label); - mServerView = (EditText)findViewById(R.id.account_server); - mPortView = (EditText)findViewById(R.id.account_port); - mSecurityTypeView = (Spinner)findViewById(R.id.account_security_type); - mAuthTypeView = (Spinner)findViewById(R.id.account_auth_type); - mImapAutoDetectNamespaceView = (CheckBox)findViewById(R.id.imap_autodetect_namespace); - mImapPathPrefixView = (EditText)findViewById(R.id.imap_path_prefix); - mWebdavPathPrefixView = (EditText)findViewById(R.id.webdav_path_prefix); - mWebdavAuthPathView = (EditText)findViewById(R.id.webdav_auth_path); - mWebdavMailboxPathView = (EditText)findViewById(R.id.webdav_mailbox_path); - mNextButton = (Button)findViewById(R.id.next); - mCompressionMobile = (CheckBox)findViewById(R.id.compression_mobile); - mCompressionWifi = (CheckBox)findViewById(R.id.compression_wifi); - mCompressionOther = (CheckBox)findViewById(R.id.compression_other); - mSubscribedFoldersOnly = (CheckBox)findViewById(R.id.subscribed_folders_only); - - mNextButton.setOnClickListener(this); - - mImapAutoDetectNamespaceView.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mImapPathPrefixView.setEnabled(!isChecked); - if (isChecked && mImapPathPrefixView.hasFocus()) { - mImapPathPrefixView.focusSearch(View.FOCUS_UP).requestFocus(); - } else if (!isChecked) { - mImapPathPrefixView.requestFocus(); - } - } - }); - - mAuthTypeAdapter = AuthTypeAdapter.get(this); - mAuthTypeView.setAdapter(mAuthTypeAdapter); - - /* - * Only allow digits in the port field. - */ - mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - mMakeDefault = getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false); - - /* - * If we're being reloaded we override the original account with the one - * we saved - */ - if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) { - accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - } - - boolean editSettings = Intent.ACTION_EDIT.equals(getIntent().getAction()); - - try { - ServerSettings settings = RemoteStore.decodeStoreUri(mAccount.getStoreUri()); - - if (savedInstanceState == null) { - // The first item is selected if settings.authenticationType is null or is not in mAuthTypeAdapter - mCurrentAuthTypeViewPosition = mAuthTypeAdapter.getAuthPosition(settings.authenticationType); - } else { - mCurrentAuthTypeViewPosition = savedInstanceState.getInt(STATE_AUTH_TYPE_POSITION); - } - mAuthTypeView.setSelection(mCurrentAuthTypeViewPosition, false); - updateViewFromAuthType(); - - if (settings.username != null) { - mUsernameView.setText(settings.username); - } - - if (settings.password != null) { - mPasswordView.setText(settings.password); - } - - if (settings.clientCertificateAlias != null) { - mClientCertificateSpinner.setAlias(settings.clientCertificateAlias); - } - - mStoreType = settings.type; - if (Type.POP3 == settings.type) { - serverLabelView.setText(R.string.account_setup_incoming_pop_server_label); - findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE); - findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); - findViewById(R.id.webdav_mailbox_alias_section).setVisibility(View.GONE); - findViewById(R.id.webdav_owa_path_section).setVisibility(View.GONE); - findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE); - findViewById(R.id.compression_section).setVisibility(View.GONE); - findViewById(R.id.compression_label).setVisibility(View.GONE); - mSubscribedFoldersOnly.setVisibility(View.GONE); - } else if (Type.IMAP == settings.type) { - serverLabelView.setText(R.string.account_setup_incoming_imap_server_label); - - ImapStoreSettings imapSettings = (ImapStoreSettings) settings; - - mImapAutoDetectNamespaceView.setChecked(imapSettings.autoDetectNamespace); - if (imapSettings.pathPrefix != null) { - mImapPathPrefixView.setText(imapSettings.pathPrefix); - } - - findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); - findViewById(R.id.webdav_mailbox_alias_section).setVisibility(View.GONE); - findViewById(R.id.webdav_owa_path_section).setVisibility(View.GONE); - findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE); - - if (!editSettings) { - findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE); - } - } else if (Type.WebDAV == settings.type) { - serverLabelView.setText(R.string.account_setup_incoming_webdav_server_label); - mConnectionSecurityChoices = new ConnectionSecurity[] { - ConnectionSecurity.NONE, - ConnectionSecurity.SSL_TLS_REQUIRED }; - - // Hide the unnecessary fields - findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE); - findViewById(R.id.account_auth_type_label).setVisibility(View.GONE); - findViewById(R.id.account_auth_type).setVisibility(View.GONE); - findViewById(R.id.compression_section).setVisibility(View.GONE); - findViewById(R.id.compression_label).setVisibility(View.GONE); - mSubscribedFoldersOnly.setVisibility(View.GONE); - - WebDavStoreSettings webDavSettings = (WebDavStoreSettings) settings; - - if (webDavSettings.path != null) { - mWebdavPathPrefixView.setText(webDavSettings.path); - } - - if (webDavSettings.authPath != null) { - mWebdavAuthPathView.setText(webDavSettings.authPath); - } - - if (webDavSettings.mailboxPath != null) { - mWebdavMailboxPathView.setText(webDavSettings.mailboxPath); - } - } else { - throw new Exception("Unknown account type: " + mAccount.getStoreUri()); - } - - if (!editSettings) { - mAccount.setDeletePolicy(AccountCreator.getDefaultDeletePolicy(settings.type)); - } - - // Note that mConnectionSecurityChoices is configured above based on server type - ConnectionSecurityAdapter securityTypesAdapter = - ConnectionSecurityAdapter.get(this, mConnectionSecurityChoices); - mSecurityTypeView.setAdapter(securityTypesAdapter); - - // Select currently configured security type - if (savedInstanceState == null) { - mCurrentSecurityTypeViewPosition = securityTypesAdapter.getConnectionSecurityPosition(settings.connectionSecurity); - } else { - - /* - * Restore the spinner state now, before calling - * setOnItemSelectedListener(), thus avoiding a call to - * onItemSelected(). Then, when the system restores the state - * (again) in onRestoreInstanceState(), The system will see that - * the new state is the same as the current state (set here), so - * once again onItemSelected() will not be called. - */ - mCurrentSecurityTypeViewPosition = savedInstanceState.getInt(STATE_SECURITY_TYPE_POSITION); - } - mSecurityTypeView.setSelection(mCurrentSecurityTypeViewPosition, false); - - updateAuthPlainTextFromSecurityType(settings.connectionSecurity); - - mCompressionMobile.setChecked(mAccount.useCompression(NetworkType.MOBILE)); - mCompressionWifi.setChecked(mAccount.useCompression(NetworkType.WIFI)); - mCompressionOther.setChecked(mAccount.useCompression(NetworkType.OTHER)); - - if (settings.host != null) { - mServerView.setText(settings.host); - } - - if (settings.port != -1) { - mPortView.setText(String.format("%d", settings.port)); - } else { - updatePortFromSecurityType(); - } - mCurrentPortViewSetting = mPortView.getText().toString(); - - mSubscribedFoldersOnly.setChecked(mAccount.subscribedFoldersOnly()); - } catch (Exception e) { - failure(e); - } - } - - /** - * Called at the end of either {@code onCreate()} or - * {@code onRestoreInstanceState()}, after the views have been initialized, - * so that the listeners are not triggered during the view initialization. - * This avoids needless calls to {@code validateFields()} which is called - * immediately after this is called. - */ - private void initializeViewListeners() { - - /* - * Updates the port when the user changes the security type. This allows - * us to show a reasonable default which the user can change. - */ - mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, - long id) { - - /* - * We keep our own record of the spinner state so we - * know for sure that onItemSelected() was called - * because of user input, not because of spinner - * state initialization. This assures that the port - * will not be replaced with a default value except - * on user input. - */ - if (mCurrentSecurityTypeViewPosition != position) { - updatePortFromSecurityType(); - validateFields(); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { /* unused */ } - }); - - mAuthTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, - long id) { - if (mCurrentAuthTypeViewPosition == position) { - return; - } - - updateViewFromAuthType(); - validateFields(); - AuthType selection = getSelectedAuthType(); - - // Have the user select (or confirm) the client certificate - if (AuthType.EXTERNAL == selection) { - - // This may again invoke validateFields() - mClientCertificateSpinner.chooseCertificate(); - } else { - mPasswordView.requestFocus(); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { /* unused */ } - }); - - mClientCertificateSpinner.setOnClientCertificateChangedListener(clientCertificateChangedListener); - mUsernameView.addTextChangedListener(validationTextWatcher); - mPasswordView.addTextChangedListener(validationTextWatcher); - mServerView.addTextChangedListener(validationTextWatcher); - mPortView.addTextChangedListener(validationTextWatcher); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); - outState.putInt(STATE_SECURITY_TYPE_POSITION, mCurrentSecurityTypeViewPosition); - outState.putInt(STATE_AUTH_TYPE_POSITION, mCurrentAuthTypeViewPosition); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - /* - * We didn't want the listeners active while the state was being restored - * because they could overwrite the restored port with a default port when - * the security type was restored. - */ - initializeViewListeners(); - validateFields(); - } - - /** - * Shows/hides password field and client certificate spinner - */ - private void updateViewFromAuthType() { - AuthType authType = getSelectedAuthType(); - boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - if (isAuthTypeExternal) { - - // hide password fields, show client certificate fields - mPasswordView.setVisibility(View.GONE); - mPasswordLabelView.setVisibility(View.GONE); - mClientCertificateLabelView.setVisibility(View.VISIBLE); - mClientCertificateSpinner.setVisibility(View.VISIBLE); - } else { - - // show password fields, hide client certificate fields - mPasswordView.setVisibility(View.VISIBLE); - mPasswordLabelView.setVisibility(View.VISIBLE); - mClientCertificateLabelView.setVisibility(View.GONE); - mClientCertificateSpinner.setVisibility(View.GONE); - } - } - - /** - * This is invoked only when the user makes changes to a widget, not when - * widgets are changed programmatically. (The logic is simpler when you know - * that this is the last thing called after an input change.) - */ - private void validateFields() { - AuthType authType = getSelectedAuthType(); - boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - ConnectionSecurity connectionSecurity = getSelectedSecurity(); - boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); - - if (isAuthTypeExternal && !hasConnectionSecurity) { - - // Notify user of an invalid combination of AuthType.EXTERNAL & ConnectionSecurity.NONE - String toastText = getString(R.string.account_setup_incoming_invalid_setting_combo_notice, - getString(R.string.account_setup_incoming_auth_type_label), - AuthType.EXTERNAL.toString(), - getString(R.string.account_setup_incoming_security_label), - ConnectionSecurity.NONE.toString()); - Toast.makeText(this, toastText, Toast.LENGTH_LONG).show(); - - // Reset the views back to their previous settings without recursing through here again - OnItemSelectedListener onItemSelectedListener = mAuthTypeView.getOnItemSelectedListener(); - mAuthTypeView.setOnItemSelectedListener(null); - mAuthTypeView.setSelection(mCurrentAuthTypeViewPosition, false); - mAuthTypeView.setOnItemSelectedListener(onItemSelectedListener); - updateViewFromAuthType(); - - onItemSelectedListener = mSecurityTypeView.getOnItemSelectedListener(); - mSecurityTypeView.setOnItemSelectedListener(null); - mSecurityTypeView.setSelection(mCurrentSecurityTypeViewPosition, false); - mSecurityTypeView.setOnItemSelectedListener(onItemSelectedListener); - updateAuthPlainTextFromSecurityType(getSelectedSecurity()); - - mPortView.removeTextChangedListener(validationTextWatcher); - mPortView.setText(mCurrentPortViewSetting); - mPortView.addTextChangedListener(validationTextWatcher); - - authType = getSelectedAuthType(); - isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - connectionSecurity = getSelectedSecurity(); - hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); - } else { - mCurrentAuthTypeViewPosition = mAuthTypeView.getSelectedItemPosition(); - mCurrentSecurityTypeViewPosition = mSecurityTypeView.getSelectedItemPosition(); - mCurrentPortViewSetting = mPortView.getText().toString(); - } - - boolean hasValidCertificateAlias = mClientCertificateSpinner.getAlias() != null; - boolean hasValidUserName = Utility.requiredFieldValid(mUsernameView); - - boolean hasValidPasswordSettings = hasValidUserName - && !isAuthTypeExternal - && Utility.requiredFieldValid(mPasswordView); - - boolean hasValidExternalAuthSettings = hasValidUserName - && isAuthTypeExternal - && hasConnectionSecurity - && hasValidCertificateAlias; - - mNextButton.setEnabled(Utility.domainFieldValid(mServerView) - && Utility.requiredFieldValid(mPortView) - && (hasValidPasswordSettings || hasValidExternalAuthSettings)); - Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); - } - - private void updatePortFromSecurityType() { - ConnectionSecurity securityType = getSelectedSecurity(); - updateAuthPlainTextFromSecurityType(securityType); - - // Remove listener so as not to trigger validateFields() which is called - // elsewhere as a result of user interaction. - mPortView.removeTextChangedListener(validationTextWatcher); - mPortView.setText(String.valueOf(AccountCreator.getDefaultPort(securityType, mStoreType))); - mPortView.addTextChangedListener(validationTextWatcher); - } - - private void updateAuthPlainTextFromSecurityType(ConnectionSecurity securityType) { - mAuthTypeAdapter.useInsecureText(securityType == ConnectionSecurity.NONE); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - if (Intent.ACTION_EDIT.equals(getIntent().getAction())) { - boolean isPushCapable = false; - try { - Store store = mAccount.getRemoteStore(); - isPushCapable = store.isPushCapable(); - } catch (Exception e) { - Timber.e(e, "Could not get remote store"); - } - if (isPushCapable && mAccount.getFolderPushMode() != FolderMode.NONE) { - MailService.actionRestartPushers(this, null); - } - mAccount.save(Preferences.getPreferences(this)); - finish(); - } else { - /* - * Set the username and password for the outgoing settings to the username and - * password the user just set for incoming. - */ - try { - String username = mUsernameView.getText().toString(); - - String password = null; - String clientCertificateAlias = null; - AuthType authType = getSelectedAuthType(); - if (AuthType.EXTERNAL == authType) { - clientCertificateAlias = mClientCertificateSpinner.getAlias(); - } else { - password = mPasswordView.getText().toString(); - } - - URI oldUri = new URI(mAccount.getTransportUri()); - ServerSettings transportServer = new ServerSettings(Type.SMTP, oldUri.getHost(), oldUri.getPort(), - ConnectionSecurity.SSL_TLS_REQUIRED, authType, username, password, clientCertificateAlias); - String transportUri = TransportUris.createTransportUri(transportServer); - mAccount.setTransportUri(transportUri); - } catch (URISyntaxException use) { - /* - * If we can't set up the URL we just continue. It's only for - * convenience. - */ - } - - - AccountSetupOutgoing.actionOutgoingSettings(this, mAccount, mMakeDefault); - finish(); - } - } - } - - protected void onNext() { - try { - ConnectionSecurity connectionSecurity = getSelectedSecurity(); - - String username = mUsernameView.getText().toString(); - String password = null; - String clientCertificateAlias = null; - - AuthType authType = getSelectedAuthType(); - if (authType == AuthType.EXTERNAL) { - clientCertificateAlias = mClientCertificateSpinner.getAlias(); - } else { - password = mPasswordView.getText().toString(); - } - String host = mServerView.getText().toString(); - int port = Integer.parseInt(mPortView.getText().toString()); - - Map extra = null; - if (Type.IMAP == mStoreType) { - extra = new HashMap(); - extra.put(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY, - Boolean.toString(mImapAutoDetectNamespaceView.isChecked())); - extra.put(ImapStoreSettings.PATH_PREFIX_KEY, - mImapPathPrefixView.getText().toString()); - } else if (Type.WebDAV == mStoreType) { - extra = new HashMap(); - extra.put(WebDavStoreSettings.PATH_KEY, - mWebdavPathPrefixView.getText().toString()); - extra.put(WebDavStoreSettings.AUTH_PATH_KEY, - mWebdavAuthPathView.getText().toString()); - extra.put(WebDavStoreSettings.MAILBOX_PATH_KEY, - mWebdavMailboxPathView.getText().toString()); - } - - mAccount.deleteCertificate(host, port, CheckDirection.INCOMING); - ServerSettings settings = new ServerSettings(mStoreType, host, port, - connectionSecurity, authType, username, password, clientCertificateAlias, extra); - - mAccount.setStoreUri(RemoteStore.createStoreUri(settings)); - - mAccount.setCompression(NetworkType.MOBILE, mCompressionMobile.isChecked()); - mAccount.setCompression(NetworkType.WIFI, mCompressionWifi.isChecked()); - mAccount.setCompression(NetworkType.OTHER, mCompressionOther.isChecked()); - mAccount.setSubscribedFoldersOnly(mSubscribedFoldersOnly.isChecked()); - - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.INCOMING); - } catch (Exception e) { - failure(e); - } - - } - - public void onClick(View v) { - try { - switch (v.getId()) { - case R.id.next: - onNext(); - break; - } - } catch (Exception e) { - failure(e); - } - } - - private void failure(Exception use) { - Timber.e(use, "Failure"); - String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); - - Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_LONG); - toast.show(); - } - - - /* - * Calls validateFields() which enables or disables the Next button - * based on the fields' validity. - */ - TextWatcher validationTextWatcher = new TextWatcher() { - public void afterTextChanged(Editable s) { - validateFields(); - } - - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - /* unused */ - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - /* unused */ - } - }; - - OnClientCertificateChangedListener clientCertificateChangedListener = new OnClientCertificateChangedListener() { - @Override - public void onClientCertificateChanged(String alias) { - validateFields(); - } - }; - - private AuthType getSelectedAuthType() { - AuthTypeHolder holder = (AuthTypeHolder) mAuthTypeView.getSelectedItem(); - return holder.authType; - } - - private ConnectionSecurity getSelectedSecurity() { - ConnectionSecurityHolder holder = (ConnectionSecurityHolder) mSecurityTypeView.getSelectedItem(); - return holder.connectionSecurity; - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupNames.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupNames.java deleted file mode 100644 index 61702c52fe6b4d1c45ee6e196e25769ccf44eb25..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupNames.java +++ /dev/null @@ -1,100 +0,0 @@ - -package com.fsck.k9.activity.setup; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.method.TextKeyListener; -import android.text.method.TextKeyListener.Capitalize; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.EditText; -import com.fsck.k9.*; -import com.fsck.k9.activity.Accounts; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.helper.Utility; - -public class AccountSetupNames extends K9Activity implements OnClickListener { - private static final String EXTRA_ACCOUNT = "account"; - - private EditText mDescription; - - private EditText mName; - - private Account mAccount; - - private Button mDoneButton; - - public static void actionSetNames(Context context, Account account) { - Intent i = new Intent(context, AccountSetupNames.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - context.startActivity(i); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_names); - mDescription = (EditText)findViewById(R.id.account_description); - mName = (EditText)findViewById(R.id.account_name); - mDoneButton = (Button)findViewById(R.id.done); - mDoneButton.setOnClickListener(this); - - TextWatcher validationTextWatcher = new TextWatcher() { - public void afterTextChanged(Editable s) { - validateFields(); - } - - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }; - mName.addTextChangedListener(validationTextWatcher); - - mName.setKeyListener(TextKeyListener.getInstance(false, Capitalize.WORDS)); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - - /* - * Since this field is considered optional, we don't set this here. If - * the user fills in a value we'll reset the current value, otherwise we - * just leave the saved value alone. - */ - // mDescription.setText(mAccount.getDescription()); - if (mAccount.getName() != null) { - mName.setText(mAccount.getName()); - } - if (!Utility.requiredFieldValid(mName)) { - mDoneButton.setEnabled(false); - } - } - - private void validateFields() { - mDoneButton.setEnabled(Utility.requiredFieldValid(mName)); - Utility.setCompoundDrawablesAlpha(mDoneButton, mDoneButton.isEnabled() ? 255 : 128); - } - - protected void onNext() { - if (Utility.requiredFieldValid(mDescription)) { - mAccount.setDescription(mDescription.getText().toString()); - } - mAccount.setName(mName.getText().toString()); - mAccount.save(Preferences.getPreferences(this)); - Accounts.listAccounts(this); - finish(); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.done: - onNext(); - break; - } - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOptions.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOptions.java deleted file mode 100644 index d44e9aa09f9b8cd8d4a7699ea81d9f9d898039dc..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOptions.java +++ /dev/null @@ -1,163 +0,0 @@ - -package com.fsck.k9.activity.setup; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import timber.log.Timber; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.ArrayAdapter; -import android.widget.CheckBox; -import android.widget.Spinner; -import com.fsck.k9.*; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.mail.Store; - -public class AccountSetupOptions extends K9Activity implements OnClickListener { - private static final String EXTRA_ACCOUNT = "account"; - - private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; - - private Spinner mCheckFrequencyView; - - private Spinner mDisplayCountView; - - - private CheckBox mNotifyView; - private CheckBox mNotifySyncView; - private CheckBox mPushEnable; - - private Account mAccount; - - public static void actionOptions(Context context, Account account, boolean makeDefault) { - Intent i = new Intent(context, AccountSetupOptions.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); - context.startActivity(i); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_options); - - mCheckFrequencyView = (Spinner)findViewById(R.id.account_check_frequency); - mDisplayCountView = (Spinner)findViewById(R.id.account_display_count); - mNotifyView = (CheckBox)findViewById(R.id.account_notify); - mNotifySyncView = (CheckBox)findViewById(R.id.account_notify_sync); - mPushEnable = (CheckBox)findViewById(R.id.account_enable_push); - - findViewById(R.id.next).setOnClickListener(this); - - SpinnerOption checkFrequencies[] = { - new SpinnerOption(-1, - getString(R.string.account_setup_options_mail_check_frequency_never)), - new SpinnerOption(1, - getString(R.string.account_setup_options_mail_check_frequency_1min)), - new SpinnerOption(5, - getString(R.string.account_setup_options_mail_check_frequency_5min)), - new SpinnerOption(10, - getString(R.string.account_setup_options_mail_check_frequency_10min)), - new SpinnerOption(15, - getString(R.string.account_setup_options_mail_check_frequency_15min)), - new SpinnerOption(30, - getString(R.string.account_setup_options_mail_check_frequency_30min)), - new SpinnerOption(60, - getString(R.string.account_setup_options_mail_check_frequency_1hour)), - new SpinnerOption(120, - getString(R.string.account_setup_options_mail_check_frequency_2hour)), - new SpinnerOption(180, - getString(R.string.account_setup_options_mail_check_frequency_3hour)), - new SpinnerOption(360, - getString(R.string.account_setup_options_mail_check_frequency_6hour)), - new SpinnerOption(720, - getString(R.string.account_setup_options_mail_check_frequency_12hour)), - new SpinnerOption(1440, - getString(R.string.account_setup_options_mail_check_frequency_24hour)), - - }; - - ArrayAdapter checkFrequenciesAdapter = new ArrayAdapter(this, - android.R.layout.simple_spinner_item, checkFrequencies); - checkFrequenciesAdapter - .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mCheckFrequencyView.setAdapter(checkFrequenciesAdapter); - - SpinnerOption displayCounts[] = { - new SpinnerOption(10, getString(R.string.account_setup_options_mail_display_count_10)), - new SpinnerOption(25, getString(R.string.account_setup_options_mail_display_count_25)), - new SpinnerOption(50, getString(R.string.account_setup_options_mail_display_count_50)), - new SpinnerOption(100, getString(R.string.account_setup_options_mail_display_count_100)), - new SpinnerOption(250, getString(R.string.account_setup_options_mail_display_count_250)), - new SpinnerOption(500, getString(R.string.account_setup_options_mail_display_count_500)), - new SpinnerOption(1000, getString(R.string.account_setup_options_mail_display_count_1000)), - }; - - ArrayAdapter displayCountsAdapter = new ArrayAdapter(this, - android.R.layout.simple_spinner_item, displayCounts); - displayCountsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mDisplayCountView.setAdapter(displayCountsAdapter); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - - mNotifyView.setChecked(mAccount.isNotifyNewMail()); - mNotifySyncView.setChecked(mAccount.isShowOngoing()); - SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, mAccount - .getAutomaticCheckIntervalMinutes()); - SpinnerOption.setSpinnerOptionValue(mDisplayCountView, mAccount - .getDisplayCount()); - - - boolean isPushCapable = false; - try { - Store store = mAccount.getRemoteStore(); - isPushCapable = store.isPushCapable(); - } catch (Exception e) { - Timber.e(e, "Could not get remote store"); - } - - - if (!isPushCapable) { - mPushEnable.setVisibility(View.GONE); - } else { - mPushEnable.setChecked(true); - } - - - } - - private void onDone() { - mAccount.setDescription(mAccount.getEmail()); - mAccount.setNotifyNewMail(mNotifyView.isChecked()); - mAccount.setShowOngoing(mNotifySyncView.isChecked()); - mAccount.setAutomaticCheckIntervalMinutes((Integer)((SpinnerOption)mCheckFrequencyView - .getSelectedItem()).value); - mAccount.setDisplayCount((Integer)((SpinnerOption)mDisplayCountView - .getSelectedItem()).value); - - if (mPushEnable.isChecked()) { - mAccount.setFolderPushMode(Account.FolderMode.FIRST_CLASS); - } else { - mAccount.setFolderPushMode(Account.FolderMode.NONE); - } - - mAccount.save(Preferences.getPreferences(this)); - if (mAccount.equals(Preferences.getPreferences(this).getDefaultAccount()) || - getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false)) { - Preferences.getPreferences(this).setDefaultAccount(mAccount); - } - K9.setServicesEnabled(this); - AccountSetupNames.actionSetNames(this, mAccount); - finish(); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.next: - onDone(); - break; - } - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java deleted file mode 100644 index c24f495ebe484cab23064898329885067ac2e314..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java +++ /dev/null @@ -1,539 +0,0 @@ - -package com.fsck.k9.activity.setup; - - -import java.net.URI; -import java.net.URISyntaxException; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.text.method.DigitsKeyListener; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.TextView; -import android.widget.Toast; - -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.account.AccountCreator; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.ServerSettings.Type; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.view.ClientCertificateSpinner; -import com.fsck.k9.view.ClientCertificateSpinner.OnClientCertificateChangedListener; -import timber.log.Timber; - -public class AccountSetupOutgoing extends K9Activity implements OnClickListener, - OnCheckedChangeListener { - private static final String EXTRA_ACCOUNT = "account"; - - private static final String EXTRA_MAKE_DEFAULT = "makeDefault"; - private static final String STATE_SECURITY_TYPE_POSITION = "stateSecurityTypePosition"; - private static final String STATE_AUTH_TYPE_POSITION = "authTypePosition"; - - private EditText mUsernameView; - private EditText mPasswordView; - private ClientCertificateSpinner mClientCertificateSpinner; - private TextView mClientCertificateLabelView; - private TextView mPasswordLabelView; - private EditText mServerView; - private EditText mPortView; - private String mCurrentPortViewSetting; - private CheckBox mRequireLoginView; - private ViewGroup mRequireLoginSettingsView; - private Spinner mSecurityTypeView; - private int mCurrentSecurityTypeViewPosition; - private Spinner mAuthTypeView; - private int mCurrentAuthTypeViewPosition; - private AuthTypeAdapter mAuthTypeAdapter; - private Button mNextButton; - private Account mAccount; - private boolean mMakeDefault; - - public static void actionOutgoingSettings(Context context, Account account, boolean makeDefault) { - Intent i = new Intent(context, AccountSetupOutgoing.class); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - i.putExtra(EXTRA_MAKE_DEFAULT, makeDefault); - context.startActivity(i); - } - - public static void actionEditOutgoingSettings(Context context, Account account) { - context.startActivity(intentActionEditOutgoingSettings(context, account)); - } - - public static Intent intentActionEditOutgoingSettings(Context context, Account account) { - Intent i = new Intent(context, AccountSetupOutgoing.class); - i.setAction(Intent.ACTION_EDIT); - i.putExtra(EXTRA_ACCOUNT, account.getUuid()); - return i; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.account_setup_outgoing); - - String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - - try { - if (new URI(mAccount.getStoreUri()).getScheme().startsWith("webdav")) { - mAccount.setTransportUri(mAccount.getStoreUri()); - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING); - } - } catch (URISyntaxException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - mUsernameView = (EditText)findViewById(R.id.account_username); - mPasswordView = (EditText)findViewById(R.id.account_password); - mClientCertificateSpinner = (ClientCertificateSpinner)findViewById(R.id.account_client_certificate_spinner); - mClientCertificateLabelView = (TextView)findViewById(R.id.account_client_certificate_label); - mPasswordLabelView = (TextView)findViewById(R.id.account_password_label); - mServerView = (EditText)findViewById(R.id.account_server); - mPortView = (EditText)findViewById(R.id.account_port); - mRequireLoginView = (CheckBox)findViewById(R.id.account_require_login); - mRequireLoginSettingsView = (ViewGroup)findViewById(R.id.account_require_login_settings); - mSecurityTypeView = (Spinner)findViewById(R.id.account_security_type); - mAuthTypeView = (Spinner)findViewById(R.id.account_auth_type); - mNextButton = (Button)findViewById(R.id.next); - - mNextButton.setOnClickListener(this); - - mSecurityTypeView.setAdapter(ConnectionSecurityAdapter.get(this)); - - mAuthTypeAdapter = AuthTypeAdapter.get(this); - mAuthTypeView.setAdapter(mAuthTypeAdapter); - - /* - * Only allow digits in the port field. - */ - mPortView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); - - //FIXME: get Account object again? - accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - mMakeDefault = getIntent().getBooleanExtra(EXTRA_MAKE_DEFAULT, false); - - /* - * If we're being reloaded we override the original account with the one - * we saved - */ - if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) { - accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - } - - try { - ServerSettings settings = TransportUris.decodeTransportUri(mAccount.getTransportUri()); - - updateAuthPlainTextFromSecurityType(settings.connectionSecurity); - - if (savedInstanceState == null) { - // The first item is selected if settings.authenticationType is null or is not in mAuthTypeAdapter - mCurrentAuthTypeViewPosition = mAuthTypeAdapter.getAuthPosition(settings.authenticationType); - } else { - mCurrentAuthTypeViewPosition = savedInstanceState.getInt(STATE_AUTH_TYPE_POSITION); - } - mAuthTypeView.setSelection(mCurrentAuthTypeViewPosition, false); - updateViewFromAuthType(); - - // Select currently configured security type - if (savedInstanceState == null) { - mCurrentSecurityTypeViewPosition = settings.connectionSecurity.ordinal(); - } else { - - /* - * Restore the spinner state now, before calling - * setOnItemSelectedListener(), thus avoiding a call to - * onItemSelected(). Then, when the system restores the state - * (again) in onRestoreInstanceState(), The system will see that - * the new state is the same as the current state (set here), so - * once again onItemSelected() will not be called. - */ - mCurrentSecurityTypeViewPosition = savedInstanceState.getInt(STATE_SECURITY_TYPE_POSITION); - } - mSecurityTypeView.setSelection(mCurrentSecurityTypeViewPosition, false); - - if (settings.username != null && !settings.username.isEmpty()) { - mUsernameView.setText(settings.username); - mRequireLoginView.setChecked(true); - mRequireLoginSettingsView.setVisibility(View.VISIBLE); - } - - if (settings.password != null) { - mPasswordView.setText(settings.password); - } - - if (settings.clientCertificateAlias != null) { - mClientCertificateSpinner.setAlias(settings.clientCertificateAlias); - } - - if (settings.host != null) { - mServerView.setText(settings.host); - } - - if (settings.port != -1) { - mPortView.setText(String.format("%d", settings.port)); - } else { - updatePortFromSecurityType(); - } - mCurrentPortViewSetting = mPortView.getText().toString(); - } catch (Exception e) { - /* - * We should always be able to parse our own settings. - */ - failure(e); - } - - } - - /** - * Called at the end of either {@code onCreate()} or - * {@code onRestoreInstanceState()}, after the views have been initialized, - * so that the listeners are not triggered during the view initialization. - * This avoids needless calls to {@code validateFields()} which is called - * immediately after this is called. - */ - private void initializeViewListeners() { - - /* - * Updates the port when the user changes the security type. This allows - * us to show a reasonable default which the user can change. - */ - mSecurityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, - long id) { - - /* - * We keep our own record of the spinner state so we - * know for sure that onItemSelected() was called - * because of user input, not because of spinner - * state initialization. This assures that the port - * will not be replaced with a default value except - * on user input. - */ - if (mCurrentSecurityTypeViewPosition != position) { - updatePortFromSecurityType(); - - boolean isInsecure = (ConnectionSecurity.NONE == getSelectedSecurity()); - boolean isAuthExternal = (AuthType.EXTERNAL == getSelectedAuthType()); - boolean loginNotRequired = !mRequireLoginView.isChecked(); - - /* - * If the user selects ConnectionSecurity.NONE, a - * warning would normally pop up if the authentication - * is AuthType.EXTERNAL (i.e., using client - * certificates). But such a warning is irrelevant if - * login is not required. So to avoid such a warning - * (generated in validateFields()) under those - * conditions, we change the (irrelevant) authentication - * method to PLAIN. - */ - if (isInsecure && isAuthExternal && loginNotRequired) { - OnItemSelectedListener onItemSelectedListener = mAuthTypeView.getOnItemSelectedListener(); - mAuthTypeView.setOnItemSelectedListener(null); - mCurrentAuthTypeViewPosition = mAuthTypeAdapter.getAuthPosition(AuthType.PLAIN); - mAuthTypeView.setSelection(mCurrentAuthTypeViewPosition, false); - mAuthTypeView.setOnItemSelectedListener(onItemSelectedListener); - updateViewFromAuthType(); - } - - validateFields(); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { /* unused */ } - }); - - mAuthTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, - long id) { - if (mCurrentAuthTypeViewPosition == position) { - return; - } - - updateViewFromAuthType(); - validateFields(); - AuthType selection = getSelectedAuthType(); - - // Have the user select (or confirm) the client certificate - if (AuthType.EXTERNAL == selection) { - - // This may again invoke validateFields() - mClientCertificateSpinner.chooseCertificate(); - } else { - mPasswordView.requestFocus(); - } - } - - @Override - public void onNothingSelected(AdapterView parent) { /* unused */ } - }); - - mRequireLoginView.setOnCheckedChangeListener(this); - mClientCertificateSpinner.setOnClientCertificateChangedListener(clientCertificateChangedListener); - mUsernameView.addTextChangedListener(validationTextWatcher); - mPasswordView.addTextChangedListener(validationTextWatcher); - mServerView.addTextChangedListener(validationTextWatcher); - mPortView.addTextChangedListener(validationTextWatcher); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); - outState.putInt(STATE_SECURITY_TYPE_POSITION, mCurrentSecurityTypeViewPosition); - outState.putInt(STATE_AUTH_TYPE_POSITION, mCurrentAuthTypeViewPosition); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - - if (mRequireLoginView.isChecked()) { - mRequireLoginSettingsView.setVisibility(View.VISIBLE); - } else { - mRequireLoginSettingsView.setVisibility(View.GONE); - } - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - - /* - * We didn't want the listeners active while the state was being restored - * because they could overwrite the restored port with a default port when - * the security type was restored. - */ - initializeViewListeners(); - validateFields(); - } - - /** - * Shows/hides password field and client certificate spinner - */ - private void updateViewFromAuthType() { - AuthType authType = getSelectedAuthType(); - boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - if (isAuthTypeExternal) { - - // hide password fields, show client certificate fields - mPasswordView.setVisibility(View.GONE); - mPasswordLabelView.setVisibility(View.GONE); - mClientCertificateLabelView.setVisibility(View.VISIBLE); - mClientCertificateSpinner.setVisibility(View.VISIBLE); - } else { - - // show password fields, hide client certificate fields - mPasswordView.setVisibility(View.VISIBLE); - mPasswordLabelView.setVisibility(View.VISIBLE); - mClientCertificateLabelView.setVisibility(View.GONE); - mClientCertificateSpinner.setVisibility(View.GONE); - } - } - - /** - * This is invoked only when the user makes changes to a widget, not when - * widgets are changed programmatically. (The logic is simpler when you know - * that this is the last thing called after an input change.) - */ - private void validateFields() { - AuthType authType = getSelectedAuthType(); - boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - ConnectionSecurity connectionSecurity = getSelectedSecurity(); - boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); - - if (isAuthTypeExternal && !hasConnectionSecurity) { - - // Notify user of an invalid combination of AuthType.EXTERNAL & ConnectionSecurity.NONE - String toastText = getString(R.string.account_setup_outgoing_invalid_setting_combo_notice, - getString(R.string.account_setup_incoming_auth_type_label), - AuthType.EXTERNAL.toString(), - getString(R.string.account_setup_incoming_security_label), - ConnectionSecurity.NONE.toString()); - Toast.makeText(this, toastText, Toast.LENGTH_LONG).show(); - - // Reset the views back to their previous settings without recursing through here again - OnItemSelectedListener onItemSelectedListener = mAuthTypeView.getOnItemSelectedListener(); - mAuthTypeView.setOnItemSelectedListener(null); - mAuthTypeView.setSelection(mCurrentAuthTypeViewPosition, false); - mAuthTypeView.setOnItemSelectedListener(onItemSelectedListener); - updateViewFromAuthType(); - - onItemSelectedListener = mSecurityTypeView.getOnItemSelectedListener(); - mSecurityTypeView.setOnItemSelectedListener(null); - mSecurityTypeView.setSelection(mCurrentSecurityTypeViewPosition, false); - mSecurityTypeView.setOnItemSelectedListener(onItemSelectedListener); - updateAuthPlainTextFromSecurityType(getSelectedSecurity()); - - mPortView.removeTextChangedListener(validationTextWatcher); - mPortView.setText(mCurrentPortViewSetting); - mPortView.addTextChangedListener(validationTextWatcher); - - authType = getSelectedAuthType(); - isAuthTypeExternal = (AuthType.EXTERNAL == authType); - - connectionSecurity = getSelectedSecurity(); - hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); - } else { - mCurrentAuthTypeViewPosition = mAuthTypeView.getSelectedItemPosition(); - mCurrentSecurityTypeViewPosition = mSecurityTypeView.getSelectedItemPosition(); - mCurrentPortViewSetting = mPortView.getText().toString(); - } - - boolean hasValidCertificateAlias = mClientCertificateSpinner.getAlias() != null; - boolean hasValidUserName = Utility.requiredFieldValid(mUsernameView); - - boolean hasValidPasswordSettings = hasValidUserName - && !isAuthTypeExternal - && Utility.requiredFieldValid(mPasswordView); - - boolean hasValidExternalAuthSettings = hasValidUserName - && isAuthTypeExternal - && hasConnectionSecurity - && hasValidCertificateAlias; - - mNextButton - .setEnabled(Utility.domainFieldValid(mServerView) - && Utility.requiredFieldValid(mPortView) - && (!mRequireLoginView.isChecked() - || hasValidPasswordSettings || hasValidExternalAuthSettings)); - Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); - } - - private void updatePortFromSecurityType() { - ConnectionSecurity securityType = getSelectedSecurity(); - updateAuthPlainTextFromSecurityType(securityType); - - // Remove listener so as not to trigger validateFields() which is called - // elsewhere as a result of user interaction. - mPortView.removeTextChangedListener(validationTextWatcher); - mPortView.setText(String.valueOf(AccountCreator.getDefaultPort(securityType, Type.SMTP))); - mPortView.addTextChangedListener(validationTextWatcher); - } - - private void updateAuthPlainTextFromSecurityType(ConnectionSecurity securityType) { - mAuthTypeAdapter.useInsecureText(securityType == ConnectionSecurity.NONE); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - if (Intent.ACTION_EDIT.equals(getIntent().getAction())) { - mAccount.save(Preferences.getPreferences(this)); - finish(); - } else { - AccountSetupOptions.actionOptions(this, mAccount, mMakeDefault); - finish(); - } - } - } - - protected void onNext() { - ConnectionSecurity securityType = getSelectedSecurity(); - String uri; - String username = null; - String password = null; - String clientCertificateAlias = null; - AuthType authType = null; - if (mRequireLoginView.isChecked()) { - username = mUsernameView.getText().toString(); - - authType = getSelectedAuthType(); - if (AuthType.EXTERNAL == authType) { - clientCertificateAlias = mClientCertificateSpinner.getAlias(); - } else { - password = mPasswordView.getText().toString(); - } - } - - String newHost = mServerView.getText().toString(); - int newPort = Integer.parseInt(mPortView.getText().toString()); - ServerSettings server = new ServerSettings(Type.SMTP, newHost, newPort, securityType, authType, username, password, clientCertificateAlias); - uri = TransportUris.createTransportUri(server); - mAccount.deleteCertificate(newHost, newPort, CheckDirection.OUTGOING); - mAccount.setTransportUri(uri); - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.next: - onNext(); - break; - } - } - - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - mRequireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE); - validateFields(); - } - - private void failure(Exception use) { - Timber.e(use, "Failure"); - String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); - - Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_LONG); - toast.show(); - } - - /* - * Calls validateFields() which enables or disables the Next button - * based on the fields' validity. - */ - TextWatcher validationTextWatcher = new TextWatcher() { - public void afterTextChanged(Editable s) { - validateFields(); - } - - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - }; - - OnClientCertificateChangedListener clientCertificateChangedListener = new OnClientCertificateChangedListener() { - @Override - public void onClientCertificateChanged(String alias) { - validateFields(); - } - }; - - private AuthType getSelectedAuthType() { - AuthTypeHolder holder = (AuthTypeHolder) mAuthTypeView.getSelectedItem(); - return holder.authType; - } - - private ConnectionSecurity getSelectedSecurity() { - ConnectionSecurityHolder holder = (ConnectionSecurityHolder) mSecurityTypeView.getSelectedItem(); - return holder.connectionSecurity; - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/cache/TemporaryAttachmentStore.java b/k9mail/src/main/java/com/fsck/k9/cache/TemporaryAttachmentStore.java deleted file mode 100644 index 810959603a60d1084a7db7447ea88dbaf69b776e..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/cache/TemporaryAttachmentStore.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.fsck.k9.cache; - - -import java.io.File; -import java.io.IOException; - -import android.content.Context; -import timber.log.Timber; - -import com.fsck.k9.helper.FileHelper; - - -public class TemporaryAttachmentStore { - private static final String TEMPORARY_ATTACHMENT_DIRECTORY = "attachments"; - private static final long MAX_FILE_AGE = 12 * 60 * 60 * 1000; // 12h - - public static File getFile(Context context, String attachmentName) { - File directory = getTemporaryAttachmentDirectory(context); - String filename = FileHelper.sanitizeFilename(attachmentName); - return new File(directory, filename); - } - - public static File getFileForWriting(Context context, String attachmentName) throws IOException { - File directory = createOrCleanAttachmentDirectory(context); - String filename = FileHelper.sanitizeFilename(attachmentName); - return new File(directory, filename); - } - - private static File createOrCleanAttachmentDirectory(Context context) throws IOException { - File directory = getTemporaryAttachmentDirectory(context); - if (directory.exists()) { - cleanOldFiles(directory); - } else { - if (!directory.mkdir()) { - throw new IOException("Couldn't create temporary attachment store: " + directory.getAbsolutePath()); - } - } - return directory; - } - - private static File getTemporaryAttachmentDirectory(Context context) { - return new File(context.getExternalCacheDir(), TEMPORARY_ATTACHMENT_DIRECTORY); - } - - private static void cleanOldFiles(File directory) { - File[] files = directory.listFiles(); - if (files == null) { - return; - } - - long cutOffTime = System.currentTimeMillis() - MAX_FILE_AGE; - for (File file : files) { - if (file.lastModified() < cutOffTime) { - if (file.delete()) { - Timber.d("Deleted from temporary attachment store: %s", file.getName()); - } else { - Timber.w("Couldn't delete from temporary attachment store: %s", file.getName()); - } - } - } - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/helper/EmailHelper.java b/k9mail/src/main/java/com/fsck/k9/helper/EmailHelper.java deleted file mode 100644 index 796dc8d2942c304fd9328c020c65e9b0a7679ca4..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/helper/EmailHelper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.fsck.k9.helper; - - -public final class EmailHelper { - private EmailHelper() {} - - public static String getDomainFromEmailAddress(String email) { - int separatorIndex = email.lastIndexOf('@'); - if (separatorIndex == -1 || separatorIndex + 1 == email.length()) { - return null; - } - - return email.substring(separatorIndex + 1); - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/helper/FileBrowserHelper.java b/k9mail/src/main/java/com/fsck/k9/helper/FileBrowserHelper.java deleted file mode 100644 index cec7ad7c5cfdf7221aabaaacd02ee610830ed281..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/helper/FileBrowserHelper.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.fsck.k9.helper; - -import java.io.File; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Fragment; -import android.content.ActivityNotFoundException; -import android.content.DialogInterface; -import android.content.Intent; -import android.net.Uri; -import android.text.InputType; -import android.widget.EditText; - -import com.fsck.k9.K9; -import com.fsck.k9.R; - -public class FileBrowserHelper { - /** - * A string array that specifies the name of the intent to use, and the scheme to use with it - * when setting the data for the intent. - */ - private static final String[][] PICK_DIRECTORY_INTENTS = { - { "org.openintents.action.PICK_DIRECTORY", "file://" }, // OI File Manager (maybe others) - { "com.estrongs.action.PICK_DIRECTORY", "file://" }, // ES File Explorer - { Intent.ACTION_PICK, "folder://" }, // Blackmoon File Browser (maybe others) - { "com.androidworkz.action.PICK_DIRECTORY", "file://" } - }; // SystemExplorer - - private static FileBrowserHelper sInstance; - - /** - * callback class to provide the result of the fallback textedit path dialog - */ - public interface FileBrowserFailOverCallback { - /** - * the user has entered a path - * @param path the path as String - */ - public void onPathEntered(String path); - /** - * the user has cancel the inputtext dialog - */ - public void onCancel(); - } - /** - * factory method - * - */ - private FileBrowserHelper() { - } - public synchronized static FileBrowserHelper getInstance() { - if (sInstance == null) { - sInstance = new FileBrowserHelper(); - } - return sInstance; - } - - - /** - * tries to open known filebrowsers. - * If no filebrowser is found and fallback textdialog is shown - * @param c the context as activity - * @param startPath: the default value, where the filebrowser will start. - * if startPath = null => the default path is used - * @param requestcode: the int you will get as requestcode in onActivityResult - * (only used if there is a filebrowser installed) - * @param callback: the callback (only used when no filebrowser is installed. - * if a filebrowser is installed => override the onActivtyResult Method - * - * @return true: if a filebrowser has been found (the result will be in the onActivityResult - * false: a fallback textinput has been shown. The Result will be sent with the callback method - * - * - */ - public boolean showFileBrowserActivity(Activity c, File startPath, int requestcode, FileBrowserFailOverCallback callback) { - boolean success = false; - - if (startPath == null) { - startPath = new File(K9.getAttachmentDefaultPath()); - } - - int listIndex = 0; - do { - String intentAction = PICK_DIRECTORY_INTENTS[listIndex][0]; - String uriPrefix = PICK_DIRECTORY_INTENTS[listIndex][1]; - Intent intent = new Intent(intentAction); - intent.setData(Uri.parse(uriPrefix + startPath.getPath())); - - try { - c.startActivityForResult(intent, requestcode); - success = true; - } catch (ActivityNotFoundException e) { - // Try the next intent in the list - listIndex++; - } - } while (!success && (listIndex < PICK_DIRECTORY_INTENTS.length)); - - if (listIndex == PICK_DIRECTORY_INTENTS.length) { - //No Filebrowser is installed => show a fallback textdialog - showPathTextInput(c, startPath, callback); - success = false; - } - - return success; - } - - public boolean showFileBrowserActivity(Fragment c, File startPath, int requestcode, FileBrowserFailOverCallback callback) { - boolean success = false; - - if (startPath == null) { - startPath = new File(K9.getAttachmentDefaultPath()); - } - - int listIndex = 0; - do { - String intentAction = PICK_DIRECTORY_INTENTS[listIndex][0]; - String uriPrefix = PICK_DIRECTORY_INTENTS[listIndex][1]; - Intent intent = new Intent(intentAction); - intent.setData(Uri.parse(uriPrefix + startPath.getPath())); - - try { - c.startActivityForResult(intent, requestcode); - success = true; - } catch (ActivityNotFoundException e) { - // Try the next intent in the list - listIndex++; - } - } while (!success && (listIndex < PICK_DIRECTORY_INTENTS.length)); - - if (listIndex == PICK_DIRECTORY_INTENTS.length) { - //No Filebrowser is installed => show a fallback textdialog - showPathTextInput(c.getActivity(), startPath, callback); - success = false; - } - - return success; - } - - private void showPathTextInput(final Activity c, final File startPath, final FileBrowserFailOverCallback callback) { - AlertDialog.Builder alert = new AlertDialog.Builder(c); - - alert.setTitle(c.getString(R.string.attachment_save_title)); - alert.setMessage(c.getString(R.string.attachment_save_desc)); - final EditText input = new EditText(c); - input.setInputType(InputType.TYPE_CLASS_TEXT); - if (startPath != null) - input.setText(startPath.toString()); - alert.setView(input); - - alert.setPositiveButton(c.getString(R.string.okay_action), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - String path = input.getText().toString(); - callback.onPathEntered(path); - } - }); - - alert.setNegativeButton(c.getString(R.string.cancel_action), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - callback.onCancel(); - } - }); - - alert.show(); - } -} diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentViewCallback.java b/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentViewCallback.java deleted file mode 100644 index 3575bee6966e312b22d27f5822d0007daf928597..0000000000000000000000000000000000000000 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentViewCallback.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.fsck.k9.ui.messageview; - - -import com.fsck.k9.mailstore.AttachmentViewInfo; - - -interface AttachmentViewCallback { - void onViewAttachment(AttachmentViewInfo attachment); - void onSaveAttachment(AttachmentViewInfo attachment); - void onSaveAttachmentToUserProvidedDirectory(AttachmentViewInfo attachment); -} diff --git a/k9mail/src/main/java/com/fsck/k9/Account.java b/k9mail/src/main/java/foundation/e/mail/Account.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/Account.java rename to k9mail/src/main/java/foundation/e/mail/Account.java index ba56293b98352057a23e343e34604d3a167352f6..eae36b72acabe7819aa62b7c0378e023c7a37f74 100644 --- a/k9mail/src/main/java/com/fsck/k9/Account.java +++ b/k9mail/src/main/java/foundation/e/mail/Account.java @@ -1,5 +1,5 @@ -package com.fsck.k9; +package foundation.e.mail; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -21,44 +21,55 @@ import android.graphics.Color; import android.net.Uri; import timber.log.Timber; -import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.NetworkType; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.Folder.FolderClass; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mail.store.StoreConfig; -import com.fsck.k9.mailstore.StorageManager; -import com.fsck.k9.mailstore.StorageManager.StorageProvider; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.provider.EmailProvider; -import com.fsck.k9.provider.EmailProvider.StatsColumns; -import com.fsck.k9.search.ConditionsTreeNode; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SqlQueryBuilder; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchCondition; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.mail.ssl.LocalKeyStore; -import com.fsck.k9.view.ColorChip; +import foundation.e.mail.activity.AccountConfig; +import foundation.e.mail.activity.setup.CheckDirection; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.Transport; + +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.Folder.FolderClass; +import foundation.e.mail.mail.TransportUris; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.mailstore.StorageManager.StorageProvider; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mail.store.StoreConfig; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.mailstore.StorageManager.StorageProvider; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.provider.EmailProvider; +import foundation.e.mail.provider.EmailProvider.StatsColumns; +import foundation.e.mail.search.ConditionsTreeNode; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SqlQueryBuilder; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchCondition; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.mail.ssl.LocalKeyStore; +import foundation.e.mail.view.ColorChip; import com.larswerkman.colorpicker.ColorPicker; -import static com.fsck.k9.Preferences.getEnumStringPref; +import static foundation.e.mail.Preferences.getEnumStringPref; /** * Account stores all of the settings for a single account defined by the user. It is able to save * and delete itself given a Preferences to work with. Each account is defined by a UUID. */ -public class Account implements BaseAccount, StoreConfig { +public class Account implements BaseAccount, AccountConfig { /** * Default value for the inbox folder (never changes for POP3 and IMAP) */ - private static final String INBOX = "INBOX"; + public static final String INBOX = "INBOX"; /** * This local folder is used to store messages to be sent. @@ -159,7 +170,7 @@ public class Account implements BaseAccount, StoreConfig { public static final boolean DEFAULT_SORT_ASCENDING = false; public static final long NO_OPENPGP_KEY = 0; - private DeletePolicy deletePolicy = DeletePolicy.NEVER; + private DeletePolicy deletePolicy = DeletePolicy.ON_DELETE; private final String accountUuid; private String storeUri; @@ -276,6 +287,8 @@ public class Account implements BaseAccount, StoreConfig { TEXT, HTML, AUTO } + private boolean isDeviceAccount; + protected Account(Context context) { accountUuid = UUID.randomUUID().toString(); localStorageProviderId = StorageManager.getInstance(context).getDefaultProviderId(); @@ -295,7 +308,7 @@ public class Account implements BaseAccount, StoreConfig { folderTargetMode = FolderMode.NOT_SECOND_CLASS; sortType = DEFAULT_SORT_TYPE; sortAscending.put(DEFAULT_SORT_TYPE, DEFAULT_SORT_ASCENDING); - showPictures = ShowPictures.NEVER; + showPictures = ShowPictures.ALWAYS; isSignatureBeforeQuotedText = false; expungePolicy = Expunge.EXPUNGE_IMMEDIATELY; autoExpandFolderName = INBOX; @@ -305,7 +318,7 @@ public class Account implements BaseAccount, StoreConfig { goToUnreadMessageSearch = false; subscribedFoldersOnly = false; maximumPolledMessageAge = -1; - maximumAutoDownloadMessageSize = 32768; + maximumAutoDownloadMessageSize = 1048576; messageFormat = DEFAULT_MESSAGE_FORMAT; messageFormatAuto = DEFAULT_MESSAGE_FORMAT_AUTO; messageReadReceipt = DEFAULT_MESSAGE_READ_RECEIPT; @@ -322,6 +335,7 @@ public class Account implements BaseAccount, StoreConfig { isEnabled = true; markMessageAsReadOnView = true; alwaysShowCcBcc = false; + isDeviceAccount = false; searchableFolders = Searchable.ALL; @@ -344,6 +358,31 @@ public class Account implements BaseAccount, StoreConfig { cacheChips(); } + public void loadConfig(AccountConfig accountConfig) { + setName(accountConfig.getName()); + setEmail(accountConfig.getEmail()); + setStoreUri(accountConfig.getStoreUri()); + setTransportUri(accountConfig.getTransportUri()); + setDescription(accountConfig.getDescription()); + setInboxFolderName(accountConfig.getInboxFolderName()); + setDraftsFolderName(accountConfig.getDraftsFolderName()); + setArchiveFolderName(accountConfig.getArchiveFolderName()); + setSentFolderName(accountConfig.getSentFolderName()); + setSpamFolderName(accountConfig.getSpamFolderName()); + setTrashFolderName(accountConfig.getTrashFolderName()); + setAutoExpandFolderName(accountConfig.getAutoExpandFolderName()); + setDisplayCount(accountConfig.getDisplayCount()); + setAllowRemoteSearch(accountConfig.allowRemoteSearch()); + setAutomaticCheckIntervalMinutes(accountConfig.getAutomaticCheckIntervalMinutes()); + setDeletePolicy(accountConfig.getDeletePolicy()); + setCompression(NetworkType.WIFI, accountConfig.useCompression(NetworkType.WIFI)); + setCompression(NetworkType.MOBILE, accountConfig.useCompression(NetworkType.MOBILE)); + setCompression(NetworkType.OTHER, accountConfig.useCompression(NetworkType.OTHER)); + setFolderPushMode(accountConfig.getFolderPushMode()); + setNotifyNewMail(accountConfig.isNotifyNewMail()); + setShowOngoing(accountConfig.isShowOngoing()); + } + /* * Pick a nice Android guidelines color if we haven't used them all yet. */ @@ -392,13 +431,13 @@ public class Account implements BaseAccount, StoreConfig { displayCount = K9.DEFAULT_VISIBLE_LIMIT; } latestOldMessageSeenTime = storage.getLong(accountUuid + ".latestOldMessageSeenTime", 0); - notifyNewMail = storage.getBoolean(accountUuid + ".notifyNewMail", false); + notifyNewMail = storage.getBoolean(accountUuid + ".notifyNewMail", true); folderNotifyNewMailMode = getEnumStringPref(storage, accountUuid + ".folderNotifyNewMailMode", FolderMode.ALL); notifySelfNewMail = storage.getBoolean(accountUuid + ".notifySelfNewMail", true); notifyContactsMailOnly = storage.getBoolean(accountUuid + ".notifyContactsMailOnly", false); notifySync = storage.getBoolean(accountUuid + ".notifyMailCheck", false); - deletePolicy = DeletePolicy.fromInt(storage.getInt(accountUuid + ".deletePolicy", DeletePolicy.NEVER.setting)); + deletePolicy = DeletePolicy.fromInt(storage.getInt(accountUuid + ".deletePolicy", DeletePolicy.ON_DELETE.setting)); inboxFolderName = storage.getString(accountUuid + ".inboxFolderName", INBOX); draftsFolderName = storage.getString(accountUuid + ".draftsFolderName", "Drafts"); sentFolderName = storage.getString(accountUuid + ".sentFolderName", "Sent"); @@ -412,7 +451,7 @@ public class Account implements BaseAccount, StoreConfig { goToUnreadMessageSearch = storage.getBoolean(accountUuid + ".goToUnreadMessageSearch", false); subscribedFoldersOnly = storage.getBoolean(accountUuid + ".subscribedFoldersOnly", false); maximumPolledMessageAge = storage.getInt(accountUuid + ".maximumPolledMessageAge", -1); - maximumAutoDownloadMessageSize = storage.getInt(accountUuid + ".maximumAutoDownloadMessageSize", 32768); + maximumAutoDownloadMessageSize = storage.getInt(accountUuid + ".maximumAutoDownloadMessageSize", 1048576); messageFormat = getEnumStringPref(storage, accountUuid + ".messageFormat", DEFAULT_MESSAGE_FORMAT); messageFormatAuto = storage.getBoolean(accountUuid + ".messageFormatAuto", DEFAULT_MESSAGE_FORMAT_AUTO); if (messageFormatAuto && messageFormat == MessageFormat.TEXT) { @@ -440,7 +479,7 @@ public class Account implements BaseAccount, StoreConfig { sortAscending.put(sortType, storage.getBoolean(accountUuid + ".sortAscending", false)); - showPictures = getEnumStringPref(storage, accountUuid + ".showPicturesEnum", ShowPictures.NEVER); + showPictures = getEnumStringPref(storage, accountUuid + ".showPicturesEnum", ShowPictures.ALWAYS); notificationSetting.setVibrate(storage.getBoolean(accountUuid + ".vibrate", false)); notificationSetting.setVibratePattern(storage.getInt(accountUuid + ".vibratePattern", 0)); @@ -473,6 +512,8 @@ public class Account implements BaseAccount, StoreConfig { markMessageAsReadOnView = storage.getBoolean(accountUuid + ".markMessageAsReadOnView", true); alwaysShowCcBcc = storage.getBoolean(accountUuid + ".alwaysShowCcBcc", false); + isDeviceAccount = storage.getBoolean(accountUuid + ".isDeviceAccount", false); + cacheChips(); // Use email address as account description if necessary @@ -572,6 +613,7 @@ public class Account implements BaseAccount, StoreConfig { editor.remove(accountUuid + ".messageFormat"); editor.remove(accountUuid + ".messageReadReceipt"); editor.remove(accountUuid + ".notifyMailCheck"); + editor.remove(accountUuid + ".isDeviceAccount"); for (NetworkType type : NetworkType.values()) { editor.remove(accountUuid + ".useCompression." + type.name()); } @@ -579,6 +621,10 @@ public class Account implements BaseAccount, StoreConfig { // TODO: Remove preference settings that may exist for individual // folders in the account. editor.commit(); + if(getEmail() != null) { + Globals.getOAuth2TokenProvider().invalidateToken(getEmail()); + Globals.getOAuth2TokenProvider().disconnectEmailWithK9(getEmail()); + } } private static int findNewAccountNumber(List accountNumbers) { @@ -909,18 +955,22 @@ public class Account implements BaseAccount, StoreConfig { return accountUuid; } + @Override public synchronized String getStoreUri() { return storeUri; } - + + @Override public synchronized void setStoreUri(String storeUri) { this.storeUri = storeUri; } - + + @Override public synchronized String getTransportUri() { return transportUri; } + @Override public synchronized void setTransportUri(String transportUri) { this.transportUri = transportUri; } @@ -935,10 +985,12 @@ public class Account implements BaseAccount, StoreConfig { this.description = description; } + @Override public synchronized String getName() { return identities.get(0).getName(); } + @Override public synchronized void setName(String name) { identities.get(0).setName(name); } @@ -1029,6 +1081,7 @@ public class Account implements BaseAccount, StoreConfig { return (oldInterval != automaticCheckIntervalMinutes); } + @Override public synchronized int getDisplayCount() { return displayCount; } @@ -1050,6 +1103,37 @@ public class Account implements BaseAccount, StoreConfig { this.latestOldMessageSeenTime = latestOldMessageSeenTime; } + @Override + public ConnectionSecurity getIncomingSecurityType() { + return RemoteStore.decodeStoreUri(getStoreUri()).connectionSecurity; + } + + @Override + public AuthType getIncomingAuthType() { + return RemoteStore.decodeStoreUri(getStoreUri()).authenticationType; + } + + @Override + public String getIncomingPort() { + return String.valueOf(RemoteStore.decodeStoreUri(getStoreUri()).port); + } + + @Override + public ConnectionSecurity getOutgoingSecurityType() { + return TransportUris.decodeTransportUri(getTransportUri()).connectionSecurity; + } + + @Override + public AuthType getOutgoingAuthType() { + return TransportUris.decodeTransportUri(getTransportUri()).authenticationType; + } + + @Override + public String getOutgoingPort() { + return String.valueOf(TransportUris.decodeTransportUri(getTransportUri()).port); + } + + @Override public synchronized boolean isNotifyNewMail() { return notifyNewMail; } @@ -1070,6 +1154,7 @@ public class Account implements BaseAccount, StoreConfig { return deletePolicy; } + @Override public synchronized void setDeletePolicy(DeletePolicy deletePolicy) { this.deletePolicy = deletePolicy; } @@ -1208,6 +1293,7 @@ public class Account implements BaseAccount, StoreConfig { return false; } + @Override public synchronized FolderMode getFolderPushMode() { return folderPushMode; } @@ -1219,6 +1305,7 @@ public class Account implements BaseAccount, StoreConfig { return pushMode != oldPushMode; } + @Override public synchronized boolean isShowOngoing() { return notifySync; } @@ -1309,7 +1396,7 @@ public class Account implements BaseAccount, StoreConfig { } public Store getRemoteStore() throws MessagingException { - return RemoteStore.getInstance(K9.app, this); + return RemoteStore.getInstance(K9.app, this, Globals.getOAuth2TokenProvider()); } // It'd be great if this actually went into the store implementation @@ -1482,11 +1569,6 @@ public class Account implements BaseAccount, StoreConfig { return idleRefreshMinutes; } - @Override - public boolean shouldHideHostname() { - return K9.hideHostnameWhenConnecting(); - } - public synchronized void setIdleRefreshMinutes(int idleRefreshMinutes) { this.idleRefreshMinutes = idleRefreshMinutes; } @@ -1868,6 +1950,7 @@ public class Account implements BaseAccount, StoreConfig { * new host/port, then try and delete any (possibly non-existent) certificate stored for the * old host/port. */ + @Override public void deleteCertificate(String newHost, int newPort, CheckDirection direction) { Uri uri; if (direction == CheckDirection.INCOMING) { @@ -1905,4 +1988,72 @@ public class Account implements BaseAccount, StoreConfig { localKeyStore.deleteCertificate(uri.getHost(), uri.getPort()); } } + + public void init(String email, String password) { + setName(getOwnerName()); + setEmail(email); + + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + + // set default uris + // NOTE: they will be changed again in AccountSetupAccountType! + ServerSettings storeServer = new ServerSettings(ServerSettings.Type.IMAP, "mail." + domain, -1, + ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, user, password, null); + ServerSettings transportServer = new ServerSettings(ServerSettings.Type.SMTP, "mail." + domain, -1, + ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, user, password, null); + String storeUri = RemoteStore.createStoreUri(storeServer); + String transportUri = TransportUris.createTransportUri(transportServer); + setStoreUri(storeUri); + setTransportUri(transportUri); + + setupFolderNames(domain); + } + + private void setupFolderNames(String domain) { + setDraftsFolderName(K9.getK9String(R.string.special_mailbox_name_drafts)); + setTrashFolderName(K9.getK9String(R.string.special_mailbox_name_trash)); + setSentFolderName(K9.getK9String(R.string.special_mailbox_name_sent)); + setArchiveFolderName(K9.getK9String(R.string.special_mailbox_name_archive)); + + // Yahoo! has a special folder for Spam, called "Bulk Mail". + if (domain.endsWith(".yahoo.com")) { + setSpamFolderName("Bulk Mail"); + } else { + setSpamFolderName(K9.getK9String(R.string.special_mailbox_name_spam)); + } + } + + + private String getOwnerName() { + String name = null; + try { + name = getDefaultAccountName(); + } catch (Exception e) { + Timber.e(e, "Could not get default account name"); + } + + if (name == null) { + name = ""; + } + return name; + } + + private String getDefaultAccountName() { + String name = null; + Account account = Preferences.getPreferences(K9.app).getDefaultAccount(); + if (account != null) { + name = account.getName(); + } + return name; + } + + public boolean isDeviceAccount() { + return this.isDeviceAccount; + } + + public void setDeviceAccount(boolean deviceAccount) { + this.isDeviceAccount = deviceAccount; + } } diff --git a/k9mail/src/main/java/com/fsck/k9/AccountStats.java b/k9mail/src/main/java/foundation/e/mail/AccountStats.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/AccountStats.java rename to k9mail/src/main/java/foundation/e/mail/AccountStats.java index 146a8c94b5ebf0c28d86971375ec3694b00bbe50..5d2da67cad5aba519848efa14e7dd58787903ec2 100644 --- a/k9mail/src/main/java/com/fsck/k9/AccountStats.java +++ b/k9mail/src/main/java/foundation/e/mail/AccountStats.java @@ -1,7 +1,7 @@ /** * */ -package com.fsck.k9; +package foundation.e.mail; import java.io.Serializable; diff --git a/k9mail/src/main/java/com/fsck/k9/BaseAccount.java b/k9mail/src/main/java/foundation/e/mail/BaseAccount.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/BaseAccount.java rename to k9mail/src/main/java/foundation/e/mail/BaseAccount.java index f663ee5adadc067772717ac86cf03ea2da11469d..11be33e98071e7a7c484adb7bba9f6fe5d51b32a 100644 --- a/k9mail/src/main/java/com/fsck/k9/BaseAccount.java +++ b/k9mail/src/main/java/foundation/e/mail/BaseAccount.java @@ -1,4 +1,4 @@ -package com.fsck.k9; +package foundation.e.mail; public interface BaseAccount { String getEmail(); diff --git a/k9mail/src/main/java/foundation/e/mail/BasePresenter.java b/k9mail/src/main/java/foundation/e/mail/BasePresenter.java new file mode 100644 index 0000000000000000000000000000000000000000..1fc276deaa3ec231e390ecc6d30d88ce632f19bd --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/BasePresenter.java @@ -0,0 +1,6 @@ +package foundation.e.mail; + + +public interface BasePresenter { +} + diff --git a/k9mail/src/main/java/foundation/e/mail/BaseState.java b/k9mail/src/main/java/foundation/e/mail/BaseState.java new file mode 100644 index 0000000000000000000000000000000000000000..da7b6d5e44a76da75f05713f6213d54cb0ce5f76 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/BaseState.java @@ -0,0 +1,8 @@ +package foundation.e.mail; + +import android.os.Parcelable; + +public interface BaseState extends Parcelable { + +} + diff --git a/k9mail/src/main/java/foundation/e/mail/BaseView.java b/k9mail/src/main/java/foundation/e/mail/BaseView.java new file mode 100644 index 0000000000000000000000000000000000000000..9a72d08d21e393637164e29f10b88ad70af41647 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/BaseView.java @@ -0,0 +1,7 @@ +package foundation.e.mail; + + +public interface BaseView { + void setPresenter(T presenter); +} + diff --git a/k9mail/src/main/java/com/fsck/k9/Clock.java b/k9mail/src/main/java/foundation/e/mail/Clock.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/Clock.java rename to k9mail/src/main/java/foundation/e/mail/Clock.java index a07841144e285579836a013843cbe2d867b87e4e..4657d9093e810f8f2d8a24c41cfd33db80faeb90 100644 --- a/k9mail/src/main/java/com/fsck/k9/Clock.java +++ b/k9mail/src/main/java/foundation/e/mail/Clock.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.fsck.k9; +package foundation.e.mail; /** * A class provide the current time (like {@link System#currentTimeMillis()}). diff --git a/k9mail/src/main/java/com/fsck/k9/EmailAddressValidator.java b/k9mail/src/main/java/foundation/e/mail/EmailAddressValidator.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/EmailAddressValidator.java rename to k9mail/src/main/java/foundation/e/mail/EmailAddressValidator.java index 3c98f7aaa87a9bd80ab370ecaf2cb261ed38d98d..2e61ec63c69b9f39632a570cabe6c490340c614d 100644 --- a/k9mail/src/main/java/com/fsck/k9/EmailAddressValidator.java +++ b/k9mail/src/main/java/foundation/e/mail/EmailAddressValidator.java @@ -1,5 +1,5 @@ -package com.fsck.k9; +package foundation.e.mail; import android.text.util.Rfc822Tokenizer; import android.widget.AutoCompleteTextView.Validator; diff --git a/k9mail/src/main/java/com/fsck/k9/FontSizes.java b/k9mail/src/main/java/foundation/e/mail/FontSizes.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/FontSizes.java rename to k9mail/src/main/java/foundation/e/mail/FontSizes.java index 090949bcea559123ee3ca34f3dc89578ef7cbca2..7ab8a15e4228c7997e9c2df36bcdb6b79ed625c1 100644 --- a/k9mail/src/main/java/com/fsck/k9/FontSizes.java +++ b/k9mail/src/main/java/foundation/e/mail/FontSizes.java @@ -1,11 +1,11 @@ -package com.fsck.k9; +package foundation.e.mail; import android.util.TypedValue; import android.widget.TextView; -import com.fsck.k9.preferences.GlobalSettings; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; +import foundation.e.mail.preferences.GlobalSettings; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; /** diff --git a/k9mail/src/main/java/foundation/e/mail/Globals.java b/k9mail/src/main/java/foundation/e/mail/Globals.java new file mode 100644 index 0000000000000000000000000000000000000000..846fe55f14b56d8ce2786143f89f2922d74584cb --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/Globals.java @@ -0,0 +1,36 @@ +package foundation.e.mail; + + +import android.content.Context; + +import foundation.e.mail.account.K9OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.account.K9OAuth2TokenProvider; + +public class Globals { + private static Context context; + private static K9OAuth2TokenProvider oAuth2TokenProvider; + + static void setContext(Context context) { + Globals.context = context; + } + + static void setOAuth2TokenProvider(K9OAuth2TokenProvider oAuth2TokenProvider) { + Globals.oAuth2TokenProvider = oAuth2TokenProvider; + } + + public static Context getContext() { + if (context == null) { + throw new IllegalStateException("No context provided"); + } + + return context; + } + + public static K9OAuth2TokenProvider getOAuth2TokenProvider() { + if (oAuth2TokenProvider == null) { + throw new IllegalStateException("No OAuth 2.0 Token Provider provided"); + } + + return oAuth2TokenProvider; + } +} diff --git a/k9mail/src/main/java/com/fsck/k9/Identity.java b/k9mail/src/main/java/foundation/e/mail/Identity.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/Identity.java rename to k9mail/src/main/java/foundation/e/mail/Identity.java index cdd7de67a54ec64d0cf3721a197f4cc4dbfafd5b..c0922dade24a8b6c36fa7145e5b46e3e22a5ce0f 100644 --- a/k9mail/src/main/java/com/fsck/k9/Identity.java +++ b/k9mail/src/main/java/foundation/e/mail/Identity.java @@ -1,4 +1,4 @@ -package com.fsck.k9; +package foundation.e.mail; import java.io.Serializable; diff --git a/k9mail/src/main/java/com/fsck/k9/K9.java b/k9mail/src/main/java/foundation/e/mail/K9.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/K9.java rename to k9mail/src/main/java/foundation/e/mail/K9.java index 68139e943f4a964e7a11f6742500ee638dd4d197..2f1fe1b4e927985e4328a5e0147a172f42827664 100644 --- a/k9mail/src/main/java/com/fsck/k9/K9.java +++ b/k9mail/src/main/java/foundation/e/mail/K9.java @@ -1,9 +1,12 @@ -package com.fsck.k9; +package foundation.e.mail; import java.io.File; import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,27 +27,31 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.StrictMode; - -import com.fsck.k9.Account.SortType; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.activity.UpgradeDatabases; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.K9MailLib; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.ssl.LocalKeyStore; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.power.DeviceIdleManager; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.provider.UnreadWidgetProvider; -import com.fsck.k9.service.BootReceiver; -import com.fsck.k9.service.MailService; -import com.fsck.k9.service.ShutdownReceiver; -import com.fsck.k9.service.StorageGoneReceiver; -import com.fsck.k9.widget.list.MessageListWidgetProvider; +import android.support.annotation.StringRes; + +import foundation.e.mail.Account.SortType; +import foundation.e.mail.account.K9OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.account.K9OAuth2TokenProvider; +import foundation.e.mail.Account.SortType; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.activity.UpgradeDatabases; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.K9MailLib; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.ssl.LocalKeyStore; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.power.DeviceIdleManager; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.provider.UnreadWidgetProvider; +import foundation.e.mail.service.BootReceiver; +import foundation.e.mail.service.MailService; +import foundation.e.mail.service.ShutdownReceiver; +import foundation.e.mail.service.StorageGoneReceiver; +import foundation.e.mail.widget.list.MessageListWidgetProvider; import timber.log.Timber; import timber.log.Timber.DebugTree; @@ -99,8 +106,8 @@ public class K9 extends Application { /** * This will be {@code true} once the initialization is complete and {@link #notifyObservers()} * was called. - * Afterwards calls to {@link #registerApplicationAware(com.fsck.k9.K9.ApplicationAware)} will - * immediately call {@link com.fsck.k9.K9.ApplicationAware#initializeComponent(Application)} for the + * Afterwards calls to {@link #registerApplicationAware(foundation.e.mail.K9.ApplicationAware)} will + * immediately call {@link foundation.e.mail.K9.ApplicationAware#initializeComponent(Application)} for the * supplied argument. */ private static boolean initialized = false; @@ -209,10 +216,9 @@ public class K9 extends Application { private static boolean messageListCheckboxes = true; private static boolean messageListStars = true; - private static int messageListPreviewLines = 2; + private static int messageListPreviewLines = 1; private static boolean showCorrespondentNames = true; - private static boolean messageListSenderAboveSubject = false; private static boolean showContactName = false; private static boolean changeContactNameColor = false; private static int contactNameColor = 0xff00008f; @@ -332,7 +338,7 @@ public class K9 extends Application { public static class Share { /* - * We don't want to use EmailReceived.EXTRA_FROM ("com.fsck.k9.intent.extra.FROM") + * We don't want to use EmailReceived.EXTRA_FROM ("foundation.e.mail.intent.extra.FROM") * because of different semantics (String array vs. string with comma separated * email addresses) */ @@ -461,7 +467,6 @@ public class K9 extends Application { editor.putBoolean("startIntegratedInbox", startIntegratedInbox); editor.putBoolean("measureAccounts", measureAccounts); editor.putBoolean("countSearchMessages", countSearchMessages); - editor.putBoolean("messageListSenderAboveSubject", messageListSenderAboveSubject); editor.putBoolean("hideSpecialAccounts", hideSpecialAccounts); editor.putBoolean("messageListStars", messageListStars); editor.putInt("messageListPreviewLines", messageListPreviewLines); @@ -531,6 +536,7 @@ public class K9 extends Application { super.onCreate(); app = this; Globals.setContext(this); + Globals.setOAuth2TokenProvider(new K9OAuth2TokenProvider(this)); K9MailLib.setDebugStatus(new K9MailLib.DebugStatus() { @Override public boolean enabled() { @@ -674,7 +680,7 @@ public class K9 extends Application { * Load preferences into our statics. * * If you're adding a preference here, odds are you'll need to add it to - * {@link com.fsck.k9.preferences.GlobalSettings}, too. + * {@link foundation.e.mail.preferences.GlobalSettings}, too. * * @param prefs Preferences to load */ @@ -690,10 +696,9 @@ public class K9 extends Application { measureAccounts = storage.getBoolean("measureAccounts", true); countSearchMessages = storage.getBoolean("countSearchMessages", true); hideSpecialAccounts = storage.getBoolean("hideSpecialAccounts", false); - messageListSenderAboveSubject = storage.getBoolean("messageListSenderAboveSubject", false); messageListCheckboxes = storage.getBoolean("messageListCheckboxes", false); messageListStars = storage.getBoolean("messageListStars", true); - messageListPreviewLines = storage.getInt("messageListPreviewLines", 2); + messageListPreviewLines = storage.getInt("messageListPreviewLines", 1); autofitWidth = storage.getBoolean("autofitWidth", true); @@ -862,6 +867,14 @@ public class K9 extends Application { USE_GLOBAL } + public static int getK9MaterialThemeResourceId(Theme themeId) { + return (themeId == Theme.LIGHT) ? R.style.Theme_K9_Material_Light : R.style.Theme_K9_Material_Dark; + } + + public static int getK9MaterialThemeResourceId() { + return getK9MaterialThemeResourceId(theme); + } + public static int getK9ThemeResourceId(Theme themeId) { return (themeId == Theme.LIGHT) ? R.style.Theme_K9_Light : R.style.Theme_K9_Dark; } @@ -1056,13 +1069,6 @@ public class K9 extends Application { return showCorrespondentNames; } - public static boolean messageListSenderAboveSubject() { - return messageListSenderAboveSubject; - } - - public static void setMessageListSenderAboveSubject(boolean sender) { - messageListSenderAboveSubject = sender; - } public static void setShowCorrespondentNames(boolean showCorrespondentNames) { K9.showCorrespondentNames = showCorrespondentNames; } @@ -1443,4 +1449,12 @@ public class K9 extends Application { }.execute(); } + public static String getK9String(@StringRes int resId) { + return app.getString(resId); + } + + public static String getK9String(@StringRes int resId, Object... args) { + return app.getString(resId, args); + } + } diff --git a/k9mail/src/main/java/com/fsck/k9/NotificationSetting.java b/k9mail/src/main/java/foundation/e/mail/NotificationSetting.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/NotificationSetting.java rename to k9mail/src/main/java/foundation/e/mail/NotificationSetting.java index da26424db9cf325957b416e81525d56948116074..e6089c965d7c6a0a11b3a740562ec8d63ab4c23b 100644 --- a/k9mail/src/main/java/com/fsck/k9/NotificationSetting.java +++ b/k9mail/src/main/java/foundation/e/mail/NotificationSetting.java @@ -1,4 +1,4 @@ -package com.fsck.k9; +package foundation.e.mail; /** * Describes how a notification should behave. diff --git a/k9mail/src/main/java/com/fsck/k9/PRNGFixes.java b/k9mail/src/main/java/foundation/e/mail/PRNGFixes.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/PRNGFixes.java rename to k9mail/src/main/java/foundation/e/mail/PRNGFixes.java index 33d4ff6c9cc4ed9fd8b0ccfa280e5e580f214630..a17154e65bb17c456e33badf00ff8884f81ae7fd 100644 --- a/k9mail/src/main/java/com/fsck/k9/PRNGFixes.java +++ b/k9mail/src/main/java/foundation/e/mail/PRNGFixes.java @@ -8,7 +8,7 @@ * freely, as long as the origin is not misrepresented. */ -package com.fsck.k9; +package foundation.e.mail; import android.os.Build; import android.os.Process; diff --git a/k9mail/src/main/java/com/fsck/k9/Preferences.java b/k9mail/src/main/java/foundation/e/mail/Preferences.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/Preferences.java rename to k9mail/src/main/java/foundation/e/mail/Preferences.java index c7f02fc2e066b2ed3679aca38b77572cbe415879..6f2e10f12ab153a4c92fdb13eab96cc89d0861dc 100644 --- a/k9mail/src/main/java/com/fsck/k9/Preferences.java +++ b/k9mail/src/main/java/foundation/e/mail/Preferences.java @@ -1,5 +1,5 @@ -package com.fsck.k9; +package foundation.e.mail; import java.util.ArrayList; import java.util.Collection; @@ -12,10 +12,10 @@ import java.util.Map; import android.content.Context; import timber.log.Timber; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.preferences.Storage; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.preferences.Storage; public class Preferences { diff --git a/k9mail/src/main/java/com/fsck/k9/QuietTimeChecker.java b/k9mail/src/main/java/foundation/e/mail/QuietTimeChecker.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/QuietTimeChecker.java rename to k9mail/src/main/java/foundation/e/mail/QuietTimeChecker.java index 23e036019054ca02046a139a268c88e52b5d3482..2390b55de087c323193179165d4e2d0f112ef110 100644 --- a/k9mail/src/main/java/com/fsck/k9/QuietTimeChecker.java +++ b/k9mail/src/main/java/foundation/e/mail/QuietTimeChecker.java @@ -1,4 +1,4 @@ -package com.fsck.k9; +package foundation.e.mail; import java.util.Calendar; diff --git a/k9mail/src/main/java/foundation/e/mail/RoundedQuickContactBadge.java b/k9mail/src/main/java/foundation/e/mail/RoundedQuickContactBadge.java new file mode 100644 index 0000000000000000000000000000000000000000..373a8480a64c3698ad17766c7e54008a8389b276 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/RoundedQuickContactBadge.java @@ -0,0 +1,82 @@ +package foundation.e.mail; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Path; +import android.util.AttributeSet; +import android.widget.QuickContactBadge; + +import java.lang.reflect.Field; + +/** + * A rounded version of {@link QuickContactBadge] + * @author kishu27 (http://linkd.in/1laN852) + * + */ +public class RoundedQuickContactBadge extends QuickContactBadge +{ + + /** + * This path is used to mask out the outer edges of a circle on this View + */ + Path clipPath; + + public RoundedQuickContactBadge(Context context) { + super(context); + init(); //Set our initialization + } + + public RoundedQuickContactBadge(Context context, AttributeSet attrs) { + super(context, attrs); + init(); //Set our initialization + } + + public RoundedQuickContactBadge(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); //Set our initialization + } + + /** + * Initialize our stuff + */ + private void init() { + + //Use reflection to reset the default triangular overlay from default quick contact badge + try { + Field field = QuickContactBadge.class.getDeclaredField("mOverlay"); + field.setAccessible(true); + + //Using a drawable that draws a white circle. This could be set as null to not draw anything at all + field.set(this, getResources().getDrawable(R.drawable.ic_circle)); + + } catch (Exception e) { + //No-op, just well off with the default overlay + } + + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + /* + * Create a new clip path. Anything outside this path will be clipped from this view and not drawn by onDraw method + */ + clipPath = new Path(); + + //Adding a circle. The circle will be positioned in the center using x = w/2 and y = w/2 + //Circle will be limiting it's radius to the smaller one of height or width. + //Direction doesn't matter + clipPath.addCircle(w/2, h/2, w < h? w/2 : h/2, Path.Direction.CW); + } + + @Override + protected void onDraw(Canvas canvas) { + + //Erase everything out of our little circle in clipPath and hence create the real rounded QuickContactBadge + canvas.clipPath(clipPath); + + //Do everything else that original badge does. Drawing of the overlay is also handled there + super.onDraw(canvas); + } +} diff --git a/k9mail/src/main/java/com/fsck/k9/Throttle.java b/k9mail/src/main/java/foundation/e/mail/Throttle.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/Throttle.java rename to k9mail/src/main/java/foundation/e/mail/Throttle.java index 3dcc485d1726c91d76c6bcfc95015671d484f15e..9a86f1d3bf4c9e9d6d2e9712788b737d4c2c89e6 100644 --- a/k9mail/src/main/java/com/fsck/k9/Throttle.java +++ b/k9mail/src/main/java/foundation/e/mail/Throttle.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.fsck.k9; +package foundation.e.mail; import java.util.Timer; diff --git a/k9mail/src/main/java/com/fsck/k9/account/AccountCreator.java b/k9mail/src/main/java/foundation/e/mail/account/AccountCreator.java similarity index 80% rename from k9mail/src/main/java/com/fsck/k9/account/AccountCreator.java rename to k9mail/src/main/java/foundation/e/mail/account/AccountCreator.java index d591ccddb0e865530268a259ff50ce83af727731..8e0db2c8114eac6818c81f6d398d9a3d107209e0 100644 --- a/k9mail/src/main/java/com/fsck/k9/account/AccountCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/account/AccountCreator.java @@ -1,15 +1,15 @@ -package com.fsck.k9.account; +package foundation.e.mail.account; -import com.fsck.k9.Account.DeletePolicy; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings.Type; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings.Type; /** * Deals with logic surrounding account creation. *

- * TODO Move much of the code from com.fsck.k9.activity.setup.* into here + * TODO Move much of the code from foundation.e.mail.activity.setup.* into here */ public class AccountCreator { diff --git a/k9mail/src/main/java/foundation/e/mail/account/AndroidAccountOAuth2TokenStore.java b/k9mail/src/main/java/foundation/e/mail/account/AndroidAccountOAuth2TokenStore.java new file mode 100644 index 0000000000000000000000000000000000000000..981facffce9e8cdddbe717fe78278101eac41e63 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/AndroidAccountOAuth2TokenStore.java @@ -0,0 +1,90 @@ +package foundation.e.mail.account; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerFuture; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.OAuth2NeedUserPromptException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * An interface between the OAuth2 requirements used for authentication and the AccountManager. + * It's not used for the time being because we have {@link GmailOAuth2TokenStore} that handle all Gmail account + */ +// TODO: 2017/8/19 maybe we can use it when google account is in Android account system (don't know whether it need effort) +public class AndroidAccountOAuth2TokenStore { + private static final String GMAIL_AUTH_TOKEN_TYPE = "oauth2:https://mail.google.com/"; + private static final String GOOGLE_ACCOUNT_TYPE = "com.google"; + + private Map authTokens = new HashMap<>(); + private AccountManager accountManager; + private Oauth2PromptRequestHandler promptRequestHandler; + + public AndroidAccountOAuth2TokenStore(Context applicationContext) { + this.accountManager = AccountManager.get(applicationContext); + } + + public void setPromptRequestHandler(Oauth2PromptRequestHandler promptRequestHandler) { + this.promptRequestHandler = promptRequestHandler; + } + + public String getToken(String username, Account account, long timeoutMillis) throws + AuthenticationFailedException, OAuth2NeedUserPromptException { + if(authTokens.get(username) == null) { + if (account == null) { + throw new AuthenticationFailedException("Account not available"); + } + fetchNewAuthToken(username, account, timeoutMillis); + } + return authTokens.get(username); + } + + private void fetchNewAuthToken(String username, Account account, long timeoutMillis) + throws AuthenticationFailedException, OAuth2NeedUserPromptException { + try { + AccountManagerFuture future = accountManager + .getAuthToken(account, GMAIL_AUTH_TOKEN_TYPE, null, false, null, null); + Bundle bundle = future.getResult(timeoutMillis, TimeUnit.MILLISECONDS); + if (bundle == null) + throw new AuthenticationFailedException("No token provided"); + if (bundle.get(AccountManager.KEY_INTENT) != null) { + promptRequestHandler.handleGmailXOAuth2Intent((Intent) bundle.get(AccountManager.KEY_INTENT)); + throw new OAuth2NeedUserPromptException(); + } else { + if (bundle.get(AccountManager.KEY_ACCOUNT_NAME) == null) + throw new AuthenticationFailedException("No account information provided"); + if (bundle.get(AccountManager.KEY_ACCOUNT_NAME).equals(username)) + authTokens.put(username, bundle.get(AccountManager.KEY_AUTHTOKEN).toString()); + else + throw new AuthenticationFailedException("Unexpected account information provided"); + } + } catch (OAuth2NeedUserPromptException e) { + throw e; + } catch (Exception e) { + throw new AuthenticationFailedException(e.getMessage()); + } + } + + public void invalidateAccessToken(String username) { + accountManager.invalidateAuthToken("com.google", authTokens.get(username)); + authTokens.remove(username); + } + + public List getAccounts() { + Account[] accounts = accountManager.getAccountsByType(GOOGLE_ACCOUNT_TYPE); + ArrayList accountNames = new ArrayList<>(); + for (Account account: accounts) { + accountNames.add(account.name); + } + return accountNames; + } +} diff --git a/k9mail/src/main/java/foundation/e/mail/account/AndroidSpecificOAuth2TokenProvider.java b/k9mail/src/main/java/foundation/e/mail/account/AndroidSpecificOAuth2TokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..7bfe7f9efc887d387c49d12c9191f42b7de4222a --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/AndroidSpecificOAuth2TokenProvider.java @@ -0,0 +1,103 @@ +package foundation.e.mail.account; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.SpecificOAuth2TokenProvider; +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.io.IOException; + +import retrofit2.Call; +import retrofit2.Response; + +/** + * base class for OAuth 2.0 standard authorization code flow + * Classes extended this should override two methods that return Retrofit's calls + * For other OAuth 2.0 flows, please create another TokenProvider + */ +abstract class AndroidSpecificOAuth2TokenProvider extends SpecificOAuth2TokenProvider { + protected Oauth2PromptRequestHandler promptRequestHandler; + + protected abstract Call getExchangeCodeCall(String code); + protected abstract Call getRefreshTokenCall(String code); + + void setPromptRequestHandler(Oauth2PromptRequestHandler promptRequestHandler) { + this.promptRequestHandler = promptRequestHandler; + } + + public OAuth2AuthorizationCodeFlowTokenProvider.Tokens exchangeCode(String username, String code) throws AuthenticationFailedException { + Call call = getExchangeCodeCall(code); + ExchangeResponse exchangeResponse; + Response response; + try { + response = call.execute(); + exchangeResponse = response.body(); + } catch (Exception e) { + throw new AuthenticationFailedException(e.getMessage()); + } + if (exchangeResponse == null || exchangeResponse.accessToken.isEmpty()) return null; + + return new OAuth2AuthorizationCodeFlowTokenProvider.Tokens(exchangeResponse.accessToken, exchangeResponse.refreshToken); + } + + public String refreshToken(String username, String refreshToken) throws AuthenticationFailedException { + Call call = getRefreshTokenCall(refreshToken); + Response response; + RefreshResponse refreshResponse; + try { + response = call.execute(); + refreshResponse = response.body(); + } catch (IOException e) { + throw new AuthenticationFailedException(e.getMessage()); + } + if (refreshResponse == null) { + if (response.errorBody() != null) { + try { + String errorBody = response.errorBody().string(); + OAuth2Error oAuth2Error = new Gson().fromJson(errorBody, OAuth2Error.class); + switch (oAuth2Error.error) { + case "invalid_grant": + throw new AuthenticationFailedException(AuthenticationFailedException.OAUTH2_ERROR_INVALID_REFRESH_TOKEN); + default: + throw new AuthenticationFailedException(AuthenticationFailedException.OAUTH2_ERROR_UNKNOWN); + } + } catch (IOException e) { + throw new AuthenticationFailedException(AuthenticationFailedException.OAUTH2_ERROR_UNKNOWN); + } + } else { + throw new AuthenticationFailedException(AuthenticationFailedException.OAUTH2_ERROR_UNKNOWN); + } + } + return refreshResponse.accessToken; + } + + protected static class OAuth2Error { + String error; + @SerializedName("error_description") + String errorDescription; + } + + protected static class ExchangeResponse { + @SerializedName("access_token") + String accessToken; + @SerializedName("id_token") + String idToken; + @SerializedName("refresh_token") + String refreshToken; + @SerializedName("expires_in") + int expiresIn; + @SerializedName("token_type") + String tokenType; + } + + protected static class RefreshResponse { + @SerializedName("access_token") + String accessToken; + @SerializedName("expires_in") + int expiresIn; + @SerializedName("token_type") + String tokenType; + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/GmailOAuth2TokenStore.java b/k9mail/src/main/java/foundation/e/mail/account/GmailOAuth2TokenStore.java new file mode 100644 index 0000000000000000000000000000000000000000..ae436c971c05991c7339bb7e5440d8c9e09dfe64 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/GmailOAuth2TokenStore.java @@ -0,0 +1,61 @@ +package foundation.e.mail.account; + + +import foundation.e.mail.mail.AuthenticationFailedException; +import retrofit2.Call; +import retrofit2.GsonConverterFactory; +import retrofit2.Retrofit; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + + +public class GmailOAuth2TokenStore extends AndroidSpecificOAuth2TokenProvider { + private static final String GOOGLE_API_BASE_URL = "https://www.googleapis.com/"; + private static final String CLIENT_ID = "654688539095-g7f4lov1ljpd6sjal6pgr57j19i58t2p.apps.googleusercontent.com"; + private static final String REDIRECT_URI = "foundation.e.mail:/oauth2redirect"; + private static final String AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth?" + + "scope=https://mail.google.com/&" + + "response_type=code&" + + "redirect_uri=" + REDIRECT_URI + "&" + + "client_id=" + CLIENT_ID; + private Retrofit retrofit; + private GoogleAPIService service; + + public GmailOAuth2TokenStore() { + retrofit = new Retrofit.Builder() + .baseUrl(GOOGLE_API_BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + service = retrofit.create(GoogleAPIService.class); + } + + @Override + public void showAuthDialog() throws AuthenticationFailedException { + if(promptRequestHandler == null) + throw new AuthenticationFailedException("No handler available"); + promptRequestHandler.handleGmailRedirectUrl(AUTHORIZATION_URL); + } + + @Override + protected Call getRefreshTokenCall(String refreshToken) { + return service.refreshToken(CLIENT_ID, refreshToken, "refresh_token"); + } + + @Override + protected Call getExchangeCodeCall(String code) { + return service.exchangeCode(code, CLIENT_ID, "authorization_code", REDIRECT_URI); + } + + private interface GoogleAPIService { + @FormUrlEncoded + @POST("oauth2/v4/token") + Call refreshToken(@Field("client_id") String clientId, + @Field("refresh_token") String refreshToken, @Field("grant_type") String grantType); + @FormUrlEncoded + @POST("oauth2/v4/token") + Call exchangeCode(@Field("code") String code, @Field("client_id") String clientId, + @Field("grant_type") String grantType, @Field("redirect_uri") String redirectUri); + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/GmailWebViewClient.java b/k9mail/src/main/java/foundation/e/mail/account/GmailWebViewClient.java new file mode 100644 index 0000000000000000000000000000000000000000..22f63bb62d9a179810a06794c1d26bd1c361d6df --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/GmailWebViewClient.java @@ -0,0 +1,23 @@ +package foundation.e.mail.account; + +import android.net.Uri; + +import foundation.e.mail.activity.setup.AccountSetupPresenter; + +public class GmailWebViewClient extends OAuth2WebViewClient { + public GmailWebViewClient(AccountSetupPresenter presenter) { + super(presenter); + } + + @Override + protected boolean arrivedAtRedirectUri(Uri uri) { + return "foundation.e.mail".equals(uri.getScheme()); + } + + @Override + protected boolean getOutOfDomain(Uri uri) { + return !uri.getHost().contains("google"); // TODO: 8/18/17 how to improve it? + } + +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2AuthorizationCodeFlowTokenProvider.java b/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2AuthorizationCodeFlowTokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..de1db2683d3d3f4c2972e221b78ebba9ce0a64c7 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2AuthorizationCodeFlowTokenProvider.java @@ -0,0 +1,84 @@ +package foundation.e.mail.account; + +import android.content.Context; +import android.content.SharedPreferences; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.SpecificOAuth2TokenProvider; + +public class K9OAuth2AuthorizationCodeFlowTokenProvider extends OAuth2AuthorizationCodeFlowTokenProvider { + private Context context; + private static final String REFRESH_TOKEN_SP = "refresh_token"; + + private enum TYPE { + GMAIL, + OUTLOOK, + } + + private GmailOAuth2TokenStore gmailOAuth2TokenStore; + private OutlookOAuth2TokenStore outlookOAuth2TokenStore; + + public K9OAuth2AuthorizationCodeFlowTokenProvider(Context context) { + this.context = context; + gmailOAuth2TokenStore = new GmailOAuth2TokenStore(); + outlookOAuth2TokenStore = new OutlookOAuth2TokenStore(); + } + + public void setPromptRequestHandler(Oauth2PromptRequestHandler promptRequestHandler) { + gmailOAuth2TokenStore.setPromptRequestHandler(promptRequestHandler); + outlookOAuth2TokenStore.setPromptRequestHandler(promptRequestHandler); + } + + @Override + protected void saveRefreshToken(String email, String refreshToken) { + getSharedPreference().edit().putString(email, refreshToken).apply(); + } + + @Override + public void showAuthDialog(String email) throws AuthenticationFailedException { + SpecificOAuth2TokenProvider provider = getSpecificProviderFromEmail(email); + if (provider == null) return; + provider.showAuthDialog(); + } + + @Override + protected String getRefreshToken(String email) { + return getSharedPreference().getString(email, null); + } + + @Override + public void invalidateRefreshToken(String email) { + getSharedPreference().edit().remove(email).apply(); + } + + @Override + protected SpecificOAuth2TokenProvider getSpecificProviderFromEmail(String email) { + TYPE type = getServerTypeFromEmail(email); + if (type == null) return null; + switch (type) { + case GMAIL: + return gmailOAuth2TokenStore; + case OUTLOOK: + return outlookOAuth2TokenStore; + } + return null; + } + + private TYPE getServerTypeFromEmail(String email) { + String domain = email.split("@")[1]; + switch (domain) { + case "gmail.com": + return TYPE.GMAIL; + case "outlook.com": + return TYPE.OUTLOOK; + } + return null; + } + + private SharedPreferences getSharedPreference() { + return context.getSharedPreferences(REFRESH_TOKEN_SP, Context.MODE_PRIVATE); + } + +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2TokenProvider.java b/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2TokenProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..2416bec51af92dd88098650f158da3eb02e7b403 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/K9OAuth2TokenProvider.java @@ -0,0 +1,160 @@ +package foundation.e.mail.account; + + +import java.util.HashMap; +import java.util.Map; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.content.Context; +import android.os.Bundle; + +import java.util.ArrayList; +import java.util.concurrent.CountDownLatch; + +import foundation.e.mail.activity.Accounts; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.OAuth2NeedUserPromptException; +import foundation.e.mail.mail.oauth.OAuth2TokenProvider; + +import static foundation.e.mail.account.OAuthConstants.ACCOUNT_EMAIL_ADDRESS_KEY; +import static foundation.e.mail.account.OAuthConstants.AUTH_TOKEN_TYPE; +import static foundation.e.mail.account.OAuthConstants.EELO_ACCOUNT_TYPE; +import static foundation.e.mail.account.OAuthConstants.GOOGLE_ACCOUNT_TYPE; + +public class K9OAuth2TokenProvider extends OAuth2TokenProvider { + + private static final String OFFICIAL_GOOGLE_ACCOUNT_TYPE = "com.google"; + + private AccountManager accountManager; + private String authToken = null; + + private AndroidAccountOAuth2TokenStore gmailTokenProviderWithAccountSystem; + private K9OAuth2AuthorizationCodeFlowTokenProvider authorizationCodeFlowTokenProvider; + private Oauth2PromptRequestHandler promptRequestHandler; + + public K9OAuth2TokenProvider(Context context) { + accountManager = AccountManager.get(context); + gmailTokenProviderWithAccountSystem = new AndroidAccountOAuth2TokenStore(context); + authorizationCodeFlowTokenProvider = new K9OAuth2AuthorizationCodeFlowTokenProvider(context); + } + + public K9OAuth2AuthorizationCodeFlowTokenProvider getAuthorizationCodeFlowTokenProvider() { + return authorizationCodeFlowTokenProvider; + } + + private Account getAccountFromManager(String emailAddress) { + android.accounts.Account[] accounts = accountManager.getAccountsByType(OFFICIAL_GOOGLE_ACCOUNT_TYPE); + for (android.accounts.Account account : accounts) { + if (account.name.equals(emailAddress)) { + return account; + } + } + return null; + } + + + @Override + public String getToken(String email, long timeoutMillis) + throws AuthenticationFailedException, OAuth2NeedUserPromptException { + String authToken = getTokenFromAccountManager(email); + if (authToken != null) { + return authToken; + } + + Account gmailAccount = getAccountFromManager(email); + if (gmailAccount != null) { + return gmailTokenProviderWithAccountSystem.getToken(email, gmailAccount, timeoutMillis); + } + + return authorizationCodeFlowTokenProvider.getToken(email, timeoutMillis); + } + + private synchronized String getTokenFromAccountManager(String emailId) { + authToken = null; // set null otherwise we will have issues when address A is on account manager but Address B isn't, authToken will be != null (token of address A) + android.accounts.Account[] eeloAccounts = accountManager.getAccountsByType( + EELO_ACCOUNT_TYPE); + android.accounts.Account[] googleAccounts = accountManager.getAccountsByType( + GOOGLE_ACCOUNT_TYPE); + + ArrayList accounts = new ArrayList<>(); + for (Account eeloAccount : eeloAccounts) { + accounts.add(eeloAccount); + } + for (Account googleAccount : googleAccounts) { + accounts.add(googleAccount); + } + + if (accounts.size() > 0) { + for (Account account : accounts) { + String accountEmailId = accountManager.getUserData(account, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (emailId.equals(accountEmailId)) { + final CountDownLatch countDownLatch = new CountDownLatch(1); + accountManager.getAuthToken(account, AUTH_TOKEN_TYPE, new Bundle(), + null, new AccountManagerCallback() { + @Override + public void run(AccountManagerFuture + accountManagerFuture) { + try { + authToken = accountManagerFuture.getResult().getString( + AccountManager.KEY_AUTHTOKEN); + countDownLatch.countDown(); + } catch (Exception e) { + authToken = null; + } + } + }, null); + try { + countDownLatch.await(); + } + catch (Exception e) + { + authToken = null; + } + } + } + } else { + authToken = null; + } + return authToken; + } + + @Override + public void invalidateToken(String email) { + String authToken = getTokenFromAccountManager(email); + if (authToken != null) { + accountManager.invalidateAuthToken(AUTH_TOKEN_TYPE,authToken); + return; + + } + Account gmailAccount = getAccountFromManager(email); + + if (gmailAccount != null) { + gmailTokenProviderWithAccountSystem.invalidateAccessToken(email); + } else { + authorizationCodeFlowTokenProvider.invalidateAccessToken(email); + } + } + + @Override + public void disconnectEmailWithK9(String email) { + Account gmailAccount = getAccountFromManager(email); + + if (gmailAccount != null) { + gmailTokenProviderWithAccountSystem.invalidateAccessToken(email); + } else { + authorizationCodeFlowTokenProvider.invalidateRefreshToken(email); + } + } + + public void setPromptRequestHandler(Oauth2PromptRequestHandler promptRequestHandler) { + this.promptRequestHandler = promptRequestHandler; + gmailTokenProviderWithAccountSystem.setPromptRequestHandler(promptRequestHandler); + authorizationCodeFlowTokenProvider.setPromptRequestHandler(promptRequestHandler); + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/OAuth2ErrorHandler.java b/k9mail/src/main/java/foundation/e/mail/account/OAuth2ErrorHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..dc59d3c8d9bb933d6bfdc66bcc0225a35e1c1cc7 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/OAuth2ErrorHandler.java @@ -0,0 +1,7 @@ +package foundation.e.mail.account; + + +public interface OAuth2ErrorHandler { + void onError(String error); +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/OAuth2WebViewClient.java b/k9mail/src/main/java/foundation/e/mail/account/OAuth2WebViewClient.java new file mode 100644 index 0000000000000000000000000000000000000000..2453c69f3b289a705e7cbc0f19b3b7008c81a2c0 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/OAuth2WebViewClient.java @@ -0,0 +1,60 @@ +package foundation.e.mail.account; + +import android.annotation.TargetApi; +import android.net.Uri; +import android.os.Build; +import android.webkit.WebResourceRequest; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import foundation.e.mail.activity.setup.AccountSetupPresenter; + +import timber.log.Timber; + +/** + * bass class for standard authorization code flow like Google's or Microsoft's + */ +abstract class OAuth2WebViewClient extends WebViewClient { + private Oauth2PromptRequestHandler requestHandler; + private OAuth2ErrorHandler errorHandler; + + public OAuth2WebViewClient(Oauth2PromptRequestHandler requestHandler) { + this.requestHandler = requestHandler; + } + + protected abstract boolean arrivedAtRedirectUri(Uri uri); + protected abstract boolean getOutOfDomain(Uri uri); + + @SuppressWarnings("deprecation") + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + Uri uri = Uri.parse(url); + + if (arrivedAtRedirectUri(uri)) { + final String error = uri.getQueryParameter("error"); + if (error != null) { + Timber.e("got oauth error: " + error); + errorHandler.onError(error); + requestHandler.onErrorWhenGettingOAuthCode(error); + return true; + } + + String oAuthCode = uri.getQueryParameter("code"); + requestHandler.onOAuthCodeGot(oAuthCode); + return true; + } + + if (getOutOfDomain(uri)) { + requestHandler.onErrorWhenGettingOAuthCode("Don't surf away"); // TODO: 2017/8/19 better error message + return true; + } + return false; + } + + @Override + @TargetApi(Build.VERSION_CODES.N) + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldOverrideUrlLoading(view, request.getUrl().toString()); + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/OAuthConstants.java b/k9mail/src/main/java/foundation/e/mail/account/OAuthConstants.java new file mode 100644 index 0000000000000000000000000000000000000000..12eff6a44247afac3aab17a2d19c5f625c6c4d5a --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/OAuthConstants.java @@ -0,0 +1,10 @@ +package foundation.e.mail.account; + +public class OAuthConstants { + public static final String EELO_ACCOUNT_TYPE = "e.foundation.webdav.eelo"; + public static final String GOOGLE_ACCOUNT_TYPE = "e.foundation.webdav.google"; + public static final String ACCOUNT_EMAIL_ADDRESS_KEY = "email_address"; + public static final String MAIL_CONTENT_AUTHORITY = "foundation.e.mail.provider.AppContentProvider"; + static final String AUTH_TOKEN_TYPE = "oauth2-access-token"; +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/Oauth2PromptRequestHandler.java b/k9mail/src/main/java/foundation/e/mail/account/Oauth2PromptRequestHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..6ce832b7e4c2122802b01eb636f2ec99f304d018 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/Oauth2PromptRequestHandler.java @@ -0,0 +1,14 @@ +package foundation.e.mail.account; + + +import android.content.Intent; + + +public interface Oauth2PromptRequestHandler { + void handleGmailXOAuth2Intent(Intent intent); + void handleGmailRedirectUrl(String url); + void handleOutlookRedirectUrl(String url); + void onErrorWhenGettingOAuthCode(String errorMessage); + void onOAuthCodeGot(String code); +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/OutlookOAuth2TokenStore.java b/k9mail/src/main/java/foundation/e/mail/account/OutlookOAuth2TokenStore.java new file mode 100644 index 0000000000000000000000000000000000000000..58151294896edd0dec174e74dcfebc6aee7fc78d --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/OutlookOAuth2TokenStore.java @@ -0,0 +1,116 @@ +package foundation.e.mail.account; + +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.oauth.OAuth2AuthorizationCodeFlowTokenProvider; +import foundation.e.mail.mail.oauth.SpecificOAuth2TokenProvider; +import com.google.gson.annotations.SerializedName; + +import java.io.IOException; + +import retrofit2.Call; +import retrofit2.GsonConverterFactory; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +class OutlookOAuth2TokenStore extends SpecificOAuth2TokenProvider { + private Oauth2PromptRequestHandler promptRequestHandler; + private static final String OUTLOOK_BASE_URL = "https://login.live.com/"; + private static final String REDIRECT_URI = "msala41aa976-c5ad-405f-a8e3-ed18c07bb13a://auth"; + private static final String CLIENT_ID = "a41aa976-c5ad-405f-a8e3-ed18c07bb13a"; + private static final String AUTHORIZATION_URL = "https://login.live.com/oauth20_authorize.srf?" + + "client_id=" + CLIENT_ID + "&" + + "scope=wl.imap wl.offline_access&" + + "response_type=code&" + + "redirect_uri=" + REDIRECT_URI; + private Retrofit retrofit; + private OutlookService service; + + OutlookOAuth2TokenStore() { + retrofit = new Retrofit.Builder() + .baseUrl(OUTLOOK_BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + service = retrofit.create(OutlookService.class); + } + + @Override + public OAuth2AuthorizationCodeFlowTokenProvider.Tokens exchangeCode(String username, String code) throws AuthenticationFailedException { + Call call = service.exchangeCode(code, CLIENT_ID, "authorization_code", REDIRECT_URI); + ExchangeResponse exchangeResponse; + Response response; + try { + response = call.execute(); + exchangeResponse = response.body(); + } catch (Exception e) { + throw new AuthenticationFailedException(e.getMessage()); + } + if (exchangeResponse == null || exchangeResponse.accessToken.isEmpty()) return null; + + return new OAuth2AuthorizationCodeFlowTokenProvider.Tokens(exchangeResponse.accessToken, exchangeResponse.refreshToken); + } + + @Override + public String refreshToken(String username, String refreshToken) throws AuthenticationFailedException { + Call call = service.refreshToken(CLIENT_ID, refreshToken, "refresh_token", "https://login.live.com/oauth20_desktop.srf"); + RefreshResponse response; + try { + response = call.execute().body(); + } catch (IOException e) { + throw new AuthenticationFailedException(e.getMessage()); + } + if (response == null) { + throw new AuthenticationFailedException("Error when getting refresh token"); + } + return response.accessToken; + } + + @Override + public void showAuthDialog() { + promptRequestHandler.handleOutlookRedirectUrl(AUTHORIZATION_URL); + } + + void setPromptRequestHandler(Oauth2PromptRequestHandler promptRequestHandler) { + this.promptRequestHandler = promptRequestHandler; + } + + private interface OutlookService { + @FormUrlEncoded + @POST("oauth20_token.srf") + Call refreshToken(@Field("client_id") String clientId, + @Field("refresh_token") String refreshToken, + @Field("grant_type") String grantType, + @Field("redirect_uri") String redirectUri); + @FormUrlEncoded + @POST("oauth20_token.srf") + Call exchangeCode(@Field("code") String code, + @Field("client_id") String clientId, + @Field("grant_type") String grantType, + @Field("redirect_uri") String redirectUri); + } + + private static class ExchangeResponse { + @SerializedName("access_token") + String accessToken; + @SerializedName("id_token") + String idToken; + @SerializedName("refresh_token") + String refreshToken; + @SerializedName("expires_in") + int expiresIn; + @SerializedName("token_type") + String tokenType; + } + + private static class RefreshResponse { + @SerializedName("access_token") + String accessToken; + @SerializedName("expires_in") + int expiresIn; + @SerializedName("token_type") + String tokenType; + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/account/OutlookWebViewClient.java b/k9mail/src/main/java/foundation/e/mail/account/OutlookWebViewClient.java new file mode 100644 index 0000000000000000000000000000000000000000..51a3f1038f52c02ea3c7b460b0f0b7b6c84597a9 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/account/OutlookWebViewClient.java @@ -0,0 +1,23 @@ +package foundation.e.mail.account; + +import android.net.Uri; + +import foundation.e.mail.activity.setup.AccountSetupPresenter; + + +public class OutlookWebViewClient extends OAuth2WebViewClient { + public OutlookWebViewClient(AccountSetupPresenter presenter) { + super(presenter); + } + + @Override + protected boolean arrivedAtRedirectUri(Uri uri) { + return ("msal" + "a41aa976-c5ad-405f-a8e3-ed18c07bb13a").equals(uri.getScheme()); + } + + @Override + protected boolean getOutOfDomain(Uri uri) { + return !uri.getHost().contains("live.com"); // TODO: 8/18/17 how to improve it? + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/activity/AboutActivity.java b/k9mail/src/main/java/foundation/e/mail/activity/AboutActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..3c432658980a4dec60e1ec60171d0ce66926565e --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/AboutActivity.java @@ -0,0 +1,31 @@ +package foundation.e.mail.activity; + +import android.app.Activity; +import android.app.Fragment; +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import foundation.e.mail.R; +import foundation.e.mail.fragment.AboutFragment; + +public class AboutActivity extends Activity { + + FragmentManager fragMan; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + + + fragMan = getFragmentManager(); + FragmentTransaction fragTransaction = fragMan.beginTransaction(); + + Fragment myFrag = new AboutFragment(); + fragTransaction.replace(R.id.layoutAbout, myFrag, "About Fragment"); + fragTransaction.commit(); + + } +} diff --git a/k9mail/src/main/java/foundation/e/mail/activity/AccountConfig.java b/k9mail/src/main/java/foundation/e/mail/activity/AccountConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..ef2cf9d06b8b1bd376797eb5cb932f2c2d2041f3 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/AccountConfig.java @@ -0,0 +1,51 @@ +package foundation.e.mail.activity; + + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.activity.setup.CheckDirection; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.store.StoreConfig; + + +public interface AccountConfig extends StoreConfig { + public ConnectionSecurity getIncomingSecurityType(); + public AuthType getIncomingAuthType(); + public String getIncomingPort(); + public ConnectionSecurity getOutgoingSecurityType(); + public AuthType getOutgoingAuthType(); + public String getOutgoingPort(); + public boolean isNotifyNewMail(); + public boolean isShowOngoing(); + public int getAutomaticCheckIntervalMinutes(); + public int getDisplayCount(); + public FolderMode getFolderPushMode(); + public String getName(); + DeletePolicy getDeletePolicy(); + + void init(String email, String password); + + public String getEmail(); + public String getDescription(); + Store getRemoteStore() throws MessagingException; + + public void setName(String name); + public void setDescription(String description); + public void setDeletePolicy(DeletePolicy deletePolicy); + public void setEmail(String email); + void setCompression(NetworkType networkType, boolean useCompression); + + void addCertificate(CheckDirection direction, X509Certificate certificate) throws CertificateException; + + void setSubscribedFoldersOnly(boolean subscribedFoldersOnly); + + void deleteCertificate(String newHost, int newPort, CheckDirection direction); +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/AccountList.java b/k9mail/src/main/java/foundation/e/mail/activity/AccountList.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/activity/AccountList.java rename to k9mail/src/main/java/foundation/e/mail/activity/AccountList.java index efee913b2463256b90a1d76691c853360905dc8b..93717d6029046ac152787b5d352bc9cd3461e626 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/AccountList.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/AccountList.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.ArrayList; import java.util.List; @@ -13,13 +13,13 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.search.SearchAccount; +import foundation.e.mail.Account; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.search.SearchAccount; /** @@ -123,7 +123,6 @@ public abstract class AccountList extends K9ListActivity implements OnItemClickL holder = new AccountViewHolder(); holder.description = (TextView) view.findViewById(R.id.description); holder.email = (TextView) view.findViewById(R.id.email); - holder.chip = view.findViewById(R.id.chip); view.setTag(holder); } @@ -142,15 +141,6 @@ public abstract class AccountList extends K9ListActivity implements OnItemClickL holder.description.setText(description); - if (account instanceof Account) { - Account realAccount = (Account) account; - holder.chip.setBackgroundColor(realAccount.getChipColor()); - } else { - holder.chip.setBackgroundColor(0xff999999); - } - - holder.chip.getBackground().setAlpha(255); - mFontSizes.setViewTextSize(holder.description, mFontSizes.getAccountName()); mFontSizes.setViewTextSize(holder.email, mFontSizes.getAccountDescription()); @@ -161,7 +151,6 @@ public abstract class AccountList extends K9ListActivity implements OnItemClickL class AccountViewHolder { public TextView description; public TextView email; - public View chip; } } diff --git a/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java b/k9mail/src/main/java/foundation/e/mail/activity/Accounts.java similarity index 80% rename from k9mail/src/main/java/com/fsck/k9/activity/Accounts.java rename to k9mail/src/main/java/foundation/e/mail/activity/Accounts.java index 0f7b09e16fb9e07c3d55383d5c2b7cccc3557294..2981ff02f6971491d5d0bce04724b1aa63b80263 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/Accounts.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/Accounts.java @@ -1,11 +1,14 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.EnumSet; import java.util.HashSet; @@ -15,6 +18,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import android.accounts.AccountManager; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; @@ -29,12 +33,17 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.XmlResourceParser; +import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.provider.Settings; +import android.support.annotation.NonNull; import android.text.Editable; import android.text.TextWatcher; +import foundation.e.mail.activity.setup.AccountSetupActivity; import android.util.SparseBooleanArray; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -54,6 +63,7 @@ import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; @@ -61,42 +71,51 @@ import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.compose.MessageActions; -import com.fsck.k9.activity.misc.ExtendedAsyncTask; -import com.fsck.k9.activity.misc.NonConfigurationInstance; -import com.fsck.k9.activity.setup.AccountSettings; -import com.fsck.k9.activity.setup.AccountSetupBasics; -import com.fsck.k9.activity.setup.Prefs; -import com.fsck.k9.activity.setup.WelcomeMessage; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.helper.SizeFormatter; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.TransportUris; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.mailstore.StorageManager; -import com.fsck.k9.preferences.SettingsExporter; -import com.fsck.k9.preferences.SettingsImportExportException; -import com.fsck.k9.preferences.SettingsImporter; -import com.fsck.k9.preferences.SettingsImporter.AccountDescription; -import com.fsck.k9.preferences.SettingsImporter.AccountDescriptionPair; -import com.fsck.k9.preferences.SettingsImporter.ImportContents; -import com.fsck.k9.preferences.SettingsImporter.ImportResults; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchAccount; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.view.ColorChip; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.compose.MessageActions; +import foundation.e.mail.activity.misc.ExtendedAsyncTask; +import foundation.e.mail.activity.misc.NonConfigurationInstance; +import foundation.e.mail.activity.setup.AccountSetupPresenter; +import foundation.e.mail.activity.setup.EeloAccountCreator; +import foundation.e.mail.activity.setup.GoogleAccountCreator; +import foundation.e.mail.activity.setup.AccountSettings; +import foundation.e.mail.activity.setup.Prefs; +import foundation.e.mail.activity.setup.WelcomeMessage; +import foundation.e.mail.activity.setup.WelcomeMessage; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.helper.SizeFormatter; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.TransportUris; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.preferences.SettingsExporter; +import foundation.e.mail.preferences.SettingsImportExportException; +import foundation.e.mail.preferences.SettingsImporter; +import foundation.e.mail.preferences.SettingsImporter.AccountDescription; +import foundation.e.mail.preferences.SettingsImporter.AccountDescriptionPair; +import foundation.e.mail.preferences.SettingsImporter.ImportContents; +import foundation.e.mail.preferences.SettingsImporter.ImportResults; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchAccount; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.view.ColorChip; import de.cketti.library.changelog.ChangeLog; import timber.log.Timber; +import static foundation.e.mail.account.OAuthConstants.ACCOUNT_EMAIL_ADDRESS_KEY; +import static foundation.e.mail.account.OAuthConstants.EELO_ACCOUNT_TYPE; +import static foundation.e.mail.account.OAuthConstants.GOOGLE_ACCOUNT_TYPE; +import static foundation.e.mail.account.OAuthConstants.MAIL_CONTENT_AUTHORITY; public class Accounts extends K9ListActivity implements OnItemClickListener { @@ -141,6 +160,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { private boolean exportGlobalSettings; private ArrayList exportAccountUuids; + private AccountManager accountManager; /** * Contains information about objects that need to be retained on configuration changes. * @@ -390,12 +410,24 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { Intent intent = getIntent(); //onNewIntent(intent); - // see if we should show the welcome message - if (ACTION_IMPORT_SETTINGS.equals(intent.getAction())) { + accountManager = AccountManager.get(this); + + removeOldAccountsAutomatically(accounts); + accounts = Preferences.getPreferences(this).getAccounts(); + + if (addNewAccountsAutomatically(accounts)) { + Accounts.listAccounts(this); + finish(); + return; + } + + checkSyncStatus(accounts); + + if (ACTION_IMPORT_SETTINGS.equals(intent.getAction())) { onImport(); } else if (accounts.size() < 1) { - WelcomeMessage.showWelcomeMessage(this); - finish(); + AccountSetupActivity.actionNewAccount(this); + finish(); return; } @@ -439,9 +471,315 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { nonConfigurationInstance.restore(this); } - ChangeLog cl = new ChangeLog(this); - if (cl.isFirstRun()) { - cl.getLogDialog().show(); + } + + private boolean hasPasswordUpdate(Account account, + String deviceAccountEmailId, + String deviceAccountPassword) { + try { + String[] emailParts = EmailHelper.splitEmail(deviceAccountEmailId); + AccountSetupPresenter.Provider provider = findProviderForDomain(this, emailParts[1]); + + if (provider != null) { + ArrayList uris = getURIs(deviceAccountEmailId, deviceAccountPassword, provider); + String deviceAccountStoreUri = uris.get(0); + String deviceAccountTransportUri = uris.get(1); + + if (deviceAccountStoreUri.equals(account.getStoreUri()) && + deviceAccountTransportUri.equals(account.getTransportUri())) { + return false; + } + + } + } + catch (Exception e) { + Timber.e(e, "Error while trying to initialise account configuration."); + } + return true; + } + + + private boolean isDomainAvailable(String deviceAccountEmailId) { + try { + String[] emailParts = EmailHelper.splitEmail(deviceAccountEmailId); + AccountSetupPresenter.Provider provider = findProviderForDomain(this, emailParts[1]); + if (provider != null) { + return true; + } + } catch (Exception e) { + Timber.e(e, "Error while trying to initialise account configuration."); + } + return false; + } + + + private static AccountSetupPresenter.Provider findProviderForDomain(Context context, + String domain) { + try { + XmlResourceParser xml = context.getResources().getXml(foundation.e.mail.R.xml.providers); + int xmlEventType; + AccountSetupPresenter.Provider provider = null; + while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { + if (xmlEventType == XmlResourceParser.START_TAG + && "provider".equals(xml.getName()) + && domain.equalsIgnoreCase(getXmlAttribute(context, xml, "domain"))) { + provider = new AccountSetupPresenter.Provider(); + provider.id = getXmlAttribute(context, xml, "id"); + provider.label = getXmlAttribute(context, xml, "label"); + provider.domain = getXmlAttribute(context, xml, "domain"); + provider.note = getXmlAttribute(context, xml, "note"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "incoming".equals(xml.getName()) + && provider != null) { + provider.incomingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.incomingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "outgoing".equals(xml.getName()) + && provider != null) { + provider.outgoingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.outgoingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.END_TAG + && "provider".equals(xml.getName()) + && provider != null) { + return provider; + } + } + + if (provider == null) { + provider = new AccountSetupPresenter.Provider(); + provider.id = domain; + provider.label = domain + " mail service"; + provider.domain = domain; + provider.note = ""; + provider.incomingUriTemplate = new URI("imap+ssl+://mail." + domain); + provider.incomingUsernameTemplate = "$email"; + provider.outgoingUriTemplate = new URI("smtp+tls+://mail." + domain); + provider.outgoingUsernameTemplate = "$email"; + } + + } catch (Exception e) { + Timber.e(e, "Error while trying to load provider settings."); + } + return null; + } + + private static String getXmlAttribute(Context context, XmlResourceParser xml, String name) { + int resId = xml.getAttributeResourceValue(null, name, 0); + if (resId == 0) { + return xml.getAttributeValue(null, name); + } else { + return context.getString(resId); + } + } + + private ArrayList getURIs(String email, String password, + @NonNull AccountSetupPresenter.Provider provider) + throws URISyntaxException { + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + String userEnc = UrlEncodingHelper.encodeUtf8(user); + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + + String incomingUsername = provider.incomingUsernameTemplate; + incomingUsername = incomingUsername.replaceAll("\\$email", email); + incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); + incomingUsername = incomingUsername.replaceAll("\\$domain", domain); + + URI incomingUriTemplate = provider.incomingUriTemplate; + String incomingUserInfo = incomingUsername + ":" + passwordEnc; + URI incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUserInfo, + incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, null, null); + + String outgoingUsername = provider.outgoingUsernameTemplate; + + URI outgoingUriTemplate = provider.outgoingUriTemplate; + + + URI outgoingUri; + if (outgoingUsername != null) { + outgoingUsername = outgoingUsername.replaceAll("\\$email", email); + outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); + outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); + + String outgoingUserInfo = outgoingUsername + ":" + passwordEnc; + outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUserInfo, + outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } else { + outgoingUri = new URI(outgoingUriTemplate.getScheme(), + null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } + + return new ArrayList<>(Arrays.asList(incomingUri.toString(), outgoingUri.toString())); + } + + private void checkSyncStatus(List accounts) { + try { + android.accounts.Account[] eeloAccounts = getEeloAccountsOnDevice(); + android.accounts.Account[] googleAccounts = getGoogleAccountsOnDevice(); + + for (Account account : accounts) { + if (account.isDeviceAccount()) { + for (android.accounts.Account eeloAccount : eeloAccounts) { + String emailId = accountManager.getUserData(eeloAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + if (ContentResolver.getSyncAutomatically(eeloAccount, + MAIL_CONTENT_AUTHORITY)) { + account.setFolderPushMode(Account.FolderMode.FIRST_CLASS); + } + else { + account.setFolderPushMode(Account.FolderMode.NONE); + } + break; + } + } + for (android.accounts.Account googleAccount : googleAccounts) { + String emailId = accountManager.getUserData(googleAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + if (ContentResolver.getSyncAutomatically(googleAccount, + MAIL_CONTENT_AUTHORITY)) { + account.setFolderPushMode(Account.FolderMode.FIRST_CLASS); + } + else { + account.setFolderPushMode(Account.FolderMode.NONE); + } + break; + } + } + } + } + } + catch (SecurityException e) { + e.printStackTrace(); + } + } + + private android.accounts.Account[] getEeloAccountsOnDevice() { + return accountManager.getAccountsByType( + EELO_ACCOUNT_TYPE); + } + + private android.accounts.Account[] getGoogleAccountsOnDevice() { + return accountManager.getAccountsByType( + GOOGLE_ACCOUNT_TYPE); + } + + private boolean addNewAccountsAutomatically(List accounts) { + try + { + android.accounts.Account[] eeloAccounts = getEeloAccountsOnDevice(); + android.accounts.Account[] googleAccounts = getGoogleAccountsOnDevice(); + boolean accountWasAdded = false; + + for (android.accounts.Account eeloAccount : eeloAccounts) { + String emailId = accountManager.getUserData(eeloAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if(!emailId.contains("@")) + continue; + boolean accountIsSignedIn = false; + for (Account account : accounts) { + if (emailId.equals(account.getEmail())) { + accountIsSignedIn = true; + break; + } + } + if (!accountIsSignedIn) { + String password = accountManager.getPassword(eeloAccount); + if (isDomainAvailable(emailId)) { + EeloAccountCreator.createAccount(this, emailId, password); + accountWasAdded = true; + } + + } + } + + for (android.accounts.Account googleAccount : googleAccounts) { + String emailId = accountManager.getUserData(googleAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + boolean accountIsSignedIn = false; + for (Account account : accounts) { + if (emailId.equals(account.getEmail())) { + if (account.getName() == null) { // we need to fix an old bug + account.setName(emailId); + account.save(Preferences.getPreferences(this)); + } + + accountIsSignedIn = true; + break; + } + } + if (!accountIsSignedIn) { + GoogleAccountCreator.createAccount(this, emailId); + accountWasAdded = true; + } + } + + return accountWasAdded; + } catch (SecurityException e) { + e.printStackTrace(); + return false; + } + + } + + private void removeOldAccountsAutomatically(List accounts) { + try { + android.accounts.Account[] eeloAccounts = getEeloAccountsOnDevice(); + android.accounts.Account[] googleAccounts = getGoogleAccountsOnDevice(); + + for (Account account : accounts) { + if (account.isDeviceAccount()) { + boolean accountIsSignedInOnDevice = false; + // because of a now fixed bug, accounts with empty mails coming from custom nextcloud server could have been added: we need to remove them + if (account.getEmail() != null) { + for (android.accounts.Account eeloAccount : eeloAccounts) { + String emailId = accountManager.getUserData(eeloAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId) && !hasPasswordUpdate(account, + emailId, accountManager.getPassword(eeloAccount))) { + accountIsSignedInOnDevice = true; + break; + } + } + for (android.accounts.Account googleAccount : googleAccounts) { + String emailId = accountManager.getUserData(googleAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + accountIsSignedInOnDevice = true; + break; + } + } + } + + if (!accountIsSignedInOnDevice) { + selectedContextAccount = account; + + Account realAccount = account; + try + { + realAccount.getLocalStore().delete(); + } + catch (Exception e) + { + // Ignore, this may lead to localStores on sd-cards that + // are currently not inserted to be left + } + MessagingController.getInstance(getApplication()) + .deleteAccount(realAccount); + Preferences.getPreferences(Accounts.this) + .deleteAccount(realAccount); + } + } + } + } + catch (SecurityException e) { + e.printStackTrace(); } } @@ -513,11 +851,30 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { @Override public void onResume() { super.onResume(); + mListener.onResume(this); + + List accounts = Preferences.getPreferences(this).getAccounts(); + + removeOldAccountsAutomatically(accounts); + accounts = Preferences.getPreferences(this).getAccounts(); + + if (addNewAccountsAutomatically(accounts)) { + Accounts.listAccounts(this); + finish(); + return; + } + + checkSyncStatus(accounts); + + if (accounts.size() < 1) + { + AccountSetupActivity.actionNewAccount(this); + finish(); + } refresh(); MessagingController.getInstance(getApplication()).addListener(mListener); StorageManager.getInstance(getApplication()).addListener(storageListener); - mListener.onResume(this); } @Override @@ -564,12 +921,6 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { accounts.clear(); accounts.addAll(Preferences.getPreferences(this).getAccounts()); - // see if we should show the welcome message -// if (accounts.length < 1) { -// WelcomeMessage.showWelcomeMessage(this); -// finish(); -// } - List newAccounts; if (!K9.isHideSpecialAccounts() && accounts.size() > 0) { if (unifiedInboxAccount == null || allMessagesAccount == null) { @@ -610,7 +961,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { } private void onAddNewAccount() { - AccountSetupBasics.actionNewAccount(this); + AccountSetupActivity.actionNewAccount(this); } private void onEditPrefs() { @@ -777,9 +1128,10 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { * Don't ask for the password to the outgoing server for WebDAV * accounts, because incoming and outgoing servers are identical for * this account type. Also don't ask when the username is missing. - * Also don't ask when the AuthType is EXTERNAL. + * Also don't ask when the AuthType is EXTERNAL or XOAUTH2 */ boolean configureOutgoingServer = AuthType.EXTERNAL != outgoing.authenticationType + && AuthType.XOAUTH2 != outgoing.authenticationType && !(ServerSettings.Type.WebDAV == outgoing.type) && outgoing.username != null && !outgoing.username.isEmpty() @@ -787,6 +1139,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { .isEmpty()); boolean configureIncomingServer = AuthType.EXTERNAL != incoming.authenticationType + && AuthType.XOAUTH2 != incoming.authenticationType && (incoming.password == null || incoming.password .isEmpty()); @@ -1038,7 +1391,12 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { private void onDeleteAccount(Account account) { selectedContextAccount = account; - showDialog(DIALOG_REMOVE_ACCOUNT); + if (account.isDeviceAccount()) { + startActivity(new Intent(Settings.ACTION_SYNC_SETTINGS)); + } + else { + showDialog(DIALOG_REMOVE_ACCOUNT); + } } private void onEditAccount(Account account) { @@ -1256,7 +1614,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { onCompose(); break; case R.id.about: - onAbout(); + startAboutActivity(); break; case R.id.search: onSearchRequested(); @@ -1273,81 +1631,13 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { return true; } - private static final String[][] USED_LIBRARIES = new String[][] { - new String[] {"Android Support Library", "https://developer.android.com/topic/libraries/support-library/index.html"}, - new String[] {"ckChangeLog", "https://github.com/cketti/ckChangeLog"}, - new String[] {"Commons IO", "http://commons.apache.org/io/"}, - new String[] {"Glide", "https://github.com/bumptech/glide"}, - new String[] {"HoloColorPicker", "https://github.com/LarsWerkman/HoloColorPicker"}, - new String[] {"jsoup", "https://jsoup.org/"}, - new String[] {"jutf7", "http://jutf7.sourceforge.net/"}, - new String[] {"JZlib", "http://www.jcraft.com/jzlib/"}, - new String[] {"Mime4j", "http://james.apache.org/mime4j/"}, - new String[] {"Moshi", "https://github.com/square/moshi"}, - new String[] {"Okio", "https://github.com/square/okio"}, - new String[] {"SafeContentResolver", "https://github.com/cketti/SafeContentResolver"}, - new String[] {"ShowcaseView", "https://github.com/amlcurran/ShowcaseView"}, - new String[] {"Timber", "https://github.com/JakeWharton/timber"}, - new String[] {"TokenAutoComplete", "https://github.com/splitwise/TokenAutoComplete/"}, - }; - - private void onAbout() { - String appName = getString(R.string.app_name); - int year = Calendar.getInstance().get(Calendar.YEAR); - WebView wv = new WebView(this); - StringBuilder html = new StringBuilder() - .append("") - .append("\"").append(appName).append("\"/") - .append("

") - .append(String.format(getString(R.string.about_title_fmt), - "") - .append(appName) - .append("") - .append("

") - .append(appName) - .append(" ") - .append(String.format(getString(R.string.debug_version_fmt), getVersionNumber())) - .append("

") - .append(String.format(getString(R.string.app_authors_fmt), - getString(R.string.app_authors))) - .append("

") - .append(String.format(getString(R.string.app_revision_fmt), - "" + - getString(R.string.app_revision_url) + - "")) - .append("


") - .append(String.format(getString(R.string.app_copyright_fmt), Integer.toString(year), Integer.toString(year))) - .append("


") - .append(getString(R.string.app_license)) - .append("


"); - - StringBuilder libs = new StringBuilder().append("

"); - - html.append(String.format(getString(R.string.app_libraries), libs.toString())) - .append("

"); - - - wv.loadDataWithBaseURL("file:///android_res/drawable/", html.toString(), "text/html", "utf-8", null); - new AlertDialog.Builder(this) - .setView(wv) - .setCancelable(true) - .setPositiveButton(R.string.okay_action, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface d, int c) { - d.dismiss(); - } - }) - .setNeutralButton(R.string.changelog_full_title, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface d, int c) { - new ChangeLog(Accounts.this).getFullLogDialog().show(); - } - }) - .show(); + private void startAboutActivity() { + Intent intent=new Intent(this,AboutActivity.class); + startActivity(intent); } + + /** * Get current version number. * @@ -1768,8 +2058,8 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { holder.flaggedMessageCountIcon = view.findViewById(R.id.flagged_message_count_icon); holder.activeIcons = (RelativeLayout) view.findViewById(R.id.active_icons); - holder.chip = view.findViewById(R.id.chip); holder.folders = (ImageButton) view.findViewById(R.id.folders); + holder.inboxImageView = (ImageView) view.findViewById(R.id.inbox_image_view); holder.accountsItemLayout = (LinearLayout)view.findViewById(R.id.accounts_item_layout); view.setTag(holder); @@ -1820,17 +2110,12 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { holder.flaggedMessageCountWrapper.setVisibility(View.GONE); } if (account instanceof Account) { - Account realAccount = (Account)account; - - holder.chip.setBackgroundColor(realAccount.getChipColor()); - - holder.flaggedMessageCountIcon.setBackgroundDrawable( realAccount.generateColorChip(false, true).drawable() ); - holder.newMessageCountIcon.setBackgroundDrawable( realAccount.generateColorChip(false, false).drawable() ); + holder.newMessageCountIcon.setBackground( new ColorChip(Color.parseColor("#F15E2E"), false, ColorChip.CIRCULAR).drawable() ); + holder.flaggedMessageCountIcon.setBackground(new ColorChip(0xff999999, false, ColorChip.STAR).drawable()); } else { - holder.chip.setBackgroundColor(0xff999999); - holder.newMessageCountIcon.setBackgroundDrawable( new ColorChip(0xff999999, false, ColorChip.CIRCULAR).drawable() ); - holder.flaggedMessageCountIcon.setBackgroundDrawable(new ColorChip(0xff999999, false, ColorChip.STAR).drawable()); + holder.newMessageCountIcon.setBackground( new ColorChip(Color.parseColor("#F15E2E"), false, ColorChip.CIRCULAR).drawable() ); + holder.flaggedMessageCountIcon.setBackground(new ColorChip(0xff999999, false, ColorChip.STAR).drawable()); } @@ -1841,8 +2126,10 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { if (account instanceof SearchAccount) { holder.folders.setVisibility(View.GONE); + holder.inboxImageView.setVisibility(View.VISIBLE); } else { holder.folders.setVisibility(View.VISIBLE); + holder.inboxImageView.setVisibility(View.GONE); holder.folders.setOnClickListener(new OnClickListener() { public void onClick(View v) { FolderList.actionHandleAccount(Accounts.this, (Account)account); @@ -1894,6 +2181,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener { public RelativeLayout activeIcons; public View chip; public ImageButton folders; + public ImageView inboxImageView; public LinearLayout accountsItemLayout; } } diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ActivityListener.java b/k9mail/src/main/java/foundation/e/mail/activity/ActivityListener.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/ActivityListener.java rename to k9mail/src/main/java/foundation/e/mail/activity/ActivityListener.java index 93631085d318cee5d8918dff069ffd4d3dc19f70..965eb3bfd46cf672e3be0e3dbc7938c76aedacb1 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ActivityListener.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ActivityListener.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.BroadcastReceiver; @@ -7,12 +7,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.text.format.DateUtils; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.service.MailService; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.service.MailService; import net.jcip.annotations.GuardedBy; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/AlternateRecipientAdapter.java b/k9mail/src/main/java/foundation/e/mail/activity/AlternateRecipientAdapter.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/AlternateRecipientAdapter.java rename to k9mail/src/main/java/foundation/e/mail/activity/AlternateRecipientAdapter.java index 05babc55a8acd54b4d8e1b1dc17d7c59c1e9da50..4a4367a6d1636f3966aa0c9e481960ae7c1db71c 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/AlternateRecipientAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/AlternateRecipientAdapter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.List; @@ -19,11 +19,11 @@ import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; -import com.fsck.k9.R; -import com.fsck.k9.activity.compose.RecipientAdapter; -import com.fsck.k9.ui.ContactBadge; -import com.fsck.k9.view.RecipientSelectView.Recipient; -import com.fsck.k9.view.ThemeUtils; +import foundation.e.mail.R; +import foundation.e.mail.activity.compose.RecipientAdapter; +import foundation.e.mail.ui.ContactBadge; +import foundation.e.mail.view.RecipientSelectView.Recipient; +import foundation.e.mail.view.ThemeUtils; public class AlternateRecipientAdapter extends BaseAdapter { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ChooseAccount.java b/k9mail/src/main/java/foundation/e/mail/activity/ChooseAccount.java similarity index 70% rename from k9mail/src/main/java/com/fsck/k9/activity/ChooseAccount.java rename to k9mail/src/main/java/foundation/e/mail/activity/ChooseAccount.java index b45ed10a31380b6717e8a87342eb5ed550a15563..748b282bd88d2d538d02110dd0006499bd5de279 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ChooseAccount.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ChooseAccount.java @@ -1,12 +1,12 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Intent; -import com.fsck.k9.BaseAccount; +import foundation.e.mail.BaseAccount; public class ChooseAccount extends AccountList { - public static final String EXTRA_ACCOUNT_UUID = "com.fsck.k9.ChooseAccount_account_uuid"; + public static final String EXTRA_ACCOUNT_UUID = "foundation.e.mail.ChooseAccount_account_uuid"; @Override protected boolean displaySpecialAccounts() { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ChooseFolder.java b/k9mail/src/main/java/foundation/e/mail/activity/ChooseFolder.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/activity/ChooseFolder.java rename to k9mail/src/main/java/foundation/e/mail/activity/ChooseFolder.java index 1a40821456212435e8b162e0d8d8f69f04b7febb..9b47af21270b2e13b24a99c57476bda58d54b3f3 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ChooseFolder.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ChooseFolder.java @@ -1,5 +1,5 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.ArrayList; import java.util.Collections; @@ -20,27 +20,27 @@ import android.widget.ListView; import android.widget.SearchView; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.LocalFolder; +import foundation.e.mail.Account; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.LocalFolder; public class ChooseFolder extends K9ListActivity { - public static final String EXTRA_ACCOUNT = "com.fsck.k9.ChooseFolder_account"; - public static final String EXTRA_CUR_FOLDER = "com.fsck.k9.ChooseFolder_curfolder"; - public static final String EXTRA_SEL_FOLDER = "com.fsck.k9.ChooseFolder_selfolder"; - public static final String EXTRA_NEW_FOLDER = "com.fsck.k9.ChooseFolder_newfolder"; - public static final String EXTRA_MESSAGE = "com.fsck.k9.ChooseFolder_message"; - public static final String EXTRA_SHOW_CURRENT = "com.fsck.k9.ChooseFolder_showcurrent"; - public static final String EXTRA_SHOW_FOLDER_NONE = "com.fsck.k9.ChooseFolder_showOptionNone"; - public static final String EXTRA_SHOW_DISPLAYABLE_ONLY = "com.fsck.k9.ChooseFolder_showDisplayableOnly"; + public static final String EXTRA_ACCOUNT = "foundation.e.mail.ChooseFolder_account"; + public static final String EXTRA_CUR_FOLDER = "foundation.e.mail.ChooseFolder_curfolder"; + public static final String EXTRA_SEL_FOLDER = "foundation.e.mail.ChooseFolder_selfolder"; + public static final String EXTRA_NEW_FOLDER = "foundation.e.mail.ChooseFolder_newfolder"; + public static final String EXTRA_MESSAGE = "foundation.e.mail.ChooseFolder_message"; + public static final String EXTRA_SHOW_CURRENT = "foundation.e.mail.ChooseFolder_showcurrent"; + public static final String EXTRA_SHOW_FOLDER_NONE = "foundation.e.mail.ChooseFolder_showOptionNone"; + public static final String EXTRA_SHOW_DISPLAYABLE_ONLY = "foundation.e.mail.ChooseFolder_showDisplayableOnly"; String mFolder; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ChooseIdentity.java b/k9mail/src/main/java/foundation/e/mail/activity/ChooseIdentity.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/activity/ChooseIdentity.java rename to k9mail/src/main/java/foundation/e/mail/activity/ChooseIdentity.java index 6795ea0b93dd52759ef746f5547f1330c74b7f49..6d7d5f165509ee1e3bc8bdd98820191bd7e78802 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ChooseIdentity.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ChooseIdentity.java @@ -1,5 +1,5 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Intent; import android.os.Bundle; @@ -9,18 +9,18 @@ import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; import java.util.List; public class ChooseIdentity extends K9ListActivity { Account mAccount; ArrayAdapter adapter; - public static final String EXTRA_ACCOUNT = "com.fsck.k9.ChooseIdentity_account"; - public static final String EXTRA_IDENTITY = "com.fsck.k9.ChooseIdentity_identity"; + public static final String EXTRA_ACCOUNT = "foundation.e.mail.ChooseIdentity_account"; + public static final String EXTRA_IDENTITY = "foundation.e.mail.ChooseIdentity_identity"; protected List identities = null; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ColorPickerDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/ColorPickerDialog.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/ColorPickerDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/ColorPickerDialog.java index 5b1c27c27c4a7f2080a7cd06b61ea912aae6b145..da4849bd6adb024c54dc3d1cea72238af811c398 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ColorPickerDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ColorPickerDialog.java @@ -1,6 +1,6 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; -import com.fsck.k9.R; +import foundation.e.mail.R; import android.annotation.SuppressLint; import android.app.AlertDialog; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ConfirmationDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/ConfirmationDialog.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/activity/ConfirmationDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/ConfirmationDialog.java index 246ab2f5db95a12bedce1e29a8a759304392b6a7..264f4416432245766e4f0867aebb7caf5de47df8 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ConfirmationDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ConfirmationDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.app.Activity; import android.app.AlertDialog; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/EditIdentity.java b/k9mail/src/main/java/foundation/e/mail/activity/EditIdentity.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/activity/EditIdentity.java rename to k9mail/src/main/java/foundation/e/mail/activity/EditIdentity.java index bf9eeced863a0932a1a38d866ba06687fce923b7..8b8d9d6048ef276a8e5d6d729ea282320838361b 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/EditIdentity.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/EditIdentity.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.os.Bundle; import android.view.View; @@ -6,17 +6,17 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; import java.util.List; public class EditIdentity extends K9Activity { - public static final String EXTRA_IDENTITY = "com.fsck.k9.EditIdentity_identity"; - public static final String EXTRA_IDENTITY_INDEX = "com.fsck.k9.EditIdentity_identity_index"; - public static final String EXTRA_ACCOUNT = "com.fsck.k9.EditIdentity_account"; + public static final String EXTRA_IDENTITY = "foundation.e.mail.EditIdentity_identity"; + public static final String EXTRA_IDENTITY_INDEX = "foundation.e.mail.EditIdentity_identity_index"; + public static final String EXTRA_ACCOUNT = "foundation.e.mail.EditIdentity_account"; private Account mAccount; private Identity mIdentity; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/EmailAddressList.java b/k9mail/src/main/java/foundation/e/mail/activity/EmailAddressList.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/activity/EmailAddressList.java rename to k9mail/src/main/java/foundation/e/mail/activity/EmailAddressList.java index 6b2141d7e021c82bd2039de3414c41d76225072d..a62b9a5186b179be421c3edb67f8aafc9bdd4d41 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/EmailAddressList.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/EmailAddressList.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Intent; import android.os.Bundle; @@ -9,8 +9,8 @@ import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; -import com.fsck.k9.R; -import com.fsck.k9.helper.ContactItem; +import foundation.e.mail.R; +import foundation.e.mail.helper.ContactItem; public class EmailAddressList extends K9ListActivity implements OnItemClickListener { public static final String EXTRA_CONTACT_ITEM = "contact"; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java b/k9mail/src/main/java/foundation/e/mail/activity/FolderInfoHolder.java similarity index 61% rename from k9mail/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java rename to k9mail/src/main/java/foundation/e/mail/activity/FolderInfoHolder.java index ef52d8b28fcf3611697354a60c06509eb6c85f4a..e75ccf85f3c82223c7b285b8cc1f3c854b4eecaa 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/FolderInfoHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/FolderInfoHolder.java @@ -1,14 +1,15 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.LocalFolder; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.LocalFolder; -public class FolderInfoHolder implements Comparable { +public class FolderInfoHolder implements Comparable +{ public String name; public String displayName; public long lastChecked; @@ -22,51 +23,64 @@ public class FolderInfoHolder implements Comparable { public boolean moreMessages; @Override - public boolean equals(Object o) { + public boolean equals(Object o) + { return o instanceof FolderInfoHolder && name.equals(((FolderInfoHolder) o).name); } @Override - public int hashCode() { + public int hashCode() + { return name.hashCode(); } - public int compareTo(FolderInfoHolder o) { + public int compareTo(FolderInfoHolder o) + { String s1 = this.name; String s2 = o.name; int ret = s1.compareToIgnoreCase(s2); - if (ret != 0) { + if (ret != 0) + { return ret; - } else { + } + else + { return s1.compareTo(s2); } } - private String truncateStatus(String mess) { - if (mess != null && mess.length() > 27) { + private String truncateStatus(String mess) + { + if (mess != null && mess.length() > 27) + { mess = mess.substring(0, 27); } return mess; } // constructor for an empty object for comparisons - public FolderInfoHolder() { + public FolderInfoHolder() + { } - public FolderInfoHolder(Context context, LocalFolder folder, Account account) { - if (context == null) { + public FolderInfoHolder(Context context, LocalFolder folder, Account account) + { + if (context == null) + { throw new IllegalArgumentException("null context given"); } populate(context, folder, account); } - public FolderInfoHolder(Context context, LocalFolder folder, Account account, int unreadCount) { + public FolderInfoHolder(Context context, LocalFolder folder, Account account, int unreadCount) + { populate(context, folder, account, unreadCount); } - public void populate(Context context, LocalFolder folder, Account account, int unreadCount) { + public void populate(Context context, LocalFolder folder, Account account, int unreadCount) + { populate(context, folder, account); this.unreadMessageCount = unreadCount; folder.close(); @@ -74,7 +88,8 @@ public class FolderInfoHolder implements Comparable { } - public void populate(Context context, LocalFolder folder, Account account) { + public void populate(Context context, LocalFolder folder, Account account) + { this.folder = folder; this.name = folder.getName(); this.lastChecked = folder.getLastUpdate(); @@ -87,51 +102,65 @@ public class FolderInfoHolder implements Comparable { /** * Returns the display name for a folder. - * + *

*

* This will return localized strings for special folders like the Inbox or the Trash folder. *

* - * @param context - * A {@link Context} instance that is used to get the string resources. - * @param account - * The {@link Account} the folder belongs to. - * @param name - * The name of the folder for which to return the display name. - * + * @param context A {@link Context} instance that is used to get the string resources. + * @param account The {@link Account} the folder belongs to. + * @param name The name of the folder for which to return the display name. * @return The localized name for the provided folder if it's a special folder or the original - * folder name if it's a non-special folder. + * folder name if it's a non-special folder. */ - public static String getDisplayName(Context context, Account account, String name) { + public static String getDisplayName(Context context, Account account, String name) + { final String displayName; - if (name.equals(account.getSpamFolderName())) { + if (name.equals(account.getSpamFolderName())) + { displayName = String.format( context.getString(R.string.special_mailbox_name_spam_fmt), name); - } else if (name.equals(account.getArchiveFolderName())) { + } + else if (name.equals(account.getArchiveFolderName())) + { displayName = String.format( context.getString(R.string.special_mailbox_name_archive_fmt), name); - } else if (name.equals(account.getSentFolderName())) { + } + else if (name.equals(account.getSentFolderName())) + { displayName = String.format( context.getString(R.string.special_mailbox_name_sent_fmt), name); - } else if (name.equals(account.getTrashFolderName())) { + } + else if (name.equals(account.getTrashFolderName())) + { displayName = String.format( context.getString(R.string.special_mailbox_name_trash_fmt), name); - } else if (name.equals(account.getDraftsFolderName())) { + } + else if (name.equals(account.getDraftsFolderName())) + { displayName = String.format( context.getString(R.string.special_mailbox_name_drafts_fmt), name); - } else if (name.equals(account.getOutboxFolderName())) { - displayName = context.getString(R.string.special_mailbox_name_outbox); - // FIXME: We really shouldn't do a case-insensitive comparison here - } else if (name.equalsIgnoreCase(account.getInboxFolderName())) { + } + else if (name.equals(account.getOutboxFolderName())) + { + displayName = String.format( + context.getString(R.string.special_mailbox_name_outbox), name); + // FIXME: We really shouldn't do a case-insensitive comparison here + } + else if (name.equalsIgnoreCase(account.getInboxFolderName())) + { displayName = context.getString(R.string.special_mailbox_name_inbox); - } else { + } + else + { displayName = name; } return displayName; } - public void setMoreMessagesFromFolder(LocalFolder folder) { + public void setMoreMessagesFromFolder(LocalFolder folder) + { moreMessages = folder.hasMoreMessages(); } } diff --git a/k9mail/src/main/java/com/fsck/k9/activity/FolderList.java b/k9mail/src/main/java/foundation/e/mail/activity/FolderList.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/FolderList.java rename to k9mail/src/main/java/foundation/e/mail/activity/FolderList.java index a4e7e3b8770c87a9182d2c0d5742dfb545e80a48..82547f8e28f745602a7bfb65e8601aaf3a43c8c2 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/FolderList.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/FolderList.java @@ -1,20 +1,24 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Set; +import java.util.TreeSet; import android.annotation.SuppressLint; import android.app.ActionBar; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.text.TextUtils.TruncateAt; import android.text.format.DateUtils; +import foundation.e.mail.view.ColorChip; import timber.log.Timber; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -38,31 +42,31 @@ import android.widget.SearchView; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.compose.MessageActions; -import com.fsck.k9.activity.setup.AccountSettings; -import com.fsck.k9.activity.setup.FolderSettings; -import com.fsck.k9.activity.setup.Prefs; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.helper.SizeFormatter; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.service.MailService; +import foundation.e.mail.Account; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.compose.MessageActions; +import foundation.e.mail.activity.setup.AccountSettings; +import foundation.e.mail.activity.setup.FolderSettings; +import foundation.e.mail.activity.setup.Prefs; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.helper.SizeFormatter; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.service.MailService; import de.cketti.library.changelog.ChangeLog; @@ -119,7 +123,11 @@ public class FolderList extends K9ListActivity { if (operation.length() < 1) { actionBarSubTitle.setText(account.getEmail()); } else { - actionBarSubTitle.setText(operation); + // We don't want messages such as "Polling/Pushing disabled" + //actionBarSubTitle.setText(operation); + + // Just show the currently selected account instead + actionBarSubTitle.setText(account.getEmail()); } } }); @@ -129,8 +137,24 @@ public class FolderList extends K9ListActivity { public void newFolders(final List newFolders) { runOnUiThread(new Runnable() { public void run() { + Set folderNamesSet = new TreeSet<>(); + ArrayList folders = new ArrayList<>(); + + for (FolderInfoHolder folder : newFolders) { + folderNamesSet.add(folder.displayName); + } + + for (String folderName : folderNamesSet) { + for (FolderInfoHolder folder : newFolders) { + if (folderName.equals(folder.displayName)) { + folders.add(folder); + break; + } + } + } + adapter.mFolders.clear(); - adapter.mFolders.addAll(newFolders); + adapter.mFolders.addAll(folders); adapter.mFilteredFolders = adapter.mFolders; handler.dataChanged(); } @@ -291,10 +315,11 @@ public class FolderList extends K9ListActivity { return; } - ChangeLog cl = new ChangeLog(this); + // Remove the ChangeLog + /*ChangeLog cl = new ChangeLog(this); if (cl.isFirstRun()) { cl.getLogDialog().show(); - } + }*/ } @SuppressLint("InflateParams") @@ -967,7 +992,6 @@ public class FolderList extends K9ListActivity { holder.folderStatus = (TextView) view.findViewById(R.id.folder_status); holder.activeIcons = (RelativeLayout) view.findViewById(R.id.active_icons); - holder.chip = view.findViewById(R.id.chip); holder.folderListItemLayout = (LinearLayout)view.findViewById(R.id.folder_list_item_layout); holder.rawFolderName = folder.name; @@ -1026,8 +1050,7 @@ public class FolderList extends K9ListActivity { holder.newMessageCountWrapper.setOnClickListener( createUnreadSearch(account, folder)); holder.newMessageCountWrapper.setVisibility(View.VISIBLE); - holder.newMessageCountIcon.setBackgroundDrawable( - account.generateColorChip(false, false).drawable()); + holder.newMessageCountIcon.setBackground(new ColorChip(Color.parseColor("#F15E2E"), false, ColorChip.CIRCULAR).drawable()); } else { holder.newMessageCountWrapper.setVisibility(View.GONE); } @@ -1046,8 +1069,7 @@ public class FolderList extends K9ListActivity { holder.flaggedMessageCountWrapper.setOnClickListener( createFlaggedSearch(account, folder)); holder.flaggedMessageCountWrapper.setVisibility(View.VISIBLE); - holder.flaggedMessageCountIcon.setBackgroundDrawable( - account.generateColorChip(false, true).drawable()); + holder.flaggedMessageCountIcon.setBackground(new ColorChip(Color.parseColor("#F15E2E"), false, ColorChip.STAR).drawable()); } else { holder.flaggedMessageCountWrapper.setVisibility(View.GONE); } @@ -1059,9 +1081,6 @@ public class FolderList extends K9ListActivity { } }); - holder.chip.setBackgroundColor(account.getChipColor()); - - fontSizes.setViewTextSize(holder.folderName, fontSizes.getFolderName()); if (K9.wrapFolderNames()) { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/FolderListFilter.java b/k9mail/src/main/java/foundation/e/mail/activity/FolderListFilter.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/activity/FolderListFilter.java rename to k9mail/src/main/java/foundation/e/mail/activity/FolderListFilter.java index 359ec7f5d27c083a89dde226c423e7ae0300b107..d37ea6ed09d8547392610445c58ccb60df14a814 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/FolderListFilter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/FolderListFilter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.ArrayList; import java.util.List; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/K9Activity.java b/k9mail/src/main/java/foundation/e/mail/activity/K9Activity.java similarity index 78% rename from k9mail/src/main/java/com/fsck/k9/activity/K9Activity.java rename to k9mail/src/main/java/foundation/e/mail/activity/K9Activity.java index 19a8c2ca6d724963b4cb5ce24ea4c59cbf518114..ce7c2a765526ce923e9c7a058d40513b8f0d08e5 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/K9Activity.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/K9Activity.java @@ -1,11 +1,11 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; -import com.fsck.k9.activity.K9ActivityCommon.K9ActivityMagic; -import com.fsck.k9.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; +import foundation.e.mail.activity.K9ActivityCommon.K9ActivityMagic; +import foundation.e.mail.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; public abstract class K9Activity extends Activity implements K9ActivityMagic { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/K9ActivityCommon.java b/k9mail/src/main/java/foundation/e/mail/activity/K9ActivityCommon.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/activity/K9ActivityCommon.java rename to k9mail/src/main/java/foundation/e/mail/activity/K9ActivityCommon.java index 2667526cad13b81ffe3792f9caf0c0556ab0b987..5585585da513c332dfdc0022a78fef20c79d727c 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/K9ActivityCommon.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/K9ActivityCommon.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.Locale; @@ -11,9 +11,9 @@ import android.text.TextUtils; import android.view.GestureDetector; import android.view.MotionEvent; -import com.fsck.k9.K9; -import com.fsck.k9.activity.misc.SwipeGestureDetector; -import com.fsck.k9.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; +import foundation.e.mail.K9; +import foundation.e.mail.activity.misc.SwipeGestureDetector; +import foundation.e.mail.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; /** @@ -36,6 +36,10 @@ public class K9ActivityCommon { return new K9ActivityCommon(activity); } + public static K9ActivityCommon newMaterialInstance(Activity activity) { + return new K9ActivityCommon(activity, true); + } + public static void setLanguage(Context context, String language) { Locale locale; if (TextUtils.isEmpty(language)) { @@ -70,9 +74,17 @@ public class K9ActivityCommon { private K9ActivityCommon(Activity activity) { + this(activity, false); + } + + private K9ActivityCommon(Activity activity, boolean isMaterial) { mActivity = activity; + if (isMaterial) { + mActivity.setTheme(K9.getK9MaterialThemeResourceId()); + } else { + mActivity.setTheme(K9.getK9ThemeResourceId()); + } setLanguage(mActivity, K9.getK9Language()); - mActivity.setTheme(K9.getK9ThemeResourceId()); } /** diff --git a/k9mail/src/main/java/com/fsck/k9/activity/K9ListActivity.java b/k9mail/src/main/java/foundation/e/mail/activity/K9ListActivity.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/activity/K9ListActivity.java rename to k9mail/src/main/java/foundation/e/mail/activity/K9ListActivity.java index df61923b82d4ae1a3c702ebef8b03e5861cdc311..7a9c0117206fae41dac402271b084cbc51934f1f 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/K9ListActivity.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/K9ListActivity.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.app.ListActivity; import android.os.Bundle; @@ -7,9 +7,9 @@ import android.view.MotionEvent; import android.widget.AdapterView; import android.widget.ListView; -import com.fsck.k9.K9; -import com.fsck.k9.activity.K9ActivityCommon.K9ActivityMagic; -import com.fsck.k9.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; +import foundation.e.mail.K9; +import foundation.e.mail.activity.K9ActivityCommon.K9ActivityMagic; +import foundation.e.mail.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; public abstract class K9ListActivity extends ListActivity implements K9ActivityMagic { diff --git a/k9mail/src/main/java/foundation/e/mail/activity/K9MaterialActivity.java b/k9mail/src/main/java/foundation/e/mail/activity/K9MaterialActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..a30075210fd0995eea1e74854affa59fc5fb811b --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/K9MaterialActivity.java @@ -0,0 +1,34 @@ +package foundation.e.mail.activity; + + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.MotionEvent; + +import foundation.e.mail.activity.K9ActivityCommon.K9ActivityMagic; +import foundation.e.mail.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; + + +public class K9MaterialActivity extends AppCompatActivity implements K9ActivityMagic { + + private K9ActivityCommon mBase; + + + @Override + public void onCreate(Bundle savedInstanceState) { + mBase = K9ActivityCommon.newMaterialInstance(this); + super.onCreate(savedInstanceState); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + mBase.preDispatchTouchEvent(event); + return super.dispatchTouchEvent(event); + } + + @Override + public void setupGestureDetector(OnSwipeGestureListener listener) { + mBase.setupGestureDetector(listener); + } +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/K9PreferenceActivity.java b/k9mail/src/main/java/foundation/e/mail/activity/K9PreferenceActivity.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/K9PreferenceActivity.java rename to k9mail/src/main/java/foundation/e/mail/activity/K9PreferenceActivity.java index 24f854038d92342ae4811d613e91cf4485ae111f..5a3853bbd7deae278351a0425d376f13eedf7d5e 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/K9PreferenceActivity.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/K9PreferenceActivity.java @@ -1,11 +1,11 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; -import com.fsck.k9.K9; +import foundation.e.mail.K9; public abstract class K9PreferenceActivity extends PreferenceActivity { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/LauncherShortcuts.java b/k9mail/src/main/java/foundation/e/mail/activity/LauncherShortcuts.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/activity/LauncherShortcuts.java rename to k9mail/src/main/java/foundation/e/mail/activity/LauncherShortcuts.java index 563505896e3ac9a8220210bcd0aa885e5c7c452b..c8fed8e020facd9486fcc86c1e4fb814c7492225 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/LauncherShortcuts.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/LauncherShortcuts.java @@ -1,13 +1,13 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; -import com.fsck.k9.Account; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.R; -import com.fsck.k9.search.SearchAccount; +import foundation.e.mail.Account; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.R; +import foundation.e.mail.search.SearchAccount; public class LauncherShortcuts extends AccountList { @Override @@ -44,7 +44,7 @@ public class LauncherShortcuts extends AccountList { description = account.getEmail(); } intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, description); - Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon); + Parcelable iconResource = Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); setResult(RESULT_OK, intent); diff --git a/k9mail/src/main/java/com/fsck/k9/activity/ManageIdentities.java b/k9mail/src/main/java/foundation/e/mail/activity/ManageIdentities.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/ManageIdentities.java rename to k9mail/src/main/java/foundation/e/mail/activity/ManageIdentities.java index 41d3d3e34820f6226c62a9b4290e41eb1fac45ce..d53de1cae9beb5c9be68e0656c3cc1ac9a0814b5 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/ManageIdentities.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/ManageIdentities.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.content.Intent; import android.view.ContextMenu; @@ -11,9 +11,9 @@ import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ListView; import android.widget.Toast; -import com.fsck.k9.Identity; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; +import foundation.e.mail.Identity; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; public class ManageIdentities extends ChooseIdentity { private boolean mIdentitiesChanged = false; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageCompose.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageCompose.java index 1fe51238ed467189907f3af43b93cc707980a71c..cc55d4de7b041fc080f598dc2ec992b3e7b4fe98 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageCompose.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageCompose.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.io.IOException; @@ -44,62 +44,62 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Account.MessageFormat; -import com.fsck.k9.Identity; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageLoaderHelper.MessageLoaderCallbacks; -import com.fsck.k9.activity.compose.AttachmentPresenter; -import com.fsck.k9.activity.compose.AttachmentPresenter.AttachmentMvpView; -import com.fsck.k9.activity.compose.AttachmentPresenter.WaitingAction; -import com.fsck.k9.activity.compose.ComposeCryptoStatus; -import com.fsck.k9.activity.compose.ComposeCryptoStatus.SendErrorState; -import com.fsck.k9.activity.compose.IdentityAdapter; -import com.fsck.k9.activity.compose.IdentityAdapter.IdentityContainer; -import com.fsck.k9.activity.compose.PgpEnabledErrorDialog.OnOpenPgpDisableListener; -import com.fsck.k9.activity.compose.PgpInlineDialog.OnOpenPgpInlineChangeListener; -import com.fsck.k9.activity.compose.PgpSignOnlyDialog.OnOpenPgpSignOnlyChangeListener; -import com.fsck.k9.activity.compose.RecipientMvpView; -import com.fsck.k9.activity.compose.RecipientPresenter; -import com.fsck.k9.activity.compose.SaveMessageTask; -import com.fsck.k9.activity.misc.Attachment; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.fragment.AttachmentDownloadDialogFragment; -import com.fsck.k9.fragment.AttachmentDownloadDialogFragment.AttachmentDownloadCancelListener; -import com.fsck.k9.fragment.ProgressDialogFragment; -import com.fsck.k9.fragment.ProgressDialogFragment.CancelListener; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.helper.IdentityHelper; -import com.fsck.k9.helper.MailTo; -import com.fsck.k9.helper.ReplyToParser; -import com.fsck.k9.helper.SimpleTextWatcher; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.message.AutocryptStatusInteractor; -import com.fsck.k9.message.ComposePgpEnableByDefaultDecider; -import com.fsck.k9.message.ComposePgpInlineDecider; -import com.fsck.k9.message.IdentityField; -import com.fsck.k9.message.IdentityHeaderParser; -import com.fsck.k9.message.MessageBuilder; -import com.fsck.k9.message.PgpMessageBuilder; -import com.fsck.k9.message.QuotedTextMode; -import com.fsck.k9.message.SimpleMessageBuilder; -import com.fsck.k9.message.SimpleMessageFormat; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.ui.EolConvertingEditText; -import com.fsck.k9.ui.compose.QuotedMessageMvpView; -import com.fsck.k9.ui.compose.QuotedMessagePresenter; +import foundation.e.mail.Account; +import foundation.e.mail.Account.MessageFormat; +import foundation.e.mail.Identity; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageLoaderHelper.MessageLoaderCallbacks; +import foundation.e.mail.activity.compose.AttachmentPresenter; +import foundation.e.mail.activity.compose.AttachmentPresenter.AttachmentMvpView; +import foundation.e.mail.activity.compose.AttachmentPresenter.WaitingAction; +import foundation.e.mail.activity.compose.ComposeCryptoStatus; +import foundation.e.mail.activity.compose.ComposeCryptoStatus.SendErrorState; +import foundation.e.mail.activity.compose.IdentityAdapter; +import foundation.e.mail.activity.compose.IdentityAdapter.IdentityContainer; +import foundation.e.mail.activity.compose.PgpEnabledErrorDialog.OnOpenPgpDisableListener; +import foundation.e.mail.activity.compose.PgpInlineDialog.OnOpenPgpInlineChangeListener; +import foundation.e.mail.activity.compose.PgpSignOnlyDialog.OnOpenPgpSignOnlyChangeListener; +import foundation.e.mail.activity.compose.RecipientMvpView; +import foundation.e.mail.activity.compose.RecipientPresenter; +import foundation.e.mail.activity.compose.SaveMessageTask; +import foundation.e.mail.activity.misc.Attachment; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.fragment.AttachmentDownloadDialogFragment; +import foundation.e.mail.fragment.AttachmentDownloadDialogFragment.AttachmentDownloadCancelListener; +import foundation.e.mail.fragment.ProgressDialogFragment; +import foundation.e.mail.fragment.ProgressDialogFragment.CancelListener; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.helper.IdentityHelper; +import foundation.e.mail.helper.MailTo; +import foundation.e.mail.helper.ReplyToParser; +import foundation.e.mail.helper.SimpleTextWatcher; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.message.AutocryptStatusInteractor; +import foundation.e.mail.message.ComposePgpEnableByDefaultDecider; +import foundation.e.mail.message.ComposePgpInlineDecider; +import foundation.e.mail.message.IdentityField; +import foundation.e.mail.message.IdentityHeaderParser; +import foundation.e.mail.message.MessageBuilder; +import foundation.e.mail.message.PgpMessageBuilder; +import foundation.e.mail.message.QuotedTextMode; +import foundation.e.mail.message.SimpleMessageBuilder; +import foundation.e.mail.message.SimpleMessageFormat; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.ui.EolConvertingEditText; +import foundation.e.mail.ui.compose.QuotedMessageMvpView; +import foundation.e.mail.ui.compose.QuotedMessagePresenter; import org.openintents.openpgp.util.OpenPgpApi; import timber.log.Timber; @@ -118,12 +118,12 @@ public class MessageCompose extends K9Activity implements OnClickListener, private static final long INVALID_DRAFT_ID = MessagingController.INVALID_MESSAGE_ID; - public static final String ACTION_COMPOSE = "com.fsck.k9.intent.action.COMPOSE"; - public static final String ACTION_REPLY = "com.fsck.k9.intent.action.REPLY"; - public static final String ACTION_REPLY_ALL = "com.fsck.k9.intent.action.REPLY_ALL"; - public static final String ACTION_FORWARD = "com.fsck.k9.intent.action.FORWARD"; - public static final String ACTION_FORWARD_AS_ATTACHMENT = "com.fsck.k9.intent.action.FORWARD_AS_ATTACHMENT"; - public static final String ACTION_EDIT_DRAFT = "com.fsck.k9.intent.action.EDIT_DRAFT"; + public static final String ACTION_COMPOSE = "foundation.e.mail.intent.action.COMPOSE"; + public static final String ACTION_REPLY = "foundation.e.mail.intent.action.REPLY"; + public static final String ACTION_REPLY_ALL = "foundation.e.mail.intent.action.REPLY_ALL"; + public static final String ACTION_FORWARD = "foundation.e.mail.intent.action.FORWARD"; + public static final String ACTION_FORWARD_AS_ATTACHMENT = "foundation.e.mail.intent.action.FORWARD_AS_ATTACHMENT"; + public static final String ACTION_EDIT_DRAFT = "foundation.e.mail.intent.action.EDIT_DRAFT"; private static final String ACTION_AUTOCRYPT_PEER = "org.autocrypt.PEER_ACTION"; public static final String EXTRA_ACCOUNT = "account"; @@ -131,16 +131,16 @@ public class MessageCompose extends K9Activity implements OnClickListener, public static final String EXTRA_MESSAGE_DECRYPTION_RESULT = "message_decryption_result"; private static final String STATE_KEY_SOURCE_MESSAGE_PROCED = - "com.fsck.k9.activity.MessageCompose.stateKeySourceMessageProced"; - private static final String STATE_KEY_DRAFT_ID = "com.fsck.k9.activity.MessageCompose.draftId"; + "foundation.e.mail.activity.MessageCompose.stateKeySourceMessageProced"; + private static final String STATE_KEY_DRAFT_ID = "foundation.e.mail.activity.MessageCompose.draftId"; private static final String STATE_IDENTITY_CHANGED = - "com.fsck.k9.activity.MessageCompose.identityChanged"; + "foundation.e.mail.activity.MessageCompose.identityChanged"; private static final String STATE_IDENTITY = - "com.fsck.k9.activity.MessageCompose.identity"; - private static final String STATE_IN_REPLY_TO = "com.fsck.k9.activity.MessageCompose.inReplyTo"; - private static final String STATE_REFERENCES = "com.fsck.k9.activity.MessageCompose.references"; - private static final String STATE_KEY_READ_RECEIPT = "com.fsck.k9.activity.MessageCompose.messageReadReceipt"; - private static final String STATE_KEY_CHANGES_MADE_SINCE_LAST_SAVE = "com.fsck.k9.activity.MessageCompose.changesMadeSinceLastSave"; + "foundation.e.mail.activity.MessageCompose.identity"; + private static final String STATE_IN_REPLY_TO = "foundation.e.mail.activity.MessageCompose.inReplyTo"; + private static final String STATE_REFERENCES = "foundation.e.mail.activity.MessageCompose.references"; + private static final String STATE_KEY_READ_RECEIPT = "foundation.e.mail.activity.MessageCompose.messageReadReceipt"; + private static final String STATE_KEY_CHANGES_MADE_SINCE_LAST_SAVE = "foundation.e.mail.activity.MessageCompose.changesMadeSinceLastSave"; private static final String STATE_ALREADY_NOTIFIED_USER_OF_EMPTY_SUBJECT = "alreadyNotifiedUserOfEmptySubject"; private static final String FRAGMENT_WAITING_FOR_ATTACHMENT = "waitingForAttachment"; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageInfoHolder.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageInfoHolder.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageInfoHolder.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageInfoHolder.java index 09708fbe60307d3f065821a94f326e1b3961bccb..e9cc6d0feacda3cbc925bcd03714617921156d0f 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageInfoHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageInfoHolder.java @@ -1,8 +1,8 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.Date; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalMessage; public class MessageInfoHolder { public String date; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageList.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageList.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageList.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageList.java index 82b6051132756ada6922f239a8047d523ce5c7e6..c031ae5e7a66986acefab853f332881a8f8dcf1a 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageList.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageList.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.Collection; @@ -32,34 +32,34 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Account.SortType; -import com.fsck.k9.K9; -import com.fsck.k9.K9.SplitViewMode; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.compose.MessageActions; -import com.fsck.k9.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; -import com.fsck.k9.activity.setup.AccountSettings; -import com.fsck.k9.activity.setup.FolderSettings; -import com.fsck.k9.activity.setup.Prefs; -import com.fsck.k9.fragment.MessageListFragment; -import com.fsck.k9.fragment.MessageListFragment.MessageListFragmentListener; -import com.fsck.k9.helper.ParcelableUtil; -import com.fsck.k9.mailstore.StorageManager; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchAccount; -import com.fsck.k9.search.SearchSpecification; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchCondition; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.ui.messageview.MessageViewFragment; -import com.fsck.k9.ui.messageview.MessageViewFragment.MessageViewFragmentListener; -import com.fsck.k9.view.MessageHeader; -import com.fsck.k9.view.MessageTitleView; -import com.fsck.k9.view.ViewSwitcher; -import com.fsck.k9.view.ViewSwitcher.OnSwitchCompleteListener; +import foundation.e.mail.Account; +import foundation.e.mail.Account.SortType; +import foundation.e.mail.K9; +import foundation.e.mail.K9.SplitViewMode; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.compose.MessageActions; +import foundation.e.mail.activity.misc.SwipeGestureDetector.OnSwipeGestureListener; +import foundation.e.mail.activity.setup.AccountSettings; +import foundation.e.mail.activity.setup.FolderSettings; +import foundation.e.mail.activity.setup.Prefs; +import foundation.e.mail.fragment.MessageListFragment; +import foundation.e.mail.fragment.MessageListFragment.MessageListFragmentListener; +import foundation.e.mail.helper.ParcelableUtil; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchAccount; +import foundation.e.mail.search.SearchSpecification; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchCondition; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.ui.messageview.MessageViewFragment; +import foundation.e.mail.ui.messageview.MessageViewFragment.MessageViewFragmentListener; +import foundation.e.mail.view.MessageHeader; +import foundation.e.mail.view.MessageTitleView; +import foundation.e.mail.view.ViewSwitcher; +import foundation.e.mail.view.ViewSwitcher.OnSwitchCompleteListener; import de.cketti.library.changelog.ChangeLog; @@ -81,8 +81,8 @@ public class MessageList extends K9Activity implements MessageListFragmentListen private static final String EXTRA_MESSAGE_REFERENCE = "message_reference"; // used for remote search - public static final String EXTRA_SEARCH_ACCOUNT = "com.fsck.k9.search_account"; - private static final String EXTRA_SEARCH_FOLDER = "com.fsck.k9.search_folder"; + public static final String EXTRA_SEARCH_ACCOUNT = "foundation.e.mail.search_account"; + private static final String EXTRA_SEARCH_FOLDER = "foundation.e.mail.search_folder"; private static final String STATE_DISPLAY_MODE = "displayMode"; private static final String STATE_MESSAGE_LIST_WAS_DISPLAYED = "messageListWasDisplayed"; @@ -92,7 +92,7 @@ public class MessageList extends K9Activity implements MessageListFragmentListen private static final int PREVIOUS = 1; private static final int NEXT = 2; - public static final int REQUEST_MASK_PENDING_INTENT = 1 << 16; + public static final int REQUEST_MASK_PENDING_INTENT = 1 << 15; public static void actionDisplaySearch(Context context, SearchSpecification search, boolean noThreading, boolean newTask) { @@ -231,10 +231,11 @@ public class MessageList extends K9Activity implements MessageListFragmentListen initializeFragments(); displayViews(); - ChangeLog cl = new ChangeLog(this); + // Remove the ChangeLog + /*ChangeLog cl = new ChangeLog(this); if (cl.isFirstRun()) { cl.getLogDialog().show(); - } + }*/ } @Override diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageLoaderHelper.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageLoaderHelper.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageLoaderHelper.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageLoaderHelper.java index d2f7059d369c65d4c98138db3e5a7eb48d0d7761..6633f0035f2b78e5a2a999d46c0db7775a5d02ad 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageLoaderHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageLoaderHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.app.FragmentManager; @@ -14,25 +14,25 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.UiThread; -import com.fsck.k9.autocrypt.AutocryptOperations; -import com.fsck.k9.ui.crypto.OpenPgpApiFactory; +import foundation.e.mail.autocrypt.AutocryptOperations; +import foundation.e.mail.ui.crypto.OpenPgpApiFactory; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.helper.RetainFragment; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.ui.crypto.MessageCryptoAnnotations; -import com.fsck.k9.ui.crypto.MessageCryptoCallback; -import com.fsck.k9.ui.crypto.MessageCryptoHelper; -import com.fsck.k9.ui.message.LocalMessageExtractorLoader; -import com.fsck.k9.ui.message.LocalMessageLoader; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.helper.RetainFragment; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.ui.crypto.MessageCryptoAnnotations; +import foundation.e.mail.ui.crypto.MessageCryptoCallback; +import foundation.e.mail.ui.crypto.MessageCryptoHelper; +import foundation.e.mail.ui.message.LocalMessageExtractorLoader; +import foundation.e.mail.ui.message.LocalMessageLoader; import org.openintents.openpgp.OpenPgpDecryptionResult; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageReference.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageReference.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageReference.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageReference.java index d9cc99fe0ed21c108218a46d2bb9d2190759187a..79d13a9f71c659e6affc2da03913492005284e1b 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageReference.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageReference.java @@ -1,14 +1,14 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.StringTokenizer; import android.support.annotation.Nullable; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.filter.Base64; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.filter.Base64; -import static com.fsck.k9.helper.Preconditions.checkNotNull; +import static foundation.e.mail.helper.Preconditions.checkNotNull; public class MessageReference { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/MessageReferenceHelper.java b/k9mail/src/main/java/foundation/e/mail/activity/MessageReferenceHelper.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/MessageReferenceHelper.java rename to k9mail/src/main/java/foundation/e/mail/activity/MessageReferenceHelper.java index 652a4f4ebdb495e4246777bcaff708f75edd81ad..18d78d663d5ccac067c366bc50a4176253cedfb0 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/MessageReferenceHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/MessageReferenceHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.ArrayList; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/NotificationDeleteConfirmation.java b/k9mail/src/main/java/foundation/e/mail/activity/NotificationDeleteConfirmation.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/activity/NotificationDeleteConfirmation.java rename to k9mail/src/main/java/foundation/e/mail/activity/NotificationDeleteConfirmation.java index 937b64e0fa5f871332c4ba2d5551e5fe86377c77..a993b068f23d359af6bdc21fde861fced61e7c40 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/NotificationDeleteConfirmation.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/NotificationDeleteConfirmation.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import java.util.Collections; @@ -12,15 +12,15 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.notification.NotificationActionService; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.notification.NotificationActionService; -import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceList; -import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceStringList; +import static foundation.e.mail.activity.MessageReferenceHelper.toMessageReferenceList; +import static foundation.e.mail.activity.MessageReferenceHelper.toMessageReferenceStringList; public class NotificationDeleteConfirmation extends Activity { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/Search.java b/k9mail/src/main/java/foundation/e/mail/activity/Search.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/activity/Search.java rename to k9mail/src/main/java/foundation/e/mail/activity/Search.java index 292ea9c704451235d05eca7bc8db668c90c8243e..0cb34c65325c19316ebb7bd15295ae664fa4b849 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/Search.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/Search.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; public class Search extends MessageList { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/UnreadWidgetConfiguration.java b/k9mail/src/main/java/foundation/e/mail/activity/UnreadWidgetConfiguration.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/UnreadWidgetConfiguration.java rename to k9mail/src/main/java/foundation/e/mail/activity/UnreadWidgetConfiguration.java index 7817d9794d32a11674fa11437bc0d64dc1ea9ca9..034fd2661dfa92db3d9b8eaa6e2b4030a6e0975e 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/UnreadWidgetConfiguration.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/UnreadWidgetConfiguration.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.appwidget.AppWidgetManager; import android.content.Context; @@ -12,12 +12,12 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.helper.UnreadWidgetProperties; -import com.fsck.k9.provider.UnreadWidgetProvider; -import com.fsck.k9.search.SearchAccount; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.helper.UnreadWidgetProperties; +import foundation.e.mail.provider.UnreadWidgetProvider; +import foundation.e.mail.search.SearchAccount; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/UpgradeDatabases.java b/k9mail/src/main/java/foundation/e/mail/activity/UpgradeDatabases.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/UpgradeDatabases.java rename to k9mail/src/main/java/foundation/e/mail/activity/UpgradeDatabases.java index 91fd71fca61e9dcd9417d4e8a148b6e3d70d4dc4..47a1500f4897a2495b101a67a0d5c21c343b4dfe 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/UpgradeDatabases.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/UpgradeDatabases.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity; +package foundation.e.mail.activity; import android.app.Activity; @@ -11,13 +11,13 @@ import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.service.DatabaseUpgradeService; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.service.DatabaseUpgradeService; /** @@ -32,7 +32,7 @@ import com.fsck.k9.service.DatabaseUpgradeService; *
  • {@link #actionUpgradeDatabases(Context, Intent)} will call {@link K9#areDatabasesUpToDate()} * to check if we already know whether the databases have been upgraded.
  • *
  • {@link K9#areDatabasesUpToDate()} will compare the last known database version stored in a - * {@link SharedPreferences} file to {@link com.fsck.k9.mailstore.LocalStore#DB_VERSION}. This + * {@link SharedPreferences} file to {@link foundation.e.mail.mailstore.LocalStore#DB_VERSION}. This * is done as an optimization because it's faster than opening all of the accounts' databases * one by one.
  • *
  • If there was an error reading the cached database version or if it shows the databases need diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/AttachmentPresenter.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/AttachmentPresenter.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/AttachmentPresenter.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/AttachmentPresenter.java index 009c956e5d7b8d29aa698dc937e7cae05cff7083..265d9cf96ae2dc1425724e85af0aaea6c24f0c8b 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/AttachmentPresenter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/AttachmentPresenter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.ArrayList; @@ -16,21 +16,21 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.compose.ComposeCryptoStatus.AttachErrorState; -import com.fsck.k9.activity.loader.AttachmentContentLoader; -import com.fsck.k9.activity.loader.AttachmentInfoLoader; -import com.fsck.k9.activity.misc.Attachment; -import com.fsck.k9.activity.misc.Attachment.LoadingState; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.provider.RawMessageProvider; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.compose.ComposeCryptoStatus.AttachErrorState; +import foundation.e.mail.activity.loader.AttachmentContentLoader; +import foundation.e.mail.activity.loader.AttachmentInfoLoader; +import foundation.e.mail.activity.misc.Attachment; +import foundation.e.mail.activity.misc.Attachment.LoadingState; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.provider.RawMessageProvider; public class AttachmentPresenter { - private static final String STATE_KEY_ATTACHMENTS = "com.fsck.k9.activity.MessageCompose.attachments"; + private static final String STATE_KEY_ATTACHMENTS = "foundation.e.mail.activity.MessageCompose.attachments"; private static final String STATE_KEY_WAITING_FOR_ATTACHMENTS = "waitingForAttachments"; private static final String STATE_KEY_NEXT_LOADER_ID = "nextLoaderId"; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/ComposeCryptoStatus.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/ComposeCryptoStatus.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/ComposeCryptoStatus.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/ComposeCryptoStatus.java index 0827df7ae33fb73fb791791d69e971bcdab0feb1..f903eceebd0e8bc9a8a113465c38642429e4856a 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/ComposeCryptoStatus.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/ComposeCryptoStatus.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.ArrayList; @@ -6,13 +6,13 @@ import java.util.List; import android.app.PendingIntent; -import com.fsck.k9.activity.compose.RecipientMvpView.CryptoSpecialModeDisplayType; -import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType; -import com.fsck.k9.activity.compose.RecipientPresenter.CryptoMode; -import com.fsck.k9.activity.compose.RecipientPresenter.CryptoProviderState; -import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatus; -import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatusType; -import com.fsck.k9.view.RecipientSelectView.Recipient; +import foundation.e.mail.activity.compose.RecipientMvpView.CryptoSpecialModeDisplayType; +import foundation.e.mail.activity.compose.RecipientMvpView.CryptoStatusDisplayType; +import foundation.e.mail.activity.compose.RecipientPresenter.CryptoMode; +import foundation.e.mail.activity.compose.RecipientPresenter.CryptoProviderState; +import foundation.e.mail.message.AutocryptStatusInteractor.RecipientAutocryptStatus; +import foundation.e.mail.message.AutocryptStatusInteractor.RecipientAutocryptStatusType; +import foundation.e.mail.view.RecipientSelectView.Recipient; /** This is an immutable object which contains all relevant metadata entered * during email composition to apply cryptographic operations before sending diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/IdentityAdapter.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/IdentityAdapter.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/IdentityAdapter.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/IdentityAdapter.java index 07f11eade1f0e54081e5f040ffd77d0b04c62c71..e3f372ef8e48c88fed0eb321124cb87636d045a6 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/IdentityAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/IdentityAdapter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.content.Context; import android.view.LayoutInflater; @@ -7,10 +7,10 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; import java.util.ArrayList; import java.util.Collection; @@ -91,14 +91,12 @@ public class IdentityAdapter extends BaseAdapter { view = mLayoutInflater.inflate(R.layout.choose_account_item, parent, false); AccountHolder holder = new AccountHolder(); holder.name = (TextView) view.findViewById(R.id.name); - holder.chip = view.findViewById(R.id.chip); view.setTag(holder); } Account account = (Account) item; AccountHolder holder = (AccountHolder) view.getTag(); holder.name.setText(account.getDescription()); - holder.chip.setBackgroundColor(account.getChipColor()); } else if (item instanceof IdentityContainer) { if (convertView != null && convertView.getTag() instanceof IdentityHolder) { view = convertView; @@ -141,7 +139,6 @@ public class IdentityAdapter extends BaseAdapter { static class AccountHolder { public TextView name; - public View chip; } static class IdentityHolder { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/MessageActions.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/MessageActions.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/MessageActions.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/MessageActions.java index 31b93c959fdf5db1ef65b5bc418fd68e9dac807b..3056f20414cf1087dced6044e1ebdd9e5b103e55 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/MessageActions.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/MessageActions.java @@ -1,13 +1,13 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.content.Context; import android.content.Intent; import android.os.Parcelable; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.activity.MessageReference; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.activity.MessageReference; public class MessageActions { /** diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEnabledErrorDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEnabledErrorDialog.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEnabledErrorDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEnabledErrorDialog.java index b6b420002dbdb91b2540d938d04a6a0d716e9db4..313f29c2c065f4d2eeca97bb6a7628e8f035cb46 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEnabledErrorDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEnabledErrorDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.annotation.SuppressLint; @@ -12,8 +12,8 @@ import android.support.annotation.IdRes; import android.view.LayoutInflater; import android.view.View; -import com.fsck.k9.R; -import com.fsck.k9.view.HighlightDialogFragment; +import foundation.e.mail.R; +import foundation.e.mail.view.HighlightDialogFragment; public class PgpEnabledErrorDialog extends HighlightDialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEncryptDescriptionDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEncryptDescriptionDialog.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEncryptDescriptionDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEncryptDescriptionDialog.java index 0c56c74a34aa02bb24ac864ce75603cc594a2e65..d0fad11e75304ae407fd22cbaff398c31fa68aeb 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpEncryptDescriptionDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpEncryptDescriptionDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.annotation.SuppressLint; @@ -12,8 +12,8 @@ import android.support.annotation.IdRes; import android.view.LayoutInflater; import android.view.View; -import com.fsck.k9.R; -import com.fsck.k9.view.HighlightDialogFragment; +import foundation.e.mail.R; +import foundation.e.mail.view.HighlightDialogFragment; public class PgpEncryptDescriptionDialog extends HighlightDialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpInlineDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpInlineDialog.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/PgpInlineDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/PgpInlineDialog.java index 370131cb01b9a5b24aead3154de5aa743242d384..2e97b7ea1cfdcf07a6df688fe8dac4beaf464e1d 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpInlineDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpInlineDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.annotation.SuppressLint; @@ -12,8 +12,8 @@ import android.support.annotation.IdRes; import android.view.LayoutInflater; import android.view.View; -import com.fsck.k9.R; -import com.fsck.k9.view.HighlightDialogFragment; +import foundation.e.mail.R; +import foundation.e.mail.view.HighlightDialogFragment; public class PgpInlineDialog extends HighlightDialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpSignOnlyDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpSignOnlyDialog.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/PgpSignOnlyDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/PgpSignOnlyDialog.java index 2c9edd5f071fb7ede7a74b1a5a50512c034a0345..655f12125c4ecb717797a3213efc09c29ec6381b 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/PgpSignOnlyDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/PgpSignOnlyDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.annotation.SuppressLint; @@ -12,8 +12,8 @@ import android.support.annotation.IdRes; import android.view.LayoutInflater; import android.view.View; -import com.fsck.k9.R; -import com.fsck.k9.view.HighlightDialogFragment; +import foundation.e.mail.R; +import foundation.e.mail.view.HighlightDialogFragment; public class PgpSignOnlyDialog extends HighlightDialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientAdapter.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientAdapter.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientAdapter.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientAdapter.java index 79433853db9763177b857ca641b16edf75645850..728eee4de4da41a267c943cea3801a5bde9b8e63 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientAdapter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.List; @@ -20,11 +20,11 @@ import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; -import com.fsck.k9.R; -import com.fsck.k9.helper.ContactPicture; -import com.fsck.k9.view.RecipientSelectView.Recipient; -import com.fsck.k9.view.RecipientSelectView.RecipientCryptoStatus; -import com.fsck.k9.view.ThemeUtils; +import foundation.e.mail.R; +import foundation.e.mail.helper.ContactPicture; +import foundation.e.mail.view.RecipientSelectView.Recipient; +import foundation.e.mail.view.RecipientSelectView.RecipientCryptoStatus; +import foundation.e.mail.view.ThemeUtils; public class RecipientAdapter extends BaseAdapter implements Filterable { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientLoader.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientLoader.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientLoader.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientLoader.java index c679a8bc725ff6a30097cb23c11faf8aa50b0aaf..f399012a495936dcf02df0f9f88869fd4d03e56d 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientLoader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.ArrayList; @@ -17,10 +17,10 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts.Data; import android.support.annotation.Nullable; -import com.fsck.k9.R; -import com.fsck.k9.mail.Address; -import com.fsck.k9.view.RecipientSelectView.Recipient; -import com.fsck.k9.view.RecipientSelectView.RecipientCryptoStatus; +import foundation.e.mail.R; +import foundation.e.mail.mail.Address; +import foundation.e.mail.view.RecipientSelectView.Recipient; +import foundation.e.mail.view.RecipientSelectView.RecipientCryptoStatus; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientMvpView.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientMvpView.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientMvpView.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientMvpView.java index 8fcc26ec8deb47a650bf228dd63fd7feaf6c421d..1289a20f8a280408099aa11e4b900319f4811496 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientMvpView.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientMvpView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.Arrays; @@ -15,15 +15,15 @@ import android.view.View.OnFocusChangeListener; import android.widget.Toast; import android.widget.ViewAnimator; -import com.fsck.k9.FontSizes; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.view.RecipientSelectView; -import com.fsck.k9.view.RecipientSelectView.Recipient; -import com.fsck.k9.view.RecipientSelectView.TokenListener; -import com.fsck.k9.view.ToolableViewAnimator; +import foundation.e.mail.FontSizes; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.view.RecipientSelectView; +import foundation.e.mail.view.RecipientSelectView.Recipient; +import foundation.e.mail.view.RecipientSelectView.TokenListener; +import foundation.e.mail.view.ToolableViewAnimator; public class RecipientMvpView implements OnFocusChangeListener, OnClickListener { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientPresenter.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientPresenter.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientPresenter.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientPresenter.java index d06e8ecb939789aa5a69cb5adc2a9ce1bc447593..a8e2d4779ea8bbe09540edcb2210baa0149e21c9 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/RecipientPresenter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/RecipientPresenter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import java.util.ArrayList; @@ -21,29 +21,29 @@ import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.view.Menu; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.compose.ComposeCryptoStatus.AttachErrorState; -import com.fsck.k9.activity.compose.ComposeCryptoStatus.ComposeCryptoStatusBuilder; -import com.fsck.k9.activity.compose.ComposeCryptoStatus.SendErrorState; -import com.fsck.k9.activity.compose.RecipientMvpView.CryptoStatusDisplayType; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.helper.MailTo; -import com.fsck.k9.helper.ReplyToParser; -import com.fsck.k9.helper.ReplyToParser.ReplyToAddresses; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.message.AutocryptStatusInteractor; -import com.fsck.k9.message.AutocryptStatusInteractor.RecipientAutocryptStatus; -import com.fsck.k9.message.ComposePgpEnableByDefaultDecider; -import com.fsck.k9.message.ComposePgpInlineDecider; -import com.fsck.k9.message.MessageBuilder; -import com.fsck.k9.message.PgpMessageBuilder; -import com.fsck.k9.view.RecipientSelectView.Recipient; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.compose.ComposeCryptoStatus.AttachErrorState; +import foundation.e.mail.activity.compose.ComposeCryptoStatus.ComposeCryptoStatusBuilder; +import foundation.e.mail.activity.compose.ComposeCryptoStatus.SendErrorState; +import foundation.e.mail.activity.compose.RecipientMvpView.CryptoStatusDisplayType; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.helper.MailTo; +import foundation.e.mail.helper.ReplyToParser; +import foundation.e.mail.helper.ReplyToParser.ReplyToAddresses; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.message.AutocryptStatusInteractor; +import foundation.e.mail.message.AutocryptStatusInteractor.RecipientAutocryptStatus; +import foundation.e.mail.message.ComposePgpEnableByDefaultDecider; +import foundation.e.mail.message.ComposePgpInlineDecider; +import foundation.e.mail.message.MessageBuilder; +import foundation.e.mail.message.PgpMessageBuilder; +import foundation.e.mail.view.RecipientSelectView.Recipient; import org.openintents.openpgp.IOpenPgpService2; import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.util.OpenPgpApi; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/compose/SaveMessageTask.java b/k9mail/src/main/java/foundation/e/mail/activity/compose/SaveMessageTask.java similarity index 82% rename from k9mail/src/main/java/com/fsck/k9/activity/compose/SaveMessageTask.java rename to k9mail/src/main/java/foundation/e/mail/activity/compose/SaveMessageTask.java index 1b07c2eb926414d54180439cf9025dbbff0d8c9d..3cbf43fa5ff89c210aef45ba74785458464e6c42 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/compose/SaveMessageTask.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/compose/SaveMessageTask.java @@ -1,14 +1,14 @@ -package com.fsck.k9.activity.compose; +package foundation.e.mail.activity.compose; import android.content.Context; import android.os.AsyncTask; import android.os.Handler; -import com.fsck.k9.Account; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.mail.Message; +import foundation.e.mail.Account; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.mail.Message; public class SaveMessageTask extends AsyncTask { Context context; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentContentLoader.java b/k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentContentLoader.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentContentLoader.java rename to k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentContentLoader.java index 9f180e51dd8141ce349b1cc22b0ac9700c47d66e..608df86b4d42e327cd212dff645ce8cb8376a7cb 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentContentLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentContentLoader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.loader; +package foundation.e.mail.activity.loader; import java.io.File; import java.io.FileOutputStream; @@ -9,9 +9,9 @@ import android.content.AsyncTaskLoader; import android.content.Context; import timber.log.Timber; -import com.fsck.k9.activity.misc.Attachment; +import foundation.e.mail.activity.misc.Attachment; -import com.fsck.k9.activity.misc.Attachment.LoadingState; +import foundation.e.mail.activity.misc.Attachment.LoadingState; import de.cketti.safecontentresolver.SafeContentResolver; import de.cketti.safecontentresolver.SafeContentResolverCompat; import org.apache.commons.io.IOUtils; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentInfoLoader.java b/k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentInfoLoader.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentInfoLoader.java rename to k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentInfoLoader.java index d21ad4e0acf8860ebe8ed18039d0af5b7f478b63..a0d17dbe76cb5d09032e061ffe6de5656b53d852 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/loader/AttachmentInfoLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/loader/AttachmentInfoLoader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.loader; +package foundation.e.mail.activity.loader; import java.io.File; @@ -10,9 +10,9 @@ import android.net.Uri; import android.provider.OpenableColumns; import timber.log.Timber; -import com.fsck.k9.activity.misc.Attachment; -import com.fsck.k9.activity.misc.Attachment.LoadingState; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.activity.misc.Attachment; +import foundation.e.mail.activity.misc.Attachment.LoadingState; +import foundation.e.mail.mail.internet.MimeUtility; /** * Loader to fetch metadata of an attachment. diff --git a/k9mail/src/main/java/com/fsck/k9/activity/misc/Attachment.java b/k9mail/src/main/java/foundation/e/mail/activity/misc/Attachment.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/misc/Attachment.java rename to k9mail/src/main/java/foundation/e/mail/activity/misc/Attachment.java index 025d59469b12607a55d9f8f63546c8b864ef9808..8806a749be7d6b97eba8a00d6cec8dda02db4eac 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/misc/Attachment.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/misc/Attachment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.misc; +package foundation.e.mail.activity.misc; import android.net.Uri; import android.os.Parcel; @@ -7,7 +7,7 @@ import android.os.Parcelable; /** * Container class for information about an attachment. * - * This is used by {@link com.fsck.k9.activity.MessageCompose} to fetch and manage attachments. + * This is used by {@link foundation.e.mail.activity.MessageCompose} to fetch and manage attachments. */ public class Attachment implements Parcelable { /** diff --git a/k9mail/src/main/java/com/fsck/k9/activity/misc/ContactPictureLoader.java b/k9mail/src/main/java/foundation/e/mail/activity/misc/ContactPictureLoader.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/activity/misc/ContactPictureLoader.java rename to k9mail/src/main/java/foundation/e/mail/activity/misc/ContactPictureLoader.java index 53494e78b4a597f03dabadd0324e823c8fc9032e..f03fb93bcce8fba8d142d68977c8757cffa28b20 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/misc/ContactPictureLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/misc/ContactPictureLoader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.misc; +package foundation.e.mail.activity.misc; import java.io.IOException; @@ -34,9 +34,9 @@ import com.bumptech.glide.load.resource.file.FileToStreamDecoder; import com.bumptech.glide.load.resource.transcode.BitmapToGlideDrawableTranscoder; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.mail.Address; -import com.fsck.k9.view.RecipientSelectView.Recipient; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.mail.Address; +import foundation.e.mail.view.RecipientSelectView.Recipient; public class ContactPictureLoader { diff --git a/k9mail/src/main/java/com/fsck/k9/activity/misc/ExtendedAsyncTask.java b/k9mail/src/main/java/foundation/e/mail/activity/misc/ExtendedAsyncTask.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/activity/misc/ExtendedAsyncTask.java rename to k9mail/src/main/java/foundation/e/mail/activity/misc/ExtendedAsyncTask.java index f8bef574118f73b9538f39c2f43ffe430ebe5b3e..4877b5e0dbd8f01ed2db19fa382e0c153d06a373 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/misc/ExtendedAsyncTask.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/misc/ExtendedAsyncTask.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.misc; +package foundation.e.mail.activity.misc; import android.app.Activity; import android.app.ProgressDialog; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/misc/NonConfigurationInstance.java b/k9mail/src/main/java/foundation/e/mail/activity/misc/NonConfigurationInstance.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/misc/NonConfigurationInstance.java rename to k9mail/src/main/java/foundation/e/mail/activity/misc/NonConfigurationInstance.java index d9f314581e4ffb81569673ddcc75779dfabc60a9..ee8f2cfd53caf0433e977b097f35aaf2674d6472 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/misc/NonConfigurationInstance.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/misc/NonConfigurationInstance.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.misc; +package foundation.e.mail.activity.misc; import android.app.Activity; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/misc/SwipeGestureDetector.java b/k9mail/src/main/java/foundation/e/mail/activity/misc/SwipeGestureDetector.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/activity/misc/SwipeGestureDetector.java rename to k9mail/src/main/java/foundation/e/mail/activity/misc/SwipeGestureDetector.java index db77ee5d9254337cb23d7d31604870c0a0e85aff..46bcd2b9087b053791d226597c6b3f540e5ab9a2 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/misc/SwipeGestureDetector.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/misc/SwipeGestureDetector.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.misc; +package foundation.e.mail.activity.misc; import android.content.Context; import android.view.MotionEvent; diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountConfigImpl.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountConfigImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..9ad0c1c2bce449ad408acd031756e2a07f7fd563 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountConfigImpl.java @@ -0,0 +1,530 @@ +package foundation.e.mail.activity.setup; + + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; + +import foundation.e.mail.Account; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.Globals; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.AccountConfig; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.TransportUris; +import foundation.e.mail.mail.ssl.LocalKeyStore; +import foundation.e.mail.mail.store.RemoteStore; +import timber.log.Timber; + + +class AccountConfigImpl implements AccountConfig, Parcelable { + private String name; + private String description; + private String email; + + private String storeUri; + private String transportUri; + + private String inboxFolderName = Account.INBOX; + private String outboxFolderName = Account.OUTBOX; + private String draftsFolderName; + private String sentFolderName; + private String trashFolderName; + private String archiveFolderName; + private String spamFolderName; + private String autoExpandFolderName = Account.INBOX; + + private int maximumAutoDownloadMessageSize = 1048576; + private boolean subscribedFoldersOnly = false; + + private Map compressionMap = new HashMap<>(); + + private boolean allowRemoteSearch = false; + private boolean remoteSearchFullText = false; + private boolean pushPollOnConnect = true; + + private int displayCount = K9.DEFAULT_VISIBLE_LIMIT; + private int idleRefreshMinutes = 24; + + private ConnectionSecurity incomingSecurityType; + private AuthType incomingAuthType; + private String incomingPort; + + private ConnectionSecurity outgoingSecurityType; + private AuthType outgoingAuthType; + private String outgoingPort; + + private boolean notifyNewMail = true; + private boolean showOngoing; + private int automaticCheckIntervalMinutes = 5; + private Account.FolderMode folderPushMode = FolderMode.FIRST_CLASS; + + private DeletePolicy deletePolicy = DeletePolicy.ON_DELETE; + + private Preferences preferences; + + AccountConfigImpl(Preferences preferences) { + this.preferences = preferences; + } + + @Override + public String getStoreUri() { + return storeUri; + } + + @Override + public String getTransportUri() { + return transportUri; + } + + @Override + public boolean subscribedFoldersOnly() { + return subscribedFoldersOnly; + } + + @Override + public boolean useCompression(NetworkType type) { + Boolean useCompression = compressionMap.get(type); + if (useCompression == null) { + return true; + } + + return useCompression; + } + + @Override + public void setCompression(NetworkType networkType, boolean useCompression) { + compressionMap.put(networkType, useCompression); + } + + @Override + public String getInboxFolderName() { + return inboxFolderName; + } + + @Override + public String getOutboxFolderName() { + return outboxFolderName; + } + + @Override + public String getDraftsFolderName() { + return draftsFolderName; + } + + @Override + public String getArchiveFolderName() { + return archiveFolderName; + } + + @Override + public String getTrashFolderName() { + return trashFolderName; + } + + @Override + public String getSpamFolderName() { + return spamFolderName; + } + + @Override + public String getSentFolderName() { + return sentFolderName; + } + + @Override + public String getAutoExpandFolderName() { + return autoExpandFolderName; + } + + @Override + public void setArchiveFolderName(String name) { + archiveFolderName = name; + } + + @Override + public void setDraftsFolderName(String name) { + draftsFolderName = name; + } + + @Override + public void setTrashFolderName(String name) { + trashFolderName = name; + } + + @Override + public void setSpamFolderName(String name) { + spamFolderName = name; + } + + @Override + public void setSentFolderName(String name) { + sentFolderName = name; + } + + @Override + public void setAutoExpandFolderName(String name) { + autoExpandFolderName = name; + } + + @Override + public void setInboxFolderName(String name) { + inboxFolderName = name; + } + + @Override + public int getMaximumAutoDownloadMessageSize() { + return maximumAutoDownloadMessageSize; + } + + @Override + public boolean allowRemoteSearch() { + return allowRemoteSearch; + } + + @Override + public boolean isRemoteSearchFullText() { + return remoteSearchFullText; + } + + @Override + public boolean isPushPollOnConnect() { + return pushPollOnConnect; + } + + @Override + public ConnectionSecurity getIncomingSecurityType() { + return incomingSecurityType; + } + + @Override + public AuthType getIncomingAuthType() { + return incomingAuthType; + } + + @Override + public String getIncomingPort() { + return incomingPort; + } + + @Override + public ConnectionSecurity getOutgoingSecurityType() { + return outgoingSecurityType; + } + + @Override + public AuthType getOutgoingAuthType() { + return outgoingAuthType; + } + + @Override + public String getOutgoingPort() { + return outgoingPort; + } + + @Override + public boolean isNotifyNewMail() { + return notifyNewMail; + } + + @Override + public boolean isShowOngoing() { + return showOngoing; + } + + @Override + public int getAutomaticCheckIntervalMinutes() { + return automaticCheckIntervalMinutes; + } + + @Override + public int getDisplayCount() { + return displayCount; + } + + @Override + public int getIdleRefreshMinutes() { + return idleRefreshMinutes; + } + + @Override + public FolderMode getFolderPushMode() { + return folderPushMode; + } + + @Override + public String getName() { + return name; + } + + @Override + public DeletePolicy getDeletePolicy() { + return deletePolicy; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public void setDescription(String description) { + this.description = description; + } + + @Override + public void setDeletePolicy(DeletePolicy deletePolicy) { + this.deletePolicy = deletePolicy; + } + + @Override + public void setEmail(String email) { + this.email = email; + } + + @Override + public void setStoreUri(String storeUri) { + this.storeUri = storeUri; + } + + @Override + public void setTransportUri(String transportUri) { + this.transportUri = transportUri; + } + + @Override + public Store getRemoteStore() throws MessagingException { + return RemoteStore.getInstance(K9.app, this, Globals.getOAuth2TokenProvider()); + } + + @Override + public void init(String email, String password) { + this.name = getOwnerName(); + this.email = email; + + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + + // set default uris + // NOTE: they will be changed again in AccountSetupAccountType! + ServerSettings storeServer = new ServerSettings(ServerSettings.Type.IMAP, "mail." + domain, -1, + ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, user, password, null); + ServerSettings transportServer = new ServerSettings(ServerSettings.Type.SMTP, "mail." + domain, -1, + ConnectionSecurity.SSL_TLS_REQUIRED, AuthType.PLAIN, user, password, null); + String storeUri = RemoteStore.createStoreUri(storeServer); + String transportUri = TransportUris.createTransportUri(transportServer); + + this.storeUri = storeUri; + this.transportUri = transportUri; + + setupFolderNames(domain); + } + + private void setupFolderNames(String domain) { + setDraftsFolderName(K9.getK9String(R.string.special_mailbox_name_drafts)); + setTrashFolderName(K9.getK9String(R.string.special_mailbox_name_trash)); + setSentFolderName(K9.getK9String(R.string.special_mailbox_name_sent)); + setArchiveFolderName(K9.getK9String(R.string.special_mailbox_name_archive)); + + // Yahoo! has a special folder for Spam, called "Bulk Mail". + if (domain.endsWith(".yahoo.com")) { + setSpamFolderName("Bulk Mail"); + } else { + setSpamFolderName(K9.getK9String(R.string.special_mailbox_name_spam)); + } + } + + @Override + public String getEmail() { + return email; + } + + @Override + public void addCertificate(CheckDirection direction, X509Certificate certificate) throws CertificateException { + Uri uri; + if (direction == CheckDirection.INCOMING) { + uri = Uri.parse(getStoreUri()); + } else { + uri = Uri.parse(getTransportUri()); + } + LocalKeyStore localKeyStore = LocalKeyStore.getInstance(); + localKeyStore.addCertificate(uri.getHost(), uri.getPort(), certificate); + } + + @Override + public void setSubscribedFoldersOnly(boolean subscribedFoldersOnly) { + this.subscribedFoldersOnly = subscribedFoldersOnly; + } + + @Override + public void deleteCertificate(String newHost, int newPort, CheckDirection direction) { + Uri uri; + if (direction == CheckDirection.INCOMING) { + uri = Uri.parse(getStoreUri()); + } else { + uri = Uri.parse(getTransportUri()); + } + String oldHost = uri.getHost(); + int oldPort = uri.getPort(); + if (oldPort == -1) { + // This occurs when a new account is created + return; + } + if (!newHost.equals(oldHost) || newPort != oldPort) { + LocalKeyStore localKeyStore = LocalKeyStore.getInstance(); + localKeyStore.deleteCertificate(oldHost, oldPort); + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeString(this.description); + dest.writeString(this.email); + dest.writeString(this.storeUri); + dest.writeString(this.transportUri); + dest.writeString(this.inboxFolderName); + dest.writeString(this.outboxFolderName); + dest.writeString(this.draftsFolderName); + dest.writeString(this.sentFolderName); + dest.writeString(this.trashFolderName); + dest.writeString(this.archiveFolderName); + dest.writeString(this.spamFolderName); + dest.writeString(this.autoExpandFolderName); + dest.writeInt(this.maximumAutoDownloadMessageSize); + dest.writeByte(this.subscribedFoldersOnly ? (byte) 1 : (byte) 0); + dest.writeInt(this.compressionMap.size()); + for (Entry entry : this.compressionMap.entrySet()) { + dest.writeInt(entry.getKey() == null ? -1 : entry.getKey().ordinal()); + dest.writeValue(entry.getValue()); + } + dest.writeByte(this.allowRemoteSearch ? (byte) 1 : (byte) 0); + dest.writeByte(this.remoteSearchFullText ? (byte) 1 : (byte) 0); + dest.writeByte(this.pushPollOnConnect ? (byte) 1 : (byte) 0); + dest.writeInt(this.displayCount); + dest.writeInt(this.idleRefreshMinutes); + dest.writeInt(this.incomingSecurityType == null ? -1 : this.incomingSecurityType.ordinal()); + dest.writeInt(this.incomingAuthType == null ? -1 : this.incomingAuthType.ordinal()); + dest.writeString(this.incomingPort); + dest.writeInt(this.outgoingSecurityType == null ? -1 : this.outgoingSecurityType.ordinal()); + dest.writeInt(this.outgoingAuthType == null ? -1 : this.outgoingAuthType.ordinal()); + dest.writeString(this.outgoingPort); + dest.writeByte(this.notifyNewMail ? (byte) 1 : (byte) 0); + dest.writeByte(this.showOngoing ? (byte) 1 : (byte) 0); + dest.writeInt(this.automaticCheckIntervalMinutes); + dest.writeInt(this.folderPushMode == null ? -1 : this.folderPushMode.ordinal()); + dest.writeInt(this.deletePolicy == null ? -1 : this.deletePolicy.ordinal()); + } + + protected AccountConfigImpl(Parcel in) { + this.name = in.readString(); + this.description = in.readString(); + this.email = in.readString(); + this.storeUri = in.readString(); + this.transportUri = in.readString(); + this.inboxFolderName = in.readString(); + this.outboxFolderName = in.readString(); + this.draftsFolderName = in.readString(); + this.sentFolderName = in.readString(); + this.trashFolderName = in.readString(); + this.archiveFolderName = in.readString(); + this.spamFolderName = in.readString(); + this.autoExpandFolderName = in.readString(); + this.maximumAutoDownloadMessageSize = in.readInt(); + this.subscribedFoldersOnly = in.readByte() != 0; + int compressionMapSize = in.readInt(); + this.compressionMap = new HashMap(compressionMapSize); + for (int i = 0; i < compressionMapSize; i++) { + int tmpKey = in.readInt(); + NetworkType key = tmpKey == -1 ? null : NetworkType.values()[tmpKey]; + Boolean value = (Boolean) in.readValue(Boolean.class.getClassLoader()); + this.compressionMap.put(key, value); + } + this.allowRemoteSearch = in.readByte() != 0; + this.remoteSearchFullText = in.readByte() != 0; + this.pushPollOnConnect = in.readByte() != 0; + this.displayCount = in.readInt(); + this.idleRefreshMinutes = in.readInt(); + int tmpIncomingSecurityType = in.readInt(); + this.incomingSecurityType = + tmpIncomingSecurityType == -1 ? null : ConnectionSecurity.values()[tmpIncomingSecurityType]; + int tmpIncomingAuthType = in.readInt(); + this.incomingAuthType = tmpIncomingAuthType == -1 ? null : AuthType.values()[tmpIncomingAuthType]; + this.incomingPort = in.readString(); + int tmpOutgoingSecurityType = in.readInt(); + this.outgoingSecurityType = + tmpOutgoingSecurityType == -1 ? null : ConnectionSecurity.values()[tmpOutgoingSecurityType]; + int tmpOutgoingAuthType = in.readInt(); + this.outgoingAuthType = tmpOutgoingAuthType == -1 ? null : AuthType.values()[tmpOutgoingAuthType]; + this.outgoingPort = in.readString(); + this.notifyNewMail = in.readByte() != 0; + this.showOngoing = in.readByte() != 0; + this.automaticCheckIntervalMinutes = in.readInt(); + int tmpFolderPushMode = in.readInt(); + this.folderPushMode = tmpFolderPushMode == -1 ? null : FolderMode.values()[tmpFolderPushMode]; + int tmpDeletePolicy = in.readInt(); + this.deletePolicy = tmpDeletePolicy == -1 ? null : DeletePolicy.values()[tmpDeletePolicy]; + } + + public static final Creator CREATOR = new Creator() { + @Override + public AccountConfigImpl createFromParcel(Parcel source) { + return new AccountConfigImpl(source); + } + + @Override + public AccountConfigImpl[] newArray(int size) { + return new AccountConfigImpl[size]; + } + }; + + private String getOwnerName() { + String name = null; + try { + name = getDefaultAccountName(); + } catch (Exception e) { + Timber.e(e, "Could not get default account name"); + } + + if (name == null) { + name = ""; + } + return name; + } + + private String getDefaultAccountName() { + String name = null; + Account account = preferences.getDefaultAccount(); + if (account != null) { + name = account.getName(); + } + return name; + } +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSettings.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSettings.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSettings.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSettings.java index 84b603124771cbce65ec3206620d1ac23d3b16f9..8d97205404515da0e91e0984cbc64c879d1c47db 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSettings.java @@ -1,5 +1,5 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import java.util.Iterator; @@ -27,30 +27,30 @@ import android.widget.CompoundButton; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Account.DeletePolicy; -import com.fsck.k9.Account.Expunge; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.Account.MessageFormat; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.Account.Searchable; -import com.fsck.k9.Account.ShowPictures; -import com.fsck.k9.K9; -import com.fsck.k9.NotificationSetting; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.ChooseFolder; -import com.fsck.k9.activity.ChooseIdentity; -import com.fsck.k9.activity.ColorPickerDialog; -import com.fsck.k9.activity.K9PreferenceActivity; -import com.fsck.k9.activity.ManageIdentities; -import com.fsck.k9.crypto.OpenPgpApiHelper; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mailstore.StorageManager; -import com.fsck.k9.service.MailService; -import com.fsck.k9.ui.dialog.AutocryptPreferEncryptDialog; -import com.fsck.k9.ui.dialog.AutocryptPreferEncryptDialog.OnPreferEncryptChangedListener; +import foundation.e.mail.Account; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.Expunge; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.Account.MessageFormat; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.Account.Searchable; +import foundation.e.mail.Account.ShowPictures; +import foundation.e.mail.K9; +import foundation.e.mail.NotificationSetting; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.ChooseFolder; +import foundation.e.mail.activity.ChooseIdentity; +import foundation.e.mail.activity.ColorPickerDialog; +import foundation.e.mail.activity.K9PreferenceActivity; +import foundation.e.mail.activity.ManageIdentities; +import foundation.e.mail.crypto.OpenPgpApiHelper; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.service.MailService; +import foundation.e.mail.ui.dialog.AutocryptPreferEncryptDialog; +import foundation.e.mail.ui.dialog.AutocryptPreferEncryptDialog.OnPreferEncryptChangedListener; import org.openintents.openpgp.util.OpenPgpKeyPreference; import timber.log.Timber; @@ -903,11 +903,11 @@ public class AccountSettings extends K9PreferenceActivity { } private void onIncomingSettings() { - AccountSetupIncoming.actionEditIncomingSettings(this, account); + AccountSetupActivity.actionEditIncomingSettings(this, account); } private void onOutgoingSettings() { - AccountSetupOutgoing.actionEditOutgoingSettings(this, account); + AccountSetupActivity.actionEditOutgoingSettings(this, account); } public void onChooseChipColor() { diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupAccountType.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupAccountType.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupActivity.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..14b5025834a88fa7599adc5b5ddcce8a72ea885c --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupActivity.java @@ -0,0 +1,1369 @@ +package foundation.e.mail.activity.setup; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface.OnDismissListener; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; +import android.view.View; +import android.view.ViewGroup; + +import foundation.e.mail.BuildConfig; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.account.GmailWebViewClient; +import foundation.e.mail.account.OutlookWebViewClient; +import foundation.e.mail.activity.Accounts; +import foundation.e.mail.activity.setup.AccountSetupPresenter.Stage; +import foundation.e.mail.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; + +import android.support.annotation.StringRes; + +import foundation.e.mail.Account; + +import java.security.cert.X509Certificate; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; +import android.text.method.DigitsKeyListener; +import android.webkit.CookieManager; +import android.webkit.WebView; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; + +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.service.StorageGoneReceiver; +import foundation.e.mail.view.ClientCertificateSpinner; + +import me.zhanghai.android.materialprogressbar.MaterialProgressBar; +import timber.log.Timber; + +import android.view.View.OnClickListener; +import android.widget.*; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.CompoundButton.OnCheckedChangeListener; + +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.view.ClientCertificateSpinner.OnClientCertificateChangedListener; + +import static foundation.e.mail.mail.ServerSettings.Type.IMAP; +import static foundation.e.mail.mail.ServerSettings.Type.POP3; +import static foundation.e.mail.mail.ServerSettings.Type.WebDAV; + + +public class AccountSetupActivity extends AppCompatActivity implements AccountSetupContract.View, + ConfirmationDialogFragmentListener, OnClickListener, OnCheckedChangeListener { + + private static final String EXTRA_ACCOUNT = "account"; + private static final String EXTRA_STAGE = "stage"; + private static final String EXTRA_EDIT_SETTINGS = "edit_settings"; + private static final String EXTRA_MAKE_DEFAULT = "make_default"; + private static final String STATE_STAGE = "state_stage"; + private static final String STATE_ACCOUNT = "state_account"; + private static final String STAGE_CONFIG = "state_config"; + private static final String STATE_EDIT_SETTINGS = "state_edit_settings"; + private static final String STATE_MAKE_DEFAULT = "state_make_default"; + + private AccountSetupPresenter presenter; + + private TextView messageView; + + private EditText usernameView; + private EditText passwordView; + @SuppressWarnings("FieldCanBeLocal") + private Button manualSetupButton; + + private RadioGroup accountTypeRadioGroup; + + private ClientCertificateSpinner clientCertificateSpinner; + private TextView clientCertificateLabelView; + private TextInputLayout usernameViewLayout; + private TextInputLayout passwordViewLayout; + private TextInputLayout serverViewLayout; + private TextInputEditText serverView; + private TextInputEditText portView; + private TextView securityTypeLabelView; + private Spinner securityTypeView; + private Spinner authTypeView; + private CheckBox imapAutoDetectNamespaceView; + private TextInputLayout imapPathPrefixLayout; + private EditText imapPathPrefixView; + private EditText webdavPathPrefixView; + private EditText webdavAuthPathView; + private EditText webdavMailboxPathView; + private Button nextButton; + private ViewGroup requireLoginSettingsView; + private CheckBox compressionMobile; + private CheckBox compressionWifi; + private CheckBox compressionOther; + private CheckBox subscribedFoldersOnly; + private AuthTypeAdapter authTypeAdapter; + private CoordinatorLayout coordinatorLayout; + + @SuppressWarnings("FieldCanBeLocal") + private MaterialProgressBar progressBar; + + private CheckBox requireLoginView; + + private Spinner displayCountView; + + private EditText description; + private EditText name; + @SuppressWarnings("FieldCanBeLocal") + private Button doneButton; + + private ViewFlipper flipper; + + Dialog authDialog; + + @SuppressWarnings({"FieldCanBeLocal", "unused"}) + private int position; + + int[] layoutIds = new int[]{R.layout.account_setup_basics, + R.layout.account_setup_check_settings, R.layout.account_setup_account_type, + R.layout.account_setup_incoming, R.layout.account_setup_outgoing, + R.layout.account_setup_options, R.layout.account_setup_names}; + private EditText emailView; + + boolean editSettings; + + Stage stage; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.account_setup); + + flipper = (ViewFlipper) findViewById(R.id.view_flipper); + flipper.setInAnimation(this, R.anim.fade_in); + flipper.setOutAnimation(this, R.anim.fade_out); + + Preferences preferences = Preferences.getPreferences(this); + presenter = new AccountSetupPresenter(this, preferences, this); + + Intent intent = getIntent(); + + stage = (Stage) intent.getSerializableExtra(EXTRA_STAGE); + String accountUuid = intent.getStringExtra(EXTRA_ACCOUNT); + editSettings = intent.getBooleanExtra(EXTRA_EDIT_SETTINGS, false); + boolean makeDefault = intent.getBooleanExtra(EXTRA_MAKE_DEFAULT, false); + + if (savedInstanceState != null) { + stage = (Stage) savedInstanceState.getSerializable(STATE_STAGE); + editSettings = savedInstanceState.getBoolean(STATE_EDIT_SETTINGS, editSettings); + + accountUuid = savedInstanceState.getString(STATE_ACCOUNT, accountUuid); + + AccountConfigImpl accountConfig = savedInstanceState.getParcelable(STAGE_CONFIG); + presenter.onGetAccountConfig(accountConfig); + + makeDefault = savedInstanceState.getBoolean(STATE_MAKE_DEFAULT, makeDefault); + presenter.onGetMakeDefault(makeDefault); + } else { + presenter.onGetAccountUuid(accountUuid); + } + + if (stage == null) { + stage = Stage.BASICS; + } + + switch (stage) { + case BASICS: + case AUTOCONFIGURATION: + case AUTOCONFIGURATION_INCOMING_CHECKING: + case AUTOCONFIGURATION_OUTGOING_CHECKING: + goToBasics(); + break; + case ACCOUNT_TYPE: + goToAccountType(); + break; + case INCOMING: + case INCOMING_CHECKING: + goToIncoming(); + break; + case OUTGOING: + case OUTGOING_CHECKING: + goToOutgoing(); + break; + case ACCOUNT_NAMES: + goToAccountNames(); + break; + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putSerializable(STATE_STAGE, stage); + final boolean editSettings = presenter.isEditSettings(); + outState.putBoolean(STATE_EDIT_SETTINGS, editSettings); + if (editSettings) { + outState.putString(STATE_ACCOUNT, presenter.getAccount().getUuid()); + } else { + outState.putParcelable(STAGE_CONFIG, (AccountConfigImpl) presenter.getAccountConfig()); + } + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + presenter.onRestoreStart(); + super.onRestoreInstanceState(savedInstanceState); + presenter.onRestoreEnd(); + } + + private void basicsStart() { + coordinatorLayout = (CoordinatorLayout) findViewById(R.id.basics_coordinator_layout); + emailView = (EditText) findViewById(R.id.account_email); + passwordViewLayout = (TextInputLayout) findViewById(R.id.password_input_layout); + passwordView = (EditText) findViewById(R.id.account_password); + manualSetupButton = (Button) findViewById(R.id.manual_setup); + nextButton = (Button) findViewById(R.id.basics_next); + nextButton.setOnClickListener(this); + manualSetupButton.setOnClickListener(this); + + initializeViewListenersInBasics(); + + presenter.onBasicsStart(); + onInputChangedInBasics(); + } + + private void onInputChangedInBasics() { + if (presenter == null) return; + + presenter.onInputChangedInBasics(emailView.getText().toString(), passwordView.getText().toString()); + } + + private TextWatcher validationTextWatcherInBasics = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + presenter.onInputChangedInBasics(emailView.getText().toString(), passwordView.getText().toString()); + } + }; + + private void initializeViewListenersInBasics() { + emailView.addTextChangedListener(validationTextWatcherInBasics); + passwordView.addTextChangedListener(validationTextWatcherInBasics); + } + + @Override + public void setPasswordInBasicsEnabled(boolean enabled) { + passwordViewLayout.setEnabled(enabled); + } + + @Override + public void setPasswordHintInBasics(String hint) { + passwordViewLayout.setHint(hint); + } + + @Override + public void setManualSetupButtonInBasicsVisibility(int visibility) { + manualSetupButton.setVisibility(visibility); + } + + private void checkingStart() { + messageView = (TextView) findViewById(R.id.message); + progressBar = (MaterialProgressBar) findViewById(R.id.progress); + + progressBar.setIndeterminate(true); + } + + private void accountTypeStart() { + accountTypeRadioGroup = (RadioGroup) findViewById(R.id.account_type_radio_group); + + findViewById(R.id.account_type_next).setOnClickListener(this); + + presenter.onAccountTypeStart(); + } + + private int getPositionFromLayoutId(@LayoutRes int layoutId) { + for (int i = 0; i < layoutIds.length; i++) { + if (layoutIds[i] == layoutId) { + return i; + } + } + return -1; + } + + private static long mLastClickTime = 0; + + private static boolean isActionValid() { + long now = System.currentTimeMillis(); + boolean valid = (now - mLastClickTime > 1000); + mLastClickTime = now; + return valid; + } + + public static void actionNewAccount(Context context) { + if (isActionValid()) { + Intent i = new Intent(context, AccountSetupActivity.class); + context.startActivity(i); + } + } + + public void goToBasics() { + stage = Stage.BASICS; + setSelection(getPositionFromLayoutId(R.layout.account_setup_basics)); + basicsStart(); + } + + + public void goToOutgoing() { + stage = Stage.OUTGOING; + setSelection(getPositionFromLayoutId(R.layout.account_setup_outgoing)); + outgoingStart(); + } + + + @Override + public void goToIncoming() { + stage = Stage.INCOMING; + setSelection(getPositionFromLayoutId(R.layout.account_setup_incoming)); + incomingStart(); + } + + + @Override + public void goToAutoConfiguration() { + stage = Stage.AUTOCONFIGURATION; + setSelection(getPositionFromLayoutId(R.layout.account_setup_check_settings)); + checkingStart(); + presenter.onCheckingStart(Stage.AUTOCONFIGURATION); + } + + + @Override + public void goToAccountType() { + stage = Stage.ACCOUNT_TYPE; + setSelection(getPositionFromLayoutId(R.layout.account_setup_account_type)); + accountTypeStart(); + } + + @Override + public void goToAccountNames() { + stage = Stage.ACCOUNT_NAMES; + setSelection(getPositionFromLayoutId(R.layout.account_setup_names)); + namesStart(); + } + + @Override + public void goToOutgoingChecking() { + stage = Stage.OUTGOING_CHECKING; + setSelection(getPositionFromLayoutId(R.layout.account_setup_check_settings)); + checkingStart(); + presenter.onCheckingStart(stage); + } + + @Override + public void end() { + finish(); + } + + @Override + public void goToIncomingChecking() { + stage = Stage.INCOMING_CHECKING; + setSelection(getPositionFromLayoutId(R.layout.account_setup_check_settings)); + checkingStart(); + presenter.onCheckingStart(stage); + } + + public void listAccounts() { + Accounts.listAccounts(this); + } + + private void setSelection(int position) { + if (position == -1) return; + + this.position = position; + flipper.setDisplayedChild(position); + + } + + + @Override + public void showAcceptKeyDialog(final int msgResId, final String exMessage, final String message, + final X509Certificate certificate) { + + // TODO: refactor with DialogFragment. + // This is difficult because we need to pass through chain[0] for onClick() + new AlertDialog.Builder(AccountSetupActivity.this) + .setTitle(getString(R.string.account_setup_failed_dlg_invalid_certificate_title)) + .setMessage(getString(msgResId, exMessage) + + " " + message + ) + .setCancelable(true) + .setPositiveButton( + getString(R.string.account_setup_failed_dlg_invalid_certificate_accept), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + presenter.onCertificateAccepted(certificate); + } + }) + .setNegativeButton( + getString(R.string.account_setup_failed_dlg_invalid_certificate_reject), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + presenter.onCertificateRefused(); + } + }) + .show(); + } + + @Override + public void showErrorDialog(@StringRes final int msgResId, final Object... args) { + // TODO: 8/13/17 add a "detail" button and show exception details here + Snackbar.make(coordinatorLayout, getString(msgResId, args), Snackbar.LENGTH_LONG).show(); + } + + @Override + public void showErrorDialog(String errorMessage) { + Snackbar.make(coordinatorLayout, errorMessage, Snackbar.LENGTH_LONG).show(); + } + + @Override + public void setMessage(@StringRes int id) { + messageView.setText(getString(id)); + } + + @Override + public Context getContext() { + return this; + } + + @Override + public void doPositiveClick(int dialogId) { + presenter.onPositiveClickedInConfirmationDialog(); + } + + @Override + public void doNegativeClick(int dialogId) { + presenter.onNegativeClickedInConfirmationDialog(); + } + + @Override + public void dialogCancelled(int dialogId) { + + } + + // ------ + + private void initializeViewListenersInIncoming() { + securityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, + long id) { + + onInputChangedInIncoming(); + + } + + @Override + public void onNothingSelected(AdapterView parent) { /* unused */ } + }); + + authTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, + long id) { + + onInputChangedInIncoming(); + } + + @Override + public void onNothingSelected(AdapterView parent) { /* unused */ } + }); + + clientCertificateSpinner.setOnClientCertificateChangedListener(clientCertificateChangedListenerInIncoming); + usernameView.addTextChangedListener(validationTextWatcherInIncoming); + passwordView.addTextChangedListener(validationTextWatcherInIncoming); + serverView.addTextChangedListener(validationTextWatcherInIncoming); + portView.addTextChangedListener(validationTextWatcherInIncoming); + } + + private void onInputChangedInIncoming() { + if (presenter == null) return; + + final AuthType selectedAuthType = getSelectedAuthType(); + final ConnectionSecurity selectedSecurity = getSelectedSecurity(); + if (selectedAuthType == null || selectedSecurity == null) return; + + presenter.onInputChangedInIncoming(clientCertificateSpinner.getAlias(), + serverView.getText().toString(), + portView.getText().toString(), usernameView.getText().toString(), + passwordView.getText().toString(), selectedAuthType, selectedSecurity); + + } + + + protected void onNextInIncoming() { + try { + ConnectionSecurity connectionSecurity = getSelectedSecurity(); + + String username = usernameView.getText().toString(); + String password = passwordView.getText().toString(); + String clientCertificateAlias = clientCertificateSpinner.getAlias(); + boolean autoDetectNamespace = imapAutoDetectNamespaceView.isChecked(); + String imapPathPrefix = imapPathPrefixView.getText().toString(); + String webdavPathPrefix = webdavPathPrefixView.getText().toString(); + String webdavAuthPath = webdavAuthPathView.getText().toString(); + String webdavMailboxPath = webdavMailboxPathView.getText().toString(); + + AuthType authType = getSelectedAuthType(); + + String host = serverView.getText().toString(); + int port = Integer.parseInt(portView.getText().toString()); + + boolean compressMobile = compressionMobile.isChecked(); + boolean compressWifi = compressionWifi.isChecked(); + boolean compressOther = compressionOther.isChecked(); + boolean subscribeFoldersOnly = subscribedFoldersOnly.isChecked(); + + presenter.onNextInIncomingClicked(username, password, clientCertificateAlias, autoDetectNamespace, + imapPathPrefix, webdavPathPrefix, webdavAuthPath, webdavMailboxPath, host, port, + connectionSecurity, authType, compressMobile, compressWifi, compressOther, + subscribeFoldersOnly); + + } catch (Exception e) { + failure(e); + } + } + + public void onClick(View v) { + try { + switch (v.getId()) { + case R.id.basics_next: + presenter.onNextButtonInBasicViewClicked(emailView.getText().toString(), + passwordView.getText().toString()); + break; + case R.id.account_type_next: + Type serverType; + switch (accountTypeRadioGroup.getCheckedRadioButtonId()) { + case R.id.imap: + serverType = IMAP; + break; + case R.id.pop: + serverType = POP3; + break; + case R.id.webdav: + serverType = WebDAV; + break; + default: + serverType = null; + break; + } + + presenter.onNextButtonInAccountTypeClicked(serverType); + break; + + case R.id.incoming_next: + onNextInIncoming(); + break; + case R.id.outgoing_next: + onNextInOutgoing(); + break; + case R.id.done: + presenter.onNextButtonInNamesClicked(name.getText().toString(), description.getText().toString()); + break; + case R.id.manual_setup: + presenter.onManualSetupButtonClicked(emailView.getText().toString(), + passwordView.getText().toString()); + break; + } + } catch (Exception e) { + failure(e); + } + } + + private void failure(Exception use) { + Timber.e(use, "Failure"); + String toastText = getString(R.string.account_setup_bad_uri, use.getMessage()); + + Toast toast = Toast.makeText(getApplication(), toastText, Toast.LENGTH_LONG); + toast.show(); + } + + + private TextWatcher validationTextWatcherInIncoming = new TextWatcher() { + public void afterTextChanged(Editable s) { + onInputChangedInIncoming(); + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + }; + + private OnClientCertificateChangedListener clientCertificateChangedListenerInIncoming = new OnClientCertificateChangedListener() { + @Override + public void onClientCertificateChanged(String alias) { + onInputChangedInIncoming(); + } + }; + + @Override + public void setAuthTypeInIncoming(AuthType authType) { + OnItemSelectedListener onItemSelectedListener = authTypeView.getOnItemSelectedListener(); + authTypeView.setOnItemSelectedListener(null); + int authTypePosition = + ((AuthTypeAdapter) authTypeView.getAdapter()).getAuthPosition(authType); + authTypeView.setSelection(authTypePosition, false); + authTypeView.setOnItemSelectedListener(onItemSelectedListener); + } + + @Override + public void setSecurityTypeInIncoming(ConnectionSecurity security) { + OnItemSelectedListener onItemSelectedListener = securityTypeView.getOnItemSelectedListener(); + securityTypeView.setOnItemSelectedListener(null); + int connectionSecurityPosition = ((ConnectionSecurityAdapter) + securityTypeView.getAdapter()).getConnectionSecurityPosition(security); + securityTypeView.setSelection(connectionSecurityPosition, false); + securityTypeView.setOnItemSelectedListener(onItemSelectedListener); + } + + @Override + public void setUsernameInIncoming(String username) { + usernameView.removeTextChangedListener(validationTextWatcherInIncoming); + usernameView.setText(username); + usernameView.addTextChangedListener(validationTextWatcherInIncoming); + } + + @Override + public void setPasswordInIncoming(String password) { + passwordView.removeTextChangedListener(validationTextWatcherInIncoming); + passwordView.setText(password); + passwordView.addTextChangedListener(validationTextWatcherInIncoming); + } + + @Override + public void setCertificateAliasInIncoming(String alias) { + clientCertificateSpinner.setOnClientCertificateChangedListener(null); + clientCertificateSpinner.setAlias(alias); + clientCertificateSpinner. + setOnClientCertificateChangedListener(clientCertificateChangedListenerInIncoming); + } + + @Override + public void setServerInIncoming(String server) { + serverView.removeTextChangedListener(validationTextWatcherInIncoming); + serverView.setText(server); + serverView.addTextChangedListener(validationTextWatcherInIncoming); + } + + @Override + public void setPortInIncoming(String port) { + portView.removeTextChangedListener(validationTextWatcherInIncoming); + portView.setText(port); + portView.addTextChangedListener(validationTextWatcherInIncoming); + } + + @Override + public void setServerLabel(String label) { + serverViewLayout.setHint(label); + } + + @Override + public void hideViewsWhenPop3() { + findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE); + findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); + findViewById(R.id.webdav_mailbox_alias_section).setVisibility(View.GONE); + findViewById(R.id.webdav_owa_path_section).setVisibility(View.GONE); + findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE); + findViewById(R.id.compression_section).setVisibility(View.GONE); + findViewById(R.id.compression_label).setVisibility(View.GONE); + subscribedFoldersOnly.setVisibility(View.GONE); + } + + @Override + public void hideViewsWhenImap() { + findViewById(R.id.webdav_advanced_header).setVisibility(View.GONE); + findViewById(R.id.webdav_mailbox_alias_section).setVisibility(View.GONE); + findViewById(R.id.webdav_owa_path_section).setVisibility(View.GONE); + findViewById(R.id.webdav_auth_path_section).setVisibility(View.GONE); + } + + @Override + public void hideViewsWhenImapAndNotEdit() { + findViewById(R.id.imap_folder_setup_section).setVisibility(View.GONE); + } + + @Override + public void hideViewsWhenWebDav() { + findViewById(R.id.imap_path_prefix_section).setVisibility(View.GONE); + findViewById(R.id.incoming_account_auth_type_label).setVisibility(View.GONE); + findViewById(R.id.incoming_account_auth_type).setVisibility(View.GONE); + findViewById(R.id.compression_section).setVisibility(View.GONE); + findViewById(R.id.compression_label).setVisibility(View.GONE); + subscribedFoldersOnly.setVisibility(View.GONE); + } + + @Override + public void setImapAutoDetectNamespace(boolean autoDetectNamespace) { + imapAutoDetectNamespaceView.setChecked(autoDetectNamespace); + } + + @Override + public void setImapPathPrefix(String imapPathPrefix) { + imapPathPrefixView.setText(imapPathPrefix); + } + + @Override + public void setWebDavPathPrefix(String webDavPathPrefix) { + webdavPathPrefixView.setText(webDavPathPrefix); + } + + @Override + public void setWebDavAuthPath(String authPath) { + webdavAuthPathView.setText(authPath); + } + + @Override + public void setWebDavMailboxPath(String mailboxPath) { + webdavMailboxPathView.setText(mailboxPath); + } + + + private void incomingStart() { + View incomingView = findViewById(R.id.account_setup_incoming); + coordinatorLayout = (CoordinatorLayout) findViewById(R.id.incoming_coordinator_layout); + usernameView = (EditText) incomingView.findViewById(R.id.incoming_account_username); + usernameViewLayout = (TextInputLayout) incomingView.findViewById(R.id.incoming_account_username_layout); + passwordView = (EditText) incomingView.findViewById(R.id.incoming_account_password); + clientCertificateSpinner = (ClientCertificateSpinner) incomingView.findViewById(R.id.incoming_account_client_certificate_spinner); + clientCertificateLabelView = (TextView) incomingView.findViewById(R.id.account_client_certificate_label); + passwordViewLayout = (TextInputLayout) incomingView.findViewById(R.id.incoming_account_password_layout); + serverViewLayout = (TextInputLayout) incomingView.findViewById(R.id.incoming_account_server_layout); + serverView = (TextInputEditText) incomingView.findViewById(R.id.incoming_account_server); + portView = (TextInputEditText) incomingView.findViewById(R.id.incoming_account_port); + securityTypeLabelView = (TextView) incomingView.findViewById(R.id.account_setup_incoming_security_label); + securityTypeView = (Spinner) incomingView.findViewById(R.id.incoming_account_security_type); + authTypeView = (Spinner) incomingView.findViewById(R.id.incoming_account_auth_type); + imapAutoDetectNamespaceView = (CheckBox) incomingView.findViewById(R.id.imap_autodetect_namespace); + imapPathPrefixLayout = (TextInputLayout) incomingView.findViewById(R.id.imap_path_prefix_layout); + imapPathPrefixView = (EditText) incomingView.findViewById(R.id.imap_path_prefix); + webdavPathPrefixView = (EditText) incomingView.findViewById(R.id.webdav_path_prefix); + webdavAuthPathView = (EditText) incomingView.findViewById(R.id.webdav_auth_path); + webdavMailboxPathView = (EditText) incomingView.findViewById(R.id.webdav_mailbox_path); + nextButton = (Button) incomingView.findViewById(R.id.incoming_next); + compressionMobile = (CheckBox) incomingView.findViewById(R.id.compression_mobile); + compressionWifi = (CheckBox) incomingView.findViewById(R.id.compression_wifi); + compressionOther = (CheckBox) incomingView.findViewById(R.id.compression_other); + subscribedFoldersOnly = (CheckBox) incomingView.findViewById(R.id.subscribed_folders_only); + + nextButton.setOnClickListener(this); + + imapAutoDetectNamespaceView.setOnCheckedChangeListener(new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked && imapPathPrefixView.hasFocus()) { + imapPathPrefixView.focusSearch(View.FOCUS_UP).requestFocus(); + } else if (!isChecked) { + imapPathPrefixView.requestFocus(); + } + imapPathPrefixLayout.setVisibility(isChecked ? View.GONE : View.VISIBLE); + } + }); + + authTypeAdapter = AuthTypeAdapter.get(this); + authTypeView.setAdapter(authTypeAdapter); + + portView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); + + initializeViewListenersInIncoming(); + + boolean editSettings = false; + if (getIntent().getAction() != null) { + editSettings = getIntent().getAction().equals(Intent.ACTION_EDIT); + } + presenter.onIncomingStart(editSettings); + } + + @Override + public void setImapPathPrefixSectionVisibility(int visibility) { + findViewById(R.id.imap_path_prefix_section).setVisibility(visibility); + } + + @Override + public void setCompressionSectionVisibility(int visibility) { + findViewById(R.id.compression_label).setVisibility(visibility); + findViewById(R.id.compression_section).setVisibility(visibility); + } + + @Override + public void setNextButtonInIncomingEnabled(boolean enabled) { + nextButton.setEnabled(enabled); + } + + @Override + public void goToIncomingSettings() { + goToIncoming(); + } + + @Override + public void setNextButtonInBasicsEnabled(boolean enabled) { + nextButton.setEnabled(enabled); + Utility.setCompoundDrawablesAlpha(nextButton, nextButton.isEnabled() ? 255 : 128); + } + + @Override + public void setSecurityChoices(ConnectionSecurity[] choices) { + // Note that connectionSecurityChoices is configured above based on server type + ConnectionSecurityAdapter securityTypesAdapter = + ConnectionSecurityAdapter.get(this, choices); + securityTypeView.setAdapter(securityTypesAdapter); + } + + @Override + public void setAuthTypeInsecureText(boolean insecure) { + authTypeAdapter.useInsecureText(insecure); + } + + @Override + public void setViewNotExternalInIncoming() { + passwordViewLayout.setVisibility(View.VISIBLE); + clientCertificateLabelView.setVisibility(View.GONE); + clientCertificateSpinner.setVisibility(View.GONE); + imapAutoDetectNamespaceView.setEnabled(true); + passwordViewLayout.setEnabled(true); + securityTypeView.setEnabled(true); + portView.setEnabled(true); + + passwordView.requestFocus(); + } + + @Override + public void setViewExternalInIncoming() { + passwordViewLayout.setVisibility(View.GONE); + clientCertificateLabelView.setVisibility(View.VISIBLE); + clientCertificateSpinner.setVisibility(View.VISIBLE); + imapAutoDetectNamespaceView.setEnabled(true); + passwordViewLayout.setEnabled(true); + securityTypeView.setEnabled(true); + portView.setEnabled(true); + + clientCertificateSpinner.chooseCertificate(); + } + + @Override + public void setViewOAuth2InIncoming() { + imapAutoDetectNamespaceView.setEnabled(false); + passwordViewLayout.setEnabled(false); + securityTypeView.setEnabled(false); + portView.setEnabled(false); + } + + @Override + public void showFailureToast(Exception use) { + failure(use); + } + + @Override + public void setCompressionMobile(boolean compressionMobileBoolean) { + compressionMobile.setChecked(compressionMobileBoolean); + } + + @Override + public void setCompressionWifi(boolean compressionWifiBoolean) { + compressionWifi.setChecked(compressionWifiBoolean); + } + + @Override + public void setCompressionOther(boolean compressionOtherBoolean) { + compressionOther.setChecked(compressionOtherBoolean); + } + + @Override + public void setSubscribedFoldersOnly(boolean subscribedFoldersOnlyBoolean) { + subscribedFoldersOnly.setChecked(subscribedFoldersOnlyBoolean); + } + + @Override + public void showInvalidSettingsToast() { + String toastText = getString(R.string.account_setup_outgoing_invalid_setting_combo_notice, + getString(R.string.account_setup_incoming_auth_type_label), + AuthType.EXTERNAL.toString(), + getString(R.string.account_setup_incoming_security_label), + ConnectionSecurity.NONE.toString()); + Toast.makeText(this, toastText, Toast.LENGTH_LONG).show(); + } + + @Override + public void showInvalidOAuthError() { + usernameViewLayout.setErrorEnabled(true); + usernameViewLayout.setError(getString(R.string.OAuth2_not_supported)); + } + + @Override + public void clearInvalidOAuthError() { + usernameViewLayout.setError(""); + } + + // names + + public void namesStart() { + doneButton = (Button) findViewById(R.id.done); + doneButton.setOnClickListener(this); + + description = (EditText) findViewById(R.id.account_description); + name = (EditText) findViewById(R.id.account_name); + name.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + onInputChangeInNames(); + } + }); + + presenter.onNamesStart(); + } + + @Override + public void setDoneButtonInNamesEnabled(boolean enabled) { + doneButton.setEnabled(enabled); + } + + private void onInputChangeInNames() { + presenter.onInputChangedInNames(name.getText().toString(), description.getText().toString()); + } + + @Override + public void goToListAccounts() { + listAccounts(); + } + + // outgoing + + /** + * Called at the end of either {@code onCreate()} or + * {@code onRestoreInstanceState()}, after the views have been initialized, + * so that the listeners are not triggered during the view initialization. + * This avoids needless calls to {@code onInputChangedInOutgoing()} which is called + * immediately after this is called. + */ + private void initializeViewListenersInOutgoing() { + + /* + * Updates the port when the user changes the security type. This allows + * us to show a reasonable default which the user can change. + */ + securityTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, + long id) { + + onInputChangedInOutgoing(); + } + + @Override + public void onNothingSelected(AdapterView parent) { /* unused */ } + }); + + authTypeView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, + long id) { + + onInputChangedInOutgoing(); + + } + + @Override + public void onNothingSelected(AdapterView parent) { /* unused */ } + }); + + requireLoginView.setOnCheckedChangeListener(this); + clientCertificateSpinner + .setOnClientCertificateChangedListener(clientCertificateChangedListenerInOutgoing); + usernameView.addTextChangedListener(validationTextWatcherInOutgoing); + passwordView.addTextChangedListener(validationTextWatcherInOutgoing); + serverView.addTextChangedListener(validationTextWatcherInOutgoing); + portView.addTextChangedListener(validationTextWatcherInOutgoing); + } + + /** + * This is invoked only when the user makes changes to a widget, not when + * widgets are changed programmatically. (The logic is simpler when you know + * that this is the last thing called after an input change.) + */ + private void onInputChangedInOutgoing() { + if (presenter == null) return; + + presenter.onInputChangedInOutgoing(clientCertificateSpinner.getAlias(), + serverView.getText().toString(), + portView.getText().toString(), usernameView.getText().toString(), + passwordView.getText().toString(), getSelectedAuthType(), getSelectedSecurity(), + requireLoginView.isChecked()); + + } + + protected void onNextInOutgoing() { + ConnectionSecurity securityType = getSelectedSecurity(); + String username = usernameView.getText().toString(); + String password = passwordView.getText().toString(); + String clientCertificateAlias = clientCertificateSpinner.getAlias(); + AuthType authType = getSelectedAuthType(); + + String newHost = serverView.getText().toString(); + int newPort = Integer.parseInt(portView.getText().toString()); + + boolean requireLogin = requireLoginView.isChecked(); + presenter.onNextInOutgoingClicked(username, password, clientCertificateAlias, newHost, newPort, securityType, + authType, requireLogin); + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + requireLoginSettingsView.setVisibility(isChecked ? View.VISIBLE : View.GONE); + onInputChangedInOutgoing(); + } + + + /* + * Calls onInputChangedInOutgoing() which enables or disables the Next button + * based on the fields' validity. + */ + private TextWatcher validationTextWatcherInOutgoing = new TextWatcher() { + public void afterTextChanged(Editable s) { + onInputChangedInOutgoing(); + } + + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + }; + + private OnClientCertificateChangedListener clientCertificateChangedListenerInOutgoing = new OnClientCertificateChangedListener() { + @Override + public void onClientCertificateChanged(String alias) { + onInputChangedInOutgoing(); + } + }; + + private AuthType getSelectedAuthType() { + AuthTypeHolder holder = (AuthTypeHolder) authTypeView.getSelectedItem(); + if (holder == null) return null; + return holder.getAuthType(); + } + + private ConnectionSecurity getSelectedSecurity() { + ConnectionSecurityHolder holder = (ConnectionSecurityHolder) securityTypeView.getSelectedItem(); + if (holder == null) return null; + return holder.getConnectionSecurity(); + } + + private void outgoingStart() { + final View outgoingView = findViewById(R.id.account_setup_outgoing); + coordinatorLayout = (CoordinatorLayout) outgoingView.findViewById(R.id.outgoing_coordinator_layout); + usernameView = (EditText) outgoingView.findViewById(R.id.outgoing_account_username); + usernameViewLayout = (TextInputLayout) outgoingView.findViewById(R.id.outgoing_account_username_layout); + passwordView = (EditText) outgoingView.findViewById(R.id.outgoing_account_password); + passwordViewLayout = (TextInputLayout) outgoingView.findViewById(R.id.outgoing_account_password_layout); + clientCertificateSpinner = (ClientCertificateSpinner) outgoingView.findViewById(R.id.outgoing_account_client_certificate_spinner); + clientCertificateLabelView = (TextView) outgoingView.findViewById(R.id.account_client_certificate_label); + serverView = (TextInputEditText) outgoingView.findViewById(R.id.outgoing_account_server); + portView = (TextInputEditText) outgoingView.findViewById(R.id.outgoing_account_port); + requireLoginView = (CheckBox) outgoingView.findViewById(R.id.account_require_login); + requireLoginSettingsView = (ViewGroup) outgoingView.findViewById(R.id.account_require_login_settings); + securityTypeView = (Spinner) outgoingView.findViewById(R.id.outgoing_account_security_type); + authTypeView = (Spinner) outgoingView.findViewById(R.id.outgoing_account_auth_type); + nextButton = (Button) outgoingView.findViewById(R.id.outgoing_next); + + nextButton.setOnClickListener(this); + + securityTypeView.setAdapter(ConnectionSecurityAdapter.get(this)); + + authTypeAdapter = AuthTypeAdapter.get(this); + authTypeView.setAdapter(authTypeAdapter); + + portView.setKeyListener(DigitsKeyListener.getInstance("0123456789")); + + onCheckedChanged(requireLoginView, requireLoginView.isChecked()); + + boolean editSettings = false; + if (getIntent().getAction() != null) { + editSettings = getIntent().getAction().equals(Intent.ACTION_EDIT); + } + presenter.onOutgoingStart(editSettings); + + initializeViewListenersInOutgoing(); + onInputChangedInOutgoing(); + } + + @Override + public void setNextButtonInOutgoingEnabled(boolean enabled) { + nextButton.setEnabled(enabled); + Utility.setCompoundDrawablesAlpha(nextButton, nextButton.isEnabled() ? 255 : 128); + } + + @Override + public void setAuthTypeInOutgoing(AuthType authType) { + OnItemSelectedListener onItemSelectedListener = authTypeView.getOnItemSelectedListener(); + authTypeView.setOnItemSelectedListener(null); + authTypeView.setSelection(authTypeAdapter.getAuthPosition(authType), false); + authTypeView.setOnItemSelectedListener(onItemSelectedListener); + } + + @Override + public void setSecurityTypeInOutgoing(ConnectionSecurity security) { + OnItemSelectedListener onItemSelectedListener = securityTypeView.getOnItemSelectedListener(); + securityTypeView.setOnItemSelectedListener(null); + securityTypeView.setSelection(security.ordinal(), false); + securityTypeView.setOnItemSelectedListener(onItemSelectedListener); + } + + @Override + public void setUsernameInOutgoing(String username) { + usernameView.removeTextChangedListener(validationTextWatcherInOutgoing); + usernameView.setText(username); + requireLoginView.setChecked(true); + requireLoginSettingsView.setVisibility(View.VISIBLE); + usernameView.addTextChangedListener(validationTextWatcherInOutgoing); + } + + @Override + public void setPasswordInOutgoing(String password) { + passwordView.removeTextChangedListener(validationTextWatcherInOutgoing); + passwordView.setText(password); + passwordView.addTextChangedListener(validationTextWatcherInOutgoing); + } + + @Override + public void setCertificateAliasInOutgoing(String alias) { + clientCertificateSpinner.setOnClientCertificateChangedListener(null); + clientCertificateSpinner.setAlias(alias); + clientCertificateSpinner. + setOnClientCertificateChangedListener(clientCertificateChangedListenerInOutgoing); + } + + @Override + public void setServerInOutgoing(String server) { + serverView.removeTextChangedListener(validationTextWatcherInOutgoing); + serverView.setText(server); + serverView.addTextChangedListener(validationTextWatcherInOutgoing); + } + + @Override + public void setPortInOutgoing(String port) { + portView.removeTextChangedListener(validationTextWatcherInOutgoing); + portView.setText(port); + portView.addTextChangedListener(validationTextWatcherInOutgoing); + } + + @Override + public void showInvalidSettingsToastInOutgoing() { + String toastText = getString(R.string.account_setup_outgoing_invalid_setting_combo_notice, + getString(R.string.account_setup_incoming_auth_type_label), + AuthType.EXTERNAL.toString(), + getString(R.string.account_setup_incoming_security_label), + ConnectionSecurity.NONE.toString()); + Toast.makeText(this, toastText, Toast.LENGTH_LONG).show(); + } + + @Override + public void updateAuthPlainTextInOutgoing(boolean insecure) { + authTypeAdapter.useInsecureText(insecure); + } + + @Override + public void setViewNotExternalInOutgoing() { + // show password fields, hide client certificate fields + passwordViewLayout.setVisibility(View.VISIBLE); + clientCertificateLabelView.setVisibility(View.GONE); + clientCertificateSpinner.setVisibility(View.GONE); + passwordViewLayout.setEnabled(true); + securityTypeView.setEnabled(true); + portView.setEnabled(true); + + passwordView.requestFocus(); + } + + @Override + public void setViewExternalInOutgoing() { + // hide password fields, show client certificate fields + passwordViewLayout.setVisibility(View.GONE); + clientCertificateLabelView.setVisibility(View.VISIBLE); + clientCertificateSpinner.setVisibility(View.VISIBLE); + passwordViewLayout.setEnabled(true); + securityTypeView.setEnabled(true); + portView.setEnabled(true); + + // This may again invoke onInputChangedInOutgoing() + clientCertificateSpinner.chooseCertificate(); + } + + @Override + public void setViewOAuth2InOutgoing() { + passwordViewLayout.setEnabled(false); + securityTypeView.setEnabled(false); + portView.setEnabled(false); + } + + public static void actionEditIncomingSettings(Activity context, Account account) { + context.startActivity(intentActionEditIncomingSettings(context, account)); + } + + public static Intent intentActionEditIncomingSettings(Context context, Account account) { + Intent i = new Intent(context, AccountSetupActivity.class); + i.setAction(Intent.ACTION_EDIT); + i.putExtra(EXTRA_ACCOUNT, account.getUuid()); + i.putExtra(EXTRA_STAGE, Stage.INCOMING); + return i; + } + + public static void actionEditOutgoingSettings(Context context, Account account) { + context.startActivity(intentActionEditOutgoingSettings(context, account)); + } + + public static Intent intentActionEditOutgoingSettings(Context context, Account account) { + Intent i = new Intent(context, AccountSetupActivity.class); + i.setAction(Intent.ACTION_EDIT); + i.putExtra(EXTRA_ACCOUNT, account.getUuid()); + i.putExtra(EXTRA_STAGE, Stage.OUTGOING); + return i; + } + + @Override + public void onBackPressed() { + presenter.onBackPressed(); + } + + @Override + public void goBack() { + onBackPressed(); + } + + @Override + public void startIntentForResult(Intent intent, int requestCode) { + startActivityForResult(intent, requestCode); + } + + @Override + public void openGmailUrl(String url) { + CookieManager cookieManager = CookieManager.getInstance(); + //noinspection deprecation + cookieManager.removeAllCookie(); + + authDialog = new Dialog(this); + authDialog.setContentView(R.layout.oauth_webview); + WebView web = (WebView) authDialog.findViewById(R.id.web_view); + web.getSettings().setSaveFormData(false); + web.getSettings().setJavaScriptEnabled(true); + web.getSettings().setUserAgentString("eelo Mail " + BuildConfig.VERSION_NAME); + web.setWebViewClient(new GmailWebViewClient(presenter)); + web.getSettings().setUseWideViewPort(true); + + authDialog.setTitle(R.string.linked_webview_title_gmail); + authDialog.setCancelable(true); + authDialog.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + presenter.onWebViewDismiss(); + } + }); + authDialog.show(); + + web.loadUrl(url); + } + + @Override + public void openOutlookUrl(String url) { + CookieManager cookieManager = CookieManager.getInstance(); + //noinspection deprecation + cookieManager.removeAllCookie(); + + authDialog = new Dialog(this); + authDialog.setContentView(R.layout.oauth_webview); + WebView web = (WebView) authDialog.findViewById(R.id.web_view); + web.getSettings().setSaveFormData(false); + web.getSettings().setJavaScriptEnabled(true); + web.getSettings().setUserAgentString("eelo Mail " + BuildConfig.VERSION_NAME); + web.setWebViewClient(new OutlookWebViewClient(presenter)); + web.getSettings().setUseWideViewPort(true); + + authDialog.setTitle(R.string.linked_webview_title_outlook); + authDialog.setCancelable(true); + authDialog.setOnDismissListener(new OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + presenter.onWebViewDismiss(); + } + }); + authDialog.show(); + + web.loadUrl(url); + } + + @Override + public void closeAuthDialog() { + if (authDialog != null) { + authDialog.dismiss(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + presenter.onActivityResult(requestCode, resultCode, data); + } + + @Override + protected void onResume() { + super.onResume(); + presenter.onResume(); + } + + @Override + protected void onPause() { + super.onPause(); + presenter.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + presenter.onStop(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + presenter.onDestroy(); + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupBasics.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupBasics.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupCheckSettings.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupCheckSettings.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupComposition.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupComposition.java new file mode 100644 index 0000000000000000000000000000000000000000..87f098990420d705452d3f9371a691e4683625a4 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupComposition.java @@ -0,0 +1,133 @@ +package foundation.e.mail.activity.setup; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.CompoundButton; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.K9Activity; + +public class AccountSetupComposition extends K9Activity { + + private static final String EXTRA_ACCOUNT = "account"; + + private Account account; + + private EditText accountSignature; + private EditText accountEmail; + private EditText accountAlwaysBcc; + private EditText accountName; + private CheckBox accountSignatureUse; + private RadioButton accountSignatureBeforeLocation; + private RadioButton accountSignatureAfterLocation; + private LinearLayout accountSignatureLayout; + + public static void actionEditCompositionSettings(Activity context, Account account) { + Intent i = new Intent(context, AccountSetupComposition.class); + i.setAction(Intent.ACTION_EDIT); + i.putExtra(EXTRA_ACCOUNT, account.getUuid()); + context.startActivity(i); + } + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT); + account = Preferences.getPreferences(this).getAccount(accountUuid); + + setContentView(R.layout.account_setup_composition); + + /* + * If we're being reloaded we override the original account with the one + * we saved + */ + if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) { + accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); + account = Preferences.getPreferences(this).getAccount(accountUuid); + } + + accountName = (EditText)findViewById(R.id.account_name); + accountName.setText(account.getName()); + + accountEmail = (EditText)findViewById(R.id.account_email); + accountEmail.setText(account.getEmail()); + + accountAlwaysBcc = (EditText)findViewById(R.id.account_always_bcc); + accountAlwaysBcc.setText(account.getAlwaysBcc()); + + accountSignatureLayout = (LinearLayout)findViewById(R.id.account_signature_layout); + + accountSignatureUse = (CheckBox)findViewById(R.id.account_signature_use); + boolean useSignature = account.getSignatureUse(); + accountSignatureUse.setChecked(useSignature); + accountSignatureUse.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + accountSignatureLayout.setVisibility(View.VISIBLE); + accountSignature.setText(account.getSignature()); + boolean isSignatureBeforeQuotedText = account.isSignatureBeforeQuotedText(); + accountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); + accountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); + } else { + accountSignatureLayout.setVisibility(View.GONE); + } + } + }); + + accountSignature = (EditText)findViewById(R.id.account_signature); + + accountSignatureBeforeLocation = (RadioButton)findViewById(R.id.account_signature_location_before_quoted_text); + accountSignatureAfterLocation = (RadioButton)findViewById(R.id.account_signature_location_after_quoted_text); + + if (useSignature) { + accountSignature.setText(account.getSignature()); + + boolean isSignatureBeforeQuotedText = account.isSignatureBeforeQuotedText(); + accountSignatureBeforeLocation.setChecked(isSignatureBeforeQuotedText); + accountSignatureAfterLocation.setChecked(!isSignatureBeforeQuotedText); + } else { + accountSignatureLayout.setVisibility(View.GONE); + } + } + + private void saveSettings() { + account.setEmail(accountEmail.getText().toString()); + account.setAlwaysBcc(accountAlwaysBcc.getText().toString()); + account.setName(accountName.getText().toString()); + account.setSignatureUse(accountSignatureUse.isChecked()); + if (accountSignatureUse.isChecked()) { + account.setSignature(accountSignature.getText().toString()); + boolean isSignatureBeforeQuotedText = accountSignatureBeforeLocation.isChecked(); + account.setSignatureBeforeQuotedText(isSignatureBeforeQuotedText); + } + + account.save(Preferences.getPreferences(this)); + } + + @Override + public void onBackPressed() { + saveSettings(); + super.onBackPressed(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putSerializable(EXTRA_ACCOUNT, account.getUuid()); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + account.save(Preferences.getPreferences(this)); + finish(); + } +} diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupContract.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupContract.java new file mode 100644 index 0000000000000000000000000000000000000000..39a011315f9d4e8a687efe01ed489f6915bbe442 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupContract.java @@ -0,0 +1,212 @@ +package foundation.e.mail.activity.setup; + + +import java.net.URISyntaxException; +import java.security.cert.X509Certificate; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.StringRes; + +import foundation.e.mail.Account; +import foundation.e.mail.BasePresenter; +import foundation.e.mail.activity.AccountConfig; +import foundation.e.mail.activity.setup.AccountSetupPresenter.Stage; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings.Type; + + +interface AccountSetupContract { + interface View { + // account type + void goToIncomingSettings(); + + // basics + void setPasswordInBasicsEnabled(boolean enabled); + void setPasswordHintInBasics(String hint); + void setManualSetupButtonInBasicsVisibility(int visibility); + void setNextButtonInBasicsEnabled(boolean enabled); + void goToAccountType(); + void goToAutoConfiguration(); + + // check settings + void showAcceptKeyDialog(final int msgResId, final String exMessage, String message, + X509Certificate certificate); + void showErrorDialog(final int msgResId, final Object... args); + void showErrorDialog(String string); + void setMessage(@StringRes int id); + + void goToBasics(); + void goToIncoming(); + void goToOutgoing(); + + Context getContext(); + + /* --incoming-- */ + + void goToIncomingChecking(); + void setNextButtonInIncomingEnabled(boolean enabled); + void setAuthTypeInIncoming(AuthType authType); + void setSecurityTypeInIncoming(ConnectionSecurity security); + + void setUsernameInIncoming(String username); + void setPasswordInIncoming(String password); + void setCertificateAliasInIncoming(String alias); + void setServerInIncoming(String server); + void setPortInIncoming(String port); + + void setServerLabel(String label); + + void hideViewsWhenPop3(); + void hideViewsWhenImap(); + void hideViewsWhenImapAndNotEdit(); + void hideViewsWhenWebDav(); + + void setImapPathPrefixSectionVisibility(int visibility); + void setImapAutoDetectNamespace(boolean autoDetectNamespace); + void setImapPathPrefix(String prefix); + + void setWebDavPathPrefix(String prefix); + void setWebDavAuthPath(String authPath); + void setWebDavMailboxPath(String mailboxPath); + + void setSecurityChoices(ConnectionSecurity[] choices); + + void setAuthTypeInsecureText(boolean insecure); + + void setViewNotExternalInIncoming(); + void setViewExternalInIncoming(); + void setViewOAuth2InIncoming(); + + void showFailureToast(Exception use); + + void setCompressionSectionVisibility(int visibility); + void setCompressionMobile(boolean compressionMobile); + void setCompressionWifi(boolean compressionWifi); + void setCompressionOther(boolean compressionOther); + + void setSubscribedFoldersOnly(boolean subscribedFoldersOnly); + + void showInvalidSettingsToast(); + void showInvalidOAuthError(); + void clearInvalidOAuthError(); + + /* --Names-- */ + void setDoneButtonInNamesEnabled(boolean enabled); + void goToListAccounts(); + + /* --outgoing-- */ + + void setNextButtonInOutgoingEnabled(boolean enabled); + + void setAuthTypeInOutgoing(AuthType authType); + void setSecurityTypeInOutgoing(ConnectionSecurity security); + + void setUsernameInOutgoing(String username); + void setPasswordInOutgoing(String password); + void setCertificateAliasInOutgoing(String alias); + void setServerInOutgoing(String server); + void setPortInOutgoing(String port); + + void showInvalidSettingsToastInOutgoing(); + + void updateAuthPlainTextInOutgoing(boolean insecure); + + void setViewNotExternalInOutgoing(); + void setViewExternalInOutgoing(); + void setViewOAuth2InOutgoing(); + + void goToOutgoingChecking(); + + void goToAccountNames(); + + + // --- + void goBack(); + void end(); + void startIntentForResult(Intent intent, int requestCode); + void openGmailUrl(String url); + void openOutlookUrl(String url); + void closeAuthDialog(); + } + + interface Presenter extends BasePresenter { + // account type + void onAccountTypeStart(); + void onNextButtonInAccountTypeClicked(Type serverType) throws URISyntaxException; + + // basics + void onBasicsStart(); + void onInputChangedInBasics(String email, String password); + void onManualSetupButtonClicked(String email, String password); + void onNextButtonInBasicViewClicked(String email, String password); + void setAccount(Account account); + Account getAccount(); + + /* checking */ + void onNegativeClickedInConfirmationDialog(); + + void onCheckingStart(Stage stage); + + void onCertificateAccepted(X509Certificate certificate); + void onPositiveClickedInConfirmationDialog(); + + /* incoming */ + + void onIncomingStart(boolean editSettings); + + void onIncomingStart(); + + void onInputChangedInIncoming(String certificateAlias, String server, String port, + String username, String password, AuthType authType, + ConnectionSecurity connectionSecurity); + + void onNextInIncomingClicked(String username, String password, String clientCertificateAlias, + boolean autoDetectNamespace, String imapPathPrefix, String webdavPathPrefix, String webdavAuthPath, + String webdavMailboxPath, String host, int port, ConnectionSecurity connectionSecurity, + AuthType authType, boolean compressMobile, boolean compressWifi, boolean compressOther, + boolean subscribedFoldersOnly); + + /* --names--*/ + void onNamesStart(); + void onInputChangedInNames(String name, String description); + void onNextButtonInNamesClicked(String name, String description); + + // outgoing + void onOutgoingStart(); + + void onOutgoingStart(boolean editSettings); + + void onNextInOutgoingClicked(String username, String password, String clientCertificateAlias, + String host, int port, ConnectionSecurity connectionSecurity, + AuthType authType, boolean requireLogin); + + void onInputChangedInOutgoing(String certificateAlias, String server, String port, + String username, String password, AuthType authType, + ConnectionSecurity connectionSecurity, boolean requireLogin); + + void onCertificateRefused(); + + // --- + + void onBackPressed(); + void onGetMakeDefault(boolean makeDefault); + void onGetAccountUuid(String accountUuid); + void onGetAccountConfig(AccountConfigImpl accountConfig); + void onRestoreStart(); + void onRestoreEnd(); + + void onActivityResult(int requestCode, int resultCode, Intent data); + + AccountSetupPresenter.AccountSetupStatus getStatus(); + AccountConfig getAccountConfig(); + void onWebViewDismiss(); + + void onPause(); + void onStop(); + void onDestroy(); + void onResume(); + } +} + diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupIncoming.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupIncoming.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupNames.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupNames.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupOptions.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupOptions.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupOutgoing.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupOutgoing.java new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupPresenter.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupPresenter.java new file mode 100644 index 0000000000000000000000000000000000000000..8808f94b7f8530d71c99465b0ca1d2d099a81710 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AccountSetupPresenter.java @@ -0,0 +1,2014 @@ +package foundation.e.mail.activity.setup; + + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.res.XmlResourceParser; +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Looper; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; +import android.widget.Toast; + +import foundation.e.mail.Account; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.EmailAddressValidator; +import foundation.e.mail.Globals; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.account.AccountCreator; +import foundation.e.mail.account.Oauth2PromptRequestHandler; +import foundation.e.mail.activity.AccountConfig; +import foundation.e.mail.activity.setup.AccountSetupContract.View; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.NetworkType; +import foundation.e.mail.mail.OAuth2NeedUserPromptException; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.ServerSettings.Type; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.Transport; +import foundation.e.mail.mail.TransportProvider; +import foundation.e.mail.mail.TransportUris; +import foundation.e.mail.mail.autoconfiguration.AutoConfigure; +import foundation.e.mail.mail.autoconfiguration.AutoConfigure.ProviderInfo; +import foundation.e.mail.mail.autoconfiguration.AutoConfigureAutodiscover; +import foundation.e.mail.mail.autoconfiguration.AutoconfigureMozilla; +import foundation.e.mail.mail.autoconfiguration.AutoconfigureSrv; +import foundation.e.mail.mail.autoconfiguration.DnsHelper; +import foundation.e.mail.mail.filter.Hex; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.mail.store.imap.ImapStoreSettings; +import foundation.e.mail.mail.store.webdav.WebDavStore; +import foundation.e.mail.mail.store.webdav.WebDavStoreSettings; +import foundation.e.mail.service.MailService; + +import java.io.Serializable; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import foundation.e.mail.setup.ServerNameSuggester; + +import timber.log.Timber; + +import static foundation.e.mail.mail.ServerSettings.Type.IMAP; +import static foundation.e.mail.mail.ServerSettings.Type.POP3; +import static foundation.e.mail.mail.ServerSettings.Type.SMTP; +import static foundation.e.mail.mail.ServerSettings.Type.WebDAV; + + +public class AccountSetupPresenter implements AccountSetupContract.Presenter, + Oauth2PromptRequestHandler { + + private Context context; + private Preferences preferences; + + private ServerSettings incomingSettings; + private ServerSettings outgoingSettings; + private boolean makeDefault; + private Provider provider; + + private boolean autoconfiguration; + private boolean incomingReady; + private boolean outgoingReady; + + private static final int REQUEST_CODE_GMAIL = 1; + + private boolean oAuth2CodeGotten = false; + + enum Stage { + BASICS, + AUTOCONFIGURATION, + AUTOCONFIGURATION_INCOMING_CHECKING, + AUTOCONFIGURATION_OUTGOING_CHECKING, + INCOMING, + INCOMING_CHECKING, + OUTGOING, + OUTGOING_CHECKING, + ACCOUNT_TYPE, + ACCOUNT_NAMES, + } + + private View view; + + private AsyncTask findProviderTask; + private CheckDirection currentDirection; + private CheckDirection direction; + + private boolean editSettings; + + private String password; + + private ConnectionSecurity currentIncomingSecurityType; + private AuthType currentIncomingAuthType; + private String currentIncomingPort; + + private ConnectionSecurity currentOutgoingSecurityType; + private AuthType currentOutgoingAuthType; + private String currentOutgoingPort; + + private Stage stage; + + private boolean restoring; + + private AccountConfig accountConfig; + + private Handler handler; + + private boolean canceled; + private boolean destroyed; + + public AccountSetupPresenter(Context context, Preferences preferences, View view) { + this.context = context; + this.preferences = preferences; + this.view = view; + this.handler = new Handler(Looper.getMainLooper()); + Globals.getOAuth2TokenProvider().setPromptRequestHandler(this); + } + + // region basics + + @Override + public void onBasicsStart() { + stage = Stage.BASICS; + } + + @Override + public void onInputChangedInBasics(String email, String password) { + EmailAddressValidator emailValidator = new EmailAddressValidator(); + + boolean valid = email != null && email.length() > 0 + && (canOAuth2(email) || (password != null && password.length() > 0)) + && emailValidator.isValidAddressOnly(email); + + if (!canOAuth2(email)) { + view.setPasswordInBasicsEnabled(true); + view.setManualSetupButtonInBasicsVisibility(android.view.View.VISIBLE); + view.setPasswordHintInBasics(context.getString(R.string.account_setup_basics_password_hint)); + } else { + view.setPasswordInBasicsEnabled(false); + view.setPasswordHintInBasics(context.getString( + R.string.account_setup_basics_password_no_password_needed_hint + ) + ); + view.setManualSetupButtonInBasicsVisibility(android.view.View.INVISIBLE); + } + + view.setNextButtonInBasicsEnabled(valid); + } + + private boolean canOAuth2(String email) { + String domain = EmailHelper.getDomainFromEmailAddress(email); + return domain != null && (domain.equals("gmail.com") || domain.equals("outlook.com")); + } + + @Override + public void onManualSetupButtonClicked(String email, String password) { + EmailAddressValidator emailValidator = new EmailAddressValidator(); + if(email != null && email.length() > 0 && emailValidator.isValidAddressOnly(email)) + manualSetup(email, password); + else + Toast.makeText(context, R.string.account_setup_basics_manual_setup_empty_mail, Toast.LENGTH_LONG).show(); + } + + @Override + public void onNextButtonInBasicViewClicked(String email, String password) { + if (accountConfig == null) { + accountConfig = new AccountConfigImpl(preferences); + } + + accountConfig.setEmail(email); + + this.password = password; + + view.goToAutoConfiguration(); + } + + // endregion basics + + // region checking + + @Override + public void onNegativeClickedInConfirmationDialog() { + if (direction == CheckDirection.BOTH && currentDirection == CheckDirection.INCOMING) { + checkOutgoing(); + } else if (currentDirection == CheckDirection.OUTGOING) { + if (editSettings) { + ((Account) accountConfig).save(preferences); + view.end(); + } else { + view.goToAccountNames(); + } + } else { + if (editSettings) { + ((Account) accountConfig).save(preferences); + view.end(); + } else { + view.goToOutgoing(); + } + } + } + + + private void autoConfiguration() { + findProvider(accountConfig.getEmail()); + } + + private void findProvider(final String email) { + findProviderTask = new AsyncTask() { + @Override + protected ProviderInfo doInBackground(Void... params) { + publishProgress(R.string.account_setup_check_settings_retr_info_msg); + + incomingReady = false; + outgoingReady = false; + + final String domain = EmailHelper.getDomainFromEmailAddress(email); + ProviderInfo providerInfo = autoconfigureDomain(domain); + + if (providerInfo != null || (incomingReady && outgoingReady)) { + return providerInfo; + } + + incomingReady = false; + outgoingReady = false; + try { + String mxDomain = DnsHelper.getMxDomain(domain); + + if (mxDomain == null) return null; + + publishProgress(R.string.account_setup_check_settings_retr_info_msg); + providerInfo = autoconfigureDomain(mxDomain); + + } catch (UnknownHostException e) { + Timber.e(e, "Error while trying to run MX lookup"); + } + + return providerInfo; + } + + @Nullable + private ProviderInfo autoconfigureDomain(String domain) { + ProviderInfo providerInfo; + AutoconfigureMozilla autoconfigureMozilla = new AutoconfigureMozilla(); + AutoconfigureSrv autoconfigureSrv = new AutoconfigureSrv(); + AutoConfigureAutodiscover autodiscover = new AutoConfigureAutodiscover(); + + provider = findProviderForDomain(domain); + + if (provider != null) return null; + + providerInfo = autoconfigureMozilla.findProviderInfo(email); + if (providerInfo != null) return providerInfo; + + providerInfo = autoconfigureSrv.findProviderInfo(email); + if (providerInfo != null) return providerInfo; + + providerInfo = autodiscover.findProviderInfo(email); + if (providerInfo != null) return providerInfo; + + testDomain(domain); + + return null; + } + + private void testDomain(String domain) { + String guessedDomainForMailPrefix; + //noinspection ConstantConditions + if (domain.startsWith("mail.")) { + guessedDomainForMailPrefix = domain; + } else { + guessedDomainForMailPrefix = "mail." + domain; + } + + Timber.d("Test %s for imap", guessedDomainForMailPrefix); + testIncoming(guessedDomainForMailPrefix, false); + + Timber.d("Test %s for smtp and starttls", guessedDomainForMailPrefix); + testOutgoing(guessedDomainForMailPrefix, ConnectionSecurity.STARTTLS_REQUIRED, false); + + Timber.d("Test %s for smtp and ssl/tls", guessedDomainForMailPrefix); + testOutgoing(guessedDomainForMailPrefix, ConnectionSecurity.SSL_TLS_REQUIRED, false); + + String domainWithImapPrefix = "imap." + domain; + Timber.d("Test %s for imap", domainWithImapPrefix); + testIncoming(domainWithImapPrefix, false); + + String domainWithSmtpPrefix = "smtp." + domain; + Timber.d("Test %s for smtp and starttls", domainWithSmtpPrefix); + testOutgoing(domainWithSmtpPrefix, ConnectionSecurity.STARTTLS_REQUIRED, false); + + Timber.d("Test %s for smtp and ssl/tls", domainWithSmtpPrefix); + testOutgoing(domainWithSmtpPrefix, ConnectionSecurity.SSL_TLS_REQUIRED, false); + } + + private void testIncoming(String domain, boolean useLocalPart) { + if (!incomingReady) { + try { + accountConfig.setStoreUri(getDefaultStoreURI( + useLocalPart ? EmailHelper.getLocalPartFromEmailAddress(email) : email, + password, domain).toString()); + accountConfig.getRemoteStore().checkSettings(); + incomingReady = true; + Timber.d("Server %s is right for imap", domain); + } catch (AuthenticationFailedException afe) { + if (!useLocalPart) { + Timber.d("Server %s is connected, but authentication failed. Use local part as username this time", domain); + testIncoming(domain, true); + } else { + Timber.d("Server %s is connected, but authentication failed for both email address and local-part", domain); + } + } catch (URISyntaxException | MessagingException ignored) { + Timber.d("Unknown error occurred when using OAuth 2.0"); + } + } + } + + private void testOutgoing(String domain, ConnectionSecurity connectionSecurity, boolean useLocalPart) { + if (!outgoingReady) { + try { + accountConfig.setTransportUri(getDefaultTransportURI( + useLocalPart ? EmailHelper.getLocalPartFromEmailAddress(email) : email, + password, domain, connectionSecurity).toString()); + Transport transport = TransportProvider.getInstance().getTransport(context, accountConfig, + Globals.getOAuth2TokenProvider()); + transport.close(); + try { + transport.open(); + } finally { + transport.close(); + } + outgoingReady = true; + Timber.d("Server %s is right for smtp and %s", domain, connectionSecurity.toString()); + } catch (AuthenticationFailedException afe) { + if (!useLocalPart) { + Timber.d("Server %s is connected, but authentication failed. Use local part as username this time", domain); + testOutgoing(domain, connectionSecurity, true); + } else { + Timber.d("Server %s is connected, but authentication failed for both email address and local-part", domain); + } + } catch (URISyntaxException | MessagingException ignored) { + Timber.d("Unknown error occurred when using OAuth 2.0"); + } + } + } + + @Override + protected void onProgressUpdate(Integer... values) { + super.onProgressUpdate(values); + view.setMessage(values[0]); + } + + @Override + protected void onPostExecute(ProviderInfo providerInfo) { + super.onPostExecute(providerInfo); + + if (canceled) { + return; + } + + if (incomingReady && outgoingReady) { + accountConfig.setDescription(accountConfig.getEmail()); + view.goToAccountNames(); + return; + } else if (incomingReady) { + view.goToOutgoing(); + return; + } + try { + if (providerInfo != null) { + provider = Provider.newInstanceFromProviderInfo(providerInfo); + } + + if (provider != null) { + autoconfiguration = true; + + boolean usingOAuth2 = false; + if (canOAuth2(email)) { + usingOAuth2 = true; + } + modifyAccount(accountConfig.getEmail(), password, provider, usingOAuth2); + + checkIncomingAndOutgoing(); + } + } catch (URISyntaxException e) { + Timber.e(e, "Error while converting providerInfo to provider"); + provider = null; + } + + if (provider == null) { + autoconfiguration = false; + manualSetup(accountConfig.getEmail(), password); + } + } + }.execute(); + } + + private void checkIncomingAndOutgoing() { + direction = CheckDirection.BOTH; + currentDirection = CheckDirection.INCOMING; + new CheckIncomingTask(accountConfig, new CheckSettingsSuccessCallback() { + @Override + public void onCheckSuccess() { + checkOutgoing(); + } + }).execute(); + } + + private void checkIncoming() { + direction = CheckDirection.INCOMING; + currentDirection = CheckDirection.INCOMING; + new CheckIncomingTask(accountConfig, new CheckSettingsSuccessCallback() { + @Override + public void onCheckSuccess() { + if (editSettings) { + updateAccount(); + view.end(); + } else { + if (outgoingReady) { + accountConfig.setDescription(accountConfig.getEmail()); + view.goToAccountNames(); + return; + } + try { + String password = null; + String clientCertificateAlias = null; + if (AuthType.EXTERNAL == incomingSettings.authenticationType) { + clientCertificateAlias = incomingSettings.clientCertificateAlias; + } else { + password = incomingSettings.password; + } + + URI oldUri = new URI(accountConfig.getTransportUri()); + ServerSettings transportServer = new ServerSettings(Type.SMTP, + oldUri.getHost(), oldUri.getPort(), + ConnectionSecurity.SSL_TLS_REQUIRED, currentIncomingAuthType, + incomingSettings.username, password, clientCertificateAlias); + String transportUri = TransportUris.createTransportUri(transportServer); + accountConfig.setTransportUri(transportUri); + } catch (URISyntaxException use) { + /* + * If we can't set up the URL we just continue. It's only for + * convenience. + */ + } + + view.goToOutgoing(); + } + } + }).execute(); + } + + private void checkOutgoing() { + direction = CheckDirection.OUTGOING; + currentDirection = CheckDirection.OUTGOING; + + new CheckOutgoingTask(accountConfig, new CheckSettingsSuccessCallback() { + @Override + public void onCheckSuccess() { + if (!editSettings) { + //We've successfully checked outgoing as well. + accountConfig.setDescription(accountConfig.getEmail()); + + view.goToAccountNames(); + } else { + updateAccount(); + + view.end(); + } + } + }).execute(); + } + + @Override + public void onCheckingStart(Stage stage) { + this.stage = stage; + + switch (stage) { + case AUTOCONFIGURATION: + autoConfiguration(); + break; + case INCOMING_CHECKING: + checkIncoming(); + break; + case OUTGOING_CHECKING: + checkOutgoing(); + break; + } + } + + + private class CheckOutgoingTask extends CheckAccountTask { + private CheckOutgoingTask(AccountConfig accountConfig) { + super(accountConfig); + } + + private CheckOutgoingTask(AccountConfig accountConfig, CheckSettingsSuccessCallback callback) { + super(accountConfig, callback); + } + + @Override + void checkSettings() throws Exception { + Transport transport; + + if (editSettings) { + clearCertificateErrorNotifications(CheckDirection.OUTGOING); + } + if (!(accountConfig.getRemoteStore() instanceof WebDavStore)) { + publishProgress(R.string.account_setup_check_settings_check_outgoing_msg); + } + + transport = TransportProvider.getInstance().getTransport(context, accountConfig, + Globals.getOAuth2TokenProvider()); + + transport.close(); + try { + transport.open(); + } finally { + transport.close(); + } + + } + } + + private class CheckIncomingTask extends CheckAccountTask { + private CheckIncomingTask(AccountConfig accountConfig) { + super(accountConfig); + } + + private CheckIncomingTask(AccountConfig accountConfig, CheckSettingsSuccessCallback callback) { + super(accountConfig, callback); + } + + @Override + void checkSettings() throws Exception { + checkIncomingSettings(); + } + + private void checkIncomingSettings() throws MessagingException { + Store store; + + if (editSettings) { + clearCertificateErrorNotifications(CheckDirection.INCOMING); + } + + store = accountConfig.getRemoteStore(); + + if (store instanceof WebDavStore) { + publishProgress(R.string.account_setup_check_settings_authenticate); + } else { + publishProgress(R.string.account_setup_check_settings_check_incoming_msg); + } + store.checkSettings(); + + if (store instanceof WebDavStore) { + publishProgress(R.string.account_setup_check_settings_fetch); + } + + if (editSettings) { + Account account = (Account) accountConfig; + MessagingController.getInstance(context).listFoldersSynchronous(account, true, null); + MessagingController.getInstance(context) + .synchronizeMailbox(account, account.getInboxFolderName(), null, null); + } + } + } + + /** + * FIXME: Don't use an AsyncTask to perform network operations. + * See also discussion in https://github.com/k9mail/k-9/pull/560 + */ + private abstract class CheckAccountTask extends AsyncTask { + private final AccountConfig accountConfig; + private CheckSettingsSuccessCallback callback; + + private CheckAccountTask(AccountConfig accountConfig) { + this(accountConfig, null); + } + + private CheckAccountTask(AccountConfig accountConfig, CheckSettingsSuccessCallback callback) { + this.accountConfig = accountConfig; + this.callback = callback; + } + + abstract void checkSettings() throws Exception; + + @Override + protected Boolean doInBackground(CheckDirection... params) { + try { + checkSettings(); + + return true; + + } catch (OAuth2NeedUserPromptException ignored) { + } catch (final AuthenticationFailedException afe) { + Timber.e(afe, "Error while testing settings"); + if (afe.getMessage().equals(AuthenticationFailedException.OAUTH2_ERROR_INVALID_REFRESH_TOKEN)) { + Globals.getOAuth2TokenProvider().disconnectEmailWithK9(accountConfig.getEmail()); + replayChecking(); + } else { + handler.post(new Runnable() { + @Override + public void run() { + view.goBack(); + view.showErrorDialog(R.string.account_setup_failed_auth_message); + } + }); + } + } catch (CertificateValidationException cve) { + handleCertificateValidationException(cve); + } catch (final Exception e) { + Timber.e(e, "Error while testing settings"); + handler.post(new Runnable() { + @Override + public void run() { + view.goBack(); + view.showErrorDialog(R.string.account_setup_failed_server_message); + } + }); + } + return false; + } + + @Override + protected void onPostExecute(Boolean bool) { + super.onPostExecute(bool); + + /* + * This task could be interrupted at any point, but network operations can block, + * so relying on InterruptedException is not enough. Instead, check after + * each potentially long-running operation. + */ + if (canceled) { + return; + } + + if (bool && callback != null) { + callback.onCheckSuccess(); + } + } + + void clearCertificateErrorNotifications(CheckDirection direction) { + final MessagingController ctrl = MessagingController.getInstance(context); + ctrl.clearCertificateErrorNotifications((Account) accountConfig, direction); + + } + + @Override + protected void onProgressUpdate(Integer... values) { + view.setMessage(values[0]); + } + + + } + + + private String getXmlAttribute(XmlResourceParser xml, String name) { + int resId = xml.getAttributeResourceValue(null, name, 0); + if (resId == 0) { + return xml.getAttributeValue(null, name); + } else { + return context.getString(resId); + } + } + + private Provider findProviderForDomain(String domain) { + try { + XmlResourceParser xml = context.getResources().getXml(R.xml.providers); + int xmlEventType; + Provider provider = null; + while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { + if (xmlEventType == XmlResourceParser.START_TAG + && "provider".equals(xml.getName()) + && domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) { + provider = new Provider(); + provider.id = getXmlAttribute(xml, "id"); + provider.label = getXmlAttribute(xml, "label"); + provider.domain = getXmlAttribute(xml, "domain"); + provider.note = getXmlAttribute(xml, "note"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "incoming".equals(xml.getName()) + && provider != null) { + provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri")); + provider.incomingUsernameTemplate = getXmlAttribute(xml, "username"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "outgoing".equals(xml.getName()) + && provider != null) { + provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri")); + provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username"); + } else if (xmlEventType == XmlResourceParser.END_TAG + && "provider".equals(xml.getName()) + && provider != null) { + return provider; + } + } + + if (provider == null) { + provider = new AccountSetupPresenter.Provider(); + provider.id = domain; + provider.label = domain + " mail service"; + provider.domain = domain; + provider.note = ""; + provider.incomingUriTemplate = new URI("imap+ssl+://mail." + domain); + provider.incomingUsernameTemplate = "$email"; + provider.outgoingUriTemplate = new URI("smtp+tls+://mail." + domain); + provider.outgoingUsernameTemplate = "$email"; + } + + } catch (Exception e) { + Timber.e(e, "Error while trying to load provider settings."); + } + return null; + } + + private URI getDefaultStoreURI(String username, String password, String server) throws URISyntaxException { + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + String userInfo = username + ":" + passwordEnc; + + return new URI("imap+ssl+", userInfo, server, 993, null, null, null); + } + + private URI getDefaultTransportURI(String username, String password, String server, + ConnectionSecurity connectionSecurity) throws URISyntaxException { + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + String userInfo = username + ":" + passwordEnc; + + if (connectionSecurity == ConnectionSecurity.STARTTLS_REQUIRED) { + return new URI("smtp+tls+", userInfo, server, 587, null, null, null); + } else { + return new URI("smtp+ssl+", userInfo, server, 465, null, null, null); + } + } + + private void modifyAccount(String email, String password, @NonNull Provider provider, + boolean usingOAuth2) throws URISyntaxException { + + accountConfig.init(email, password); + + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + String userEnc = UrlEncodingHelper.encodeUtf8(user); + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + + String incomingUsername = provider.incomingUsernameTemplate; + incomingUsername = incomingUsername.replaceAll("\\$email", email); + incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); + incomingUsername = incomingUsername.replaceAll("\\$domain", domain); + + URI incomingUriTemplate = provider.incomingUriTemplate; + String incomingUserInfo = incomingUsername + ":" + passwordEnc; + if (usingOAuth2) { + incomingUserInfo = AuthType.XOAUTH2 + ":" + incomingUserInfo; + } + URI incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUserInfo, + incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, null, null); + + String outgoingUsername = provider.outgoingUsernameTemplate; + + URI outgoingUriTemplate = provider.outgoingUriTemplate; + + + URI outgoingUri; + if (outgoingUsername != null) { + outgoingUsername = outgoingUsername.replaceAll("\\$email", email); + outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); + outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); + + String outgoingUserInfo = outgoingUsername + ":" + passwordEnc; + if (usingOAuth2) { + outgoingUserInfo = outgoingUserInfo + ":" + AuthType.XOAUTH2; + } + outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUserInfo, + outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } else { + outgoingUri = new URI(outgoingUriTemplate.getScheme(), + null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } + + accountConfig.setStoreUri(incomingUri.toString()); + accountConfig.setTransportUri(outgoingUri.toString()); + + setupFolderNames(incomingUriTemplate.getHost().toLowerCase(Locale.US)); + + ServerSettings incomingSettings = RemoteStore.decodeStoreUri(incomingUri.toString()); + accountConfig.setDeletePolicy(AccountCreator.getDefaultDeletePolicy(incomingSettings.type)); + } + + private void setupFolderNames(String domain) { + accountConfig.setDraftsFolderName(K9.getK9String(R.string.special_mailbox_name_drafts)); + accountConfig.setTrashFolderName(K9.getK9String(R.string.special_mailbox_name_trash)); + accountConfig.setSentFolderName(K9.getK9String(R.string.special_mailbox_name_sent)); + accountConfig.setArchiveFolderName(K9.getK9String(R.string.special_mailbox_name_archive)); + + // Yahoo! has a special folder for Spam, called "Bulk Mail". + if (domain.endsWith(".yahoo.com")) { + accountConfig.setSpamFolderName("Bulk Mail"); + } else { + accountConfig.setSpamFolderName(K9.getK9String(R.string.special_mailbox_name_spam)); + } + } + + @Override + public void onCertificateAccepted(X509Certificate certificate) { + try { + accountConfig.addCertificate(currentDirection, certificate); + } catch (CertificateException e) { + view.showErrorDialog( + R.string.account_setup_failed_dlg_certificate_message_fmt, + e.getMessage() == null ? "" : e.getMessage()); + } + + replayChecking(); + } + + @Override + public void onCertificateRefused() { + if (stage == Stage.INCOMING_CHECKING) { + view.goToIncoming(); + } else if (stage == Stage.OUTGOING_CHECKING) { + view.goToOutgoing(); + } + } + + @Override + public void onPositiveClickedInConfirmationDialog() { + if (stage == Stage.INCOMING_CHECKING) { + view.goToIncoming(); + } else if (stage == Stage.OUTGOING_CHECKING){ + view.goToOutgoing(); + } else { + view.goToBasics(); + } + } + + private void replayChecking() { + if (direction == CheckDirection.BOTH && currentDirection == CheckDirection.INCOMING) { + checkIncomingAndOutgoing(); + } else if (currentDirection == CheckDirection.INCOMING) { + checkIncoming(); + } else { + checkOutgoing(); + } + } + + private String errorMessageForCertificateException(CertificateValidationException e) { + switch (e.getReason()) { + case Expired: return K9.getK9String(R.string.client_certificate_expired, e.getAlias(), e.getMessage()); + case MissingCapability: return K9.getK9String(R.string.auth_external_error); + case RetrievalFailure: return K9.getK9String(R.string.client_certificate_retrieval_failure, e.getAlias()); + case UseMessage: return e.getMessage(); + case Unknown: + default: return ""; + } + } + + private void acceptKeyDialog(final int msgResId, final CertificateValidationException ex) { + String exMessage = "Unknown Error"; + + if (ex != null) { + if (ex.getCause() != null) { + if (ex.getCause().getCause() != null) { + exMessage = ex.getCause().getCause().getMessage(); + + } else { + exMessage = ex.getCause().getMessage(); + } + } else { + exMessage = ex.getMessage(); + } + } + + final StringBuilder chainInfo = new StringBuilder(100); + MessageDigest sha1 = null; + try { + sha1 = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException e) { + Timber.e(e, "Error while initializing MessageDigest"); + } + + final X509Certificate[] chain = ex.getCertChain(); + // We already know chain != null (tested before calling this method) + for (int i = 0; i < chain.length; i++) { + // display certificate chain information + //TODO: localize this strings + chainInfo.append("Certificate chain[").append(i).append("]:\n"); + chainInfo.append("Subject: ").append(chain[i].getSubjectDN().toString()).append("\n"); + + // display SubjectAltNames too + // (the user may be mislead into mistrusting a certificate + // by a subjectDN not matching the server even though a + // SubjectAltName matches) + try { + final Collection> subjectAlternativeNames = chain[i].getSubjectAlternativeNames(); + if (subjectAlternativeNames != null) { + // The list of SubjectAltNames may be very long + //TODO: localize this string + StringBuilder altNamesText = new StringBuilder(); + altNamesText.append("Subject has ").append(subjectAlternativeNames.size()).append(" alternative names\n"); + + // we need these for matching + + for (List subjectAlternativeName : subjectAlternativeNames) { + Integer type = (Integer)subjectAlternativeName.get(0); + Object value = subjectAlternativeName.get(1); + String name; + switch (type.intValue()) { + case 0: + Timber.w("SubjectAltName of type OtherName not supported."); + continue; + case 1: // RFC822Name + name = (String)value; + break; + case 2: // DNSName + name = (String)value; + break; + case 3: + Timber.w("unsupported SubjectAltName of type x400Address"); + continue; + case 4: + Timber.w("unsupported SubjectAltName of type directoryName"); + continue; + case 5: + Timber.w("unsupported SubjectAltName of type ediPartyName"); + continue; + case 6: // Uri + name = (String)value; + break; + case 7: // ip-address + name = (String)value; + break; + default: + Timber.w("unsupported SubjectAltName of unknown type"); + continue; + } + + // if some of the SubjectAltNames match the store or transport -host, + // display them + if (name.equalsIgnoreCase(incomingSettings.host) || name.equalsIgnoreCase(outgoingSettings.host)) { + //TODO: localize this string + altNamesText.append("Subject(alt): ").append(name).append(",...\n"); + } else if (name.startsWith("*.") && ( + (incomingSettings != null && incomingSettings.host.endsWith(name.substring(2))) || + (outgoingSettings != null && outgoingSettings.host.endsWith(name.substring(2))))) { + //TODO: localize this string + altNamesText.append("Subject(alt): ").append(name).append(",...\n"); + } + } + chainInfo.append(altNamesText); + } + } catch (Exception e1) { + // don't fail just because of subjectAltNames + Timber.w(e1, "cannot display SubjectAltNames in dialog"); + } + + chainInfo.append("Issuer: ").append(chain[i].getIssuerDN().toString()).append("\n"); + if (sha1 != null) { + sha1.reset(); + try { + String sha1sum = Hex.encodeHex(sha1.digest(chain[i].getEncoded())); + chainInfo.append("Fingerprint (SHA-1): ").append(sha1sum).append("\n"); + } catch (CertificateEncodingException e) { + Timber.e(e, "Error while encoding certificate"); + } + } + + } + + final String finalExMessage = exMessage; + handler.post(new Runnable() { + @Override + public void run() { + view.showAcceptKeyDialog(msgResId, finalExMessage, chainInfo.toString(), chain[0]); + } + }); + } + + private void handleCertificateValidationException(CertificateValidationException cve) { + Timber.e(cve, "Error while testing settings"); + + X509Certificate[] chain = cve.getCertChain(); + // Avoid NullPointerException in acceptKeyDialog() + if (chain != null) { + acceptKeyDialog( + R.string.account_setup_failed_dlg_certificate_message_fmt, + cve); + } else { + view.showErrorDialog( + R.string.account_setup_failed_dlg_server_message_fmt, + errorMessageForCertificateException(cve)); + } + } + + public static class Provider implements Serializable { + private static final long serialVersionUID = 8511656164616538989L; + + public String id; + + public String label; + + public String domain; + + public URI incomingUriTemplate; + + public String incomingUsernameTemplate; + + public URI outgoingUriTemplate; + + public String outgoingUsernameTemplate; + + public String note; + + public static Provider newInstanceFromProviderInfo(@Nullable AutoConfigure.ProviderInfo providerInfo) throws URISyntaxException { + if (providerInfo == null) return null; + + Provider provider = new Provider(); + + provider.incomingUsernameTemplate = providerInfo.incomingUsernameTemplate; + provider.outgoingUsernameTemplate = providerInfo.outgoingUsernameTemplate; + + provider.incomingUriTemplate = new URI(providerInfo.incomingType + "+" + + ("".equals(providerInfo.incomingSocketType) ? "" : (providerInfo.incomingSocketType + "+")), + null, + providerInfo.incomingAddr, + providerInfo.incomingPort, + null, null, null); + provider.outgoingUriTemplate = new URI(providerInfo.outgoingType + "+" + + ("".equals(providerInfo.outgoingSocketType) ? "" : (providerInfo.outgoingSocketType + "+")), + null, + providerInfo.outgoingAddr, + providerInfo.outgoingPort, + null, null, null); + + return provider; + } + } + + private interface CheckSettingsSuccessCallback { + void onCheckSuccess(); + } + + // endregion checking + + // region incoming + + @Override + public void onIncomingStart(boolean editSettings) { + this.editSettings = editSettings; + + stage = Stage.INCOMING; + ConnectionSecurity[] connectionSecurityChoices = ConnectionSecurity.values(); + try { + incomingSettings = RemoteStore.decodeStoreUri(accountConfig.getStoreUri()); + + currentIncomingAuthType = incomingSettings.authenticationType; + + view.setAuthTypeInIncoming(currentIncomingAuthType); + + updateViewFromAuthTypeInIncoming(currentIncomingAuthType); + + currentIncomingSecurityType = incomingSettings.connectionSecurity; + + if (incomingSettings.username != null) { + view.setUsernameInIncoming(incomingSettings.username); + } + + if (incomingSettings.password != null) { + view.setPasswordInIncoming(incomingSettings.password); + } + + if (incomingSettings.clientCertificateAlias != null) { + view.setCertificateAliasInIncoming(incomingSettings.clientCertificateAlias); + } + + if (Type.POP3 == incomingSettings.type) { + view.setServerLabel(getString(R.string.account_setup_incoming_pop_server_label)); + + view.hideViewsWhenPop3(); + } else if (Type.IMAP == incomingSettings.type) { + view.setServerLabel(getString(R.string.account_setup_incoming_imap_server_label)); + + ImapStoreSettings imapSettings = (ImapStoreSettings) incomingSettings; + + view.setImapAutoDetectNamespace(imapSettings.autoDetectNamespace); + if (imapSettings.pathPrefix != null) { + view.setImapPathPrefix(imapSettings.pathPrefix); + } + + view.hideViewsWhenImap(); + + if (!editSettings) { + view.hideViewsWhenImapAndNotEdit(); + } + } else if (Type.WebDAV == incomingSettings.type) { + view.setServerLabel(getString(R.string.account_setup_incoming_webdav_server_label)); + connectionSecurityChoices = new ConnectionSecurity[] { + ConnectionSecurity.NONE, + ConnectionSecurity.SSL_TLS_REQUIRED }; + + view.hideViewsWhenWebDav(); + WebDavStoreSettings webDavSettings = (WebDavStoreSettings) incomingSettings; + + if (webDavSettings.path != null) { + view.setWebDavPathPrefix(webDavSettings.path); + } + + if (webDavSettings.authPath != null) { + view.setWebDavAuthPath(webDavSettings.authPath); + } + + if (webDavSettings.mailboxPath != null) { + view.setWebDavMailboxPath(webDavSettings.mailboxPath); + } + } else { + throw new IllegalArgumentException("Unknown account type: " + accountConfig.getStoreUri()); + } + + if (!editSettings) { + accountConfig.setDeletePolicy(AccountCreator.getDefaultDeletePolicy(incomingSettings.type)); + } + + view.setSecurityChoices(connectionSecurityChoices); + + view.setSecurityTypeInIncoming(currentIncomingSecurityType); + updateAuthPlainTextFromSecurityType(currentIncomingSecurityType); + + if (incomingSettings.host != null) { + view.setServerInIncoming(incomingSettings.host); + } + + if (incomingSettings.port != -1) { + String port = String.valueOf(incomingSettings.port); + view.setPortInIncoming(port); + currentIncomingPort = port; + } else { + updatePortFromSecurityTypeInIncoming(currentIncomingSecurityType); + } + + if (editSettings) { + view.setCompressionSectionVisibility(android.view.View.VISIBLE); + view.setImapPathPrefixSectionVisibility(android.view.View.VISIBLE); + } + view.setCompressionMobile(accountConfig.useCompression(NetworkType.MOBILE)); + view.setCompressionWifi(accountConfig.useCompression(NetworkType.WIFI)); + view.setCompressionOther(accountConfig.useCompression(NetworkType.OTHER)); + + view.setSubscribedFoldersOnly(accountConfig.subscribedFoldersOnly()); + + } catch (IllegalArgumentException e) { + view.showFailureToast(e); + } + } + + @Override + public void onIncomingStart() { + onIncomingStart(editSettings); + } + + private void updatePortFromSecurityTypeInIncoming(ConnectionSecurity securityType) { + if (restoring) return; + + String port = String.valueOf(AccountCreator.getDefaultPort(securityType, incomingSettings.type)); + view.setPortInIncoming(port); + currentIncomingPort = port; + } + + private void updateAuthPlainTextFromSecurityType(ConnectionSecurity securityType) { + view.setAuthTypeInsecureText(securityType == ConnectionSecurity.NONE); + } + + @Override + public void onInputChangedInIncoming(String certificateAlias, String server, String port, + String username, String password, AuthType authType, + ConnectionSecurity connectionSecurity) { + revokeInvalidSettingsAndUpdateViewInIncoming(authType, connectionSecurity, port); + validateFieldInIncoming(certificateAlias, server, currentIncomingPort, username, password, + currentIncomingAuthType, + currentIncomingSecurityType); + } + + @Override + public void onNextInIncomingClicked(String username, String password, String clientCertificateAlias, + boolean autoDetectNamespace, String imapPathPrefix, String webdavPathPrefix, String webdavAuthPath, + String webdavMailboxPath, String host, int port, ConnectionSecurity connectionSecurity, + AuthType authType, boolean compressMobile, boolean compressWifi, boolean compressOther, + boolean subscribedFoldersOnly) { + + if (authType == AuthType.EXTERNAL) { + password = null; + } else { + clientCertificateAlias = null; + } + + Map extra = null; + if (Type.IMAP == incomingSettings.type) { + extra = new HashMap<>(); + extra.put(ImapStoreSettings.AUTODETECT_NAMESPACE_KEY, + Boolean.toString(autoDetectNamespace)); + extra.put(ImapStoreSettings.PATH_PREFIX_KEY, + imapPathPrefix); + } else if (WebDAV == incomingSettings.type) { + extra = new HashMap<>(); + extra.put(WebDavStoreSettings.PATH_KEY, + webdavPathPrefix); + extra.put(WebDavStoreSettings.AUTH_PATH_KEY, + webdavAuthPath); + extra.put(WebDavStoreSettings.MAILBOX_PATH_KEY, + webdavMailboxPath); + } + + accountConfig.deleteCertificate(host, port, CheckDirection.INCOMING); + incomingSettings = new ServerSettings(incomingSettings.type, host, port, + connectionSecurity, authType, username, password, clientCertificateAlias, extra); + + accountConfig.setStoreUri(RemoteStore.createStoreUri(incomingSettings)); + + accountConfig.setCompression(NetworkType.MOBILE, compressMobile); + accountConfig.setCompression(NetworkType.WIFI, compressWifi); + accountConfig.setCompression(NetworkType.OTHER, compressOther); + accountConfig.setSubscribedFoldersOnly(subscribedFoldersOnly); + + view.goToIncomingChecking(); + } + + private void revokeInvalidSettingsAndUpdateViewInIncoming(AuthType authType, + ConnectionSecurity connectionSecurity, + String port) { + boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); + boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); + + if (isAuthTypeExternal && !hasConnectionSecurity) { + view.showInvalidSettingsToast(); + view.setAuthTypeInIncoming(currentIncomingAuthType); + view.setSecurityTypeInIncoming(currentIncomingSecurityType); + view.setPortInIncoming(currentIncomingPort); + } else { + currentIncomingPort = port; + + onAuthTypeSelectedInIncoming(authType); + onSecuritySelectedInIncoming(connectionSecurity); + + currentIncomingAuthType = authType; + currentIncomingSecurityType = connectionSecurity; + } + } + + private void onAuthTypeSelectedInIncoming(AuthType authType) { + if (authType != currentIncomingAuthType) { + setAuthTypeInIncoming(authType); + } + } + + private void onSecuritySelectedInIncoming(ConnectionSecurity securityType) { + if (securityType != currentIncomingSecurityType) { + setSecurityTypeInIncoming(securityType); + } + } + + private void setAuthTypeInIncoming(AuthType authType) { + view.setAuthTypeInIncoming(authType); + + updateViewFromAuthTypeInIncoming(authType); + } + + private void setSecurityTypeInIncoming(ConnectionSecurity securityType) { + view.setSecurityTypeInIncoming(securityType); + + updatePortFromSecurityTypeInIncoming(securityType); + updateAuthPlainTextFromSecurityType(securityType); + } + + + private void validateFieldInIncoming(String certificateAlias, String server, String port, + String username, String password, AuthType authType, ConnectionSecurity connectionSecurity) { + boolean isAuthTypeOAuth = (AuthType.XOAUTH2 == authType); + boolean isOAuthValid = canOAuth2(username); + boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); + boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); + + boolean hasValidCertificateAlias = certificateAlias != null; + boolean hasValidUserName = Utility.requiredFieldValid(username); + + boolean hasValidPasswordSettings = hasValidUserName + && !isAuthTypeExternal && !isAuthTypeOAuth + && Utility.requiredFieldValid(password); + + boolean hasValidExternalAuthSettings = hasValidUserName + && isAuthTypeExternal + && hasConnectionSecurity + && hasValidCertificateAlias; + + boolean hasValidOAuth2Settings = hasValidUserName + && isAuthTypeOAuth + && isOAuthValid; + + final boolean enabled = Utility.domainFieldValid(server) + && Utility.requiredFieldValid(port) + && (hasValidPasswordSettings || hasValidExternalAuthSettings + || hasValidOAuth2Settings); + + checkInvalidOAuthError(isAuthTypeOAuth, isOAuthValid); + view.setNextButtonInIncomingEnabled(enabled); + } + + private void checkInvalidOAuthError(boolean isAuthTypeOAuth, boolean isOAuthValid) { + if (isAuthTypeOAuth && !isOAuthValid) { + view.showInvalidOAuthError(); + } else { + view.clearInvalidOAuthError(); + } + } + + private void updateAccount() { + Account account = (Account) accountConfig; + + boolean isPushCapable = false; + try { + Store store = account.getRemoteStore(); + isPushCapable = store.isPushCapable(); + } catch (Exception e) { + Timber.e(e, "Could not get remote store"); + } + if (isPushCapable && account.getFolderPushMode() != FolderMode.NONE) { + MailService.actionRestartPushers(view.getContext(), null); + } + account.save(preferences); + } + + private void updateViewFromAuthTypeInIncoming(AuthType authType) { + if (authType == AuthType.EXTERNAL) { + view.setViewExternalInIncoming(); + } else if (authType == AuthType.XOAUTH2) { + view.setViewOAuth2InIncoming(); + } else { + view.setViewNotExternalInIncoming(); + } + } + + private String getString(int id) { + return context.getString(id); + } + + // endregion incoming + + // region names + + @Override + public void onNamesStart() { + stage = Stage.ACCOUNT_NAMES; + } + + @Override + public void onInputChangedInNames(String name, String description) { + if (Utility.requiredFieldValid(name)) { + view.setDoneButtonInNamesEnabled(true); + } else { + view.setDoneButtonInNamesEnabled(false); + } + } + + @Override + public void onNextButtonInNamesClicked(String name, String description) { + if (Utility.requiredFieldValid(description)) { + accountConfig.setDescription(description); + } + + accountConfig.setName(name); + + Account account = preferences.newAccount(); + account.loadConfig(accountConfig); + + MessagingController.getInstance(context).listFoldersSynchronous(account, true, null); + MessagingController.getInstance(context) + .synchronizeMailbox(account, account.getInboxFolderName(), null, null); + + account.save(preferences); + + if (account.equals(preferences.getDefaultAccount()) || makeDefault) { + preferences.setDefaultAccount(account); + } + + K9.setServicesEnabled(context); + + view.goToListAccounts(); + } + + // endregion names + + // region outgoing + @Override + public void onOutgoingStart() { + onOutgoingStart(editSettings); + } + + @Override + public void onOutgoingStart(boolean editSettings) { + this.editSettings = editSettings; + stage = Stage.OUTGOING; + analysisAccount(); + } + + private void analysisAccount() { + try { + if (new URI(accountConfig.getStoreUri()).getScheme().startsWith("webdav")) { + accountConfig.setTransportUri(accountConfig.getStoreUri()); + view.goToOutgoingChecking(); + + return; + } + } catch (URISyntaxException e) { + view.showFailureToast(e); + } + + try { + outgoingSettings = TransportUris.decodeTransportUri(accountConfig.getTransportUri()); + + currentOutgoingAuthType = outgoingSettings.authenticationType; + setAuthTypeInOutgoing(currentOutgoingAuthType); + + currentOutgoingSecurityType = outgoingSettings.connectionSecurity; + setSecurityTypeInOutgoing(currentOutgoingSecurityType); + + if (outgoingSettings.username != null && !outgoingSettings.username.isEmpty()) { + view.setUsernameInOutgoing(outgoingSettings.username); + } + + if (outgoingSettings.password != null) { + view.setPasswordInOutgoing(outgoingSettings.password); + } + + if (outgoingSettings.clientCertificateAlias != null) { + view.setCertificateAliasInOutgoing(outgoingSettings.clientCertificateAlias); + } + + if (outgoingSettings.host != null) { + view.setServerInOutgoing(outgoingSettings.host); + } + + if (outgoingSettings.port != -1) { + currentOutgoingPort = String.valueOf(outgoingSettings.port); + view.setPortInOutgoing(currentOutgoingPort); + } + } catch (Exception e) { + view.showFailureToast(e); + } + } + + + private void setAuthTypeInOutgoing(AuthType authType) { + view.setAuthTypeInOutgoing(authType); + + updateViewFromAuthTypeInOutgoing(authType); + } + + private void setSecurityTypeInOutgoing(ConnectionSecurity securityType) { + view.setSecurityTypeInOutgoing(securityType); + + updateViewFromSecurityTypeInOutgoing(securityType); + } + + private void onSecuritySelectedInOutgoing(ConnectionSecurity securityType) { + if (securityType != currentOutgoingSecurityType) { + updateViewFromSecurityTypeInOutgoing(securityType); + } + } + + private void onAuthTypeSelectedInOutgoing(AuthType authType) { + if (authType != currentOutgoingAuthType) { + setAuthTypeInOutgoing(authType); + } + } + + @Override + public void onNextInOutgoingClicked(String username, String password, String clientCertificateAlias, + String host, int port, ConnectionSecurity connectionSecurity, + AuthType authType, boolean requireLogin) { + + if (!requireLogin) { + username = null; + password = null; + authType = null; + clientCertificateAlias = null; + } + + accountConfig.deleteCertificate(host, port, CheckDirection.OUTGOING); + ServerSettings server = new ServerSettings(Type.SMTP, host, port, connectionSecurity, + authType, username, password, clientCertificateAlias); + String uri = TransportUris.createTransportUri(server); + accountConfig.setTransportUri(uri); + + view.goToOutgoingChecking(); + } + + @Override + public void onInputChangedInOutgoing(String certificateAlias, String server, String port, String username, + String password, AuthType authType, + ConnectionSecurity connectionSecurity, boolean requireLogin) { + + if (currentOutgoingSecurityType != connectionSecurity) { + boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); + + boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); + + if (isAuthTypeExternal && !hasConnectionSecurity && !requireLogin) { + authType = AuthType.PLAIN; + view.setAuthTypeInOutgoing(authType); + updateViewFromAuthTypeInOutgoing(authType); + } + } + + revokeInvalidSettingsAndUpdateViewInOutgoing(authType, connectionSecurity, port); + validateFieldInOutgoing(certificateAlias, server, currentOutgoingPort, username, password, currentOutgoingAuthType, + currentOutgoingSecurityType, requireLogin); + } + + private void validateFieldInOutgoing(String certificateAlias, String server, String port, + String username, String password, AuthType authType, + ConnectionSecurity connectionSecurity, + boolean requireLogin) { + + boolean isAuthTypeOAuth = (AuthType.XOAUTH2 == authType); + boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); + boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); + + boolean hasValidCertificateAlias = certificateAlias != null; + boolean hasValidUserName = Utility.requiredFieldValid(username); + boolean isOAuthValid = hasValidUserName && canOAuth2(username); + + boolean hasValidPasswordSettings = hasValidUserName + && !isAuthTypeExternal + && Utility.requiredFieldValid(password); + + boolean hasValidExternalAuthSettings = hasValidUserName + && isAuthTypeExternal + && hasConnectionSecurity + && hasValidCertificateAlias; + + boolean hasValidOAuth2Settings = hasValidUserName + && isAuthTypeOAuth + && isOAuthValid; + + boolean enabled = Utility.domainFieldValid(server) + && Utility.requiredFieldValid(port) + && (!requireLogin + || hasValidPasswordSettings || hasValidExternalAuthSettings + || hasValidOAuth2Settings); + + checkInvalidOAuthError(isAuthTypeOAuth, isOAuthValid); + + view.setNextButtonInOutgoingEnabled(enabled); + } + + private void revokeInvalidSettingsAndUpdateViewInOutgoing(AuthType authType, + ConnectionSecurity connectionSecurity, + String port) { + boolean isAuthTypeExternal = (AuthType.EXTERNAL == authType); + + boolean hasConnectionSecurity = (connectionSecurity != ConnectionSecurity.NONE); + + if (isAuthTypeExternal && !hasConnectionSecurity) { + view.showInvalidSettingsToastInOutgoing(); + view.setAuthTypeInOutgoing(currentOutgoingAuthType); + view.setSecurityTypeInOutgoing(currentOutgoingSecurityType); + view.setPortInOutgoing(currentOutgoingPort); + } else { + currentOutgoingPort = port; + + onAuthTypeSelectedInOutgoing(authType); + onSecuritySelectedInOutgoing(connectionSecurity); + + currentOutgoingAuthType = authType; + currentOutgoingSecurityType = connectionSecurity; + } + } + + private void updateViewFromSecurityTypeInOutgoing(ConnectionSecurity securityType) { + view.updateAuthPlainTextInOutgoing(securityType == ConnectionSecurity.NONE); + + if (restoring) return; + String port = String.valueOf(AccountCreator.getDefaultPort(securityType, SMTP)); + view.setPortInOutgoing(port); + currentOutgoingPort = port; + } + + private void updateViewFromAuthTypeInOutgoing(AuthType authType) { + if (authType == AuthType.EXTERNAL) { + view.setViewExternalInOutgoing(); + } else if (authType == AuthType.XOAUTH2) { + view.setViewOAuth2InOutgoing(); + } else { + view.setViewNotExternalInOutgoing(); + } + } + + // endregion outgoing + + // region account type + @Override + public void onAccountTypeStart() { + stage = Stage.ACCOUNT_TYPE; + } + + @Override + public void onNextButtonInAccountTypeClicked(Type serverType) throws URISyntaxException { + switch (serverType) { + case IMAP: + onImapOrPop3Selected(IMAP, "imap+ssl+"); + break; + case POP3: + onImapOrPop3Selected(POP3, "pop3+ssl+"); + break; + case WebDAV: + onWebdavSelected(); + break; + } + } + + private void onImapOrPop3Selected(Type serverType, String schemePrefix) throws URISyntaxException { + ServerNameSuggester serverNameSuggester = new ServerNameSuggester(); + + String domainPart = EmailHelper.getDomainFromEmailAddress(accountConfig.getEmail()); + + String suggestedStoreServerName = serverNameSuggester.suggestServerName(serverType, domainPart); + URI storeUriForDecode = new URI(accountConfig.getStoreUri()); + URI storeUri = new URI(schemePrefix, storeUriForDecode.getUserInfo(), suggestedStoreServerName, + storeUriForDecode.getPort(), null, null, null); + accountConfig.setStoreUri(storeUri.toString()); + + String suggestedTransportServerName = serverNameSuggester.suggestServerName(SMTP, domainPart); + URI transportUriForDecode = new URI(accountConfig.getTransportUri()); + URI transportUri = new URI("smtp+tls+", transportUriForDecode.getUserInfo(), suggestedTransportServerName, + transportUriForDecode.getPort(), null, null, null); + accountConfig.setTransportUri(transportUri.toString()); + + view.goToIncomingSettings(); + } + + private void onWebdavSelected() throws URISyntaxException { + ServerNameSuggester serverNameSuggester = new ServerNameSuggester(); + + URI uriForDecode = new URI(accountConfig.getStoreUri()); + + /* + * The user info we have been given from + * BasicsView.onManualSetup() is encoded as an IMAP store + * URI: AuthType:UserName:Password (no fields should be empty). + * However, AuthType is not applicable to WebDAV nor to its store + * URI. Re-encode without it, using just the UserName and Password. + */ + String userPass = ""; + String[] userInfo = uriForDecode.getUserInfo().split(":"); + if (userInfo.length > 1) { + userPass = userInfo[1]; + } + if (userInfo.length > 2) { + userPass = userPass + ":" + userInfo[2]; + } + + String domainPart = EmailHelper.getDomainFromEmailAddress(accountConfig.getEmail()); + String suggestedServerName = serverNameSuggester.suggestServerName(WebDAV, domainPart); + URI uri = new URI("webdav+ssl+", userPass, suggestedServerName, uriForDecode.getPort(), null, null, null); + accountConfig.setStoreUri(uri.toString()); + + view.goToIncomingSettings(); + } + + // endregion account type + + @Override + public void onBackPressed() { + if (findProviderTask != null && !findProviderTask.isCancelled()) { + findProviderTask.cancel(true); + } + switch (stage) { + case AUTOCONFIGURATION: + case AUTOCONFIGURATION_INCOMING_CHECKING: + case AUTOCONFIGURATION_OUTGOING_CHECKING: + case ACCOUNT_TYPE: + stage = Stage.BASICS; + view.goToBasics(); + break; + case INCOMING: + if (!editSettings) { + stage = Stage.ACCOUNT_TYPE; + view.goToAccountType(); + } else { + view.end(); + } + break; + case INCOMING_CHECKING: + stage = Stage.INCOMING; + view.goToIncoming(); + break; + case OUTGOING: + if (!editSettings) { + stage = Stage.INCOMING; + view.goToIncoming(); + } else { + view.end(); + } + break; + case OUTGOING_CHECKING: + case ACCOUNT_NAMES: + if (autoconfiguration) { + stage = Stage.BASICS; + view.goToBasics(); + } else { + stage = Stage.OUTGOING; + view.goToOutgoing(); + } + break; + default: + view.end(); + break; + } + } + + @Override + public void setAccount(Account account) { + this.accountConfig = account; + } + + @Override + public Account getAccount() { + return (Account) accountConfig; + } + + public boolean isEditSettings() { + return editSettings; + } + + @Override + public void onGetAccountUuid(@Nullable String accountUuid) { + accountConfig = preferences.getAccount(accountUuid); + } + + @Override + public void onGetAccountConfig(@Nullable AccountConfigImpl accountConfig) { + this.accountConfig = accountConfig; + } + + @Override + public void onRestoreStart() { + restoring = true; + } + + @Override + public void onRestoreEnd() { + restoring = false; + } + + @Override + public AccountSetupStatus getStatus() { + return new AccountSetupStatus(currentIncomingSecurityType, currentIncomingAuthType, + currentIncomingPort, currentOutgoingSecurityType, currentOutgoingAuthType, + currentOutgoingPort, accountConfig.isNotifyNewMail(), accountConfig.isShowOngoing(), + accountConfig.getAutomaticCheckIntervalMinutes(), accountConfig.getDisplayCount(), accountConfig.getFolderPushMode(), + accountConfig.getName(), accountConfig.getDescription()); + } + + @Override + public AccountConfig getAccountConfig() { + return accountConfig; + } + + @Override + public void onGetMakeDefault(boolean makeDefault) { + this.makeDefault = makeDefault; + } + + private void manualSetup(String email, String password) { + autoconfiguration = false; + + if (accountConfig == null) { + accountConfig = new AccountConfigImpl(preferences); + } + + accountConfig.init(email, password); + + view.goToAccountType(); + } + + @Override + public void handleGmailXOAuth2Intent(Intent intent) { + view.startIntentForResult(intent, REQUEST_CODE_GMAIL); + } + + @Override + public void handleGmailRedirectUrl(final String url) { + handler.post(new Runnable() { + @Override + public void run() { + view.openGmailUrl(url); + } + }); + } + + @Override + public void handleOutlookRedirectUrl(final String url) { + handler.post(new Runnable() { + @Override + public void run() { + view.openOutlookUrl(url); + } + }); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_CODE_GMAIL) { + if (resultCode == Activity.RESULT_OK) { + checkIncomingAndOutgoing(); + } else { + view.goBack(); + } + } + } + + @Override + public void onOAuthCodeGot(final String code) { + oAuth2CodeGotten = true; + view.closeAuthDialog(); + new AsyncTask() { + @Override + protected Boolean doInBackground(Void... params) { + try { + Globals.getOAuth2TokenProvider().getAuthorizationCodeFlowTokenProvider().exchangeCode(accountConfig.getEmail(), code); + } catch (AuthenticationFailedException e) { + return false; + } + return true; + } + + @Override + protected void onPostExecute(Boolean result) { + if (result) { + checkIncomingAndOutgoing(); + } else { + oAuth2CodeGotten = false; + view.goToBasics(); + view.showErrorDialog("Error when exchanging code"); + } + } + }.execute(); + } + + @Override + public void onErrorWhenGettingOAuthCode(String errorMessage) { + oAuth2CodeGotten = false; + view.closeAuthDialog(); + view.goToBasics(); + view.showErrorDialog(errorMessage); + } + + @Override + public void onWebViewDismiss() { + if (!oAuth2CodeGotten) { + view.goToBasics(); + view.showErrorDialog("Couldn't sign in"); + } + } + + @Override + public void onPause() { + canceled = true; + } + + @Override + public void onStop() { + canceled = true; + } + + @Override + public void onDestroy() { + canceled = true; + destroyed = true; + } + + @Override + public void onResume() { + canceled = false; + destroyed = false; + } + + static class AccountSetupStatus { + private ConnectionSecurity incomingSecurityType; + private AuthType incomingAuthType; + private String incomingPort; + + private ConnectionSecurity outgoingSecurityType; + private AuthType outgoingAuthType; + private String outgoingPort; + + private boolean notifyNewMail; + private boolean showOngoing; + private int automaticCheckIntervalMinutes; + private int displayCount; + private Account.FolderMode folderPushMode; + + private String name; + private String description; + + AccountSetupStatus(ConnectionSecurity incomingSecurityType, AuthType incomingAuthType, + String incomingPort, ConnectionSecurity outgoingSecurityType, AuthType outgoingAuthType, + String outgoingPort, boolean notifyNewMail, boolean showOngoing, int automaticCheckIntervalMinutes, + int displayCount, Account.FolderMode folderPushMode, + String name, String description) { + this.incomingSecurityType = incomingSecurityType; + this.incomingAuthType = incomingAuthType; + this.incomingPort = incomingPort; + this.outgoingSecurityType = outgoingSecurityType; + this.outgoingAuthType = outgoingAuthType; + this.outgoingPort = outgoingPort; + this.notifyNewMail = notifyNewMail; + this.showOngoing = showOngoing; + this.automaticCheckIntervalMinutes = automaticCheckIntervalMinutes; + this.displayCount = displayCount; + this.folderPushMode = folderPushMode; + this.name = name; + this.description = description; + } + + public ConnectionSecurity getIncomingSecurityType() { + return incomingSecurityType; + } + + public AuthType getIncomingAuthType() { + return incomingAuthType; + } + + public String getIncomingPort() { + return incomingPort; + } + + public ConnectionSecurity getOutgoingSecurityType() { + return outgoingSecurityType; + } + + public AuthType getOutgoingAuthType() { + return outgoingAuthType; + } + + public String getOutgoingPort() { + return outgoingPort; + } + + public boolean isNotifyNewMail() { + return notifyNewMail; + } + + public boolean isShowOngoing() { + return showOngoing; + } + + public int getAutomaticCheckIntervalMinutes() { + return automaticCheckIntervalMinutes; + } + + public int getDisplayCount() { + return displayCount; + } + + public FolderMode getFolderPushMode() { + return folderPushMode; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + } + + +} + + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeAdapter.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeAdapter.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeAdapter.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeAdapter.java index 53a6d557ea3ce46b7767ebbde4c815b517c2d3ab..3174d1770a60418c34f61b835f4115fa15e99dbb 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeAdapter.java @@ -1,18 +1,18 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.widget.ArrayAdapter; -import com.fsck.k9.mail.AuthType; +import foundation.e.mail.mail.AuthType; -class AuthTypeAdapter extends ArrayAdapter { +public class AuthTypeAdapter extends ArrayAdapter { public AuthTypeAdapter(Context context, int resource, AuthTypeHolder[] holders) { super(context, resource, holders); } public static AuthTypeAdapter get(Context context) { - AuthType[] authTypes = new AuthType[]{AuthType.PLAIN, AuthType.CRAM_MD5, AuthType.EXTERNAL}; + AuthType[] authTypes = new AuthType[]{AuthType.PLAIN, AuthType.CRAM_MD5, AuthType.XOAUTH2, AuthType.EXTERNAL}; AuthTypeHolder[] holders = new AuthTypeHolder[authTypes.length]; for (int i = 0; i < authTypes.length; i++) { holders[i] = new AuthTypeHolder(authTypes[i], context.getResources()); diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeHolder.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeHolder.java similarity index 81% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeHolder.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeHolder.java index 6b81ddc461e1e400efb8d5866b6252da62d9a214..3af62c75aada8d38554ec65e0b4b24fd4dc2a4f4 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AuthTypeHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/AuthTypeHolder.java @@ -1,11 +1,11 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.res.Resources; -import com.fsck.k9.R; -import com.fsck.k9.mail.AuthType; +import foundation.e.mail.R; +import foundation.e.mail.mail.AuthType; -class AuthTypeHolder { +public class AuthTypeHolder { final AuthType authType; private final Resources resources; private boolean insecure; @@ -39,6 +39,8 @@ class AuthTypeHolder { } case CRAM_MD5: return R.string.account_setup_auth_type_encrypted_password; + case XOAUTH2: + return R.string.account_setup_auth_type_xoauth2; case EXTERNAL: return R.string.account_setup_auth_type_tls_client_certificate; @@ -48,4 +50,8 @@ class AuthTypeHolder { return 0; } } + + public AuthType getAuthType() { + return authType; + } } diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/CheckDirection.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/CheckDirection.java new file mode 100644 index 0000000000000000000000000000000000000000..848ac8008866d68465a1374ef544ce8831e7a88d --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/CheckDirection.java @@ -0,0 +1,9 @@ +package foundation.e.mail.activity.setup; + + +public enum CheckDirection { + INCOMING, + OUTGOING, + BOTH +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityAdapter.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityAdapter.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityAdapter.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityAdapter.java index 6993699948355f97cb0e87c9369b7eba553b1dec..5a45c446ed0fd287ec3e2e746a6cd755667edafc 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityAdapter.java @@ -1,12 +1,12 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.widget.ArrayAdapter; -import com.fsck.k9.mail.ConnectionSecurity; +import foundation.e.mail.mail.ConnectionSecurity; -class ConnectionSecurityAdapter extends ArrayAdapter { +public class ConnectionSecurityAdapter extends ArrayAdapter { public ConnectionSecurityAdapter(Context context, int resource, ConnectionSecurityHolder[] securityTypes) { super(context, resource, securityTypes); } diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityHolder.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityHolder.java similarity index 78% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityHolder.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityHolder.java index d9afa6d874782aad8ae2c002311370f7d17021c6..af28dab2adea368d3ee95332d66303a9e6cd594f 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/ConnectionSecurityHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/ConnectionSecurityHolder.java @@ -1,11 +1,11 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.res.Resources; -import com.fsck.k9.R; -import com.fsck.k9.mail.ConnectionSecurity; +import foundation.e.mail.R; +import foundation.e.mail.mail.ConnectionSecurity; -class ConnectionSecurityHolder { +public class ConnectionSecurityHolder { final ConnectionSecurity connectionSecurity; private final Resources resources; @@ -31,4 +31,8 @@ class ConnectionSecurityHolder { default: return 0; } } + + public ConnectionSecurity getConnectionSecurity() { + return connectionSecurity; + } } diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/EeloAccountCreator.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/EeloAccountCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..1b535934dc1823136b8db6259b51b401c392143d --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/EeloAccountCreator.java @@ -0,0 +1,184 @@ +package foundation.e.mail.activity.setup; + +import android.content.Context; +import android.content.res.XmlResourceParser; +import android.support.annotation.NonNull; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Locale; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.account.AccountCreator; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.store.RemoteStore; +import timber.log.Timber; + +public class EeloAccountCreator { + private static AccountConfigImpl accountConfig; + + public static void createAccount(Context context, String emailId, String password) { + Preferences preferences = Preferences.getPreferences(context); + + accountConfig = new AccountConfigImpl(preferences); + try { + String[] emailParts = EmailHelper.splitEmail(emailId); + AccountSetupPresenter.Provider provider = findProviderForDomain(context, emailParts[1]); + if (provider != null) { + modifyAccount(emailId, password, provider); + } + } + catch (Exception e) { + Timber.e(e, "Error while trying to initialise account configuration."); + } + + Account account = preferences.newAccount(); + account.setDeviceAccount(true); + account.loadConfig(accountConfig); + + MessagingController.getInstance(context).listFoldersSynchronous(account, true, null); + MessagingController.getInstance(context) + .synchronizeMailbox(account, account.getInboxFolderName(), null, null); + + account.save(preferences); + + preferences.setDefaultAccount(account); + + K9.setServicesEnabled(context); + } + + private static void modifyAccount(String email, String password, + @NonNull AccountSetupPresenter.Provider provider) + throws URISyntaxException { + accountConfig.init(email, password); + accountConfig.setDescription(email); + + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + String userEnc = UrlEncodingHelper.encodeUtf8(user); + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + + String incomingUsername = provider.incomingUsernameTemplate; + incomingUsername = incomingUsername.replaceAll("\\$email", email); + incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); + incomingUsername = incomingUsername.replaceAll("\\$domain", domain); + + URI incomingUriTemplate = provider.incomingUriTemplate; + String incomingUserInfo = incomingUsername + ":" + passwordEnc; + URI incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUserInfo, + incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, null, null); + + String outgoingUsername = provider.outgoingUsernameTemplate; + + URI outgoingUriTemplate = provider.outgoingUriTemplate; + + + URI outgoingUri; + if (outgoingUsername != null) { + outgoingUsername = outgoingUsername.replaceAll("\\$email", email); + outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); + outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); + + String outgoingUserInfo = outgoingUsername + ":" + passwordEnc; + outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUserInfo, + outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } else { + outgoingUri = new URI(outgoingUriTemplate.getScheme(), + null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } + + accountConfig.setStoreUri(incomingUri.toString()); + accountConfig.setTransportUri(outgoingUri.toString()); + + setupFolderNames(incomingUriTemplate.getHost().toLowerCase(Locale.US)); + + ServerSettings incomingSettings = RemoteStore.decodeStoreUri(incomingUri.toString()); + accountConfig.setDeletePolicy(AccountCreator.getDefaultDeletePolicy(incomingSettings.type)); + } + + private static void setupFolderNames(String domain) { + accountConfig.setDraftsFolderName(K9.getK9String(foundation.e.mail.R.string.special_mailbox_name_drafts)); + accountConfig.setTrashFolderName(K9.getK9String(foundation.e.mail.R.string.special_mailbox_name_trash)); + accountConfig.setSentFolderName(K9.getK9String(foundation.e.mail.R.string.special_mailbox_name_sent)); + accountConfig.setArchiveFolderName(K9.getK9String(foundation.e.mail.R.string.special_mailbox_name_archive)); + + // Yahoo! has a special folder for Spam, called "Bulk Mail". + if (domain.endsWith(".yahoo.com")) { + accountConfig.setSpamFolderName("Bulk Mail"); + } else { + accountConfig.setSpamFolderName(K9.getK9String(foundation.e.mail.R.string.special_mailbox_name_spam)); + } + } + + private static AccountSetupPresenter.Provider findProviderForDomain(Context context, + String domain) { + try { + XmlResourceParser xml = context.getResources().getXml(foundation.e.mail.R.xml.providers); + int xmlEventType; + AccountSetupPresenter.Provider provider = null; + while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { + if (xmlEventType == XmlResourceParser.START_TAG + && "provider".equals(xml.getName()) + && domain.equalsIgnoreCase(getXmlAttribute(context, xml, "domain"))) { + provider = new AccountSetupPresenter.Provider(); + provider.id = getXmlAttribute(context, xml, "id"); + provider.label = getXmlAttribute(context, xml, "label"); + provider.domain = getXmlAttribute(context, xml, "domain"); + provider.note = getXmlAttribute(context, xml, "note"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "incoming".equals(xml.getName()) + && provider != null) { + provider.incomingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.incomingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "outgoing".equals(xml.getName()) + && provider != null) { + provider.outgoingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.outgoingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.END_TAG + && "provider".equals(xml.getName()) + && provider != null) { + return provider; + } + } + if (provider == null) { + provider = new AccountSetupPresenter.Provider(); + provider.id = domain; + provider.label = domain + " mail service"; + provider.domain = domain; + provider.note = ""; + provider.incomingUriTemplate = new URI("imap+ssl+://mail." + domain); + provider.incomingUsernameTemplate = "$email"; + provider.outgoingUriTemplate = new URI("smtp+tls+://mail." + domain); + provider.outgoingUsernameTemplate = "$email"; + } + + } catch (Exception e) { + Timber.e(e, "Error while trying to load provider settings."); + } + return null; + } + + private static String getXmlAttribute(Context context, XmlResourceParser xml, String name) { + int resId = xml.getAttributeResourceValue(null, name, 0); + if (resId == 0) { + return xml.getAttributeValue(null, name); + } else { + return context.getString(resId); + } + } +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/FolderSettings.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/FolderSettings.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/FolderSettings.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/FolderSettings.java index ffe6de63ba5aa8f12336030e89faeeb858329fd6..e8f5c013c34bf48f973a5f17ea52b0e15445210e 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/FolderSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/FolderSettings.java @@ -1,5 +1,5 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.content.Intent; @@ -7,23 +7,24 @@ import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; import timber.log.Timber; -import com.fsck.k9.*; -import com.fsck.k9.activity.FolderInfoHolder; -import com.fsck.k9.activity.K9PreferenceActivity; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Folder.FolderClass; - -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.service.MailService; +import foundation.e.mail.activity.FolderInfoHolder; +import foundation.e.mail.activity.K9PreferenceActivity; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Folder.FolderClass; + +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.service.MailService; public class FolderSettings extends K9PreferenceActivity { - private static final String EXTRA_FOLDER_NAME = "com.fsck.k9.folderName"; - private static final String EXTRA_ACCOUNT = "com.fsck.k9.account"; + private static final String EXTRA_FOLDER_NAME = "foundation.e.mail.folderName"; + private static final String EXTRA_ACCOUNT = "foundation.e.mail.account"; private static final String PREFERENCE_TOP_CATERGORY = "folder_settings"; private static final String PREFERENCE_DISPLAY_CLASS = "folder_settings_folder_display_mode"; @@ -74,7 +75,7 @@ public class FolderSettings extends K9PreferenceActivity { Timber.e(e, "Could not get remote store"); } - addPreferencesFromResource(R.xml.folder_settings_preferences); + addPreferencesFromResource(foundation.e.mail.R.xml.folder_settings_preferences); String displayName = FolderInfoHolder.getDisplayName(this, mAccount, mFolder.getName()); Preference category = findPreference(PREFERENCE_TOP_CATERGORY); diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/FontSizeSettings.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/FontSizeSettings.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/FontSizeSettings.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/FontSizeSettings.java index c688b6bb13b9b871833d86e117a3050d221db455..8c51d167973274d71095a674b9335d1e7081ff1f 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/FontSizeSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/FontSizeSettings.java @@ -1,13 +1,16 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.preference.*; -import com.fsck.k9.*; -import com.fsck.k9.activity.K9PreferenceActivity; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; +import foundation.e.mail.activity.K9PreferenceActivity; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; /** diff --git a/k9mail/src/main/java/foundation/e/mail/activity/setup/GoogleAccountCreator.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/GoogleAccountCreator.java new file mode 100644 index 0000000000000000000000000000000000000000..c364fd7a441f95c4a47b26220c7a4d7d631324f4 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/GoogleAccountCreator.java @@ -0,0 +1,55 @@ +package foundation.e.mail.activity.setup; + +import android.content.Context; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.controller.MessagingController; + +public class GoogleAccountCreator { + public static void createAccount(Context context, String emailId) { + Preferences preferences = Preferences.getPreferences(context); + + AccountConfigImpl accountConfig = new AccountConfigImpl(preferences); + accountConfig.setName(emailId); + accountConfig.setEmail(emailId); + accountConfig.setDescription(emailId); + accountConfig.setTrashFolderName("[Gmail]/Trash"); + accountConfig.setArchiveFolderName("[Gmail]/All Mail"); + accountConfig.setDraftsFolderName("[Gmail]/Drafts"); + accountConfig.setInboxFolderName("INBOX"); + accountConfig.setSentFolderName("[Gmail]/Sent Mail"); + accountConfig.setSpamFolderName("[Gmail]/Spam"); + accountConfig.setAutoExpandFolderName("INBOX"); + + try { + accountConfig.setStoreUri("imap+ssl+://XOAUTH2:" + + URLEncoder.encode(emailId, "UTF-8") + ":@imap.gmail.com"); + accountConfig.setTransportUri("smtp+ssl+://" + + URLEncoder.encode(emailId, "UTF-8") + + "::XOAUTH2@smtp.gmail.com"); + } + catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + Account account = preferences.newAccount(); + account.setDeviceAccount(true); + account.loadConfig(accountConfig); + + MessagingController.getInstance(context).listFoldersSynchronous(account, true, null); + MessagingController.getInstance(context) + .synchronizeMailbox(account, account.getInboxFolderName(), null, null); + + account.save(preferences); + + preferences.setDefaultAccount(account); + + K9.setServicesEnabled(context); + } +} + diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/OpenPgpAppSelectDialog.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/OpenPgpAppSelectDialog.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/OpenPgpAppSelectDialog.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/OpenPgpAppSelectDialog.java index 1619b092dbe6607372c7e70eb47c6099c85a724e..ea494f19303d128365e7718214cec03d3169f448 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/OpenPgpAppSelectDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/OpenPgpAppSelectDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import java.util.ArrayList; @@ -22,11 +22,11 @@ import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.TextView; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.ui.dialog.ApgDeprecationWarningDialog; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.ui.dialog.ApgDeprecationWarningDialog; import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpAppPreference; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/Prefs.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/Prefs.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/Prefs.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/Prefs.java index b532e0a65a55d6032f63695fd94801308e3aabae..7e69d7a44a72bca7a270e67a638a8a95e407697b 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/Prefs.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/Prefs.java @@ -1,47 +1,43 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.content.Intent; -import android.net.Uri; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.text.TextUtils; import android.widget.Toast; -import com.fsck.k9.K9; -import com.fsck.k9.K9.NotificationHideSubject; -import com.fsck.k9.K9.NotificationQuickDelete; -import com.fsck.k9.K9.SplitViewMode; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.ColorPickerDialog; -import com.fsck.k9.activity.K9PreferenceActivity; -import com.fsck.k9.helper.FileBrowserHelper; -import com.fsck.k9.helper.FileBrowserHelper.FileBrowserFailOverCallback; -import com.fsck.k9.notification.NotificationController; -import com.fsck.k9.preferences.CheckBoxListPreference; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.preferences.TimePickerPreference; -import com.fsck.k9.service.MailService; -import com.fsck.k9.ui.dialog.ApgDeprecationWarningDialog; import org.openintents.openpgp.util.OpenPgpAppPreference; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import foundation.e.mail.K9; +import foundation.e.mail.K9.NotificationHideSubject; +import foundation.e.mail.K9.NotificationQuickDelete; +import foundation.e.mail.K9.SplitViewMode; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.ColorPickerDialog; +import foundation.e.mail.activity.K9PreferenceActivity; +import foundation.e.mail.notification.NotificationController; +import foundation.e.mail.preferences.CheckBoxListPreference; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.preferences.TimePickerPreference; +import foundation.e.mail.service.MailService; +import foundation.e.mail.ui.dialog.ApgDeprecationWarningDialog; + public class Prefs extends K9PreferenceActivity { @@ -70,7 +66,6 @@ public class Prefs extends K9PreferenceActivity { private static final String PREFERENCE_HIDE_SPECIAL_ACCOUNTS = "hide_special_accounts"; private static final String PREFERENCE_MESSAGELIST_CHECKBOXES = "messagelist_checkboxes"; private static final String PREFERENCE_MESSAGELIST_PREVIEW_LINES = "messagelist_preview_lines"; - private static final String PREFERENCE_MESSAGELIST_SENDER_ABOVE_SUBJECT = "messagelist_sender_above_subject"; private static final String PREFERENCE_MESSAGELIST_STARS = "messagelist_stars"; private static final String PREFERENCE_MESSAGELIST_SHOW_CORRESPONDENT_NAMES = "messagelist_show_correspondent_names"; private static final String PREFERENCE_MESSAGELIST_SHOW_CONTACT_NAME = "messagelist_show_contact_name"; @@ -136,7 +131,6 @@ public class Prefs extends K9PreferenceActivity { private CheckBoxPreference mCountSearch; private CheckBoxPreference mHideSpecialAccounts; private ListPreference mPreviewLines; - private CheckBoxPreference mSenderAboveSubject; private CheckBoxPreference mCheckboxes; private CheckBoxPreference mStars; private CheckBoxPreference mShowCorrespondentNames; @@ -162,11 +156,10 @@ public class Prefs extends K9PreferenceActivity { private CheckBoxPreference mQuietTimeEnabled; private CheckBoxPreference mDisableNotificationDuringQuietTime; - private com.fsck.k9.preferences.TimePickerPreference mQuietTimeStarts; - private com.fsck.k9.preferences.TimePickerPreference mQuietTimeEnds; + private foundation.e.mail.preferences.TimePickerPreference mQuietTimeStarts; + private foundation.e.mail.preferences.TimePickerPreference mQuietTimeEnds; private ListPreference mNotificationQuickDelete; private ListPreference mLockScreenNotificationVisibility; - private Preference mAttachmentPathPreference; private CheckBoxPreference mBackgroundAsUnreadIndicator; private CheckBoxPreference mThreadedView; @@ -269,8 +262,6 @@ public class Prefs extends K9PreferenceActivity { mPreviewLines = setupListPreference(PREFERENCE_MESSAGELIST_PREVIEW_LINES, Integer.toString(K9.messageListPreviewLines())); - mSenderAboveSubject = (CheckBoxPreference)findPreference(PREFERENCE_MESSAGELIST_SENDER_ABOVE_SUBJECT); - mSenderAboveSubject.setChecked(K9.messageListSenderAboveSubject()); mCheckboxes = (CheckBoxPreference)findPreference(PREFERENCE_MESSAGELIST_CHECKBOXES); mCheckboxes.setChecked(K9.messageListCheckboxes()); @@ -410,36 +401,6 @@ public class Prefs extends K9PreferenceActivity { mOpenPgpSupportSignOnly = (CheckBoxPreference) findPreference(PREFERENCE_OPENPGP_SUPPORT_SIGN_ONLY); mOpenPgpSupportSignOnly.setChecked(K9.getOpenPgpSupportSignOnly()); - mAttachmentPathPreference = findPreference(PREFERENCE_ATTACHMENT_DEF_PATH); - mAttachmentPathPreference.setSummary(K9.getAttachmentDefaultPath()); - mAttachmentPathPreference - .setOnPreferenceClickListener(new OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - FileBrowserHelper - .getInstance() - .showFileBrowserActivity(Prefs.this, - new File(K9.getAttachmentDefaultPath()), - ACTIVITY_CHOOSE_FOLDER, callback); - - return true; - } - - FileBrowserFailOverCallback callback = new FileBrowserFailOverCallback() { - - @Override - public void onPathEntered(String path) { - mAttachmentPathPreference.setSummary(path); - K9.setAttachmentDefaultPath(path); - } - - @Override - public void onCancel() { - // canceled, do nothing - } - }; - }); - mWrapFolderNames = (CheckBoxPreference)findPreference(PREFERENCE_FOLDERLIST_WRAP_NAME); mWrapFolderNames.setChecked(K9.wrapFolderNames()); @@ -518,7 +479,6 @@ public class Prefs extends K9PreferenceActivity { K9.setMessageListCheckboxes(mCheckboxes.isChecked()); K9.setMessageListStars(mStars.isChecked()); K9.setShowCorrespondentNames(mShowCorrespondentNames.isChecked()); - K9.setMessageListSenderAboveSubject(mSenderAboveSubject.isChecked()); K9.setShowContactName(mShowContactName.isChecked()); K9.setShowContactPicture(mShowContactPicture.isChecked()); K9.setColorizeMissingContactPictures(mColorizeMissingContactPictures.isChecked()); @@ -554,7 +514,6 @@ public class Prefs extends K9PreferenceActivity { } K9.setSplitViewMode(SplitViewMode.valueOf(mSplitViewMode.getValue())); - K9.setAttachmentDefaultPath(mAttachmentPathPreference.getSummary().toString()); boolean needsRefresh = K9.setBackgroundOps(mBackgroundOps.getValue()); if (!K9.isDebug() && mDebugLogging.isChecked()) { @@ -615,25 +574,4 @@ public class Prefs extends K9PreferenceActivity { } return dialog; } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case ACTIVITY_CHOOSE_FOLDER: - if (resultCode == RESULT_OK && data != null) { - // obtain the filename - Uri fileUri = data.getData(); - if (fileUri != null) { - String filePath = fileUri.getPath(); - if (filePath != null) { - mAttachmentPathPreference.setSummary(filePath.toString()); - K9.setAttachmentDefaultPath(filePath.toString()); - } - } - } - break; - } - - super.onActivityResult(requestCode, resultCode, data); - } } diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/SliderPreference.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/SliderPreference.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/SliderPreference.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/SliderPreference.java index cf84b352d6b59f1414f75daa9150c09071086790..b7dd6145737d1611529eb8409b8e1eec8827e247 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/SliderPreference.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/SliderPreference.java @@ -22,7 +22,7 @@ * Source: https://github.com/jayschwa/AndroidSliderPreference */ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.content.res.TypedArray; @@ -33,8 +33,7 @@ import android.support.annotation.ArrayRes; import android.util.AttributeSet; import android.view.View; import android.widget.SeekBar; -import com.fsck.k9.*; - +import foundation.e.mail.R; /** * @author Jay Weisskopf diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/SpinnerOption.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/SpinnerOption.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/SpinnerOption.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/SpinnerOption.java index 89275b97424b8b0e8bd3343e45df1495c170155d..71eea911a83367eaa64f55b97ed11a4bc92b6daf 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/SpinnerOption.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/SpinnerOption.java @@ -2,7 +2,7 @@ * */ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.widget.Spinner; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/WelcomeMessage.java b/k9mail/src/main/java/foundation/e/mail/activity/setup/WelcomeMessage.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/activity/setup/WelcomeMessage.java rename to k9mail/src/main/java/foundation/e/mail/activity/setup/WelcomeMessage.java index 34c92cc1a10fa69a5eea300699c87919ffef0a9e..1e0f2379cef5eff48500f0962048b302d47be281 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/WelcomeMessage.java +++ b/k9mail/src/main/java/foundation/e/mail/activity/setup/WelcomeMessage.java @@ -1,4 +1,4 @@ -package com.fsck.k9.activity.setup; +package foundation.e.mail.activity.setup; import android.content.Context; import android.content.Intent; @@ -8,10 +8,10 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; -import com.fsck.k9.R; -import com.fsck.k9.activity.Accounts; -import com.fsck.k9.activity.K9Activity; -import com.fsck.k9.message.html.HtmlConverter; +import foundation.e.mail.R; +import foundation.e.mail.activity.Accounts; +import foundation.e.mail.activity.K9Activity; +import foundation.e.mail.message.html.HtmlConverter; /** * Displays a welcome message when no accounts have been created yet. @@ -40,7 +40,7 @@ public class WelcomeMessage extends K9Activity implements OnClickListener{ public void onClick(View view) { switch (view.getId()) { case R.id.next: { - AccountSetupBasics.actionNewAccount(this); + AccountSetupActivity.actionNewAccount(this); finish(); break; } diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeader.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeader.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeader.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeader.java index b63e4259fcae9f76d390352e9430117b61a66e2d..1693071330c6d352bfc7e93b04451f2eb695ec65 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeader.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.util.Arrays; diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeaderParser.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeaderParser.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeaderParser.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeaderParser.java index d5f299454f5992dba1881898603d624944a99b1d..27de202caa5f6e2ad65cc5970779b4876c9c0795 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptGossipHeaderParser.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptGossipHeaderParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.util.ArrayList; @@ -10,8 +10,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MimeUtility; import okio.ByteString; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeader.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeader.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeader.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeader.java index 7a71b0fe066798855299151dd045f060e226d31b..4e51e6a9b1a5cc750d4c617627a6b3755fba46c4 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeader.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.util.Arrays; diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeaderParser.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeaderParser.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeaderParser.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeaderParser.java index 68692447856f877def92fe5f206c0c2b332b3a6f..d759a3e7bd55502e2636929a11fd60f7b65d18fb 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptHeaderParser.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptHeaderParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.util.ArrayList; @@ -8,8 +8,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.internet.MimeUtility; import okio.ByteString; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOpenPgpApiInteractor.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOpenPgpApiInteractor.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOpenPgpApiInteractor.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOpenPgpApiInteractor.java index 4d0927c87e0f5f04e22229a5e5a5f161293e6b7d..a594ab2b09443a9cab728d57453a9900ae5bc56e 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOpenPgpApiInteractor.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOpenPgpApiInteractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.io.ByteArrayOutputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOperations.java b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOperations.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOperations.java rename to k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOperations.java index ffe4b2466fc38fb80d560477a32ba67aa9d615a7..d1a50bed1a590df0528b9373e510f0201c8ebf1b 100644 --- a/k9mail/src/main/java/com/fsck/k9/autocrypt/AutocryptOperations.java +++ b/k9mail/src/main/java/foundation/e/mail/autocrypt/AutocryptOperations.java @@ -1,4 +1,4 @@ -package com.fsck.k9.autocrypt; +package foundation.e.mail.autocrypt; import java.util.ArrayList; @@ -10,10 +10,10 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.internet.MimeBodyPart; import org.openintents.openpgp.AutocryptPeerUpdate; import org.openintents.openpgp.util.OpenPgpApi; diff --git a/k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCache.java b/k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCache.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCache.java rename to k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCache.java index 66ec2afec2d3c0be0dd92f9357c33f27a389119b..ae2996928ea35947f7af3d2739add544cf9903f2 100644 --- a/k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCache.java +++ b/k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCache.java @@ -1,4 +1,4 @@ -package com.fsck.k9.cache; +package foundation.e.mail.cache; import java.util.HashMap; import java.util.List; @@ -9,11 +9,11 @@ import android.content.Intent; import android.net.Uri; import android.support.v4.content.LocalBroadcastManager; -import com.fsck.k9.fragment.MessageListFragment; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.provider.EmailProvider; +import foundation.e.mail.fragment.MessageListFragment; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.provider.EmailProvider; /** * Cache to bridge the time needed to write (user-initiated) changes to the database. diff --git a/k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCacheCursor.java b/k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCacheCursor.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCacheCursor.java rename to k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCacheCursor.java index 55e4882fda094195cad0f80a990f8e26fa3beca7..fba90a88f20b5e8fcf6ca241b2aaae614cb0f4ff 100644 --- a/k9mail/src/main/java/com/fsck/k9/cache/EmailProviderCacheCursor.java +++ b/k9mail/src/main/java/foundation/e/mail/cache/EmailProviderCacheCursor.java @@ -1,10 +1,10 @@ -package com.fsck.k9.cache; +package foundation.e.mail.cache; import java.util.ArrayList; import java.util.List; -import com.fsck.k9.provider.EmailProvider.MessageColumns; -import com.fsck.k9.provider.EmailProvider.ThreadColumns; +import foundation.e.mail.provider.EmailProvider.MessageColumns; +import foundation.e.mail.provider.EmailProvider.ThreadColumns; import android.content.Context; import android.database.Cursor; diff --git a/k9mail/src/main/java/com/fsck/k9/controller/MemorizingMessagingListener.java b/k9mail/src/main/java/foundation/e/mail/controller/MemorizingMessagingListener.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/controller/MemorizingMessagingListener.java rename to k9mail/src/main/java/foundation/e/mail/controller/MemorizingMessagingListener.java index a5441287b95d71e649c93265281dc3e0afb1dc24..fdd13490c65910ffb814c86311a2ba867eec4803 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/MemorizingMessagingListener.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/MemorizingMessagingListener.java @@ -1,4 +1,4 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.util.HashMap; @@ -6,7 +6,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import com.fsck.k9.Account; +import foundation.e.mail.Account; class MemorizingMessagingListener extends SimpleMessagingListener { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java b/k9mail/src/main/java/foundation/e/mail/controller/MessagingController.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java rename to k9mail/src/main/java/foundation/e/mail/controller/MessagingController.java index 718c6efe1668dee59aa8794b994178e6115d0ade..f79d8071012c57d30c5562a3e5f6549d868e1e54 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/MessagingController.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/MessagingController.java @@ -1,8 +1,13 @@ -package com.fsck.k9.controller; - +package foundation.e.mail.controller; +import java.io.CharArrayWriter; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.io.PrintWriter; import java.util.ArrayList; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -24,86 +29,106 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.PriorityBlockingQueue; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import android.accounts.AccountManager; import android.annotation.SuppressLint; +import android.app.NotificationManager; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.res.XmlResourceParser; +import android.content.pm.PackageInfo; import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.PowerManager; import android.os.Process; import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.Account; -import com.fsck.k9.Account.DeletePolicy; -import com.fsck.k9.Account.Expunge; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.K9; -import com.fsck.k9.K9.Intents; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.ActivityListener; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection; -import com.fsck.k9.cache.EmailProviderCache; -import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; -import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; -import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; -import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMoveOrCopy; -import com.fsck.k9.controller.MessagingControllerCommands.PendingSetFlag; -import com.fsck.k9.controller.ProgressBodyFactory.ProgressListener; -import com.fsck.k9.controller.imap.ImapMessageStore; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.BodyFactory; -import com.fsck.k9.mail.CertificateValidationException; -import com.fsck.k9.mail.DefaultBodyFactory; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.FetchProfile.Item; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Folder.FolderType; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mail.Pusher; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.Transport; -import com.fsck.k9.mail.TransportProvider; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; -import com.fsck.k9.mail.store.pop3.Pop3Store; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalFolder.MoreMessages; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.mailstore.MessageRemovalListener; -import com.fsck.k9.mailstore.UnavailableStorageException; -import com.fsck.k9.notification.NotificationController; -import com.fsck.k9.provider.EmailProvider; -import com.fsck.k9.provider.EmailProvider.StatsColumns; -import com.fsck.k9.search.ConditionsTreeNode; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchAccount; -import com.fsck.k9.search.SearchSpecification; -import com.fsck.k9.search.SqlQueryBuilder; +import foundation.e.mail.Account; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.Expunge; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.Expunge; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.Globals; +import foundation.e.mail.K9; +import foundation.e.mail.K9.Intents; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.ActivityListener; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.setup.AccountSetupPresenter; +import foundation.e.mail.activity.setup.CheckDirection; +import foundation.e.mail.cache.EmailProviderCache; +import foundation.e.mail.controller.MessagingControllerCommands.PendingAppend; +import foundation.e.mail.controller.MessagingControllerCommands.PendingCommand; +import foundation.e.mail.controller.MessagingControllerCommands.PendingEmptyTrash; +import foundation.e.mail.controller.MessagingControllerCommands.PendingExpunge; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMarkAllAsRead; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMoveOrCopy; +import foundation.e.mail.controller.MessagingControllerCommands.PendingSetFlag; +import foundation.e.mail.controller.ProgressBodyFactory.ProgressListener; +import foundation.e.mail.controller.imap.ImapMessageStore; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.helper.EmailHelper; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.BodyFactory; +import foundation.e.mail.mail.CertificateValidationException; +import foundation.e.mail.mail.DefaultBodyFactory; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.FetchProfile.Item; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Folder.FolderType; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mail.Pusher; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.Transport; +import foundation.e.mail.mail.TransportProvider; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMessageHelper; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.store.pop3.Pop3Store; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalFolder.MoreMessages; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.mailstore.MessageRemovalListener; +import foundation.e.mail.mailstore.UnavailableStorageException; +import foundation.e.mail.notification.NotificationController; +import foundation.e.mail.provider.EmailProvider; +import foundation.e.mail.provider.EmailProvider.StatsColumns; +import foundation.e.mail.search.ConditionsTreeNode; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchAccount; +import foundation.e.mail.search.SearchSpecification; +import foundation.e.mail.search.SqlQueryBuilder; import timber.log.Timber; -import static com.fsck.k9.K9.MAX_SEND_ATTEMPTS; -import static com.fsck.k9.mail.Flag.X_REMOTE_COPY_STARTED; +import static foundation.e.mail.K9.MAX_SEND_ATTEMPTS; +import static foundation.e.mail.mail.Flag.X_REMOTE_COPY_STARTED; + +import static foundation.e.mail.account.OAuthConstants.ACCOUNT_EMAIL_ADDRESS_KEY; +import static foundation.e.mail.account.OAuthConstants.EELO_ACCOUNT_TYPE; +import static foundation.e.mail.account.OAuthConstants.GOOGLE_ACCOUNT_TYPE; +import static foundation.e.mail.account.OAuthConstants.MAIL_CONTENT_AUTHORITY; /** @@ -142,8 +167,6 @@ public class MessagingController { private final MemorizingMessagingListener memorizingMessagingListener = new MemorizingMessagingListener(); private final TransportProvider transportProvider; - private ImapMessageStore imapMessageStore; - private MessagingListener checkMailListener = null; private volatile boolean stopped = false; @@ -163,7 +186,7 @@ public class MessagingController { @VisibleForTesting MessagingController(Context context, NotificationController notificationController, - Contacts contacts, TransportProvider transportProvider) { + Contacts contacts, TransportProvider transportProvider) { this.context = context; this.notificationController = notificationController; this.contacts = contacts; @@ -237,7 +260,7 @@ public class MessagingController { } private void putCommand(BlockingQueue queue, String description, MessagingListener listener, - Runnable runnable, boolean isForeground) { + Runnable runnable, boolean isForeground) { int retries = 10; Exception e = null; while (retries-- > 0) { @@ -257,19 +280,6 @@ public class MessagingController { throw new Error(e); } - private RemoteMessageStore getRemoteMessageStore(Account account) { - return account.getStoreUri().startsWith("imap") ? getImapMessageStore() : null; - } - - private ImapMessageStore getImapMessageStore() { - if (imapMessageStore == null) { - imapMessageStore = new ImapMessageStore(notificationController, this, context); - } - - return imapMessageStore; - } - - public void addListener(MessagingListener listener) { listeners.add(listener); refreshListener(listener); @@ -321,7 +331,7 @@ public class MessagingController { } private void setFlagInCache(final Account account, final List messageIds, - final Flag flag, final boolean newState) { + final Flag flag, final boolean newState) { EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context); String columnName = LocalStore.getColumnNameForFlag(flag); @@ -330,7 +340,7 @@ public class MessagingController { } private void removeFlagFromCache(final Account account, final List messageIds, - final Flag flag) { + final Flag flag) { EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context); String columnName = LocalStore.getColumnNameForFlag(flag); @@ -338,7 +348,7 @@ public class MessagingController { } private void setFlagForThreadsInCache(final Account account, final List threadRootIds, - final Flag flag, final boolean newState) { + final Flag flag, final boolean newState) { EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context); String columnName = LocalStore.getColumnNameForFlag(flag); @@ -347,7 +357,7 @@ public class MessagingController { } private void removeFlagForThreadsFromCache(final Account account, final List messageIds, - final Flag flag) { + final Flag flag) { EmailProviderCache cache = EmailProviderCache.getCache(account.getUuid(), context); String columnName = LocalStore.getColumnNameForFlag(flag); @@ -381,7 +391,7 @@ public class MessagingController { * TODO this needs to cache the remote folder list */ public void listFoldersSynchronous(final Account account, final boolean refreshRemote, - final MessagingListener listener) { + final MessagingListener listener) { for (MessagingListener l : getListeners(listener)) { l.listFoldersStarted(account); } @@ -567,7 +577,7 @@ public class MessagingController { } public Future searchRemoteMessages(final String acctUuid, final String folderName, final String query, - final Set requiredFlags, final Set forbiddenFlags, final MessagingListener listener) { + final Set requiredFlags, final Set forbiddenFlags, final MessagingListener listener) { Timber.i("searchRemoteMessages (acct = %s, folderName = %s, query = %s)", acctUuid, folderName, query); return threadPool.submit(new Runnable() { @@ -580,7 +590,7 @@ public class MessagingController { @VisibleForTesting void searchRemoteMessagesSynchronous(final String acctUuid, final String folderName, final String query, - final Set requiredFlags, final Set forbiddenFlags, final MessagingListener listener) { + final Set requiredFlags, final Set forbiddenFlags, final MessagingListener listener) { final Account acct = Preferences.getPreferences(context).getAccount(acctUuid); if (listener != null) { @@ -645,7 +655,7 @@ public class MessagingController { } public void loadSearchResults(final Account account, final String folderName, final List messages, - final MessagingListener listener) { + final MessagingListener listener) { threadPool.execute(new Runnable() { @Override public void run() { @@ -679,7 +689,7 @@ public class MessagingController { } private void loadSearchResultsSynchronous(List messages, LocalFolder localFolder, Folder remoteFolder, - MessagingListener listener) throws MessagingException { + MessagingListener listener) throws MessagingException { final FetchProfile header = new FetchProfile(); header.add(FetchProfile.Item.FLAGS); header.add(FetchProfile.Item.ENVELOPE); @@ -719,7 +729,7 @@ public class MessagingController { * Start background synchronization of the specified folder. */ public void synchronizeMailbox(final Account account, final String folder, final MessagingListener listener, - final Folder providedRemoteFolder) { + final Folder providedRemoteFolder) { putBackground("synchronizeMailbox", listener, new Runnable() { @Override public void run() { @@ -736,17 +746,7 @@ public class MessagingController { */ @VisibleForTesting void synchronizeMailboxSynchronous(final Account account, final String folder, final MessagingListener listener, - Folder providedRemoteFolder) { - RemoteMessageStore remoteMessageStore = getRemoteMessageStore(account); - if (remoteMessageStore != null) { - remoteMessageStore.sync(account, folder, listener, providedRemoteFolder); - } else { - synchronizeMailboxSynchronousLegacy(account, folder, listener); - } - } - - void synchronizeMailboxSynchronousLegacy(Account account, String folder, MessagingListener listener) { - + Folder providedRemoteFolder) { Folder remoteFolder = null; LocalFolder tLocalFolder = null; @@ -1027,7 +1027,7 @@ public class MessagingController { * to treat Pop3 and Imap the same in this code. */ private boolean verifyOrCreateRemoteSpecialFolder(Account account, String folder, Folder remoteFolder, - MessagingListener listener) throws MessagingException { + MessagingListener listener) throws MessagingException { if (folder.equals(account.getTrashFolderName()) || folder.equals(account.getSentFolderName()) || folder.equals(account.getDraftsFolderName())) { @@ -1049,26 +1049,18 @@ public class MessagingController { * Fetches the messages described by inputMessages from the remote store and writes them to * local storage. * - * @param account - * The account the remote store belongs to. - * @param remoteFolder - * The remote folder to download messages from. - * @param localFolder - * The {@link LocalFolder} instance corresponding to the remote folder. - * @param inputMessages - * A list of messages objects that store the UIDs of which messages to download. - * @param flagSyncOnly - * Only flags will be fetched from the remote store if this is {@code true}. - * @param purgeToVisibleLimit - * If true, local messages will be purged down to the limit of visible messages. - * + * @param account The account the remote store belongs to. + * @param remoteFolder The remote folder to download messages from. + * @param localFolder The {@link LocalFolder} instance corresponding to the remote folder. + * @param inputMessages A list of messages objects that store the UIDs of which messages to download. + * @param flagSyncOnly Only flags will be fetched from the remote store if this is {@code true}. + * @param purgeToVisibleLimit If true, local messages will be purged down to the limit of visible messages. * @return The number of downloaded messages that are not flagged as {@link Flag#SEEN}. - * * @throws MessagingException */ private int downloadMessages(final Account account, final Folder remoteFolder, - final LocalFolder localFolder, List inputMessages, - boolean flagSyncOnly, boolean purgeToVisibleLimit) throws MessagingException { + final LocalFolder localFolder, List inputMessages, + boolean flagSyncOnly, boolean purgeToVisibleLimit) throws MessagingException { final Date earliestDate = account.getEarliestPollDate(); Date downloadStarted = new Date(); // now @@ -1199,12 +1191,12 @@ public class MessagingController { } private void evaluateMessageForDownload(final Message message, final String folder, - final LocalFolder localFolder, - final Folder remoteFolder, - final Account account, - final List unsyncedMessages, - final List syncFlagMessages, - boolean flagSyncOnly) throws MessagingException { + final LocalFolder localFolder, + final Folder remoteFolder, + final Account account, + final List unsyncedMessages, + final List syncFlagMessages, + boolean flagSyncOnly) throws MessagingException { if (message.isSet(Flag.DELETED)) { Timber.v("Message with uid %s is marked as deleted", message.getUid()); @@ -1258,12 +1250,12 @@ public class MessagingController { } private void fetchUnsyncedMessages(final Account account, final Folder remoteFolder, - List unsyncedMessages, - final List smallMessages, - final List largeMessages, - final AtomicInteger progress, - final int todo, - FetchProfile fp) throws MessagingException { + List unsyncedMessages, + final List smallMessages, + final List largeMessages, + final AtomicInteger progress, + final int todo, + FetchProfile fp) throws MessagingException { final String folder = remoteFolder.getName(); final Date earliestDate = account.getEarliestPollDate(); @@ -1314,13 +1306,13 @@ public class MessagingController { } private void downloadSmallMessages(final Account account, final Folder remoteFolder, - final LocalFolder localFolder, - List smallMessages, - final AtomicInteger progress, - final int unreadBeforeStart, - final AtomicInteger newMessages, - final int todo, - FetchProfile fp) throws MessagingException { + final LocalFolder localFolder, + List smallMessages, + final AtomicInteger progress, + final int unreadBeforeStart, + final AtomicInteger newMessages, + final int todo, + FetchProfile fp) throws MessagingException { final String folder = remoteFolder.getName(); Timber.d("SYNC: Fetching %d small messages for folder %s", smallMessages.size(), folder); @@ -1380,13 +1372,13 @@ public class MessagingController { } private void downloadLargeMessages(final Account account, final Folder remoteFolder, - final LocalFolder localFolder, - List largeMessages, - final AtomicInteger progress, - final int unreadBeforeStart, - final AtomicInteger newMessages, - final int todo, - FetchProfile fp) throws MessagingException { + final LocalFolder localFolder, + List largeMessages, + final AtomicInteger progress, + final int unreadBeforeStart, + final AtomicInteger newMessages, + final int todo, + FetchProfile fp) throws MessagingException { final String folder = remoteFolder.getName(); Timber.d("SYNC: Fetching large messages for folder %s", folder); @@ -1466,11 +1458,11 @@ public class MessagingController { */ FetchProfile fp = new FetchProfile(); fp.add(FetchProfile.Item.BODY_SANE); - /* - * TODO a good optimization here would be to make sure that all Stores set - * the proper size after this fetch and compare the before and after size. If - * they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED - */ + /* + * TODO a good optimization here would be to make sure that all Stores set + * the proper size after this fetch and compare the before and after size. If + * they equal we can mark this SYNCHRONIZED instead of PARTIALLY_SYNCHRONIZED + */ remoteFolder.fetch(Collections.singletonList(message), fp, null); @@ -1482,15 +1474,15 @@ public class MessagingController { // Certain (POP3) servers give you the whole message even when you ask for only the first x Kb if (!message.isSet(Flag.X_DOWNLOADED_FULL)) { - /* - * Mark the message as fully downloaded if the message size is smaller than - * the account's autodownload size limit, otherwise mark as only a partial - * download. This will prevent the system from downloading the same message - * twice. - * - * If there is no limit on autodownload size, that's the same as the message - * being smaller than the max size - */ + /* + * Mark the message as fully downloaded if the message size is smaller than + * the account's autodownload size limit, otherwise mark as only a partial + * download. This will prevent the system from downloading the same message + * twice. + * + * If there is no limit on autodownload size, that's the same as the message + * being smaller than the max size + */ if (account.getMaximumAutoDownloadMessageSize() == 0 || message.getSize() < account.getMaximumAutoDownloadMessageSize()) { localMessage.setFlag(Flag.X_DOWNLOADED_FULL, true); @@ -1504,10 +1496,10 @@ public class MessagingController { } private void refreshLocalMessageFlags(final Account account, final Folder remoteFolder, - final LocalFolder localFolder, - List syncFlagMessages, - final AtomicInteger progress, - final int todo + final LocalFolder localFolder, + List syncFlagMessages, + final AtomicInteger progress, + final int todo ) throws MessagingException { final String folder = remoteFolder.getName(); @@ -1735,7 +1727,7 @@ public class MessagingController { String rUid = remoteFolder.getUidFromMessageId(localMessage); if (rUid != null) { Timber.w("Local message has flag %s already set, and there is a remote message with uid %s, " + - "assuming message was already copied and aborting this copy", + "assuming message was already copied and aborting this copy", X_REMOTE_COPY_STARTED, rUid); String oldUid = localMessage.getUid(); @@ -1828,13 +1820,13 @@ public class MessagingController { } private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, boolean isCopy, - List uids) { + List uids) { PendingCommand command = PendingMoveOrCopy.create(srcFolder, destFolder, isCopy, uids); queuePendingCommand(account, command); } private void queueMoveOrCopy(Account account, String srcFolder, String destFolder, - boolean isCopy, List uids, Map uidMap) { + boolean isCopy, List uids, Map uidMap) { if (uidMap == null || uidMap.isEmpty()) { queueMoveOrCopy(account, srcFolder, destFolder, isCopy, uids); } else { @@ -1844,14 +1836,24 @@ public class MessagingController { } void processPendingMoveOrCopy(PendingMoveOrCopy command, Account account) throws MessagingException { + String srcFolder = command.srcFolder; + String destFolder = command.destFolder; + boolean isCopy = command.isCopy; + + Map newUidMap = command.newUidMap; + Collection uids = newUidMap != null ? newUidMap.keySet() : command.uids; + + processPendingMoveOrCopy(account, srcFolder, destFolder, uids, isCopy, newUidMap); + } + + @VisibleForTesting + void processPendingMoveOrCopy(Account account, String srcFolder, String destFolder, Collection uids, + boolean isCopy, Map newUidMap) throws MessagingException { Folder remoteSrcFolder = null; Folder remoteDestFolder = null; LocalFolder localDestFolder; - try { - String srcFolder = command.srcFolder; - String destFolder = command.destFolder; - boolean isCopy = command.isCopy; + try { Store remoteStore = account.getRemoteStore(); remoteSrcFolder = remoteStore.getFolder(srcFolder); @@ -1859,13 +1861,17 @@ public class MessagingController { localDestFolder = (LocalFolder) localStore.getFolder(destFolder); List messages = new ArrayList<>(); - Collection uids = command.newUidMap != null ? command.newUidMap.keySet() : command.uids; for (String uid : uids) { if (!uid.startsWith(K9.LOCAL_UID_PREFIX)) { messages.add(remoteSrcFolder.getMessage(uid)); } } + if (messages.isEmpty()) { + Timber.i("processingPendingMoveOrCopy: no remote messages to move, skipping"); + return; + } + if (!remoteSrcFolder.exists()) { throw new MessagingException( "processingPendingMoveOrCopy: remoteFolder " + srcFolder + " does not exist", true); @@ -1911,11 +1917,12 @@ public class MessagingController { * This next part is used to bring the local UIDs of the local destination folder * upto speed with the remote UIDs of remote destination folder. */ - if (command.newUidMap != null && remoteUidMap != null && !remoteUidMap.isEmpty()) { - for (Map.Entry entry : remoteUidMap.entrySet()) { + if (newUidMap != null && remoteUidMap != null && !remoteUidMap.isEmpty()) { + Timber.i("processingPendingMoveOrCopy: changing local uids of %d messages", remoteUidMap.size()); + for (Entry entry : remoteUidMap.entrySet()) { String remoteSrcUid = entry.getKey(); String newUid = entry.getValue(); - String localDestUid = command.newUidMap.get(remoteSrcUid); + String localDestUid = newUidMap.get(remoteSrcUid); if (localDestUid == null) { continue; } @@ -1937,7 +1944,7 @@ public class MessagingController { } private void queueSetFlag(final Account account, final String folderName, - final boolean newState, final Flag flag, final List uids) { + final boolean newState, final Flag flag, final List uids) { putBackground("queueSetFlag " + account.getDescription() + ":" + folderName, null, new Runnable() { @Override public void run() { @@ -1949,7 +1956,7 @@ public class MessagingController { } /** - * Processes a pending mark read or unread command. + * Processes a pending mark as read or unread command. */ void processPendingSetFlag(PendingSetFlag command, Account account) throws MessagingException { String folder = command.folder; @@ -2067,7 +2074,7 @@ public class MessagingController { } public void setFlag(final Account account, final List messageIds, final Flag flag, - final boolean newState) { + final boolean newState) { setFlagInCache(account, messageIds, flag, newState); @@ -2080,7 +2087,7 @@ public class MessagingController { } public void setFlagForThreads(final Account account, final List threadRootIds, - final Flag flag, final boolean newState) { + final Flag flag, final boolean newState) { setFlagForThreadsInCache(account, threadRootIds, flag, newState); @@ -2093,7 +2100,7 @@ public class MessagingController { } private void setFlagSynchronous(final Account account, final List ids, - final Flag flag, final boolean newState, final boolean threadedList) { + final Flag flag, final boolean newState, final boolean threadedList) { LocalStore localStore; try { @@ -2156,19 +2163,14 @@ public class MessagingController { * The {@link Message} objects passed in are updated to reflect the new flag state. *

    * - * @param account - * The account the folder containing the messages belongs to. - * @param folderName - * The name of the folder. - * @param messages - * The messages to change the flag for. - * @param flag - * The flag to change. - * @param newState - * {@code true}, if the flag should be set. {@code false} if it should be removed. + * @param account The account the folder containing the messages belongs to. + * @param folderName The name of the folder. + * @param messages The messages to change the flag for. + * @param flag The flag to change. + * @param newState {@code true}, if the flag should be set. {@code false} if it should be removed. */ public void setFlag(Account account, String folderName, List messages, Flag flag, - boolean newState) { + boolean newState) { // TODO: Put this into the background, but right now some callers depend on the message // objects being modified right after this method returns. Folder localFolder = null; @@ -2216,19 +2218,14 @@ public class MessagingController { /** * Set or remove a flag for a message referenced by message UID. * - * @param account - * The account the folder containing the message belongs to. - * @param folderName - * The name of the folder. - * @param uid - * The UID of the message to change the flag for. - * @param flag - * The flag to change. - * @param newState - * {@code true}, if the flag should be set. {@code false} if it should be removed. + * @param account The account the folder containing the message belongs to. + * @param folderName The name of the folder. + * @param uid The UID of the message to change the flag for. + * @param flag The flag to change. + * @param newState {@code true}, if the flag should be set. {@code false} if it should be removed. */ public void setFlag(Account account, String folderName, String uid, Flag flag, - boolean newState) { + boolean newState) { Folder localFolder = null; try { LocalStore localStore = account.getLocalStore(); @@ -2257,7 +2254,7 @@ public class MessagingController { } public void loadMessageRemotePartial(final Account account, final String folder, - final String uid, final MessagingListener listener) { + final String uid, final MessagingListener listener) { put("loadMessageRemotePartial", listener, new Runnable() { @Override public void run() { @@ -2268,7 +2265,7 @@ public class MessagingController { //TODO: Fix the callback mess. See GH-782 public void loadMessageRemote(final Account account, final String folder, - final String uid, final MessagingListener listener) { + final String uid, final MessagingListener listener) { put("loadMessageRemote", listener, new Runnable() { @Override public void run() { @@ -2278,7 +2275,7 @@ public class MessagingController { } private boolean loadMessageRemoteSynchronous(final Account account, final String folder, - final String uid, final MessagingListener listener, final boolean loadPartialFromSearch) { + final String uid, final MessagingListener listener, final boolean loadPartialFromSearch) { Folder remoteFolder = null; LocalFolder localFolder = null; try { @@ -2394,7 +2391,7 @@ public class MessagingController { } public void loadAttachment(final Account account, final LocalMessage message, final Part part, - final MessagingListener listener) { + final MessagingListener listener) { put("loadAttachment", listener, new Runnable() { @Override @@ -2448,8 +2445,8 @@ public class MessagingController { * attempt to send the message. */ public void sendMessage(final Account account, - final Message message, - MessagingListener listener) { + final Message message, + MessagingListener listener) { try { LocalStore localStore = account.getLocalStore(); LocalFolder localFolder = localStore.getFolder(account.getOutboxFolderName()); @@ -2484,7 +2481,7 @@ public class MessagingController { * Attempt to send any messages that are sitting in the Outbox. */ public void sendPendingMessages(final Account account, - MessagingListener listener) { + MessagingListener listener) { putBackground("sendPendingMessages", listener, new Runnable() { @Override public void run() { @@ -2577,7 +2574,7 @@ public class MessagingController { Timber.i("Scanning folder '%s' (%d) for messages to send", account.getOutboxFolderName(), localFolder.getDatabaseId()); - Transport transport = transportProvider.getTransport(K9.app, account); + Transport transport = transportProvider.getTransport(K9.app, account, Globals.getOAuth2TokenProvider()); for (LocalMessage message : localMessages) { if (message.isSet(Flag.DELETED)) { @@ -2681,7 +2678,7 @@ public class MessagingController { } private void moveOrDeleteSentMessage(Account account, LocalStore localStore, - LocalFolder localFolder, LocalMessage message) throws MessagingException { + LocalFolder localFolder, LocalMessage message) throws MessagingException { if (!account.hasSentFolder()) { Timber.i("Account does not have a sent mail folder; deleting sent message"); message.setFlag(Flag.DELETED, true); @@ -2700,7 +2697,7 @@ public class MessagingController { } private void handleSendFailure(Account account, Store localStore, Folder localFolder, Message message, - Exception exception, boolean permanentFailure) throws MessagingException { + Exception exception, boolean permanentFailure) throws MessagingException { Timber.e(exception, "Failed to send message"); @@ -2728,7 +2725,7 @@ public class MessagingController { } public void getAccountStats(final Context context, final Account account, - final MessagingListener listener) { + final MessagingListener listener) { threadPool.execute(new Runnable() { @Override @@ -2745,7 +2742,7 @@ public class MessagingController { } public void getSearchAccountStats(final SearchAccount searchAccount, - final MessagingListener listener) { + final MessagingListener listener) { threadPool.execute(new Runnable() { @Override @@ -2756,7 +2753,7 @@ public class MessagingController { } public AccountStats getSearchAccountStatsSynchronous(final SearchAccount searchAccount, - final MessagingListener listener) { + final MessagingListener listener) { Preferences preferences = Preferences.getPreferences(context); LocalSearch search = searchAccount.getRelatedSearch(); @@ -2824,7 +2821,7 @@ public class MessagingController { } public void getFolderUnreadMessageCount(final Account account, final String folderName, - final MessagingListener l) { + final MessagingListener l) { Runnable unreadRunnable = new Runnable() { @Override public void run() { @@ -2877,7 +2874,7 @@ public class MessagingController { } public void moveMessages(final Account srcAccount, final String srcFolder, - List messageReferences, final String destFolder) { + List messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { @Override public void act(final Account account, LocalFolder messageFolder, final List messages) { @@ -2894,7 +2891,7 @@ public class MessagingController { } public void moveMessagesInThread(Account srcAccount, final String srcFolder, - final List messageReferences, final String destFolder) { + final List messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { @Override public void act(final Account account, LocalFolder messageFolder, final List messages) { @@ -2916,12 +2913,12 @@ public class MessagingController { } public void moveMessage(final Account account, final String srcFolder, final MessageReference message, - final String destFolder) { + final String destFolder) { moveMessages(account, srcFolder, Collections.singletonList(message), destFolder); } public void copyMessages(final Account srcAccount, final String srcFolder, - final List messageReferences, final String destFolder) { + final List messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { @Override public void act(final Account account, LocalFolder messageFolder, final List messages) { @@ -2936,7 +2933,7 @@ public class MessagingController { } public void copyMessagesInThread(Account srcAccount, final String srcFolder, - final List messageReferences, final String destFolder) { + final List messageReferences, final String destFolder) { actOnMessageGroup(srcAccount, srcFolder, messageReferences, new MessageActor() { @Override public void act(final Account account, LocalFolder messageFolder, final List messages) { @@ -2957,13 +2954,13 @@ public class MessagingController { } public void copyMessage(final Account account, final String srcFolder, final MessageReference message, - final String destFolder) { + final String destFolder) { copyMessages(account, srcFolder, Collections.singletonList(message), destFolder); } private void moveOrCopyMessageSynchronous(final Account account, final String srcFolder, - final List inMessages, final String destFolder, final boolean isCopy) { + final List inMessages, final String destFolder, final boolean isCopy) { try { LocalStore localStore = account.getLocalStore(); @@ -3087,7 +3084,7 @@ public class MessagingController { actOnMessagesGroupedByAccountAndFolder(messages, new MessageActor() { @Override public void act(final Account account, final LocalFolder messageFolder, - final List accountMessages) { + final List accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteThreads", null, new Runnable() { @@ -3139,7 +3136,7 @@ public class MessagingController { @Override public void act(final Account account, final LocalFolder messageFolder, - final List accountMessages) { + final List accountMessages) { suppressMessages(account, accountMessages); putBackground("deleteMessages", null, new Runnable() { @@ -3163,7 +3160,7 @@ public class MessagingController { @Override public void act(final Account account, final LocalFolder messageFolder, - final List accountMessages) { + final List accountMessages) { putBackground("debugClearLocalMessages", null, new Runnable() { @Override @@ -3183,8 +3180,8 @@ public class MessagingController { } private void deleteMessagesSynchronous(final Account account, final String folder, - final List messages, - MessagingListener listener) { + final List messages, + MessagingListener listener) { LocalFolder localFolder = null; LocalFolder localTrashFolder = null; try { @@ -3258,7 +3255,7 @@ public class MessagingController { queueSetFlag(account, folder, true, Flag.DELETED, syncedMessageUids); } else { queueMoveOrCopy(account, folder, account.getTrashFolderName(), false, - syncedMessageUids, uidMap); + syncedMessageUids, uidMap); } processPendingCommands(account); } else if (account.getDeletePolicy() == DeletePolicy.MARK_AS_READ) { @@ -3385,14 +3382,10 @@ public class MessagingController { *

    *

    Note: Currently this is only the case for POP3 accounts.

    * - * @param account - * The account to check. - * + * @param account The account to check. * @return {@code true} if the account only has a local Trash folder that is not synchronized * with a folder on the server. {@code false} otherwise. - * - * @throws MessagingException - * In case of an error. + * @throws MessagingException In case of an error. */ private boolean isTrashLocalOnly(Account account) throws MessagingException { // TODO: Get rid of the tight coupling once we properly support local folders @@ -3442,14 +3435,227 @@ public class MessagingController { context.startActivity(Intent.createChooser(msg, context.getString(R.string.send_alternate_chooser_title))); } + private android.accounts.Account[] getEeloAccountsOnDevice(AccountManager accountManager) { + return accountManager.getAccountsByType( + EELO_ACCOUNT_TYPE); + } + + private android.accounts.Account[] getGoogleAccountsOnDevice(AccountManager accountManager) { + return accountManager.getAccountsByType( + GOOGLE_ACCOUNT_TYPE); + } + + private boolean hasPasswordUpdate(Account account, + String deviceAccountEmailId, + String deviceAccountPassword) { + try { + String[] emailParts = EmailHelper.splitEmail(deviceAccountEmailId); + AccountSetupPresenter.Provider provider = findProviderForDomain(context, emailParts[1]); + + if (provider != null) { + ArrayList uris = getURIs(deviceAccountEmailId, deviceAccountPassword, provider); + String deviceAccountStoreUri = uris.get(0); + String deviceAccountTransportUri = uris.get(1); + + if (deviceAccountStoreUri.equals(account.getStoreUri()) && + deviceAccountTransportUri.equals(account.getTransportUri())) { + return false; + } + } + } catch (Exception e) { + Timber.e(e, "Error while trying to initialise account configuration."); + } + return true; + } + + private static AccountSetupPresenter.Provider findProviderForDomain(Context context, + String domain) { + try { + XmlResourceParser xml = context.getResources().getXml(foundation.e.mail.R.xml.providers); + int xmlEventType; + AccountSetupPresenter.Provider provider = null; + while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { + if (xmlEventType == XmlResourceParser.START_TAG + && "provider".equals(xml.getName()) + && domain.equalsIgnoreCase(getXmlAttribute(context, xml, "domain"))) { + provider = new AccountSetupPresenter.Provider(); + provider.id = getXmlAttribute(context, xml, "id"); + provider.label = getXmlAttribute(context, xml, "label"); + provider.domain = getXmlAttribute(context, xml, "domain"); + provider.note = getXmlAttribute(context, xml, "note"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "incoming".equals(xml.getName()) + && provider != null) { + provider.incomingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.incomingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.START_TAG + && "outgoing".equals(xml.getName()) + && provider != null) { + provider.outgoingUriTemplate = new URI(getXmlAttribute(context, xml, "uri")); + provider.outgoingUsernameTemplate = getXmlAttribute(context, xml, "username"); + } else if (xmlEventType == XmlResourceParser.END_TAG + && "provider".equals(xml.getName()) + && provider != null) { + return provider; + } + } + + if (provider == null) { + provider = new AccountSetupPresenter.Provider(); + provider.id = domain; + provider.label = domain + " mail service"; + provider.domain = domain; + provider.note = ""; + provider.incomingUriTemplate = new URI("imap+ssl+://mail." + domain); + provider.incomingUsernameTemplate = "$email"; + provider.outgoingUriTemplate = new URI("smtp+tls+://mail." + domain); + provider.outgoingUsernameTemplate = "$email"; + } + + } catch (Exception e) { + Timber.e(e, "Error while trying to load provider settings."); + } + return null; + } + + private static String getXmlAttribute(Context context, XmlResourceParser xml, String name) { + int resId = xml.getAttributeResourceValue(null, name, 0); + if (resId == 0) { + return xml.getAttributeValue(null, name); + } else { + return context.getString(resId); + } + } + + private ArrayList getURIs(String email, String password, + @NonNull AccountSetupPresenter.Provider provider) + throws URISyntaxException { + String[] emailParts = EmailHelper.splitEmail(email); + String user = emailParts[0]; + String domain = emailParts[1]; + String userEnc = UrlEncodingHelper.encodeUtf8(user); + String passwordEnc = UrlEncodingHelper.encodeUtf8(password); + + String incomingUsername = provider.incomingUsernameTemplate; + incomingUsername = incomingUsername.replaceAll("\\$email", email); + incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); + incomingUsername = incomingUsername.replaceAll("\\$domain", domain); + + URI incomingUriTemplate = provider.incomingUriTemplate; + String incomingUserInfo = incomingUsername + ":" + passwordEnc; + URI incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUserInfo, + incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, null, null); + + String outgoingUsername = provider.outgoingUsernameTemplate; + + URI outgoingUriTemplate = provider.outgoingUriTemplate; + + + URI outgoingUri; + if (outgoingUsername != null) { + outgoingUsername = outgoingUsername.replaceAll("\\$email", email); + outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); + outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); + + String outgoingUserInfo = outgoingUsername + ":" + passwordEnc; + outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUserInfo, + outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } else { + outgoingUri = new URI(outgoingUriTemplate.getScheme(), + null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, + null, null); + + } + + return new ArrayList<>(Arrays.asList(incomingUri.toString(), outgoingUri.toString())); + } + + private boolean isAccountSignedInOnDevice(AccountManager accountManager, Account account) { + try { + android.accounts.Account[] eeloAccounts = getEeloAccountsOnDevice(accountManager); + android.accounts.Account[] googleAccounts = getGoogleAccountsOnDevice(accountManager); + + if (account.isDeviceAccount()) { + boolean accountIsSignedInOnDevice = false; + for (android.accounts.Account eeloAccount : eeloAccounts) { + String emailId = accountManager.getUserData(eeloAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId) && !hasPasswordUpdate(account, + emailId, accountManager.getPassword(eeloAccount))) { + accountIsSignedInOnDevice = true; + break; + } + } + for (android.accounts.Account googleAccount : googleAccounts) { + String emailId = accountManager.getUserData(googleAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + accountIsSignedInOnDevice = true; + break; + } + } + + if (accountIsSignedInOnDevice) { + return true; + } + } + } catch (SecurityException e) { + e.printStackTrace(); + } + return false; + } + + private boolean isSyncEnabled(AccountManager accountManager, Account account) { + try { + android.accounts.Account[] eeloAccounts = getEeloAccountsOnDevice(accountManager); + android.accounts.Account[] googleAccounts = getGoogleAccountsOnDevice(accountManager); + + if (account.isDeviceAccount()) { + for (android.accounts.Account eeloAccount : eeloAccounts) { + String emailId = accountManager.getUserData(eeloAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + if (ContentResolver.getSyncAutomatically(eeloAccount, + MAIL_CONTENT_AUTHORITY)) { + account.setFolderPushMode(Account.FolderMode.FIRST_CLASS); + return true; + } else { + account.setFolderPushMode(Account.FolderMode.NONE); + return false; + } + } + } + for (android.accounts.Account googleAccount : googleAccounts) { + String emailId = accountManager.getUserData(googleAccount, + ACCOUNT_EMAIL_ADDRESS_KEY); + if (account.getEmail().equals(emailId)) { + if (ContentResolver.getSyncAutomatically(googleAccount, + MAIL_CONTENT_AUTHORITY)) { + account.setFolderPushMode(Account.FolderMode.FIRST_CLASS); + return true; + } else { + account.setFolderPushMode(Account.FolderMode.NONE); + return false; + } + } + } + } + } catch (SecurityException e) { + e.printStackTrace(); + } + return false; + } + /** * Checks mail for one or multiple accounts. If account is null all accounts * are checked. */ public void checkMail(final Context context, final Account account, - final boolean ignoreLastCheckedTime, - final boolean useManualWakeLock, - final MessagingListener listener) { + final boolean ignoreLastCheckedTime, + final boolean useManualWakeLock, + final MessagingListener listener) { TracingWakeLock twakeLock = null; if (useManualWakeLock) { @@ -3482,7 +3688,14 @@ public class MessagingController { } for (final Account account : accounts) { - checkMailForAccount(context, account, ignoreLastCheckedTime, listener); + if (account.isDeviceAccount()) { + if (isAccountSignedInOnDevice(AccountManager.get(context), account) && + isSyncEnabled(AccountManager.get(context), account)) { + checkMailForAccount(context, account, ignoreLastCheckedTime, listener); + } + } else { + checkMailForAccount(context, account, ignoreLastCheckedTime, listener); + } } } catch (Exception e) { @@ -3510,8 +3723,8 @@ public class MessagingController { private void checkMailForAccount(final Context context, final Account account, - final boolean ignoreLastCheckedTime, - final MessagingListener listener) { + final boolean ignoreLastCheckedTime, + final MessagingListener listener) { if (!account.isAvailable(context)) { Timber.i("Skipping synchronizing unavailable account %s", account.getDescription()); return; @@ -3619,7 +3832,7 @@ public class MessagingController { if (!ignoreLastCheckedTime && tLocalFolder.getLastChecked() > (System.currentTimeMillis() - accountInterval)) { Timber.v("Not running Command for folder %s, previously synced @ %tc which would " + - "be too recent for the account period", + "be too recent for the account period", folder.getName(), folder.getLastChecked()); return; } @@ -3817,11 +4030,8 @@ public class MessagingController { /** * Save a draft message. * - * @param account - * Account we are saving for. - * @param message - * Message to save. - * + * @param account Account we are saving for. + * @param message Message to save. * @return Message representing the entry in the local store. */ public Message saveDraft(final Account account, final Message message, long existingDraftId, boolean saveRemotely) { @@ -4022,7 +4232,7 @@ public class MessagingController { } public void messagesArrived(final Account account, final Folder remoteFolder, final List messages, - final boolean flagSyncOnly) { + final boolean flagSyncOnly) { Timber.i("Got new pushed email messages for account %s, folder %s", account.getDescription(), remoteFolder.getName()); diff --git a/k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java b/k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerCommands.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java rename to k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerCommands.java index fc1552a9512af1319e4092ed786b730db5d56487..d2d6b4754e825adc8b6e08b0069c41aab13bb518 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerCommands.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerCommands.java @@ -1,12 +1,12 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.util.List; import java.util.Map; -import com.fsck.k9.Account; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.Account; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.MessagingException; public class MessagingControllerCommands { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerPushReceiver.java b/k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerPushReceiver.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerPushReceiver.java rename to k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerPushReceiver.java index 778420ae88085a0727b3cb8a4ebbce2fc8346572..42c1c423c7f99afec6766b6c53c8add6f1889e72 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/MessagingControllerPushReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/MessagingControllerPushReceiver.java @@ -1,18 +1,18 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import android.content.Context; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; -import com.fsck.k9.mail.Folder; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.Folder; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.PushReceiver; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.service.SleepService; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.PushReceiver; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.service.SleepService; import java.util.List; import java.util.concurrent.CountDownLatch; diff --git a/k9mail/src/main/java/com/fsck/k9/controller/MessagingListener.java b/k9mail/src/main/java/foundation/e/mail/controller/MessagingListener.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/controller/MessagingListener.java rename to k9mail/src/main/java/foundation/e/mail/controller/MessagingListener.java index 6a3e3f97a9f36b151984f24e31fa8378e585c159..df2cb4c5fe3a4dab429eca736421efe186c50494 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/MessagingListener.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/MessagingListener.java @@ -1,18 +1,18 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.util.List; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; public interface MessagingListener { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/PendingCommandSerializer.java b/k9mail/src/main/java/foundation/e/mail/controller/PendingCommandSerializer.java similarity index 79% rename from k9mail/src/main/java/com/fsck/k9/controller/PendingCommandSerializer.java rename to k9mail/src/main/java/foundation/e/mail/controller/PendingCommandSerializer.java index 27beff3d7785419953effd4e18086f4bdefe178b..1532287ceb4bac46a7817323d009767c04a4261b 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/PendingCommandSerializer.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/PendingCommandSerializer.java @@ -1,4 +1,4 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.io.IOError; @@ -7,13 +7,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; -import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; -import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; -import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMoveOrCopy; -import com.fsck.k9.controller.MessagingControllerCommands.PendingSetFlag; +import foundation.e.mail.controller.MessagingControllerCommands.PendingAppend; +import foundation.e.mail.controller.MessagingControllerCommands.PendingCommand; +import foundation.e.mail.controller.MessagingControllerCommands.PendingEmptyTrash; +import foundation.e.mail.controller.MessagingControllerCommands.PendingExpunge; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMarkAllAsRead; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMoveOrCopy; +import foundation.e.mail.controller.MessagingControllerCommands.PendingSetFlag; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.Moshi; diff --git a/k9mail/src/main/java/com/fsck/k9/controller/ProgressBodyFactory.java b/k9mail/src/main/java/foundation/e/mail/controller/ProgressBodyFactory.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/controller/ProgressBodyFactory.java rename to k9mail/src/main/java/foundation/e/mail/controller/ProgressBodyFactory.java index 606541f27fa7baebc58e501affacd6ffa649dc2e..7f09d8e91e2e7ef1cdb611311c1bad6d8f9a5b93 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/ProgressBodyFactory.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/ProgressBodyFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.io.IOException; @@ -7,7 +7,7 @@ import java.io.OutputStream; import java.util.Timer; import java.util.TimerTask; -import com.fsck.k9.mail.DefaultBodyFactory; +import foundation.e.mail.mail.DefaultBodyFactory; import org.apache.commons.io.output.CountingOutputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/controller/RemoteMessageStore.java b/k9mail/src/main/java/foundation/e/mail/controller/RemoteMessageStore.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/controller/RemoteMessageStore.java rename to k9mail/src/main/java/foundation/e/mail/controller/RemoteMessageStore.java index bc8359b9a2f5372ca57c73f25c3320afd4772724..613c4a9f75119642dc1230b97db3858bccd968b9 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/RemoteMessageStore.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/RemoteMessageStore.java @@ -1,8 +1,8 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; -import com.fsck.k9.Account; -import com.fsck.k9.mail.Folder; +import foundation.e.mail.Account; +import foundation.e.mail.mail.Folder; public interface RemoteMessageStore { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/SimpleMessagingListener.java b/k9mail/src/main/java/foundation/e/mail/controller/SimpleMessagingListener.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/controller/SimpleMessagingListener.java rename to k9mail/src/main/java/foundation/e/mail/controller/SimpleMessagingListener.java index 3998981ed4dba21acf340a8aeab14b464376f3e8..7a2ee55839c4faf9c26d246e04965f9ebd1c401e 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/SimpleMessagingListener.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/SimpleMessagingListener.java @@ -1,18 +1,18 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.util.List; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; public abstract class SimpleMessagingListener implements MessagingListener { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/UidReverseComparator.java b/k9mail/src/main/java/foundation/e/mail/controller/UidReverseComparator.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/controller/UidReverseComparator.java rename to k9mail/src/main/java/foundation/e/mail/controller/UidReverseComparator.java index f9b08b323346f0671b122c1ac56dd0e5a8f00f1e..1efc39ad5944276f179079b24a8b25b669f2907b 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/UidReverseComparator.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/UidReverseComparator.java @@ -1,9 +1,9 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; import java.util.Comparator; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Message; public class UidReverseComparator implements Comparator { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/UnavailableAccountException.java b/k9mail/src/main/java/foundation/e/mail/controller/UnavailableAccountException.java similarity index 82% rename from k9mail/src/main/java/com/fsck/k9/controller/UnavailableAccountException.java rename to k9mail/src/main/java/foundation/e/mail/controller/UnavailableAccountException.java index 55533828eb18d9cf82f73861f33b18458312dfae..a17643e0510a08c5b6e1dc0bee1d5bb1009a8cbf 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/UnavailableAccountException.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/UnavailableAccountException.java @@ -1,8 +1,8 @@ -package com.fsck.k9.controller; +package foundation.e.mail.controller; /** - * An {@link com.fsck.k9.Account} is not - * {@link com.fsck.k9.Account#isAvailable(android.content.Context)}.
    + * An {@link foundation.e.mail.Account} is not + * {@link foundation.e.mail.Account#isAvailable(android.content.Context)}.
    * The operation may be retried later. */ public class UnavailableAccountException extends RuntimeException { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/imap/ImapMessageStore.java b/k9mail/src/main/java/foundation/e/mail/controller/imap/ImapMessageStore.java similarity index 62% rename from k9mail/src/main/java/com/fsck/k9/controller/imap/ImapMessageStore.java rename to k9mail/src/main/java/foundation/e/mail/controller/imap/ImapMessageStore.java index 01912258ffbfb323c51621cf52546508a5e0d249..e3eeccb024a3519befc62d9bff4928e0ced021b8 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/imap/ImapMessageStore.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/imap/ImapMessageStore.java @@ -1,14 +1,14 @@ -package com.fsck.k9.controller.imap; +package foundation.e.mail.controller.imap; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.RemoteMessageStore; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.notification.NotificationController; +import foundation.e.mail.Account; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.RemoteMessageStore; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.notification.NotificationController; public class ImapMessageStore implements RemoteMessageStore { diff --git a/k9mail/src/main/java/com/fsck/k9/controller/imap/ImapSync.java b/k9mail/src/main/java/foundation/e/mail/controller/imap/ImapSync.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/controller/imap/ImapSync.java rename to k9mail/src/main/java/foundation/e/mail/controller/imap/ImapSync.java index ebfa328727ebe13949af7896148dc359dea6948a..475db6640e95d1d5dbd79015d9f87479411dfbba 100644 --- a/k9mail/src/main/java/com/fsck/k9/controller/imap/ImapSync.java +++ b/k9mail/src/main/java/foundation/e/mail/controller/imap/ImapSync.java @@ -1,4 +1,4 @@ -package com.fsck.k9.controller.imap; +package foundation.e.mail.controller.imap; import java.io.IOException; @@ -14,36 +14,36 @@ import java.util.concurrent.atomic.AtomicInteger; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.Account.Expunge; -import com.fsck.k9.AccountStats; -import com.fsck.k9.K9; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.UidReverseComparator; -import com.fsck.k9.mail.AuthenticationFailedException; -import com.fsck.k9.mail.BodyFactory; -import com.fsck.k9.mail.DefaultBodyFactory; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Folder.FolderType; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalFolder.MoreMessages; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.mailstore.MessageRemovalListener; -import com.fsck.k9.notification.NotificationController; +import foundation.e.mail.Account; +import foundation.e.mail.Account.Expunge; +import foundation.e.mail.AccountStats; +import foundation.e.mail.K9; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.UidReverseComparator; +import foundation.e.mail.mail.AuthenticationFailedException; +import foundation.e.mail.mail.BodyFactory; +import foundation.e.mail.mail.DefaultBodyFactory; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Folder.FolderType; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalFolder.MoreMessages; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.mailstore.MessageRemovalListener; +import foundation.e.mail.notification.NotificationController; import timber.log.Timber; -import static com.fsck.k9.helper.ExceptionHelper.getRootCauseMessage; +import static foundation.e.mail.helper.ExceptionHelper.getRootCauseMessage; class ImapSync { diff --git a/k9mail/src/main/java/com/fsck/k9/crypto/MessageCryptoStructureDetector.java b/k9mail/src/main/java/foundation/e/mail/crypto/MessageCryptoStructureDetector.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/crypto/MessageCryptoStructureDetector.java rename to k9mail/src/main/java/foundation/e/mail/crypto/MessageCryptoStructureDetector.java index 6b7e63555e3b38228539dfca1d4a75d6e988cd4a..2d9b2f3ca35d665067603c84b641a41dc852eb28 100644 --- a/k9mail/src/main/java/com/fsck/k9/crypto/MessageCryptoStructureDetector.java +++ b/k9mail/src/main/java/foundation/e/mail/crypto/MessageCryptoStructureDetector.java @@ -1,4 +1,4 @@ -package com.fsck.k9.crypto; +package foundation.e.mail.crypto; import java.io.ByteArrayOutputStream; @@ -11,19 +11,19 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.CryptoResultAnnotation; -import com.fsck.k9.ui.crypto.MessageCryptoAnnotations; - -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.CryptoResultAnnotation; +import foundation.e.mail.ui.crypto.MessageCryptoAnnotations; + +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; public class MessageCryptoStructureDetector { diff --git a/k9mail/src/main/java/com/fsck/k9/crypto/OpenPgpApiHelper.java b/k9mail/src/main/java/foundation/e/mail/crypto/OpenPgpApiHelper.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/crypto/OpenPgpApiHelper.java rename to k9mail/src/main/java/foundation/e/mail/crypto/OpenPgpApiHelper.java index f9d71ed3d1302804a09ab209ea4a1fb773dc562c..2fa0142e69a126a5c9929cba13fcab408fcdb5bb 100644 --- a/k9mail/src/main/java/com/fsck/k9/crypto/OpenPgpApiHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/crypto/OpenPgpApiHelper.java @@ -1,8 +1,8 @@ -package com.fsck.k9.crypto; +package foundation.e.mail.crypto; import android.text.TextUtils; -import com.fsck.k9.Identity; +import foundation.e.mail.Identity; public class OpenPgpApiHelper { diff --git a/k9mail/src/main/java/foundation/e/mail/fragment/AboutFragment.java b/k9mail/src/main/java/foundation/e/mail/fragment/AboutFragment.java new file mode 100644 index 0000000000000000000000000000000000000000..ff2950ffdc95c8ea315838575d0764d70d84bd74 --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/fragment/AboutFragment.java @@ -0,0 +1,26 @@ +package foundation.e.mail.fragment; + +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.support.annotation.Nullable; + + +import foundation.e.mail.BuildConfig; +import foundation.e.mail.R; + +public class AboutFragment extends PreferenceFragment { + + private final static String Build_Version="build_version"; + private final static String About_App="about_app"; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.about_preferences); + + findPreference(Build_Version).setSummary(BuildConfig.VERSION_NAME); + + } +} diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/AttachmentDownloadDialogFragment.java b/k9mail/src/main/java/foundation/e/mail/fragment/AttachmentDownloadDialogFragment.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/fragment/AttachmentDownloadDialogFragment.java rename to k9mail/src/main/java/foundation/e/mail/fragment/AttachmentDownloadDialogFragment.java index 7d2abe7212569c0d25581fbb741f2aceaeeffa42..f9e27c04c577fe0aa278d025641a3d83507f4abe 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/AttachmentDownloadDialogFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/AttachmentDownloadDialogFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.app.Activity; @@ -8,9 +8,9 @@ import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.Bundle; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.MessagingListener; -import com.fsck.k9.controller.SimpleMessagingListener; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.MessagingListener; +import foundation.e.mail.controller.SimpleMessagingListener; public class AttachmentDownloadDialogFragment extends DialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/ConfirmationDialogFragment.java b/k9mail/src/main/java/foundation/e/mail/fragment/ConfirmationDialogFragment.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/fragment/ConfirmationDialogFragment.java rename to k9mail/src/main/java/foundation/e/mail/fragment/ConfirmationDialogFragment.java index b8807ec0ad2a48c51b0113afc65f5c38e3b6ef2a..679d851998c6d162f2ad2327e16eddf83b831837 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/ConfirmationDialogFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/ConfirmationDialogFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.app.Activity; import android.app.AlertDialog; @@ -10,6 +10,9 @@ import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import timber.log.Timber; +import foundation.e.mail.K9; +import foundation.e.mail.mail.ConnectionSecurity; + public class ConfirmationDialogFragment extends DialogFragment implements OnClickListener, OnCancelListener { private ConfirmationDialogFragmentListener mListener; @@ -22,7 +25,7 @@ public class ConfirmationDialogFragment extends DialogFragment implements OnClic public static ConfirmationDialogFragment newInstance(int dialogId, String title, String message, - String confirmText, String cancelText) { + String confirmText, String cancelText, ConfirmationDialogFragmentListener listener) { ConfirmationDialogFragment fragment = new ConfirmationDialogFragment(); Bundle args = new Bundle(); @@ -32,13 +35,20 @@ public class ConfirmationDialogFragment extends DialogFragment implements OnClic args.putString(ARG_CONFIRM_TEXT, confirmText); args.putString(ARG_CANCEL_TEXT, cancelText); fragment.setArguments(args); + fragment.mListener = listener; return fragment; } + public static ConfirmationDialogFragment newInstance(int dialogId, String title, String message, + String confirmText, String cancelText) { + + return newInstance(dialogId, title, message, confirmText, cancelText, null); + } + public static ConfirmationDialogFragment newInstance(int dialogId, String title, String message, String cancelText) { - return newInstance(dialogId, title, message, null, cancelText); + return newInstance(dialogId, title, message, null, cancelText, null); } @@ -103,11 +113,13 @@ public class ConfirmationDialogFragment extends DialogFragment implements OnClic @Override public void onAttach(Activity activity) { super.onAttach(activity); - try { - mListener = (ConfirmationDialogFragmentListener) activity; - } catch (ClassCastException e) { - Timber.d("%s did not implement ConfirmationDialogFragmentListener", activity); - } + if (mListener != null) { + try { + mListener = (ConfirmationDialogFragmentListener) activity; + } catch (ClassCastException e) { + Timber.d("%s did not implement ConfirmationDialogFragmentListener", activity); + } + } } private ConfirmationDialogFragmentListener getListener() { diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MLFProjectionInfo.java b/k9mail/src/main/java/foundation/e/mail/fragment/MLFProjectionInfo.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/fragment/MLFProjectionInfo.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MLFProjectionInfo.java index 4a51464a27a173f62bc15047d3b3466a275ab8f4..836ead7e5a87660478362db16a8abf0ca4fcdcf3 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MLFProjectionInfo.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MLFProjectionInfo.java @@ -1,11 +1,11 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import java.util.Arrays; -import com.fsck.k9.provider.EmailProvider.MessageColumns; -import com.fsck.k9.provider.EmailProvider.SpecialColumns; -import com.fsck.k9.provider.EmailProvider.ThreadColumns; +import foundation.e.mail.provider.EmailProvider.MessageColumns; +import foundation.e.mail.provider.EmailProvider.SpecialColumns; +import foundation.e.mail.provider.EmailProvider.ThreadColumns; public final class MLFProjectionInfo { diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListAdapter.java b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListAdapter.java similarity index 53% rename from k9mail/src/main/java/com/fsck/k9/fragment/MessageListAdapter.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MessageListAdapter.java index d90d179e182c715926be03baac386c0e4eae66b9..47df24608ea1bb86a33d9681498a65eba5edb884 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListAdapter.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListAdapter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.content.Context; @@ -6,129 +6,98 @@ import android.database.Cursor; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.text.Spannable; -import android.text.SpannableStringBuilder; import android.text.format.DateUtils; -import android.text.style.AbsoluteSizeSpan; -import android.text.style.ForegroundColorSpan; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CursorAdapter; +import android.widget.ImageView; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mailstore.DatabasePreviewType; -import com.fsck.k9.ui.ContactBadge; - -import static com.fsck.k9.fragment.MLFProjectionInfo.ANSWERED_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.ATTACHMENT_COUNT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.CC_LIST_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.DATE_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.FLAGGED_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.FOLDER_NAME_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.FORWARDED_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.PREVIEW_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.PREVIEW_TYPE_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.READ_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.SENDER_LIST_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.SUBJECT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.THREAD_COUNT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.TO_LIST_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.UID_COLUMN; +import java.util.Locale; + +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.RoundedQuickContactBadge; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mailstore.DatabasePreviewType; +import foundation.e.mail.ui.ContactBadge; + +import static foundation.e.mail.fragment.MLFProjectionInfo.ANSWERED_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.ATTACHMENT_COUNT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.CC_LIST_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.DATE_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.FLAGGED_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.FOLDER_NAME_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.FORWARDED_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.PREVIEW_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.PREVIEW_TYPE_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.READ_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.SENDER_LIST_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.SUBJECT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.THREAD_COUNT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.TO_LIST_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.UID_COLUMN; public class MessageListAdapter extends CursorAdapter { private final MessageListFragment fragment; - private Drawable mAttachmentIcon; private Drawable mForwardedIcon; private Drawable mAnsweredIcon; private Drawable mForwardedAnsweredIcon; - private FontSizes fontSizes = K9.getFontSizes(); MessageListAdapter(MessageListFragment fragment) { super(fragment.getActivity(), null, 0); this.fragment = fragment; - mAttachmentIcon = fragment.getResources().getDrawable(R.drawable.ic_email_attachment_small); - mAnsweredIcon = fragment.getResources().getDrawable(R.drawable.ic_email_answered_small); - mForwardedIcon = fragment.getResources().getDrawable(R.drawable.ic_email_forwarded_small); - mForwardedAnsweredIcon = fragment.getResources().getDrawable(R.drawable.ic_email_forwarded_answered_small); - } - - private String recipientSigil(boolean toMe, boolean ccMe) { - if (toMe) { - return fragment.getString(R.string.messagelist_sent_to_me_sigil); - } else if (ccMe) { - return fragment.getString(R.string.messagelist_sent_cc_me_sigil); - } else { - return ""; - } + mAnsweredIcon = fragment.getResources().getDrawable(R.drawable.ic_reply_light); + mForwardedIcon = fragment.getResources().getDrawable(R.drawable.ic_forward_light); + mForwardedAnsweredIcon = fragment.getResources().getDrawable(R.drawable.ic_reply_light); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { - View view = fragment.getK9LayoutInflater().inflate(R.layout.message_list_item, parent, false); + // Inflate the message lst item + View view = fragment.getK9LayoutInflater().inflate(R.layout.message_list_item, parent, false); MessageViewHolder holder = new MessageViewHolder(fragment); - holder.date = (TextView) view.findViewById(R.id.date); - holder.chip = view.findViewById(R.id.chip); - + + holder.date = (TextView) view.findViewById(R.id.date); if (fragment.previewLines == 0 && fragment.contactsPictureLoader == null) { - view.findViewById(R.id.preview).setVisibility(View.GONE); - holder.preview = (TextView) view.findViewById(R.id.sender_compact); - holder.flagged = (CheckBox) view.findViewById(R.id.flagged_center_right); - view.findViewById(R.id.flagged_bottom_right).setVisibility(View.GONE); + view.findViewById(R.id.preview_text_view).setVisibility(View.GONE); + } else { + holder.preview = (TextView) view.findViewById(R.id.preview_text_view); + } + RoundedQuickContactBadge contactBadge = + (RoundedQuickContactBadge) view.findViewById(R.id.contact_badge); + // Assign a reference to Star ImageView + holder.starImageView = (ImageView) view.findViewById(R.id.star_image_view); - } else { - view.findViewById(R.id.sender_compact).setVisibility(View.GONE); - holder.preview = (TextView) view.findViewById(R.id.preview); - holder.flagged = (CheckBox) view.findViewById(R.id.flagged_bottom_right); - view.findViewById(R.id.flagged_center_right).setVisibility(View.GONE); + // Assign a reference to Reply Status ImageView + holder.replyStatusImageView = (ImageView) view.findViewById(R.id.reply_status_image_view); - } + // Assign a reference to Attachment ImageView + holder.attachmentImageView = (ImageView) view.findViewById(R.id.attachment_image_view); - ContactBadge contactBadge = - (ContactBadge) view.findViewById(R.id.contact_badge); if (fragment.contactsPictureLoader != null) { holder.contactBadge = contactBadge; } else { contactBadge.setVisibility(View.GONE); } - if (fragment.senderAboveSubject) { - holder.from = (TextView) view.findViewById(R.id.subject); - fontSizes.setViewTextSize(holder.from, fontSizes.getMessageListSender()); + holder.from = (TextView) view.findViewById(R.id.from_text_view); - } else { - holder.subject = (TextView) view.findViewById(R.id.subject); - fontSizes.setViewTextSize(holder.subject, fontSizes.getMessageListSubject()); + holder.subject = (TextView) view.findViewById(R.id.subject_text_view); - } - - fontSizes.setViewTextSize(holder.date, fontSizes.getMessageListDate()); - - - // 1 preview line is needed even if it is set to 0, because subject is part of the same text view - holder.preview.setLines(Math.max(fragment.previewLines,1)); - fontSizes.setViewTextSize(holder.preview, fontSizes.getMessageListPreview()); holder.threadCount = (TextView) view.findViewById(R.id.thread_count); - fontSizes.setViewTextSize(holder.threadCount, fontSizes.getMessageListSubject()); // thread count is next to subject view.findViewById(R.id.selected_checkbox_wrapper).setVisibility((fragment.checkboxes) ? View.VISIBLE : View.GONE); - holder.flagged.setVisibility(fragment.stars ? View.VISIBLE : View.GONE); - holder.flagged.setOnClickListener(holder); - - holder.selected = (CheckBox) view.findViewById(R.id.selected_checkbox); holder.selected.setOnClickListener(holder); @@ -150,8 +119,6 @@ public class MessageListAdapter extends CursorAdapter { Address[] ccAddrs = Address.unpack(ccList); boolean fromMe = fragment.messageHelper.toMe(account, fromAddrs); - boolean toMe = fragment.messageHelper.toMe(account, toAddrs); - boolean ccMe = fragment.messageHelper.toMe(account, ccAddrs); CharSequence displayName = fragment.messageHelper.getDisplayName(account, fromAddrs, toAddrs); CharSequence displayDate = DateUtils.getRelativeTimeSpanString(context, cursor.getLong(DATE_COLUMN)); @@ -172,90 +139,109 @@ public class MessageListAdapter extends CursorAdapter { MessageViewHolder holder = (MessageViewHolder) view.getTag(); - int maybeBoldTypeface = (read) ? Typeface.NORMAL : Typeface.BOLD; + // Don't change the text view type face based on unread state + // use Typeface.NORMAL only (has been hardcoded) + //int maybeBoldTypeface = (read) ? Typeface.NORMAL : Typeface.BOLD; long uniqueId = cursor.getLong(fragment.uniqueIdColumn); boolean selected = fragment.selected.contains(uniqueId); - holder.chip.setBackgroundColor(account.getChipColor()); + // If checkboxes are enabled and this email is checked, check the checkbox. #dopetonguetwister if (fragment.checkboxes) { holder.selected.setChecked(selected); } + + // If stars are enabled and this email is starred/flagged, show a 'Star' icon if (fragment.stars) { - holder.flagged.setChecked(flagged); + if (flagged) + { + holder.starImageView.setVisibility(View.VISIBLE); + } + else + { + holder.starImageView.setVisibility(View.GONE); + } } + else + { + holder.starImageView.setVisibility(View.GONE); + } + + // Get the position of this list item holder.position = cursor.getPosition(); if (holder.contactBadge != null) { updateContactBadge(holder, counterpartyAddress); } + // Set the background color of this list item setBackgroundColor(view, selected, read); + + // I don't really understand this either. PS: I didn't write this code if (fragment.activeMessage != null) { changeBackgroundColorIfActiveMessage(cursor, account, view); } - updateWithThreadCount(holder, threadCount); - CharSequence beforePreviewText = (fragment.senderAboveSubject) ? subject : displayName; - String sigil = recipientSigil(toMe, ccMe); - SpannableStringBuilder messageStringBuilder = new SpannableStringBuilder(sigil) - .append(beforePreviewText); - if (fragment.previewLines > 0) { - String preview = getPreview(cursor); - messageStringBuilder.append(" ").append(preview); - } - holder.preview.setText(messageStringBuilder, TextView.BufferType.SPANNABLE); - formatPreviewText(holder.preview, beforePreviewText, sigil); + // Set the text of the thread count text view + updateWithThreadCount(holder, threadCount); - Drawable statusHolder = buildStatusHolder(forwarded, answered); + // Set the text of the from text view + if (holder.from != null) + { + holder.from.setTypeface(Typeface.create(holder.from.getTypeface(), Typeface.NORMAL)); + holder.from.setText(displayName); + holder.from.setVisibility(View.VISIBLE); + } + + // Set the text of the subject text view + if (holder.subject != null) + { + holder.subject.setTypeface(Typeface.create(holder.subject.getTypeface(), Typeface.NORMAL)); + holder.subject.setText(subject); + holder.subject.setVisibility(View.VISIBLE); + } - if (holder.from != null ) { - holder.from.setTypeface(Typeface.create(holder.from.getTypeface(), maybeBoldTypeface)); - if (fragment.senderAboveSubject) { - holder.from.setCompoundDrawablesWithIntrinsicBounds( - statusHolder, // left - null, // top - hasAttachments ? mAttachmentIcon : null, // right - null); // bottom + // Set the text of the preview text view + if (fragment.previewLines > 0) + { + String preview = getPreview(cursor); - holder.from.setText(displayName); - } else { - holder.from.setText(new SpannableStringBuilder(sigil).append(displayName)); + if (preview != null && !preview.equals("")) + { + holder.preview.setMaxLines(fragment.previewLines); + holder.preview.setText(preview); + holder.preview.setVisibility(View.VISIBLE); } - } - if (holder.subject != null ) { - if (!fragment.senderAboveSubject) { - holder.subject.setCompoundDrawablesWithIntrinsicBounds( - statusHolder, // left - null, // top - hasAttachments ? mAttachmentIcon : null, // right - null); // bottom + else + { + holder.preview.setVisibility(View.GONE); } - - holder.subject.setTypeface(Typeface.create(holder.subject.getTypeface(), maybeBoldTypeface)); - holder.subject.setText(subject); } - holder.date.setText(displayDate); - } - private void formatPreviewText(TextView preview, CharSequence beforePreviewText, String sigil) { - Spannable previewText = (Spannable)preview.getText(); - previewText.setSpan(buildSenderSpan(), 0, beforePreviewText.length() + sigil.length(), - Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + // Set the text of the date text view + holder.date.setText(displayDate); - int previewSpanColor = buildPreviewSpanColor(); + // If the email has been replied to or has been forwarded, show an icon to indicate that + Drawable replyStatusHolder = buildStatusHolder(forwarded, answered); - // Set span (color) for preview message - previewText.setSpan(new ForegroundColorSpan(previewSpanColor), beforePreviewText.length() + sigil.length(), - previewText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); - } + if (replyStatusHolder != null) + { + holder.replyStatusImageView.setImageDrawable(replyStatusHolder); + holder.replyStatusImageView.setVisibility(View.VISIBLE); + } + else + { + holder.replyStatusImageView.setVisibility(View.GONE); + } - /** - * Create a span section for the sender, and assign the correct font size and weight - */ - private AbsoluteSizeSpan buildSenderSpan() { - int fontSize = (fragment.senderAboveSubject) ? - fontSizes.getMessageListSubject(): - fontSizes.getMessageListSender(); - return new AbsoluteSizeSpan(fontSize, true); + // If the email has any attachments, show an 'Attachment' icon + if (hasAttachments) + { + holder.attachmentImageView.setVisibility(View.VISIBLE); + } + else + { + holder.attachmentImageView.setVisibility(View.GONE); + + } } private Address fetchCounterPartyAddress(boolean fromMe, Address[] toAddrs, Address[] ccAddrs, Address[] fromAddrs) { @@ -302,13 +288,6 @@ public class MessageListAdapter extends CursorAdapter { } } - private int buildPreviewSpanColor() { - //TODO: make this part of the theme - return (K9.getK9Theme() == K9.Theme.LIGHT) ? - Color.rgb(105, 105, 105) : - Color.rgb(160, 160, 160); - } - private Drawable buildStatusHolder(boolean forwarded, boolean answered) { if (forwarded && answered) { return mForwardedAnsweredIcon; @@ -341,7 +320,7 @@ public class MessageListAdapter extends CursorAdapter { private void updateWithThreadCount(MessageViewHolder holder, int threadCount) { if (threadCount > 1) { - holder.threadCount.setText(String.format("%d", threadCount)); + holder.threadCount.setText(String.format(Locale.getDefault(), "%d", threadCount)); holder.threadCount.setVisibility(View.VISIBLE); } else { holder.threadCount.setVisibility(View.GONE); diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragment.java b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragment.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragment.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragment.java index 749db4c089ce2cb1d28095c28161bdfdd493d6f0..f166ecbd331ae17e8c9bfb453db11f5078d2af42 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import java.util.ArrayList; import java.util.Collections; @@ -50,61 +50,61 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.Account.SortType; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.ActivityListener; -import com.fsck.k9.activity.ChooseFolder; -import com.fsck.k9.activity.FolderInfoHolder; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.misc.ContactPictureLoader; -import com.fsck.k9.cache.EmailProviderCache; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; -import com.fsck.k9.fragment.MessageListFragmentComparators.ArrivalComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.AttachmentComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.ComparatorChain; -import com.fsck.k9.fragment.MessageListFragmentComparators.DateComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.FlaggedComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.ReverseComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.ReverseIdComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.SenderComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.SubjectComparator; -import com.fsck.k9.fragment.MessageListFragmentComparators.UnreadComparator; -import com.fsck.k9.helper.ContactPicture; -import com.fsck.k9.helper.MergeCursorWithUniqueId; -import com.fsck.k9.helper.MessageHelper; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.provider.EmailProvider; -import com.fsck.k9.provider.EmailProvider.MessageColumns; -import com.fsck.k9.provider.EmailProvider.SpecialColumns; -import com.fsck.k9.search.ConditionsTreeNode; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchSpecification; -import com.fsck.k9.search.SearchSpecification.SearchCondition; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.search.SqlQueryBuilder; - -import static com.fsck.k9.fragment.MLFProjectionInfo.ACCOUNT_UUID_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.FLAGGED_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.FOLDER_NAME_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.ID_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.PROJECTION; -import static com.fsck.k9.fragment.MLFProjectionInfo.READ_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.SUBJECT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.THREADED_PROJECTION; -import static com.fsck.k9.fragment.MLFProjectionInfo.THREAD_COUNT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.THREAD_ROOT_COLUMN; -import static com.fsck.k9.fragment.MLFProjectionInfo.UID_COLUMN; +import foundation.e.mail.Account; +import foundation.e.mail.Account.SortType; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.ActivityListener; +import foundation.e.mail.activity.ChooseFolder; +import foundation.e.mail.activity.FolderInfoHolder; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.misc.ContactPictureLoader; +import foundation.e.mail.cache.EmailProviderCache; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; +import foundation.e.mail.fragment.MessageListFragmentComparators.ArrivalComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.AttachmentComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.ComparatorChain; +import foundation.e.mail.fragment.MessageListFragmentComparators.DateComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.FlaggedComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.ReverseComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.ReverseIdComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.SenderComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.SubjectComparator; +import foundation.e.mail.fragment.MessageListFragmentComparators.UnreadComparator; +import foundation.e.mail.helper.ContactPicture; +import foundation.e.mail.helper.MergeCursorWithUniqueId; +import foundation.e.mail.helper.MessageHelper; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.provider.EmailProvider; +import foundation.e.mail.provider.EmailProvider.MessageColumns; +import foundation.e.mail.provider.EmailProvider.SpecialColumns; +import foundation.e.mail.search.ConditionsTreeNode; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchSpecification; +import foundation.e.mail.search.SearchSpecification.SearchCondition; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.search.SqlQueryBuilder; + +import static foundation.e.mail.fragment.MLFProjectionInfo.ACCOUNT_UUID_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.FLAGGED_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.FOLDER_NAME_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.ID_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.PROJECTION; +import static foundation.e.mail.fragment.MLFProjectionInfo.READ_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.SUBJECT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.THREADED_PROJECTION; +import static foundation.e.mail.fragment.MLFProjectionInfo.THREAD_COUNT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.THREAD_ROOT_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.UID_COLUMN; public class MessageListFragment extends Fragment implements OnItemClickListener, @@ -196,7 +196,6 @@ public class MessageListFragment extends Fragment implements OnItemClickListener private SortType sortType = SortType.SORT_DATE; private boolean sortAscending = true; private boolean sortDateAscending = false; - boolean senderAboveSubject = false; boolean checkboxes = true; boolean stars = true; @@ -675,8 +674,6 @@ public class MessageListFragment extends Fragment implements OnItemClickListener public void onResume() { super.onResume(); - senderAboveSubject = K9.messageListSenderAboveSubject(); - if (!loaderJustInitialized) { restartLoader(); } else { diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragmentComparators.java b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragmentComparators.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragmentComparators.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragmentComparators.java index e15cc004ba3632eda37e09bf83afa5f7cbdadf39..34a141a327643b715fd309874f01150c048a4122 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListFragmentComparators.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListFragmentComparators.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.database.Cursor; diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListHandler.java b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListHandler.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/fragment/MessageListHandler.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MessageListHandler.java index e19e8624b2be7b2f32f165662e19e240e85339df..29ecfebb938427fac4ca2ce5b264f6c2d05117de 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MessageListHandler.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MessageListHandler.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import java.lang.ref.WeakReference; @@ -7,7 +7,7 @@ import android.app.Activity; import android.os.Handler; import android.os.Parcelable; -import com.fsck.k9.activity.MessageReference; +import foundation.e.mail.activity.MessageReference; /** * This class is used to run operations that modify UI elements in the UI thread. diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MessageViewHolder.java b/k9mail/src/main/java/foundation/e/mail/fragment/MessageViewHolder.java similarity index 63% rename from k9mail/src/main/java/com/fsck/k9/fragment/MessageViewHolder.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MessageViewHolder.java index 225e6233b728d9ca7a91c3e73f1de1120d9e8c09..ec00e064a7f45b058804c157db6f0049e49d763d 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MessageViewHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MessageViewHolder.java @@ -1,29 +1,31 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; +import android.widget.ImageView; -import com.fsck.k9.R; -import com.fsck.k9.ui.ContactBadge; - +import foundation.e.mail.R; +import foundation.e.mail.RoundedQuickContactBadge; public class MessageViewHolder implements View.OnClickListener { private final MessageListFragment fragment; public TextView subject; public TextView preview; public TextView from; + public ImageView replyStatusImageView; + public ImageView attachmentImageView; public TextView time; public TextView date; - public View chip; + public ImageView starImageView; public TextView threadCount; - public CheckBox flagged; public CheckBox selected; public int position = -1; - public ContactBadge contactBadge; + public RoundedQuickContactBadge contactBadge; - public MessageViewHolder(MessageListFragment fragment) { + public MessageViewHolder(MessageListFragment fragment) + { this.fragment = fragment; } @@ -34,10 +36,6 @@ public class MessageViewHolder implements View.OnClickListener { case R.id.selected_checkbox: fragment.toggleMessageSelectWithAdapterPosition(position); break; - case R.id.flagged_bottom_right: - case R.id.flagged_center_right: - fragment.toggleMessageFlagWithAdapterPosition(position); - break; } } } diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/MlfUtils.java b/k9mail/src/main/java/foundation/e/mail/fragment/MlfUtils.java similarity index 77% rename from k9mail/src/main/java/com/fsck/k9/fragment/MlfUtils.java rename to k9mail/src/main/java/foundation/e/mail/fragment/MlfUtils.java index f5b91717d0b91bd99d877ffb72df88f423735d06..c5ac3369bc302090d30dc52a30ff8602b1e58639 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/MlfUtils.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/MlfUtils.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import java.util.List; @@ -6,18 +6,18 @@ import java.util.List; import android.database.Cursor; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; import timber.log.Timber; -import static com.fsck.k9.fragment.MLFProjectionInfo.SENDER_LIST_COLUMN; +import static foundation.e.mail.fragment.MLFProjectionInfo.SENDER_LIST_COLUMN; public class MlfUtils { diff --git a/k9mail/src/main/java/com/fsck/k9/fragment/ProgressDialogFragment.java b/k9mail/src/main/java/foundation/e/mail/fragment/ProgressDialogFragment.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/fragment/ProgressDialogFragment.java rename to k9mail/src/main/java/foundation/e/mail/fragment/ProgressDialogFragment.java index ef1fa6425564359eb54dcc33a3662f8bab209d60..dec3e47d2ff8841b72f4456db2ec16828fa033dd 100644 --- a/k9mail/src/main/java/com/fsck/k9/fragment/ProgressDialogFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/fragment/ProgressDialogFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.fragment; +package foundation.e.mail.fragment; import android.app.Activity; import android.app.Dialog; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ClipboardManager.java b/k9mail/src/main/java/foundation/e/mail/helper/ClipboardManager.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/helper/ClipboardManager.java rename to k9mail/src/main/java/foundation/e/mail/helper/ClipboardManager.java index 8ccf7d93383c2176dd86195522282f978d015802..415ee70db122dacc38c40c66be93c83ac4464768 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/ClipboardManager.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ClipboardManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.ClipData; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ContactItem.java b/k9mail/src/main/java/foundation/e/mail/helper/ContactItem.java old mode 100755 new mode 100644 similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/helper/ContactItem.java rename to k9mail/src/main/java/foundation/e/mail/helper/ContactItem.java index 76fa1aa2b3f2e62e8cc1f34179abe04d4a35395c..5fe6697c77584576e6c4893aefc709243e687db7 --- a/k9mail/src/main/java/com/fsck/k9/helper/ContactItem.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ContactItem.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.io.Serializable; import java.util.Collections; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ContactPicture.java b/k9mail/src/main/java/foundation/e/mail/helper/ContactPicture.java similarity index 80% rename from k9mail/src/main/java/com/fsck/k9/helper/ContactPicture.java rename to k9mail/src/main/java/foundation/e/mail/helper/ContactPicture.java index cd3eb8fbfc4a961e8f68278f6d820c6b3f97864d..a43a751cab2c2d9c3b1dfc1768f1de3466074859 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/ContactPicture.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ContactPicture.java @@ -1,11 +1,11 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.Context; import android.util.TypedValue; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.misc.ContactPictureLoader; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.misc.ContactPictureLoader; public class ContactPicture { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/Contacts.java b/k9mail/src/main/java/foundation/e/mail/helper/Contacts.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/helper/Contacts.java rename to k9mail/src/main/java/foundation/e/mail/helper/Contacts.java index 3d520579e1554eb3c8a911e672f643b0b8274801..7d3b95df0a4cc9c6517c86322da0f6769b373bc3 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/Contacts.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/Contacts.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.ContentResolver; @@ -10,7 +10,7 @@ import android.provider.ContactsContract; import timber.log.Timber; import android.provider.ContactsContract.CommonDataKinds.Photo; -import com.fsck.k9.mail.Address; +import foundation.e.mail.mail.Address; /** * Helper class to access the contacts stored on the device. diff --git a/k9mail/src/main/java/foundation/e/mail/helper/EmailHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/EmailHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..c3d477e75cf57b7ce7584279870bd5fadbe5055f --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/helper/EmailHelper.java @@ -0,0 +1,41 @@ +package foundation.e.mail.helper; + + +public final class EmailHelper { + public static String getLocalPartFromEmailAddress(String email) { + int separatorIndex = email.lastIndexOf('@'); + if (separatorIndex == -1 || separatorIndex + 1 == email.length()) { + return null; + } + + return email.substring(0, separatorIndex); + } + + public static String getDomainFromEmailAddress(String email) { + int separatorIndex = email.lastIndexOf('@'); + if (separatorIndex == -1 || separatorIndex + 1 == email.length()) { + return null; + } + + return email.substring(separatorIndex + 1); + } + + public static String getProviderNameFromEmailAddress(String email) { + String domain = getDomainFromEmailAddress(email); + if (domain == null) return null; + + int dotIndex = domain.lastIndexOf("."); + if (dotIndex == -1) return null; + + return domain.substring(0, dotIndex); + } + + public static String[] splitEmail(String email) { + String[] retParts = new String[2]; + String[] emailParts = email.split("@"); + retParts[0] = (emailParts.length > 0) ? emailParts[0] : ""; + retParts[1] = (emailParts.length > 1) ? emailParts[1] : ""; + return retParts; + } + +} diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ExceptionHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/ExceptionHelper.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/helper/ExceptionHelper.java rename to k9mail/src/main/java/foundation/e/mail/helper/ExceptionHelper.java index 146e92a8a6da77136f924fd7abdb2652ddc5e578..4eb3c365958e6cd06c4f3c2da756322aa405d3ce 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/ExceptionHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ExceptionHelper.java @@ -1,7 +1,7 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; public class ExceptionHelper { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/FileHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/FileHelper.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/helper/FileHelper.java rename to k9mail/src/main/java/foundation/e/mail/helper/FileHelper.java index 72cffbf8508263acbf14173372366d979a6280e3..b4ba480a1ed6f5a10c610cf65a780a2f9f093804 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/FileHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/FileHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.io.File; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/IdentityHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/IdentityHelper.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/helper/IdentityHelper.java rename to k9mail/src/main/java/foundation/e/mail/helper/IdentityHelper.java index 6a05cfed3949a346b37b63962cf7974bd0d45b69..daf27427499a851d753f9f3d5b3e02e08c66020a 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/IdentityHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/IdentityHelper.java @@ -1,10 +1,10 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; public class IdentityHelper { @@ -20,7 +20,7 @@ public class IdentityHelper { * @return The identity the message was sent to, or the account's default identity if it * couldn't be determined which identity this message was sent to. * - * @see Account#findIdentity(com.fsck.k9.mail.Address) + * @see Account#findIdentity(foundation.e.mail.mail.Address) */ public static Identity getRecipientIdentityFromMessage(Account account, Message message) { Identity recipient = null; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/K9AlarmManager.java b/k9mail/src/main/java/foundation/e/mail/helper/K9AlarmManager.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/helper/K9AlarmManager.java rename to k9mail/src/main/java/foundation/e/mail/helper/K9AlarmManager.java index 5921477fa314537b85d86b58928ff2ba42ae7046..edef51aa3819260334ea36d703ddfbce9b6743b5 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/K9AlarmManager.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/K9AlarmManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.app.AlarmManager; @@ -8,7 +8,7 @@ import android.os.Build; import android.support.annotation.RequiresApi; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.power.DozeChecker; +import foundation.e.mail.power.DozeChecker; public class K9AlarmManager { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/MailTo.java b/k9mail/src/main/java/foundation/e/mail/helper/MailTo.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/helper/MailTo.java rename to k9mail/src/main/java/foundation/e/mail/helper/MailTo.java index b346968cb4a7b04f09fa628f57409d53c58dba30..1c90dac4aeab2704f8783cce5224d46da1f81524 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/MailTo.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/MailTo.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.util.ArrayList; @@ -6,7 +6,7 @@ import java.util.List; import android.net.Uri; -import com.fsck.k9.mail.Address; +import foundation.e.mail.mail.Address; public final class MailTo { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/MergeCursor.java b/k9mail/src/main/java/foundation/e/mail/helper/MergeCursor.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/helper/MergeCursor.java rename to k9mail/src/main/java/foundation/e/mail/helper/MergeCursor.java index 96dff9ccb0a5063edf391d566413b875ffa364ad..48635edf256d490c41c80d8a0b8904c9ed920123 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/MergeCursor.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/MergeCursor.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.util.Comparator; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/MergeCursorWithUniqueId.java b/k9mail/src/main/java/foundation/e/mail/helper/MergeCursorWithUniqueId.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/helper/MergeCursorWithUniqueId.java rename to k9mail/src/main/java/foundation/e/mail/helper/MergeCursorWithUniqueId.java index 111d49fbbb19b19ca79a75c2fb0cf4110c080b35..aa1fd9afce363b8351c193fd8b55a3f6a52c4797 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/MergeCursorWithUniqueId.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/MergeCursorWithUniqueId.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.util.Comparator; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/MessageHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/MessageHelper.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/helper/MessageHelper.java rename to k9mail/src/main/java/foundation/e/mail/helper/MessageHelper.java index e2d1a2c6943d90519a4fc75eecf27b45fae6beb2..4760b856b96b139a4e4ad11b38e7eb12b04155ac 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/MessageHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/MessageHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.Context; @@ -8,15 +8,15 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.FolderInfoHolder; -import com.fsck.k9.activity.MessageInfoHolder; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.FolderInfoHolder; +import foundation.e.mail.activity.MessageInfoHolder; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mailstore.LocalMessage; public class MessageHelper { /** @@ -28,7 +28,7 @@ public class MessageHelper { * performance tests. *

    * - * @see #toFriendly(Address[], com.fsck.k9.helper.Contacts) + * @see #toFriendly(Address[], foundation.e.mail.helper.Contacts) */ private static final int TOO_MANY_ADDRESSES = 50; @@ -121,7 +121,7 @@ public class MessageHelper { * is returned. If that isn't available either, the email address is * returned. * - * @param address An {@link com.fsck.k9.mail.Address} + * @param address An {@link foundation.e.mail.mail.Address} * @param contacts A {@link Contacts} instance or {@code null}. * @return A "friendly" name for this {@link Address}. */ diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ParcelableUtil.java b/k9mail/src/main/java/foundation/e/mail/helper/ParcelableUtil.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/helper/ParcelableUtil.java rename to k9mail/src/main/java/foundation/e/mail/helper/ParcelableUtil.java index 830c9c0c4749021e75a2c6f74855ecefe820f773..9608af9ee4bd577597c2534be0184d10edc3d09e 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/ParcelableUtil.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ParcelableUtil.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.os.Parcel; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/Preconditions.java b/k9mail/src/main/java/foundation/e/mail/helper/Preconditions.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/helper/Preconditions.java rename to k9mail/src/main/java/foundation/e/mail/helper/Preconditions.java index 9f379eb4482a2426b17c156c9249984de41f12ec..3ab5e1c190ead8ae7bc684c19e163c3b33b585d0 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/Preconditions.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/Preconditions.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; public class Preconditions { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/ReplyToParser.java b/k9mail/src/main/java/foundation/e/mail/helper/ReplyToParser.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/helper/ReplyToParser.java rename to k9mail/src/main/java/foundation/e/mail/helper/ReplyToParser.java index 2358189ac7c913e73968149d88c2ba95d66c47fb..d71b6204d2fe1e463f5e36ab059418b8b3c13374 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/ReplyToParser.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/ReplyToParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.util.ArrayList; @@ -8,11 +8,11 @@ import java.util.List; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.Account; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.internet.ListHeaders; +import foundation.e.mail.Account; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.internet.ListHeaders; public class ReplyToParser { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/RetainFragment.java b/k9mail/src/main/java/foundation/e/mail/helper/RetainFragment.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/helper/RetainFragment.java rename to k9mail/src/main/java/foundation/e/mail/helper/RetainFragment.java index d9406fb79e06ba9d04dcb75672d413ddeea63e83..a60bea4a9665c97ac18b2f6e5c3ab3da6a64bdcb 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/RetainFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/RetainFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.app.Fragment; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java b/k9mail/src/main/java/foundation/e/mail/helper/SimpleTextWatcher.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java rename to k9mail/src/main/java/foundation/e/mail/helper/SimpleTextWatcher.java index 495c6194576255f161ca02e9de326a2c0038d9f2..7dc456163dafba200d02f49791bb2b851ecb343a 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/SimpleTextWatcher.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/SimpleTextWatcher.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.text.Editable; import android.text.TextWatcher; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/SizeFormatter.java b/k9mail/src/main/java/foundation/e/mail/helper/SizeFormatter.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/helper/SizeFormatter.java rename to k9mail/src/main/java/foundation/e/mail/helper/SizeFormatter.java index 08c7f1a11e0c8850a4fbd461fd5009014a18073d..c397ebe3e6f0ca647c1f410407d884b22b1a4c7f 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/SizeFormatter.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/SizeFormatter.java @@ -1,7 +1,7 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.Context; -import com.fsck.k9.R; +import foundation.e.mail.R; public class SizeFormatter { /* diff --git a/k9mail/src/main/java/com/fsck/k9/helper/UnreadWidgetProperties.java b/k9mail/src/main/java/foundation/e/mail/helper/UnreadWidgetProperties.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/helper/UnreadWidgetProperties.java rename to k9mail/src/main/java/foundation/e/mail/helper/UnreadWidgetProperties.java index 9ea867406aa17bcac1eada0bbef2ad3475b83554..86a87ffde28a2b3c29f95350531a8275099d2356 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/UnreadWidgetProperties.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/UnreadWidgetProperties.java @@ -1,20 +1,20 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.Context; import android.content.Intent; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.FolderList; -import com.fsck.k9.activity.MessageList; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchAccount; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.FolderList; +import foundation.e.mail.activity.MessageList; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchAccount; public class UnreadWidgetProperties { diff --git a/k9mail/src/main/java/com/fsck/k9/helper/UrlEncodingHelper.java b/k9mail/src/main/java/foundation/e/mail/helper/UrlEncodingHelper.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/helper/UrlEncodingHelper.java rename to k9mail/src/main/java/foundation/e/mail/helper/UrlEncodingHelper.java index 2e6f1d591251afdb0d922496cd6696d95f8f9af6..bbee325671117cc35e88bc7f926dfbb020731683 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/UrlEncodingHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/UrlEncodingHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/Utility.java b/k9mail/src/main/java/foundation/e/mail/helper/Utility.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/helper/Utility.java rename to k9mail/src/main/java/foundation/e/mail/helper/Utility.java index bd9f4f42ce55068c9ad4990f675280b836650f47..83d2a5bde6f37d0afdd5eac834400dc4c8c19e7c 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/Utility.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/Utility.java @@ -1,5 +1,5 @@ -package com.fsck.k9.helper; +package foundation.e.mail.helper; import android.content.Context; import android.database.Cursor; @@ -16,8 +16,9 @@ import timber.log.Timber; import android.widget.EditText; import android.widget.TextView; -import com.fsck.k9.ui.ContactBadge; -import com.fsck.k9.mail.Address; +import foundation.e.mail.RoundedQuickContactBadge; +import foundation.e.mail.ui.ContactBadge; +import foundation.e.mail.mail.Address; import org.apache.james.mime4j.util.MimeUtil; @@ -109,21 +110,22 @@ public class Utility { public static boolean requiredFieldValid(Editable s) { + return s != null && requiredFieldValid(s.toString()); + } + + public static boolean requiredFieldValid(String s) { return s != null && s.length() > 0; } public static boolean domainFieldValid(EditText view) { - if (view.getText() != null) { - String s = view.getText().toString(); - if (s.matches("^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?$") && - s.length() <= 253) { - return true; - } - if (s.matches("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")) { - return true; - } - } - return false; + return view != null && view.getText() != null && domainFieldValid(view.getText().toString()); + } + + public static boolean domainFieldValid(String s) { + return s.matches( + "^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)*[a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?$") && + s.length() <= 253 || s.matches( + "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); } /* @@ -478,7 +480,7 @@ public class Utility { * @param contactBadge the badge to the set the contact for * @param address the address to look for a contact for. */ - public static void setContactForBadge(ContactBadge contactBadge, + public static void setContactForBadge(RoundedQuickContactBadge contactBadge, Address address) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { Bundle extraContactInfo = new Bundle(); diff --git a/k9mail/src/main/java/com/fsck/k9/helper/jsoup/AdvancedNodeTraversor.java b/k9mail/src/main/java/foundation/e/mail/helper/jsoup/AdvancedNodeTraversor.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/helper/jsoup/AdvancedNodeTraversor.java rename to k9mail/src/main/java/foundation/e/mail/helper/jsoup/AdvancedNodeTraversor.java index cfcab37a4cc186a1cb8e5bcbba89201b44de7427..e4f9f2e196e5856e2e91e83cba95e73272c4e174 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/jsoup/AdvancedNodeTraversor.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/jsoup/AdvancedNodeTraversor.java @@ -21,11 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package com.fsck.k9.helper.jsoup; +package foundation.e.mail.helper.jsoup; -import com.fsck.k9.helper.jsoup.NodeFilter.HeadFilterDecision; -import com.fsck.k9.helper.jsoup.NodeFilter.TailFilterDecision; +import foundation.e.mail.helper.jsoup.NodeFilter.HeadFilterDecision; +import foundation.e.mail.helper.jsoup.NodeFilter.TailFilterDecision; import org.jsoup.nodes.Node; import org.jsoup.select.NodeTraversor; diff --git a/k9mail/src/main/java/com/fsck/k9/helper/jsoup/NodeFilter.java b/k9mail/src/main/java/foundation/e/mail/helper/jsoup/NodeFilter.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/helper/jsoup/NodeFilter.java rename to k9mail/src/main/java/foundation/e/mail/helper/jsoup/NodeFilter.java index 8fb22e7d5d61529fd128dd9231869be16235a1b7..7bcea8871a0f12e290cd41514090d535c7fefb80 100644 --- a/k9mail/src/main/java/com/fsck/k9/helper/jsoup/NodeFilter.java +++ b/k9mail/src/main/java/foundation/e/mail/helper/jsoup/NodeFilter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.helper.jsoup; +package foundation.e.mail.helper.jsoup; import android.support.annotation.NonNull; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentResolver.java b/k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentResolver.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentResolver.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentResolver.java index 9166eb0cfd9fb5463f1cc6221680416fe274fa2c..c1d308232ab9d97a36c9d627ab7353554e747321 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentResolver.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentResolver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.util.Collections; @@ -12,11 +12,11 @@ import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; import timber.log.Timber; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.message.extractors.AttachmentInfoExtractor; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.message.extractors.AttachmentInfoExtractor; /** diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentViewInfo.java b/k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentViewInfo.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentViewInfo.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentViewInfo.java index 31b04d405cdb39a7ac3bcc7cf41f9f0b477231bc..8ed05a2edbc519dcca7741edf0a7f7d738ae6f30 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/AttachmentViewInfo.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/AttachmentViewInfo.java @@ -1,9 +1,9 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import android.net.Uri; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Part; public class AttachmentViewInfo { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/BinaryAttachmentBody.java b/k9mail/src/main/java/foundation/e/mail/mailstore/BinaryAttachmentBody.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/mailstore/BinaryAttachmentBody.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/BinaryAttachmentBody.java index eecf8ed8c96cfd88247f7f3923780e770a94eb91..7fcb402fd96e5512f6e52dfa66ee4604725abbc9 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/BinaryAttachmentBody.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/BinaryAttachmentBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.IOException; import java.io.InputStream; @@ -8,9 +8,9 @@ import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.codec.QuotedPrintableOutputStream; import org.apache.james.mime4j.util.MimeUtil; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.Base64OutputStream; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.Base64OutputStream; /** * Superclass for attachments that contain binary data. diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/CryptoResultAnnotation.java b/k9mail/src/main/java/foundation/e/mail/mailstore/CryptoResultAnnotation.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/mailstore/CryptoResultAnnotation.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/CryptoResultAnnotation.java index 70615ebf4988bcbe0f3306d3bd6172ad422e7990..b2ebbf37cc5c71f18802ef9c6dad3f1bf297c83f 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/CryptoResultAnnotation.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/CryptoResultAnnotation.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import android.app.PendingIntent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.fsck.k9.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeBodyPart; import org.openintents.openpgp.OpenPgpDecryptionResult; import org.openintents.openpgp.OpenPgpError; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/DatabasePreviewType.java b/k9mail/src/main/java/foundation/e/mail/mailstore/DatabasePreviewType.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/mailstore/DatabasePreviewType.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/DatabasePreviewType.java index 40a262caaee47dcfea6cbd9c07121d889dfb3fea..b90a400f78544f30bc6258c2192dff335336c9ee 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/DatabasePreviewType.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/DatabasePreviewType.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; -import com.fsck.k9.message.extractors.PreviewResult.PreviewType; +import foundation.e.mail.message.extractors.PreviewResult.PreviewType; public enum DatabasePreviewType { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/DeferredFileBody.java b/k9mail/src/main/java/foundation/e/mail/mailstore/DeferredFileBody.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/mailstore/DeferredFileBody.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/DeferredFileBody.java index d9bf3b100905f7d240a4687a4926c47c5acbce25..104a5560cba348507d0183936705b42f82ff4746 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/DeferredFileBody.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/DeferredFileBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.BufferedInputStream; @@ -14,11 +14,11 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import timber.log.Timber; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.RawDataBody; -import com.fsck.k9.mail.internet.SizeAware; -import com.fsck.k9.mailstore.util.DeferredFileOutputStream; -import com.fsck.k9.mailstore.util.FileFactory; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.RawDataBody; +import foundation.e.mail.mail.internet.SizeAware; +import foundation.e.mail.mailstore.util.DeferredFileOutputStream; +import foundation.e.mail.mailstore.util.FileFactory; import org.apache.commons.io.IOUtils; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java b/k9mail/src/main/java/foundation/e/mail/mailstore/FileBackedBody.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/FileBackedBody.java index beb1c56c50cd2c9324fad850760e12317611fbab..1bd304e912881dee54a086ccb6279a9b2c0d9e33 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/FileBackedBody.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/FileBackedBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.File; @@ -8,10 +8,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.RawDataBody; -import com.fsck.k9.mail.internet.SizeAware; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.RawDataBody; +import foundation.e.mail.mail.internet.SizeAware; import org.apache.commons.io.IOUtils; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalBodyPart.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalBodyPart.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalBodyPart.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalBodyPart.java index 7fd31aaa6ac4e7e75c03613375b2d617cb1b16d2..6edd1ed3104a0baa829ad7e50df6735bf473fd9f 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalBodyPart.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalBodyPart.java @@ -1,8 +1,8 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeBodyPart; public class LocalBodyPart extends MimeBodyPart implements LocalPart { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalFolder.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalFolder.java index 63d863ba00a443e7cf82fda7821c6b13025e4286..71c025386eb64c9ed219e27ad7412e423ab008a5 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalFolder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; @@ -26,43 +26,43 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.NonNull; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.Search; -import com.fsck.k9.helper.FileHelper; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.BoundaryGenerator; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.filter.CountingOutputStream; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mail.internet.SizeAware; -import com.fsck.k9.mail.message.MessageHeaderParser; -import com.fsck.k9.mailstore.LockableDatabase.DbCallback; -import com.fsck.k9.mailstore.LockableDatabase.WrappedException; -import com.fsck.k9.message.extractors.AttachmentCounter; -import com.fsck.k9.message.extractors.AttachmentInfoExtractor; -import com.fsck.k9.message.extractors.MessageFulltextCreator; -import com.fsck.k9.message.extractors.MessagePreviewCreator; -import com.fsck.k9.message.extractors.PreviewResult; -import com.fsck.k9.message.extractors.PreviewResult.PreviewType; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.Search; +import foundation.e.mail.helper.FileHelper; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.BoundaryGenerator; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.filter.CountingOutputStream; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mail.internet.SizeAware; +import foundation.e.mail.mail.message.MessageHeaderParser; +import foundation.e.mail.mailstore.LockableDatabase.DbCallback; +import foundation.e.mail.mailstore.LockableDatabase.WrappedException; +import foundation.e.mail.message.extractors.AttachmentCounter; +import foundation.e.mail.message.extractors.AttachmentInfoExtractor; +import foundation.e.mail.message.extractors.MessageFulltextCreator; +import foundation.e.mail.message.extractors.MessagePreviewCreator; +import foundation.e.mail.message.extractors.PreviewResult; +import foundation.e.mail.message.extractors.PreviewResult.PreviewType; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.util.MimeUtil; import timber.log.Timber; @@ -2070,7 +2070,7 @@ public class LocalFolder extends Folder { /** *

    Fetches the most recent numeric UID value in this folder. This is used by - * {@link com.fsck.k9.controller.MessagingController#shouldNotifyForMessage} to see if messages being + * {@link foundation.e.mail.controller.MessagingController#shouldNotifyForMessage} to see if messages being * fetched are new and unread. Messages are "new" if they have a UID higher than the most recent UID prior * to synchronization.

    * diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalMessage.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalMessage.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalMessage.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalMessage.java index e842c9adc4f226a8ce31c8e1cb7449ed75e1781f..a3ec193c03a76ab79672e2d9e37c6d5aa70b30a0 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalMessage.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalMessage.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; @@ -11,18 +11,18 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.Account; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.message.MessageHeaderParser; -import com.fsck.k9.mailstore.LockableDatabase.DbCallback; -import com.fsck.k9.mailstore.LockableDatabase.WrappedException; -import com.fsck.k9.message.extractors.PreviewResult.PreviewType; +import foundation.e.mail.Account; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.message.MessageHeaderParser; +import foundation.e.mail.mailstore.LockableDatabase.DbCallback; +import foundation.e.mail.mailstore.LockableDatabase.WrappedException; +import foundation.e.mail.message.extractors.PreviewResult.PreviewType; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalMimeMessage.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalMimeMessage.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalMimeMessage.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalMimeMessage.java index e221ee005a2ab88c9b5499f4867bf6dce0f2f269..c1c52fbf47b7117a59e983e91f1d397e88c4a288 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalMimeMessage.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalMimeMessage.java @@ -1,7 +1,7 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMessage; public class LocalMimeMessage extends MimeMessage implements LocalPart { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalPart.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalPart.java similarity index 78% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalPart.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalPart.java index 42dd65fdca4c561f032c1b853930aee6b0e23d4a..806b32f19b9c641d87297b274302df85afaf29e2 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalPart.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalPart.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; public interface LocalPart { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalStore.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalStore.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LocalStore.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LocalStore.java index 92204244d26b7719dfd6c01bd043f3d0917a60dc..a635e905387ac2f28a42352a626b686759bf43aa 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LocalStore.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LocalStore.java @@ -1,5 +1,5 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; @@ -30,39 +30,39 @@ import android.support.annotation.Nullable; import android.text.TextUtils; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.controller.PendingCommandSerializer; -import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.FetchProfile.Item; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessageRetrievalListener; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.Store; -import com.fsck.k9.mailstore.LocalFolder.DataLocation; -import com.fsck.k9.mailstore.LocalFolder.MoreMessages; -import com.fsck.k9.mailstore.LockableDatabase.DbCallback; -import com.fsck.k9.mailstore.LockableDatabase.WrappedException; -import com.fsck.k9.mailstore.StorageManager.StorageProvider; -import com.fsck.k9.message.extractors.AttachmentCounter; -import com.fsck.k9.message.extractors.AttachmentInfoExtractor; -import com.fsck.k9.message.extractors.MessageFulltextCreator; -import com.fsck.k9.message.extractors.MessagePreviewCreator; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.provider.EmailProvider; -import com.fsck.k9.provider.EmailProvider.MessageColumns; -import com.fsck.k9.search.LocalSearch; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchField; -import com.fsck.k9.search.SqlQueryBuilder; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.controller.PendingCommandSerializer; +import foundation.e.mail.controller.MessagingControllerCommands.PendingCommand; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.FetchProfile.Item; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessageRetrievalListener; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.Store; +import foundation.e.mail.mailstore.LocalFolder.DataLocation; +import foundation.e.mail.mailstore.LocalFolder.MoreMessages; +import foundation.e.mail.mailstore.LockableDatabase.DbCallback; +import foundation.e.mail.mailstore.LockableDatabase.WrappedException; +import foundation.e.mail.mailstore.StorageManager.StorageProvider; +import foundation.e.mail.message.extractors.AttachmentCounter; +import foundation.e.mail.message.extractors.AttachmentInfoExtractor; +import foundation.e.mail.message.extractors.MessageFulltextCreator; +import foundation.e.mail.message.extractors.MessagePreviewCreator; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.provider.EmailProvider; +import foundation.e.mail.provider.EmailProvider.MessageColumns; +import foundation.e.mail.search.LocalSearch; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchField; +import foundation.e.mail.search.SqlQueryBuilder; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.codec.Base64InputStream; import org.apache.james.mime4j.codec.QuotedPrintableInputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/LockableDatabase.java b/k9mail/src/main/java/foundation/e/mail/mailstore/LockableDatabase.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/mailstore/LockableDatabase.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/LockableDatabase.java index 2c7d3b727e280f50f5df83aa769f6506b3c4f083..1e78a3f9d5b17114243905b11f27a4c9d36a6212 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/LockableDatabase.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/LockableDatabase.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.File; import java.util.concurrent.locks.Lock; @@ -12,9 +12,9 @@ import android.database.sqlite.SQLiteException; import android.os.Build; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.helper.FileHelper; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.K9; +import foundation.e.mail.helper.FileHelper; +import foundation.e.mail.mail.MessagingException; import static java.lang.System.currentTimeMillis; @@ -35,8 +35,8 @@ public class LockableDatabase { * null. * @return Any relevant data. Can be null. * @throws WrappedException - * @throws com.fsck.k9.mail.MessagingException - * @throws com.fsck.k9.mailstore.UnavailableStorageException + * @throws foundation.e.mail.mail.MessagingException + * @throws foundation.e.mail.mailstore.UnavailableStorageException */ T doDbWork(SQLiteDatabase db) throws WrappedException, MessagingException; } diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageHelper.java b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageHelper.java similarity index 76% rename from k9mail/src/main/java/com/fsck/k9/mailstore/MessageHelper.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/MessageHelper.java index a08612e2bc987529f818efd3e8c2e0eccc98c9ae..6ea942c9608aa9b849c04ca91e651a62b8132e28 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageHelper.java @@ -1,14 +1,14 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.util.Stack; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MimeBodyPart; public class MessageHelper { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageRemovalListener.java b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageRemovalListener.java similarity index 55% rename from k9mail/src/main/java/com/fsck/k9/mailstore/MessageRemovalListener.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/MessageRemovalListener.java index 51ad9a15e44a20c4d2322963ae741d2bc09890a8..6ab80dc64885714f418f7c3a04c5503568ba322e 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageRemovalListener.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageRemovalListener.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; -import com.fsck.k9.mail.Message; +import foundation.e.mail.mail.Message; public interface MessageRemovalListener { public void messageRemoved(Message message); diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfo.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfo.java index bda32a1fc6e6110330b1e38afc850f24cce3d4b3..c2fa350e8cd2f19a632e81a4043f60a273f0335b 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfo.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfo.java @@ -1,11 +1,11 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.util.Collections; import java.util.List; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; public class MessageViewInfo { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfoExtractor.java b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfoExtractor.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfoExtractor.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfoExtractor.java index 9956c2b9b7c2f84a04e783698c82c420ea200da7..a7cfcee0ecda9c5e5fd4baaac0031e54b3e66ff7 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MessageViewInfoExtractor.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/MessageViewInfoExtractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.util.ArrayList; @@ -11,33 +11,33 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; -import com.fsck.k9.Globals; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.crypto.MessageCryptoStructureDetector; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.Viewable; -import com.fsck.k9.mail.internet.Viewable.Flowed; -import com.fsck.k9.mailstore.CryptoResultAnnotation.CryptoError; -import com.fsck.k9.mailstore.util.FlowedMessageUtils; -import com.fsck.k9.message.extractors.AttachmentInfoExtractor; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.message.html.HtmlProcessor; -import com.fsck.k9.ui.crypto.MessageCryptoAnnotations; +import foundation.e.mail.Globals; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.crypto.MessageCryptoStructureDetector; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.Viewable; +import foundation.e.mail.mail.internet.Viewable.Flowed; +import foundation.e.mail.mailstore.CryptoResultAnnotation.CryptoError; +import foundation.e.mail.mailstore.util.FlowedMessageUtils; +import foundation.e.mail.message.extractors.AttachmentInfoExtractor; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.message.html.HtmlProcessor; +import foundation.e.mail.ui.crypto.MessageCryptoAnnotations; import org.openintents.openpgp.util.OpenPgpUtils; import timber.log.Timber; -import static com.fsck.k9.mail.internet.MimeUtility.getHeaderParameter; -import static com.fsck.k9.mail.internet.Viewable.Alternative; -import static com.fsck.k9.mail.internet.Viewable.Html; -import static com.fsck.k9.mail.internet.Viewable.MessageHeader; -import static com.fsck.k9.mail.internet.Viewable.Text; -import static com.fsck.k9.mail.internet.Viewable.Textual; +import static foundation.e.mail.mail.internet.MimeUtility.getHeaderParameter; +import static foundation.e.mail.mail.internet.Viewable.Alternative; +import static foundation.e.mail.mail.internet.Viewable.Html; +import static foundation.e.mail.mail.internet.Viewable.MessageHeader; +import static foundation.e.mail.mail.internet.Viewable.Text; +import static foundation.e.mail.mail.internet.Viewable.Textual; public class MessageViewInfoExtractor { private static final String TEXT_DIVIDER = @@ -146,7 +146,7 @@ public class MessageViewInfoExtractor { * @return A {@link ViewableExtractedText} instance containing the textual parts of the message as * plain text and HTML, and a list of message parts considered attachments. * - * @throws com.fsck.k9.mail.MessagingException + * @throws foundation.e.mail.mail.MessagingException * In case of an error. */ @VisibleForTesting @@ -224,7 +224,7 @@ public class MessageViewInfoExtractor { } /** - * Use the contents of a {@link com.fsck.k9.mail.internet.Viewable} to create the HTML to be displayed. + * Use the contents of a {@link foundation.e.mail.mail.internet.Viewable} to create the HTML to be displayed. * *

    * This will use {@link HtmlConverter#textToHtml(String)} to convert plain text parts @@ -404,7 +404,7 @@ public class MessageViewInfoExtractor { * @param message * The message to extract the header values from. * - * @throws com.fsck.k9.mail.MessagingException + * @throws foundation.e.mail.mail.MessagingException * In case of an error. */ private void addMessageHeaderText(StringBuilder text, Message message) @@ -465,7 +465,7 @@ public class MessageViewInfoExtractor { * @param message * The message to extract the header values from. * - * @throws com.fsck.k9.mail.MessagingException + * @throws foundation.e.mail.mail.MessagingException * In case of an error. */ private void addMessageHeaderHtml(StringBuilder html, Message message) diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/MimePartStreamParser.java b/k9mail/src/main/java/foundation/e/mail/mailstore/MimePartStreamParser.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/mailstore/MimePartStreamParser.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/MimePartStreamParser.java index 574164f02b0c70c61e6f2accb325d7db09f06c53..b5c2e0e59470f4825c1225f38212d5218b0685dd 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/MimePartStreamParser.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/MimePartStreamParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayOutputStream; @@ -7,17 +7,17 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.Stack; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.util.FileFactory; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.util.FileFactory; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.MimeException; import org.apache.james.mime4j.io.EOLConvertingInputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/StorageManager.java b/k9mail/src/main/java/foundation/e/mail/mailstore/StorageManager.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/mailstore/StorageManager.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/StorageManager.java index 5fa8dbb11cd8695bb76403eb475d7d4b4aa81535..363dfb8b753b11d38a038cd4c6834a25b188531d 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/StorageManager.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/StorageManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.File; import java.io.IOException; @@ -17,8 +17,8 @@ import android.os.Build; import android.os.Environment; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.R; +import foundation.e.mail.K9; +import foundation.e.mail.R; /** * Manager for different {@link StorageProvider} -classes that abstract access diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/StoreSchemaDefinition.java b/k9mail/src/main/java/foundation/e/mail/mailstore/StoreSchemaDefinition.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/mailstore/StoreSchemaDefinition.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/StoreSchemaDefinition.java index 7e8fd4150ccfb358c725b893684a4e11bd62cc73..6d96c146bcf1f653f5cda34b0e63cdeebfad3768 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/StoreSchemaDefinition.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/StoreSchemaDefinition.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.util.List; @@ -7,15 +7,15 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.migrations.Migrations; -import com.fsck.k9.mailstore.migrations.MigrationsHelper; -import com.fsck.k9.preferences.Storage; +import foundation.e.mail.Account; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.migrations.Migrations; +import foundation.e.mail.mailstore.migrations.MigrationsHelper; +import foundation.e.mail.preferences.Storage; -import static com.fsck.k9.mailstore.LocalStore.DB_VERSION; +import static foundation.e.mail.mailstore.LocalStore.DB_VERSION; class StoreSchemaDefinition implements LockableDatabase.SchemaDefinition { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/TempFileBody.java b/k9mail/src/main/java/foundation/e/mail/mailstore/TempFileBody.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/mailstore/TempFileBody.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/TempFileBody.java index 9703951f27c9cfcc3129b82ffcc41f0aa789bd1f..75149d6428e94275118e41e429d57e61a19cb06a 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/TempFileBody.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/TempFileBody.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; import java.io.ByteArrayInputStream; import java.io.File; @@ -6,7 +6,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; -import com.fsck.k9.mail.internet.SizeAware; +import foundation.e.mail.mail.internet.SizeAware; /** diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/ThreadInfo.java b/k9mail/src/main/java/foundation/e/mail/mailstore/ThreadInfo.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/mailstore/ThreadInfo.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/ThreadInfo.java index 9f9ee22045f45f889e857cb7eee69a77162464e5..4ccb274f9c8e46201a4e7f2560e5a45db4da2cae 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/ThreadInfo.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/ThreadInfo.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; class ThreadInfo { public final long threadId; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/UnavailableStorageException.java b/k9mail/src/main/java/foundation/e/mail/mailstore/UnavailableStorageException.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/mailstore/UnavailableStorageException.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/UnavailableStorageException.java index d764a0e39178535f4a106719ae504b736413e6f8..765f6014f84ae4f5733ae65c1ee82f10d011c37c 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/UnavailableStorageException.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/UnavailableStorageException.java @@ -1,6 +1,6 @@ -package com.fsck.k9.mailstore; +package foundation.e.mail.mailstore; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.mail.MessagingException; public class UnavailableStorageException extends MessagingException { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo30.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo30.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo30.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo30.java index ed27ba254e554835ea0a5f598c3a2e0134349023..81e6b61cd983b42416d3d3bfd457f58a9fef9da6 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo30.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo30.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo31.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo31.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo31.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo31.java index 3bede318b6a35b6de0a01be1eb57708760b74622..0895e2112d94aa2dae5deef1f54a765b7bf81403 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo31.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo31.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo32.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo32.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo32.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo32.java index c71bd38bfee3df555244c22cbbf8fb0bf544b005..c2ef7ee9940c923a284c5342b4c2b5ad3f55c722 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo32.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo32.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo33.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo33.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo33.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo33.java index 739a5e95805d8a3a97299082bda141ec695693d1..9c6a0ba2c064d18c614c3a99df32ff40804e4650 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo33.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo33.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo34.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo34.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo34.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo34.java index b90d4e4d7cb72f35a1c9c1630965fe03e5b1b187..1840685b535d7890fdcc886c331fb85855162f53 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo34.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo34.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo35.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo35.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo35.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo35.java index 03a33bb4fe92aff3746278bd80305a042b4abbee..ab5cc22062fec6767948d1c898597b44c8a018eb 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo35.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo35.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo36.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo36.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo36.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo36.java index 5924d37b6e7f68f385cd450a2df18b78ec254858..2f411bddb22b70aa8c9140d4eccc141950a93ebb 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo36.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo36.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo37.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo37.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo37.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo37.java index 1007c0f4e2b376b0020b97f415a1046e69f2274e..92b48f589cc98abbe5cb6eba52dddceb13b2a43e 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo37.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo37.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo39.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo39.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo39.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo39.java index 26b3733b54b710e218c1531a70ddde670e31fc53..0e5642f6448cd5fc63ac49083dc70eb936699156 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo39.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo39.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo40.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo40.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo40.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo40.java index 2f8f2592f71d2c12e0de9d7fae721d6a22e33d38..bd6d25c2d03a1f931ac852e719514b7295283c20 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo40.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo40.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo41.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo41.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo41.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo41.java index 9904b48d2fbd57a8433ec40461909dfca7b5a15b..d1b053c323ed70fc2b874ccb378a4941af96270c 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo41.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo41.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.Cursor; @@ -6,10 +6,10 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.preferences.Storage; +import foundation.e.mail.Account; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.preferences.Storage; class MigrationTo41 { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo42.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo42.java similarity index 80% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo42.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo42.java index c61e1a76331042a2ab784c6ee45c0a16add68b47..4fe62ca7070ad5e6f91d49b4fcaf4f67c9d2b1eb 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo42.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo42.java @@ -1,15 +1,15 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.util.List; import android.os.SystemClock; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo43.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo43.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo43.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo43.java index 1b6fa93b2bf9c6cdf5c88703db2ffd05d8242e7c..9a47f0ef0caf5a4f7869d46d63eac201fbc78779 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo43.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo43.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.util.List; @@ -8,13 +8,13 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; -import static com.fsck.k9.Account.OUTBOX; +import static foundation.e.mail.Account.OUTBOX; class MigrationTo43 { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo44.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo44.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo44.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo44.java index cb8d1b405ad71c38f82279700c1761c705587ce5..fab470a5137bf44c5ef4af9ccb74e5411674060d 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo44.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo44.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo45.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo45.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo45.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo45.java index 0cd15443a92df66f342a94bd3993ae8122a2cfda..fd98541ceac93155b4340147805bd4d33561c189 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo45.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo45.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo46.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo46.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo46.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo46.java index ad591f121b5cb8cea8f56ee0f8027b5fc5fd1840..bdc7b23c1aebc4de444502c97865ff2dbc80a531 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo46.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo46.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.util.ArrayList; @@ -8,7 +8,7 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.mail.Flag; class MigrationTo46 { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo47.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo47.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo47.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo47.java index ad0a8e1023525668ebc6b8b56f2404ec12c03aac..bbf30e40fad6bf548a78d58dc82b3451e0d6ec16 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo47.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo47.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.content.ContentValues; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo48.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo48.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo48.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo48.java index c4a63054ae3127da993497def9f4596a5a367cd3..9a037b7d9cac79800c4e5363017113456f16b709 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo48.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo48.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo49.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo49.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo49.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo49.java index 983c636e81ee15f81c9f1f18d97f2be16ccc2ab9..8d4554b6fe09a6f5d7a4b03bd97b4b49afacb48d 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo49.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo49.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo50.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo50.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo50.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo50.java index 88a1fae4f41d2268f391ca554853ec9213b85a8a..1cb6745830e5642bc2afd537cc4affa88c6d1d06 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo50.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo50.java @@ -1,12 +1,12 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; -import com.fsck.k9.Account; -import com.fsck.k9.mail.Folder; +import foundation.e.mail.Account; +import foundation.e.mail.mail.Folder; class MigrationTo50 { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo51.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo51.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo51.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo51.java index fa950158b1dd1b4811296358c96aa32be5698672..1c26aa0237b5b1edde988d2525d0b145af430ff8 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo51.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo51.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.io.ByteArrayOutputStream; @@ -17,12 +17,12 @@ import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.StorageManager; +import foundation.e.mail.Account; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.StorageManager; import org.apache.james.mime4j.codec.QuotedPrintableOutputStream; import org.apache.james.mime4j.util.MimeUtil; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo52.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo52.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo52.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo52.java index efdbe4ec832de161274c06c085271661c09def8f..e958e8a622c653853e455947d10791d96d16b9c1 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo52.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo52.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo53.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo53.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo53.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo53.java index ecaa2c1e7d54867a4ab9ea4a1595d53a73f774c8..a13ed86ba6ca1168a896fd145959024410b4d60f 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo53.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo53.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo54.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo54.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo54.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo54.java index 07b00041f94227c8feeb786d878d7a08407d1e8b..0f8b98df3f889373a60e99d5df3eaf371dccfaac 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo54.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo54.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo55.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo55.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo55.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo55.java index ca2cda2fa4783cf5132afc89560fb5aa27eeff78..41b2ec6b0150bf8e7eef809761ebfec6456ecbfe 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo55.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo55.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.util.Collections; @@ -9,12 +9,12 @@ import android.database.sqlite.SQLiteDatabase; import android.text.TextUtils; import timber.log.Timber; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.message.extractors.MessageFulltextCreator; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.message.extractors.MessageFulltextCreator; class MigrationTo55 { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo56.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo56.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo56.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo56.java index 7b8743f7fb58fa7ecacf728b86b2db610844eaa5..b0a55ade771b40bcfc049c255e85646d8d3fc9a5 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo56.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo56.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo57.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo57.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo57.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo57.java index 6519069def6a88fcd430f4ff8353b60042663544..de54b7d17b4ddf3c8080e1da8c43f1127461ec05 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo57.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo57.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo58.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo58.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo58.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo58.java index 5f0b7180c71a9ffe64eb3ed4bb3936e8c9ace353..0bf8abbaf1bc943aebea281301fcb0b094622fdd 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo58.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo58.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo59.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo59.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo59.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo59.java index 5a00852c68fa90f30926d75a1cfd8e459d0b6591..9716fe14dd3bfeb7db6031e45ee9ae5fce147d94 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo59.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo59.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo60.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo60.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo60.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo60.java index 36e4c54ad85fc4a27ce3d537f36b1c7d91d5a2ae..86808510342fea7829167895921b4dc3f5e870ee 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo60.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo60.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.nio.charset.Charset; @@ -13,30 +13,30 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.controller.MessagingControllerCommands.PendingAppend; -import com.fsck.k9.controller.MessagingControllerCommands.PendingCommand; -import com.fsck.k9.controller.MessagingControllerCommands.PendingEmptyTrash; -import com.fsck.k9.controller.MessagingControllerCommands.PendingExpunge; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMarkAllAsRead; -import com.fsck.k9.controller.MessagingControllerCommands.PendingMoveOrCopy; -import com.fsck.k9.controller.MessagingControllerCommands.PendingSetFlag; -import com.fsck.k9.controller.PendingCommandSerializer; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Flag; +import foundation.e.mail.controller.MessagingControllerCommands.PendingAppend; +import foundation.e.mail.controller.MessagingControllerCommands.PendingCommand; +import foundation.e.mail.controller.MessagingControllerCommands.PendingEmptyTrash; +import foundation.e.mail.controller.MessagingControllerCommands.PendingExpunge; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMarkAllAsRead; +import foundation.e.mail.controller.MessagingControllerCommands.PendingMoveOrCopy; +import foundation.e.mail.controller.MessagingControllerCommands.PendingSetFlag; +import foundation.e.mail.controller.PendingCommandSerializer; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Flag; import static java.util.Collections.singletonList; class MigrationTo60 { - private static final String PENDING_COMMAND_MOVE_OR_COPY = "com.fsck.k9.MessagingController.moveOrCopy"; - private static final String PENDING_COMMAND_MOVE_OR_COPY_BULK = "com.fsck.k9.MessagingController.moveOrCopyBulk"; - private static final String PENDING_COMMAND_MOVE_OR_COPY_BULK_NEW = "com.fsck.k9.MessagingController.moveOrCopyBulkNew"; - private static final String PENDING_COMMAND_EMPTY_TRASH = "com.fsck.k9.MessagingController.emptyTrash"; - private static final String PENDING_COMMAND_SET_FLAG_BULK = "com.fsck.k9.MessagingController.setFlagBulk"; - private static final String PENDING_COMMAND_SET_FLAG = "com.fsck.k9.MessagingController.setFlag"; - private static final String PENDING_COMMAND_APPEND = "com.fsck.k9.MessagingController.append"; - private static final String PENDING_COMMAND_MARK_ALL_AS_READ = "com.fsck.k9.MessagingController.markAllAsRead"; - private static final String PENDING_COMMAND_EXPUNGE = "com.fsck.k9.MessagingController.expunge"; + private static final String PENDING_COMMAND_MOVE_OR_COPY = "foundation.e.mail.MessagingController.moveOrCopy"; + private static final String PENDING_COMMAND_MOVE_OR_COPY_BULK = "foundation.e.mail.MessagingController.moveOrCopyBulk"; + private static final String PENDING_COMMAND_MOVE_OR_COPY_BULK_NEW = "foundation.e.mail.MessagingController.moveOrCopyBulkNew"; + private static final String PENDING_COMMAND_EMPTY_TRASH = "foundation.e.mail.MessagingController.emptyTrash"; + private static final String PENDING_COMMAND_SET_FLAG_BULK = "foundation.e.mail.MessagingController.setFlagBulk"; + private static final String PENDING_COMMAND_SET_FLAG = "foundation.e.mail.MessagingController.setFlag"; + private static final String PENDING_COMMAND_APPEND = "foundation.e.mail.MessagingController.append"; + private static final String PENDING_COMMAND_MARK_ALL_AS_READ = "foundation.e.mail.MessagingController.markAllAsRead"; + private static final String PENDING_COMMAND_EXPUNGE = "foundation.e.mail.MessagingController.expunge"; public static void migratePendingCommands(SQLiteDatabase db) { diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo61.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo61.java similarity index 53% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo61.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo61.java index edfdd83b7ffedc54c79be4edfb314d660dd0de2c..573bcc818903c5d1d15f672f1db40c8540453e1e 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationTo61.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationTo61.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; @@ -6,6 +6,6 @@ import android.database.sqlite.SQLiteDatabase; class MigrationTo61 { public static void removeErrorsFolder(SQLiteDatabase db) { - db.execSQL("DELETE FROM folders WHERE name = 'K9mail-errors'"); + db.execSQL("DELETE FROM folders WHERE name = 'eelo Mail-errors'"); } } diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/Migrations.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/Migrations.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/Migrations.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/Migrations.java index 03397c3e4a77101ec55c4759b05bdd0b8993fb18..cb47464467bd8471c0b1d80cb50ba957b34343d9 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/Migrations.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/Migrations.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import android.database.sqlite.SQLiteDatabase; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationsHelper.java b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationsHelper.java similarity index 63% rename from k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationsHelper.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationsHelper.java index 1558c48dfbc62a32e9c49ce74bec8be3ea334381..be26bb4f8beea9d1f0af9e9860b2613b37c6f3b8 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/migrations/MigrationsHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/migrations/MigrationsHelper.java @@ -1,14 +1,14 @@ -package com.fsck.k9.mailstore.migrations; +package foundation.e.mail.mailstore.migrations; import java.util.List; import android.content.Context; -import com.fsck.k9.Account; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.preferences.Storage; +import foundation.e.mail.Account; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.preferences.Storage; /** diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/util/DeferredFileOutputStream.java b/k9mail/src/main/java/foundation/e/mail/mailstore/util/DeferredFileOutputStream.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/mailstore/util/DeferredFileOutputStream.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/util/DeferredFileOutputStream.java index a56ea9a9f6aeb0ff0ce6d1bd5e72dc1f265e1d16..9718ab547df565868b9fcfc75ee50ea6c4f1870d 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/util/DeferredFileOutputStream.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/util/DeferredFileOutputStream.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.util; +package foundation.e.mail.mailstore.util; import java.io.ByteArrayOutputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/util/FileFactory.java b/k9mail/src/main/java/foundation/e/mail/mailstore/util/FileFactory.java similarity index 75% rename from k9mail/src/main/java/com/fsck/k9/mailstore/util/FileFactory.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/util/FileFactory.java index 749999ca6d2c7f871dc0da8e88e554305ea31b82..b454231f0ab2080e4334ef59f8f4e3f248d53696 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/util/FileFactory.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/util/FileFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.util; +package foundation.e.mail.mailstore.util; import java.io.File; diff --git a/k9mail/src/main/java/com/fsck/k9/mailstore/util/FlowedMessageUtils.java b/k9mail/src/main/java/foundation/e/mail/mailstore/util/FlowedMessageUtils.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/mailstore/util/FlowedMessageUtils.java rename to k9mail/src/main/java/foundation/e/mail/mailstore/util/FlowedMessageUtils.java index 8cbf5a9ab6db0afea7539758c0c8f98413e31707..af4efb20b1f66877b4318c31b060d25a4670a219 100644 --- a/k9mail/src/main/java/com/fsck/k9/mailstore/util/FlowedMessageUtils.java +++ b/k9mail/src/main/java/foundation/e/mail/mailstore/util/FlowedMessageUtils.java @@ -1,4 +1,4 @@ -package com.fsck.k9.mailstore.util; +package foundation.e.mail.mailstore.util; /** diff --git a/k9mail/src/main/java/com/fsck/k9/message/AutocryptStatusInteractor.java b/k9mail/src/main/java/foundation/e/mail/message/AutocryptStatusInteractor.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/message/AutocryptStatusInteractor.java rename to k9mail/src/main/java/foundation/e/mail/message/AutocryptStatusInteractor.java index a6e7216cb0615bd4e57f8e44dcb7f83bf1abc9d9..42de1f339fd46f5cab4d3783fac48f1b8cab2481 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/AutocryptStatusInteractor.java +++ b/k9mail/src/main/java/foundation/e/mail/message/AutocryptStatusInteractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.io.InputStream; diff --git a/k9mail/src/main/java/com/fsck/k9/message/ComposePgpEnableByDefaultDecider.java b/k9mail/src/main/java/foundation/e/mail/message/ComposePgpEnableByDefaultDecider.java similarity index 70% rename from k9mail/src/main/java/com/fsck/k9/message/ComposePgpEnableByDefaultDecider.java rename to k9mail/src/main/java/foundation/e/mail/message/ComposePgpEnableByDefaultDecider.java index 3350ce6e7fee9794129a8c895ade883ea3935438..1eb990449c99e000a401f2f3166e235975bf6265 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/ComposePgpEnableByDefaultDecider.java +++ b/k9mail/src/main/java/foundation/e/mail/message/ComposePgpEnableByDefaultDecider.java @@ -1,11 +1,11 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.util.List; -import com.fsck.k9.crypto.MessageCryptoStructureDetector; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; +import foundation.e.mail.crypto.MessageCryptoStructureDetector; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; public class ComposePgpEnableByDefaultDecider { diff --git a/k9mail/src/main/java/com/fsck/k9/message/ComposePgpInlineDecider.java b/k9mail/src/main/java/foundation/e/mail/message/ComposePgpInlineDecider.java similarity index 73% rename from k9mail/src/main/java/com/fsck/k9/message/ComposePgpInlineDecider.java rename to k9mail/src/main/java/foundation/e/mail/message/ComposePgpInlineDecider.java index e3146b390a7d38bfc769fc9114162373ec5d694c..f81fb034272088b2433db69dd32c854df65717da 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/ComposePgpInlineDecider.java +++ b/k9mail/src/main/java/foundation/e/mail/message/ComposePgpInlineDecider.java @@ -1,11 +1,11 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.util.List; -import com.fsck.k9.crypto.MessageCryptoStructureDetector; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; +import foundation.e.mail.crypto.MessageCryptoStructureDetector; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; public class ComposePgpInlineDecider { diff --git a/k9mail/src/main/java/com/fsck/k9/message/IdentityField.java b/k9mail/src/main/java/foundation/e/mail/message/IdentityField.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/message/IdentityField.java rename to k9mail/src/main/java/foundation/e/mail/message/IdentityField.java index c00dc604bd92754bda392cd447a95103be0be504..0f6b3afe28700d9f1325d57bd88c277e6b535eee 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/IdentityField.java +++ b/k9mail/src/main/java/foundation/e/mail/message/IdentityField.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; // FYI, there's nothing in the code that requires these variables to one letter. They're one diff --git a/k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderBuilder.java b/k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderBuilder.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderBuilder.java rename to k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderBuilder.java index 1cf707013f6ed7136dbdeef7d3b8fb8fa25f9e34..88b433cc0405e8e1ec73e6ca29e22ba23832fede 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderBuilder.java @@ -1,15 +1,15 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import android.net.Uri; import android.net.Uri.Builder; import timber.log.Timber; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.Identity; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.mail.internet.TextBody; -import com.fsck.k9.message.quote.InsertableHtmlContent; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.Identity; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.message.quote.InsertableHtmlContent; public class IdentityHeaderBuilder { diff --git a/k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderParser.java b/k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderParser.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderParser.java rename to k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderParser.java index b7bbc613189997904a13d76cb0d7573a04ca06d3..72cb322540187acfaf76451894c2174655830452 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/IdentityHeaderParser.java +++ b/k9mail/src/main/java/foundation/e/mail/message/IdentityHeaderParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.util.HashMap; @@ -8,7 +8,7 @@ import java.util.StringTokenizer; import android.net.Uri; import timber.log.Timber; -import com.fsck.k9.mail.filter.Base64; +import foundation.e.mail.mail.filter.Base64; public class IdentityHeaderParser { diff --git a/k9mail/src/main/java/com/fsck/k9/message/MessageBuilder.java b/k9mail/src/main/java/foundation/e/mail/message/MessageBuilder.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/MessageBuilder.java rename to k9mail/src/main/java/foundation/e/mail/message/MessageBuilder.java index 0f7529cb19fcade31b14ccda495858ccb9f1676b..dbf580a548f7fa66a8ae7a1c7422e9feb281029c 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/MessageBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/MessageBuilder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.util.Date; @@ -12,28 +12,28 @@ import android.content.Intent; import android.os.AsyncTask; import timber.log.Timber; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.Identity; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.misc.Attachment; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BoundaryGenerator; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MessageIdGenerator; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.internet.MimeMessageHelper; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mail.internet.TextBody; -import com.fsck.k9.mailstore.TempFileBody; -import com.fsck.k9.message.quote.InsertableHtmlContent; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.Identity; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.misc.Attachment; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BoundaryGenerator; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MessageIdGenerator; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMessageHelper; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.mailstore.TempFileBody; +import foundation.e.mail.message.quote.InsertableHtmlContent; import org.apache.james.mime4j.codec.EncoderUtil; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail/src/main/java/com/fsck/k9/message/PgpMessageBuilder.java b/k9mail/src/main/java/foundation/e/mail/message/PgpMessageBuilder.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/message/PgpMessageBuilder.java rename to k9mail/src/main/java/foundation/e/mail/message/PgpMessageBuilder.java index 43ad2d71beb41d6515ffbbde9e71fd51889a4bcf..acd6bfbb923da02e9b53495402bb5a57ee20d0be 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/PgpMessageBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/PgpMessageBuilder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import java.io.IOException; @@ -14,27 +14,27 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.Globals; -import com.fsck.k9.activity.compose.ComposeCryptoStatus; -import com.fsck.k9.autocrypt.AutocryptOpenPgpApiInteractor; -import com.fsck.k9.autocrypt.AutocryptOperations; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.BoundaryGenerator; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.EOLConvertingOutputStream; -import com.fsck.k9.mail.internet.BinaryTempFileBody; -import com.fsck.k9.mail.internet.MessageIdGenerator; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeMessage; -import com.fsck.k9.mail.internet.MimeMessageHelper; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mail.internet.TextBody; -import com.fsck.k9.mailstore.BinaryMemoryBody; +import foundation.e.mail.Globals; +import foundation.e.mail.activity.compose.ComposeCryptoStatus; +import foundation.e.mail.autocrypt.AutocryptOpenPgpApiInteractor; +import foundation.e.mail.autocrypt.AutocryptOperations; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.BoundaryGenerator; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.EOLConvertingOutputStream; +import foundation.e.mail.mail.internet.BinaryTempFileBody; +import foundation.e.mail.mail.internet.MessageIdGenerator; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeMessage; +import foundation.e.mail.mail.internet.MimeMessageHelper; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.mailstore.BinaryMemoryBody; import org.apache.commons.io.IOUtils; import org.apache.james.mime4j.util.MimeUtil; import org.openintents.openpgp.OpenPgpError; diff --git a/k9mail/src/main/java/com/fsck/k9/message/QuotedTextMode.java b/k9mail/src/main/java/foundation/e/mail/message/QuotedTextMode.java similarity index 63% rename from k9mail/src/main/java/com/fsck/k9/message/QuotedTextMode.java rename to k9mail/src/main/java/foundation/e/mail/message/QuotedTextMode.java index 2e31ef057a145c6790188735f23a78e92dd388fd..1cf397b0d523407f1e5032400edec9b2dfef7ed4 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/QuotedTextMode.java +++ b/k9mail/src/main/java/foundation/e/mail/message/QuotedTextMode.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; public enum QuotedTextMode { diff --git a/k9mail/src/main/java/com/fsck/k9/message/SimpleMessageBuilder.java b/k9mail/src/main/java/foundation/e/mail/message/SimpleMessageBuilder.java similarity index 80% rename from k9mail/src/main/java/com/fsck/k9/message/SimpleMessageBuilder.java rename to k9mail/src/main/java/foundation/e/mail/message/SimpleMessageBuilder.java index 7d9ae635ef19df5b1cedface6b3d0ac0f141a8a3..7ff64a0382bae852f6f3e501e269ef6a0bea7ae7 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/SimpleMessageBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/SimpleMessageBuilder.java @@ -1,15 +1,15 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import android.content.Context; import android.content.Intent; import android.support.annotation.VisibleForTesting; -import com.fsck.k9.Globals; -import com.fsck.k9.mail.BoundaryGenerator; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MessageIdGenerator; -import com.fsck.k9.mail.internet.MimeMessage; +import foundation.e.mail.Globals; +import foundation.e.mail.mail.BoundaryGenerator; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MessageIdGenerator; +import foundation.e.mail.mail.internet.MimeMessage; public class SimpleMessageBuilder extends MessageBuilder { diff --git a/k9mail/src/main/java/com/fsck/k9/message/SimpleMessageFormat.java b/k9mail/src/main/java/foundation/e/mail/message/SimpleMessageFormat.java similarity index 61% rename from k9mail/src/main/java/com/fsck/k9/message/SimpleMessageFormat.java rename to k9mail/src/main/java/foundation/e/mail/message/SimpleMessageFormat.java index 5d82d0df233a251a81a485bacd9b90a95307020a..9ebf3c50936541b960ee3b0a0961254ca102199a 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/SimpleMessageFormat.java +++ b/k9mail/src/main/java/foundation/e/mail/message/SimpleMessageFormat.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; public enum SimpleMessageFormat { diff --git a/k9mail/src/main/java/com/fsck/k9/message/TextBodyBuilder.java b/k9mail/src/main/java/foundation/e/mail/message/TextBodyBuilder.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/TextBodyBuilder.java rename to k9mail/src/main/java/foundation/e/mail/message/TextBodyBuilder.java index 86933385701aca33d76e81ca56f14da1ee390c9e..d5950460cfb917fc9575bc0d59739a0672c0979e 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/TextBodyBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/TextBodyBuilder.java @@ -1,14 +1,14 @@ -package com.fsck.k9.message; +package foundation.e.mail.message; import android.text.TextUtils; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.internet.TextBody; -import com.fsck.k9.message.quote.InsertableHtmlContent; +import foundation.e.mail.K9; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.message.quote.InsertableHtmlContent; class TextBodyBuilder { @@ -30,7 +30,7 @@ class TextBodyBuilder { /** * Build the {@link Body} that will contain the text of the message. * - * @return {@link com.fsck.k9.mail.internet.TextBody} instance that contains the entered text and + * @return {@link foundation.e.mail.mail.internet.TextBody} instance that contains the entered text and * possibly the quoted original message. */ public TextBody buildTextHtml() { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentCounter.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentCounter.java similarity index 79% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentCounter.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentCounter.java index 6f1f9dae76e9bab1fe53a92638b6c070b26e676c..1a4700df3f076656c100e40e6192d85a49a983f0 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentCounter.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentCounter.java @@ -1,13 +1,13 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import java.util.ArrayList; import java.util.List; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; public class AttachmentCounter { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentInfoExtractor.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentInfoExtractor.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentInfoExtractor.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentInfoExtractor.java index 52b75eac570a12567ff7e2edca3eff0965f1c701..c023e6e7dac01b02eeda5439f804bdb17506052b 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/AttachmentInfoExtractor.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/AttachmentInfoExtractor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import java.io.File; @@ -14,18 +14,18 @@ import android.support.annotation.VisibleForTesting; import timber.log.Timber; import android.support.annotation.WorkerThread; -import com.fsck.k9.Globals; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MimeHeader; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.mailstore.DeferredFileBody; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalPart; -import com.fsck.k9.provider.AttachmentProvider; -import com.fsck.k9.provider.DecryptedFileProvider; +import foundation.e.mail.Globals; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MimeHeader; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.mailstore.DeferredFileBody; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalPart; +import foundation.e.mail.provider.AttachmentProvider; +import foundation.e.mail.provider.DecryptedFileProvider; public class AttachmentInfoExtractor { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/BodyTextExtractor.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/BodyTextExtractor.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/BodyTextExtractor.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/BodyTextExtractor.java index a1af349a40a4b62237c0e311212d1584ed5ca1af..63e97ad6cf436414fe73e89fb9996f5bfe5960f2 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/BodyTextExtractor.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/BodyTextExtractor.java @@ -1,13 +1,13 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import timber.log.Timber; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.message.SimpleMessageFormat; -import com.fsck.k9.message.html.HtmlConverter; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.message.SimpleMessageFormat; +import foundation.e.mail.message.html.HtmlConverter; //TODO: Get rid of this class and use MessageViewInfoExtractor instead diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/EncryptionDetector.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/EncryptionDetector.java similarity index 81% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/EncryptionDetector.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/EncryptionDetector.java index 084c9c51264ec54813dfef08ff23394d445fac73..54cded03b59b19dd184b313f27768b772ddcf69e 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/EncryptionDetector.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/EncryptionDetector.java @@ -1,16 +1,16 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; -import com.fsck.k9.crypto.MessageCryptoStructureDetector; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; +import foundation.e.mail.crypto.MessageCryptoStructureDetector; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; class EncryptionDetector { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/MessageFulltextCreator.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/MessageFulltextCreator.java similarity index 84% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/MessageFulltextCreator.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/MessageFulltextCreator.java index 82dd8e4ed216ae785e74404c2278793179f4bdb7..2ecf77993f233c0b6c164d686354c300b515d98a 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/MessageFulltextCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/MessageFulltextCreator.java @@ -1,13 +1,13 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeUtility; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeUtility; public class MessageFulltextCreator { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/MessagePreviewCreator.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/MessagePreviewCreator.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/MessagePreviewCreator.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/MessagePreviewCreator.java index 88b2f935369fdd2d5df39c1a711f6322f60fa6e8..478e08e58d265694d241204bf5b0c2f4df67ecae 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/MessagePreviewCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/MessagePreviewCreator.java @@ -1,10 +1,10 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; public class MessagePreviewCreator { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewExtractionException.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewExtractionException.java similarity index 77% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewExtractionException.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewExtractionException.java index b7830ce92e7bd0832e93a6df505a80ebb04d4a29..3dc093f997a3a1f4f21856553ccd937b591e0b1c 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewExtractionException.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewExtractionException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; class PreviewExtractionException extends Exception { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewResult.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewResult.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewResult.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewResult.java index e557af8f4214073820bc5ddd4e01e4b4652bb481..9ddf202b62c88329d1c35abaaa7d3995d4a47ff3 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewResult.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewResult.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewTextExtractor.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewTextExtractor.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewTextExtractor.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewTextExtractor.java index 7e51ab5ab29cc7c54fda02f871f8183bb0807874..65f3ad0de592c5e9841f25033affbb93e7e534d2 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/PreviewTextExtractor.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/PreviewTextExtractor.java @@ -1,13 +1,13 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; class PreviewTextExtractor { diff --git a/k9mail/src/main/java/com/fsck/k9/message/extractors/TextPartFinder.java b/k9mail/src/main/java/foundation/e/mail/message/extractors/TextPartFinder.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/message/extractors/TextPartFinder.java rename to k9mail/src/main/java/foundation/e/mail/message/extractors/TextPartFinder.java index aa37570156644dfff1b72740a8d09892c9834bd5..9bb440d8769bbc6e758f038ec4a82c470078b3aa 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/extractors/TextPartFinder.java +++ b/k9mail/src/main/java/foundation/e/mail/message/extractors/TextPartFinder.java @@ -1,15 +1,15 @@ -package com.fsck.k9.message.extractors; +package foundation.e.mail.message.extractors; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; -import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; +import static foundation.e.mail.mail.internet.MimeUtility.isSameMimeType; class TextPartFinder { diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/BitcoinUriParser.java b/k9mail/src/main/java/foundation/e/mail/message/html/BitcoinUriParser.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/html/BitcoinUriParser.java rename to k9mail/src/main/java/foundation/e/mail/message/html/BitcoinUriParser.java index 632231a00a45250d916a5e834de138367e027223..abb48702f28613d4a7cfa4f127248e27069d773c 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/BitcoinUriParser.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/BitcoinUriParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import java.util.regex.Matcher; diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/DividerReplacer.kt b/k9mail/src/main/java/foundation/e/mail/message/html/DividerReplacer.kt similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/html/DividerReplacer.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/DividerReplacer.kt index 6eb0b925eaea4a7f09da7ba6bbb6cc51e5e67d31..197550d3ac13564e06c5595b13993c14ed6980ec 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/DividerReplacer.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/DividerReplacer.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html internal object DividerReplacer : TextToHtml.HtmlModifier { private const val SIMPLE_DIVIDER = "[-=_]{3,}" diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/EmailSection.kt b/k9mail/src/main/java/foundation/e/mail/message/html/EmailSection.kt similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/message/html/EmailSection.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/EmailSection.kt index 0cd35d1c637790ff0a4c7d1fafc0e150e2656df4..d34c83ef3b94702342fcfa1e314e435d730b4884 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/EmailSection.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/EmailSection.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html /** * Represents a section of an email's plain text body. diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/EmailSectionExtractor.kt b/k9mail/src/main/java/foundation/e/mail/message/html/EmailSectionExtractor.kt similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/message/html/EmailSectionExtractor.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/EmailSectionExtractor.kt index e995d83634763e7a5f211296439a90dddcf25063..37bd1507573324d3b95cdac9b59c8f18bec444a5 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/EmailSectionExtractor.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/EmailSectionExtractor.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html /** * Extract sections from a plain text email. diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/EmailTextToHtml.kt b/k9mail/src/main/java/foundation/e/mail/message/html/EmailTextToHtml.kt similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/message/html/EmailTextToHtml.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/EmailTextToHtml.kt index bca3b7105e4ca1c4d8a551e2ec65db22d463e4b4..263a8b9133a1cfd8397340633684e052d4121369 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/EmailTextToHtml.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/EmailTextToHtml.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html class EmailTextToHtml private constructor(private val text: String) { private val html = StringBuilder(text.length + EXTRA_BUFFER_LENGTH) diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/EthereumUriParser.java b/k9mail/src/main/java/foundation/e/mail/message/html/EthereumUriParser.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/html/EthereumUriParser.java rename to k9mail/src/main/java/foundation/e/mail/message/html/EthereumUriParser.java index 70f5878a23cddeda747a9a5a4b791c61898ec330..9322e54a21cb924d4dc47db7e7a6bc321e5ee663 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/EthereumUriParser.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/EthereumUriParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import java.util.regex.Matcher; diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HeadCleaner.java b/k9mail/src/main/java/foundation/e/mail/message/html/HeadCleaner.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/message/html/HeadCleaner.java rename to k9mail/src/main/java/foundation/e/mail/message/html/HeadCleaner.java index 3b0fbc80ee60eaf9a975fdf7a139dbbe72341811..81f1775241f5b9ec954797e6e377775c80b9c79b 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HeadCleaner.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HeadCleaner.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import java.util.List; diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlConverter.java b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlConverter.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/message/html/HtmlConverter.java rename to k9mail/src/main/java/foundation/e/mail/message/html/HtmlConverter.java index 4334fd9a44a2d7d1c92a37f9d16eea5b7562a23a..bf2602e86ed8957cc7f9ff0ae6993d941fa8a07b 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlConverter.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlConverter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import java.util.Collections; @@ -13,7 +13,7 @@ import android.text.Html.TagHandler; import android.text.Spannable; import android.text.Spanned; -import com.fsck.k9.K9; +import foundation.e.mail.K9; import org.xml.sax.XMLReader; /** diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlModification.kt b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlModification.kt similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/message/html/HtmlModification.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/HtmlModification.kt index 4494f718136678d6e65c878a2e820d2e6c55bed3..f036c83085a05e5ef4a8f8e386c0b1eb4e97875f 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlModification.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlModification.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html internal abstract class HtmlModification private constructor(val startIndex: Int, val endIndex: Int) { abstract class Wrap(startIndex: Int, endIndex: Int) : HtmlModification(startIndex, endIndex) { diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlProcessor.java b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlProcessor.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/message/html/HtmlProcessor.java rename to k9mail/src/main/java/foundation/e/mail/message/html/HtmlProcessor.java index a300bd47137c9ec06c6d389552dceb28d374097f..94be4d3b913fff76ce9679461de3e5b05c018d73 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlProcessor.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlProcessor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import org.jsoup.nodes.Document; diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlSanitizer.java b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlSanitizer.java similarity index 78% rename from k9mail/src/main/java/com/fsck/k9/message/html/HtmlSanitizer.java rename to k9mail/src/main/java/foundation/e/mail/message/html/HtmlSanitizer.java index 1707f7c9ea95c696c7e7462c29f314f5c4ddf7f0..ed12133259525c9991cac3da035dbe7df1a251ba 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HtmlSanitizer.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HtmlSanitizer.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import org.jsoup.Jsoup; @@ -17,13 +17,13 @@ public class HtmlSanitizer { .addAttributes("font", "color", "face", "size") .addAttributes("table", "align", "background", "bgcolor", "border", "cellpadding", "cellspacing", "width") - .addAttributes("tr", "align", "bgcolor", "valign") + .addAttributes("tr", "align", "background", "bgcolor", "valign") .addAttributes("th", - "align", "bgcolor", "colspan", "headers", "height", "nowrap", "rowspan", "scope", "sorted", - "valign", "width") + "align", "background", "bgcolor", "colspan", "headers", "height", "nowrap", "rowspan", "scope", + "sorted", "valign", "width") .addAttributes("td", - "align", "bgcolor", "colspan", "headers", "height", "nowrap", "rowspan", "scope", "valign", - "width") + "align", "background", "bgcolor", "colspan", "headers", "height", "nowrap", "rowspan", "scope", + "valign", "width") .addAttributes("map", "name") .addAttributes("area", "shape", "coords", "href", "alt") .addProtocols("area", "href", "http", "https") diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/HttpUriParser.java b/k9mail/src/main/java/foundation/e/mail/message/html/HttpUriParser.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/message/html/HttpUriParser.java rename to k9mail/src/main/java/foundation/e/mail/message/html/HttpUriParser.java index 305db0c515638da2cfcf4299ad5d6e3cb8c648a4..31978c4d8b0d4a1bb64035d7fde3c6ed2444bc43 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/HttpUriParser.java +++ b/k9mail/src/main/java/foundation/e/mail/message/html/HttpUriParser.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html; +package foundation.e.mail.message.html; import java.util.regex.Matcher; diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/TextToHtml.kt b/k9mail/src/main/java/foundation/e/mail/message/html/TextToHtml.kt similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/message/html/TextToHtml.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/TextToHtml.kt index 8ca04b3b5014acad7140228acc2e5f22b2492fe2..97e4bacd479d1e134b896e43401712635fe2d5f3 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/TextToHtml.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/TextToHtml.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html class TextToHtml private constructor(private val text: CharSequence, private val html: StringBuilder) { fun appendAsHtmlFragment() { diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/UriLinkifier.kt b/k9mail/src/main/java/foundation/e/mail/message/html/UriLinkifier.kt similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/message/html/UriLinkifier.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/UriLinkifier.kt index e97a9099b7bacfd8803175c5d02095d6a519fcd4..fecee0ca2d466fe252173f34832032d631b4a1c0 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/UriLinkifier.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/UriLinkifier.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html internal object UriLinkifier : TextToHtml.HtmlModifier { override fun findModifications(text: CharSequence): List { diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/UriMatch.kt b/k9mail/src/main/java/foundation/e/mail/message/html/UriMatch.kt similarity index 73% rename from k9mail/src/main/java/com/fsck/k9/message/html/UriMatch.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/UriMatch.kt index 3c6bdb6864c20fd1de0981895c9ffd5b375fcfe4..31b049020dbdd22c6458f65713e77c0f40c5381f 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/UriMatch.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/UriMatch.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html data class UriMatch( val startIndex: Int, diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/UriMatcher.kt b/k9mail/src/main/java/foundation/e/mail/message/html/UriMatcher.kt similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/message/html/UriMatcher.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/UriMatcher.kt index 711760622b95a14be7ed59fb6543e8ffd07a2dee..5f88e5e3625c5995f0d53b39e9a580ba3ca1f113 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/UriMatcher.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/UriMatcher.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html import java.util.* diff --git a/k9mail/src/main/java/com/fsck/k9/message/html/UriParser.kt b/k9mail/src/main/java/foundation/e/mail/message/html/UriParser.kt similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/message/html/UriParser.kt rename to k9mail/src/main/java/foundation/e/mail/message/html/UriParser.kt index c4cf7f446cdff802094cfaab4589887984418ec2..0e8f8af239b6c9f6c46d5701996c803b4230f5b2 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/html/UriParser.kt +++ b/k9mail/src/main/java/foundation/e/mail/message/html/UriParser.kt @@ -1,4 +1,4 @@ -package com.fsck.k9.message.html +package foundation.e.mail.message.html internal interface UriParser { diff --git a/k9mail/src/main/java/com/fsck/k9/message/quote/HtmlQuoteCreator.java b/k9mail/src/main/java/foundation/e/mail/message/quote/HtmlQuoteCreator.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/message/quote/HtmlQuoteCreator.java rename to k9mail/src/main/java/foundation/e/mail/message/quote/HtmlQuoteCreator.java index 983659222958088f7c96319c5d8fa5fb9f35c9be..32d5a5f4d1fe6db9969fc14c0bb97a389d0205d4 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/quote/HtmlQuoteCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/message/quote/HtmlQuoteCreator.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.quote; +package foundation.e.mail.message.quote; import java.util.regex.Matcher; @@ -7,13 +7,13 @@ import java.util.regex.Pattern; import android.content.res.Resources; import timber.log.Timber; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.R; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.message.html.HtmlConverter; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.R; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.message.html.HtmlConverter; public class HtmlQuoteCreator { diff --git a/k9mail/src/main/java/com/fsck/k9/message/quote/InsertableHtmlContent.java b/k9mail/src/main/java/foundation/e/mail/message/quote/InsertableHtmlContent.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/message/quote/InsertableHtmlContent.java rename to k9mail/src/main/java/foundation/e/mail/message/quote/InsertableHtmlContent.java index ee5bffdcc67941bcd1267029e6adc3eb647bba24..f75c80e9eb49468e8deb7864e78fcdacc4c773af 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/quote/InsertableHtmlContent.java +++ b/k9mail/src/main/java/foundation/e/mail/message/quote/InsertableHtmlContent.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.quote; +package foundation.e.mail.message.quote; import java.io.Serializable; diff --git a/k9mail/src/main/java/com/fsck/k9/message/quote/QuoteHelper.java b/k9mail/src/main/java/foundation/e/mail/message/quote/QuoteHelper.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/message/quote/QuoteHelper.java rename to k9mail/src/main/java/foundation/e/mail/message/quote/QuoteHelper.java index 80efc1753b4d2add2078831c0b05909cb9191033..c1a0905662e5508394b73f5b951981266f850a82 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/quote/QuoteHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/message/quote/QuoteHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.quote; +package foundation.e.mail.message.quote; import java.text.DateFormat; @@ -8,8 +8,8 @@ import java.util.TimeZone; import android.content.res.Resources; -import com.fsck.k9.K9; -import com.fsck.k9.mail.Message; +import foundation.e.mail.K9; +import foundation.e.mail.mail.Message; class QuoteHelper { diff --git a/k9mail/src/main/java/com/fsck/k9/message/quote/TextQuoteCreator.java b/k9mail/src/main/java/foundation/e/mail/message/quote/TextQuoteCreator.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/message/quote/TextQuoteCreator.java rename to k9mail/src/main/java/foundation/e/mail/message/quote/TextQuoteCreator.java index 1f2c3ee66e89bcd92761dead3ed290bf95656600..afb6bd4f3f8bcccff5ae625ad2f7bc46022c0e6c 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/quote/TextQuoteCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/message/quote/TextQuoteCreator.java @@ -1,17 +1,17 @@ -package com.fsck.k9.message.quote; +package foundation.e.mail.message.quote; import android.content.res.Resources; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.R; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Message.RecipientType; -import com.fsck.k9.mail.MessagingException; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.R; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Message.RecipientType; +import foundation.e.mail.mail.MessagingException; -import static com.fsck.k9.message.quote.QuoteHelper.QUOTE_BUFFER_LENGTH; +import static foundation.e.mail.message.quote.QuoteHelper.QUOTE_BUFFER_LENGTH; public class TextQuoteCreator { diff --git a/k9mail/src/main/java/com/fsck/k9/message/signature/HtmlSignatureRemover.java b/k9mail/src/main/java/foundation/e/mail/message/signature/HtmlSignatureRemover.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/message/signature/HtmlSignatureRemover.java rename to k9mail/src/main/java/foundation/e/mail/message/signature/HtmlSignatureRemover.java index 50a10f0d213a8e1e697309bd4343ed941efe3070..ce589ccd281e333ac7ed3a09773a04c186d89659 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/signature/HtmlSignatureRemover.java +++ b/k9mail/src/main/java/foundation/e/mail/message/signature/HtmlSignatureRemover.java @@ -1,13 +1,13 @@ -package com.fsck.k9.message.signature; +package foundation.e.mail.message.signature; import java.util.regex.Pattern; import android.support.annotation.NonNull; -import com.fsck.k9.helper.jsoup.AdvancedNodeTraversor; -import com.fsck.k9.helper.jsoup.NodeFilter; -import com.fsck.k9.message.html.HtmlProcessor; +import foundation.e.mail.helper.jsoup.AdvancedNodeTraversor; +import foundation.e.mail.helper.jsoup.NodeFilter; +import foundation.e.mail.message.html.HtmlProcessor; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; diff --git a/k9mail/src/main/java/com/fsck/k9/message/signature/TextSignatureRemover.java b/k9mail/src/main/java/foundation/e/mail/message/signature/TextSignatureRemover.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/message/signature/TextSignatureRemover.java rename to k9mail/src/main/java/foundation/e/mail/message/signature/TextSignatureRemover.java index 2e610ff41113ba0c2f9caef8c98fe1f67892e4e6..bb484b4a0c25cfbbb29091d40285149d3adb582e 100644 --- a/k9mail/src/main/java/com/fsck/k9/message/signature/TextSignatureRemover.java +++ b/k9mail/src/main/java/foundation/e/mail/message/signature/TextSignatureRemover.java @@ -1,4 +1,4 @@ -package com.fsck.k9.message.signature; +package foundation.e.mail.message.signature; import java.util.regex.Pattern; diff --git a/k9mail/src/main/java/com/fsck/k9/notification/AddNotificationResult.java b/k9mail/src/main/java/foundation/e/mail/notification/AddNotificationResult.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/notification/AddNotificationResult.java rename to k9mail/src/main/java/foundation/e/mail/notification/AddNotificationResult.java index 9dd3257fa1a025497a71cddda1fa9a5370c332db..17a4c97ef14b1eb9a31658c952b742b5a7b7cbea 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/AddNotificationResult.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/AddNotificationResult.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; class AddNotificationResult { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/AuthenticationErrorNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/AuthenticationErrorNotifications.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/notification/AuthenticationErrorNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/AuthenticationErrorNotifications.java index a29c5a05a2174a6de83138c03dc85ac5ba5bafbd..d1cdcdd6e9e99685181e2f196d02c73da66442f0 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/AuthenticationErrorNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/AuthenticationErrorNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.app.PendingIntent; @@ -8,13 +8,12 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.BigTextStyle; import android.support.v4.app.NotificationManagerCompat; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.activity.setup.AccountSetupIncoming; -import com.fsck.k9.activity.setup.AccountSetupOutgoing; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.activity.setup.AccountSetupActivity; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; class AuthenticationErrorNotifications { @@ -33,7 +32,7 @@ class AuthenticationErrorNotifications { String title = context.getString(R.string.notification_authentication_error_title); String text = context.getString(R.string.notification_authentication_error_text, account.getDescription()); - NotificationCompat.Builder builder = controller.createNotificationBuilder() + NotificationCompat.Builder builder = controller.createNotificationBuilder(account) .setSmallIcon(R.drawable.notification_icon_warning) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) @@ -59,8 +58,8 @@ class AuthenticationErrorNotifications { PendingIntent createContentIntent(Context context, Account account, boolean incoming) { Intent editServerSettingsIntent = incoming ? - AccountSetupIncoming.intentActionEditIncomingSettings(context, account) : - AccountSetupOutgoing.intentActionEditOutgoingSettings(context, account); + AccountSetupActivity.intentActionEditIncomingSettings(context, account) : + AccountSetupActivity.intentActionEditOutgoingSettings(context, account); return PendingIntent.getActivity(context, account.getAccountNumber(), editServerSettingsIntent, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/k9mail/src/main/java/com/fsck/k9/notification/BaseNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/BaseNotifications.java similarity index 57% rename from k9mail/src/main/java/com/fsck/k9/notification/BaseNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/BaseNotifications.java index 6a7a376f1930b890e0f6429cef998f1bcb0e61a2..15e7d0713e79d0a23a34a90872aa77b5c2411432 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/BaseNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/BaseNotifications.java @@ -1,36 +1,55 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; +import android.app.NotificationChannel; +import android.app.NotificationChannelGroup; +import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.support.annotation.RequiresApi; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.BigTextStyle; import android.support.v4.app.NotificationCompat.Builder; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.K9.NotificationQuickDelete; -import com.fsck.k9.R; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.K9.NotificationQuickDelete; +import foundation.e.mail.R; + +import static foundation.e.mail.notification.NotificationController.channelDescription; +import static foundation.e.mail.notification.NotificationController.channelId; +import static foundation.e.mail.notification.NotificationController.channelName; abstract class BaseNotifications { protected final Context context; protected final NotificationController controller; protected final NotificationActionCreator actionCreator; - + NotificationManager mNotificationManager; protected BaseNotifications(NotificationController controller, NotificationActionCreator actionCreator) { this.context = controller.getContext(); this.controller = controller; this.actionCreator = actionCreator; + mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); } protected NotificationCompat.Builder createBigTextStyleNotification(Account account, NotificationHolder holder, - int notificationId) { + int notificationId) { String accountName = controller.getAccountName(account); NotificationContent content = holder.content; String groupKey = NotificationGroupKeys.getGroupKey(account); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mNotificationManager.createNotificationChannel(mailNotificationChannel(account)); + mNotificationManager.createNotificationChannelGroup( + new NotificationChannelGroup(account.getUuid(), account.getName()) + ); + } + NotificationCompat.Builder builder = createAndInitializeNotificationBuilder(account) .setTicker(content.summary) .setGroup(groupKey) @@ -51,7 +70,7 @@ abstract class BaseNotifications { } protected NotificationCompat.Builder createAndInitializeNotificationBuilder(Account account) { - return controller.createNotificationBuilder() + return controller.createNotificationBuilder(account) .setSmallIcon(getNewMailNotificationIcon()) .setColor(account.getChipColor()) .setWhen(System.currentTimeMillis()) @@ -71,4 +90,17 @@ abstract class BaseNotifications { private int getNewMailNotificationIcon() { return R.drawable.notification_icon_new_mail; } + + + @RequiresApi(api = Build.VERSION_CODES.O) + private NotificationChannel mailNotificationChannel(Account account) { + NotificationChannel notificationChannel = new + NotificationChannel(channelId + account.getUuid(), channelName, NotificationManager.IMPORTANCE_DEFAULT); + notificationChannel.enableLights(true); + notificationChannel.setDescription(channelDescription); + notificationChannel.setLightColor(Color.RED); + notificationChannel.enableVibration(true); + return notificationChannel; + } + } diff --git a/k9mail/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/CertificateErrorNotifications.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/CertificateErrorNotifications.java index 1b70e8b44a60dd4f4d23a1f006f281ea73728318..f843d0bfe3ed73d7397f3e9fec12868f412d0213 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/CertificateErrorNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/CertificateErrorNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.app.PendingIntent; @@ -7,13 +7,12 @@ import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.activity.setup.AccountSetupIncoming; -import com.fsck.k9.activity.setup.AccountSetupOutgoing; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.activity.setup.AccountSetupActivity; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; class CertificateErrorNotifications { @@ -32,7 +31,7 @@ class CertificateErrorNotifications { String title = context.getString(R.string.notification_certificate_error_title, account.getDescription()); String text = context.getString(R.string.notification_certificate_error_text); - NotificationCompat.Builder builder = controller.createNotificationBuilder() + NotificationCompat.Builder builder = controller.createNotificationBuilder(account) .setSmallIcon(getCertificateErrorNotificationIcon()) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) @@ -57,8 +56,8 @@ class CertificateErrorNotifications { PendingIntent createContentIntent(Context context, Account account, boolean incoming) { Intent editServerSettingsIntent = incoming ? - AccountSetupIncoming.intentActionEditIncomingSettings(context, account) : - AccountSetupOutgoing.intentActionEditOutgoingSettings(context, account); + AccountSetupActivity.intentActionEditIncomingSettings(context, account) : + AccountSetupActivity.intentActionEditOutgoingSettings(context, account); return PendingIntent.getActivity(context, account.getAccountNumber(), editServerSettingsIntent, PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/k9mail/src/main/java/com/fsck/k9/notification/DeviceNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/DeviceNotifications.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/notification/DeviceNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/DeviceNotifications.java index 599dbb254f751b4d667a56c61931b51e41a542e2..561362d73846d8d05bf58c01b59e91604b7ae89b 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/DeviceNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/DeviceNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.ArrayList; @@ -12,16 +12,16 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.InboxStyle; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.K9.NotificationHideSubject; -import com.fsck.k9.K9.NotificationQuickDelete; -import com.fsck.k9.NotificationSetting; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageReference; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.K9.NotificationHideSubject; +import foundation.e.mail.K9.NotificationQuickDelete; +import foundation.e.mail.NotificationSetting; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageReference; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_SLOW; -import static com.fsck.k9.notification.NotificationController.platformSupportsExtendedNotifications; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_BLINK_SLOW; +import static foundation.e.mail.notification.NotificationController.platformSupportsExtendedNotifications; class DeviceNotifications extends BaseNotifications { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/LockScreenNotification.java b/k9mail/src/main/java/foundation/e/mail/notification/LockScreenNotification.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/notification/LockScreenNotification.java rename to k9mail/src/main/java/foundation/e/mail/notification/LockScreenNotification.java index d609109e7562b3b87f947255ab0a96fb87d84ee6..cb05fdd67522b04deada52e0c8b1477a354c1cba 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/LockScreenNotification.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/LockScreenNotification.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.LinkedHashSet; @@ -11,9 +11,9 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.R; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.R; class LockScreenNotification { @@ -95,7 +95,7 @@ class LockScreenNotification { String title = context.getResources().getQuantityString(R.plurals.notification_new_messages_title, newMessages, newMessages); - return controller.createNotificationBuilder() + return controller.createNotificationBuilder(account) .setSmallIcon(R.drawable.notification_icon_new_mail) .setColor(account.getChipColor()) .setNumber(unreadCount) diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NewMailNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/NewMailNotifications.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/notification/NewMailNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/NewMailNotifications.java index c0feb5451f4dcc61d5e4ef276cb62859f0c59feb..ed8fc49fcecd9331176b45e9af063f5882af8c3a 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NewMailNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NewMailNotifications.java @@ -1,15 +1,15 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.app.Notification; import android.support.v4.app.NotificationManagerCompat; import android.util.SparseArray; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.K9.NotificationHideSubject; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.K9.NotificationHideSubject; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.mailstore.LocalMessage; /** diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationActionCreator.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationActionCreator.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationActionCreator.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationActionCreator.java index 264c6977caf72128685b0f73913d3c17bd4cddc3..8b7615fea5e2f1dad284687d3843d14c608dab01 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationActionCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationActionCreator.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.List; @@ -9,16 +9,16 @@ import android.content.Intent; import android.support.v4.app.TaskStackBuilder; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.Accounts; -import com.fsck.k9.activity.FolderList; -import com.fsck.k9.activity.MessageList; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.NotificationDeleteConfirmation; -import com.fsck.k9.activity.compose.MessageActions; -import com.fsck.k9.search.LocalSearch; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.Accounts; +import foundation.e.mail.activity.FolderList; +import foundation.e.mail.activity.MessageList; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.NotificationDeleteConfirmation; +import foundation.e.mail.activity.compose.MessageActions; +import foundation.e.mail.search.LocalSearch; /** diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationActionService.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationActionService.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationActionService.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationActionService.java index ea446b4e79c4d2efba26e7456575f92887049c66..4d134d2375991228140d37e640c580a7ac2223ac 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationActionService.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationActionService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.ArrayList; @@ -8,16 +8,16 @@ import android.content.Context; import android.content.Intent; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.service.CoreService; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.service.CoreService; -import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceList; -import static com.fsck.k9.activity.MessageReferenceHelper.toMessageReferenceStringList; +import static foundation.e.mail.activity.MessageReferenceHelper.toMessageReferenceList; +import static foundation.e.mail.activity.MessageReferenceHelper.toMessageReferenceStringList; public class NotificationActionService extends CoreService { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationContent.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationContent.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationContent.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationContent.java index ea441b572afbc2576f700b98cb1f1c6e053e7cea..841b321e9c47c77b71696dd00f96e89ee50ff353 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationContent.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationContent.java @@ -1,7 +1,7 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; -import com.fsck.k9.activity.MessageReference; +import foundation.e.mail.activity.MessageReference; class NotificationContent { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationContentCreator.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationContentCreator.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationContentCreator.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationContentCreator.java index ec878934b07969fcb52c663deadb17bf8d34ead3..ec2ae011157c69f1497d7f761c7193e114f77862 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationContentCreator.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationContentCreator.java @@ -1,21 +1,21 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.content.Context; import android.text.SpannableStringBuilder; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.helper.MessageHelper; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.message.extractors.PreviewResult.PreviewType; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.helper.MessageHelper; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.message.extractors.PreviewResult.PreviewType; class NotificationContentCreator { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationController.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationController.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationController.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationController.java index 07d5064022c11efaf63263526b667359586cb521..50e762f84761891d58619afa84479dafa3fcddc3 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationController.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationController.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.content.Context; @@ -8,11 +8,11 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.LocalMessage; public class NotificationController { @@ -23,7 +23,10 @@ public class NotificationController { static final int NOTIFICATION_LED_BLINK_SLOW = 0; static final int NOTIFICATION_LED_BLINK_FAST = 1; static final int NOTIFICATION_LED_FAILURE_COLOR = 0xffff0000; - + //Notification channel + static final String channelId = "mail_channel_id_"; + static final String channelName = "mail_channel"; + static final String channelDescription = "mail_channel_description"; private final Context context; private final NotificationManagerCompat notificationManager; @@ -33,7 +36,6 @@ public class NotificationController { private final SendFailedNotifications sendFailedNotifications; private final NewMailNotifications newMailNotifications; - public static NotificationController newInstance(Context context) { Context appContext = context.getApplicationContext(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(appContext); @@ -114,7 +116,7 @@ public class NotificationController { } void configureNotification(NotificationCompat.Builder builder, String ringtone, long[] vibrationPattern, - Integer ledColor, int ledSpeed, boolean ringAndVibrate) { + Integer ledColor, int ledSpeed, boolean ringAndVibrate) { if (K9.isQuietTime()) { return; @@ -137,6 +139,7 @@ public class NotificationController { ledOnMS = NOTIFICATION_LED_ON_TIME; ledOffMS = NOTIFICATION_LED_OFF_TIME; } else { + ledOnMS = NOTIFICATION_LED_FAST_ON_TIME; ledOffMS = NOTIFICATION_LED_FAST_OFF_TIME; } @@ -158,7 +161,8 @@ public class NotificationController { return notificationManager; } - NotificationCompat.Builder createNotificationBuilder() { - return new NotificationCompat.Builder(context); + NotificationCompat.Builder createNotificationBuilder(Account account) { + return new NotificationCompat.Builder(context, channelId + account.getUuid()); } + } diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationData.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationData.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationData.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationData.java index fc2a17e50c496f6c8dfd0025786a68c78e5e5960..bf39cd23ff77dd5ddf358670be5863ee953c30b3 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationData.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationData.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.ArrayList; @@ -9,8 +9,8 @@ import java.util.List; import android.util.SparseBooleanArray; -import com.fsck.k9.Account; -import com.fsck.k9.activity.MessageReference; +import foundation.e.mail.Account; +import foundation.e.mail.activity.MessageReference; /** diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationGroupKeys.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationGroupKeys.java similarity index 79% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationGroupKeys.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationGroupKeys.java index 7d95f50feba1d58247470108c2691ae3afccf2e5..6af14cdaef912aa2f05f8046b544ae9cac6a9f44 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationGroupKeys.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationGroupKeys.java @@ -1,7 +1,7 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; -import com.fsck.k9.Account; +import foundation.e.mail.Account; public class NotificationGroupKeys { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationHolder.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationHolder.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationHolder.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationHolder.java index b1acf555fbaa4f078a1645a81bfc63ff7eeb8964..9f4ad01995904d6806174a145db7fb43b8597b67 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationHolder.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationHolder.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; class NotificationHolder { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/NotificationIds.java b/k9mail/src/main/java/foundation/e/mail/notification/NotificationIds.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/notification/NotificationIds.java rename to k9mail/src/main/java/foundation/e/mail/notification/NotificationIds.java index b0f171522d7e83a03a8680038cf152c9bb61fa5c..7cd374f7ebcf3c16598c34fc5d7542c3de3fb2eb 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/NotificationIds.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/NotificationIds.java @@ -1,7 +1,7 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; -import com.fsck.k9.Account; +import foundation.e.mail.Account; class NotificationIds { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/RemoveNotificationResult.java b/k9mail/src/main/java/foundation/e/mail/notification/RemoveNotificationResult.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/notification/RemoveNotificationResult.java rename to k9mail/src/main/java/foundation/e/mail/notification/RemoveNotificationResult.java index 7b57b0442c96d56afbe9d19e0a7262782b003b2c..8f482b3f968b77593faa58c9e2cfff942847eb50 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/RemoveNotificationResult.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/RemoveNotificationResult.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; class RemoveNotificationResult { diff --git a/k9mail/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/SendFailedNotifications.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/SendFailedNotifications.java index 16d2a8b2b4f02a2259a8b495c98dd55c3023dc9c..259a73a93a7300ec9937ff43e221310d852a088f 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/SendFailedNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/SendFailedNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.app.PendingIntent; @@ -6,12 +6,12 @@ import android.content.Context; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.helper.ExceptionHelper; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.helper.ExceptionHelper; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_FAILURE_COLOR; class SendFailedNotifications { @@ -33,7 +33,7 @@ class SendFailedNotifications { PendingIntent folderListPendingIntent = actionBuilder.createViewFolderListPendingIntent( account, notificationId); - NotificationCompat.Builder builder = controller.createNotificationBuilder() + NotificationCompat.Builder builder = controller.createNotificationBuilder(account) .setSmallIcon(getSendFailedNotificationIcon()) .setWhen(System.currentTimeMillis()) .setAutoCancel(true) diff --git a/k9mail/src/main/java/com/fsck/k9/notification/SyncNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/SyncNotifications.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/notification/SyncNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/SyncNotifications.java index 578ad160d1c6134fecc15b98260a709a3aca6633..d7410e3fb2dd7031d67100438a611fb78c29ee5d 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/SyncNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/SyncNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import android.app.PendingIntent; @@ -6,11 +6,11 @@ import android.content.Context; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; -import com.fsck.k9.Account; -import com.fsck.k9.R; -import com.fsck.k9.mail.Folder; +import foundation.e.mail.Account; +import foundation.e.mail.R; +import foundation.e.mail.mail.Folder; -import static com.fsck.k9.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; +import static foundation.e.mail.notification.NotificationController.NOTIFICATION_LED_BLINK_FAST; class SyncNotifications { @@ -37,7 +37,7 @@ class SyncNotifications { PendingIntent showMessageListPendingIntent = actionBuilder.createViewFolderPendingIntent( account, outboxFolderName, notificationId); - NotificationCompat.Builder builder = controller.createNotificationBuilder() + NotificationCompat.Builder builder = controller.createNotificationBuilder(account) .setSmallIcon(R.drawable.ic_notify_check_mail) .setWhen(System.currentTimeMillis()) .setOngoing(true) @@ -75,7 +75,7 @@ class SyncNotifications { PendingIntent showMessageListPendingIntent = actionBuilder.createViewFolderPendingIntent( account, folderName, notificationId); - NotificationCompat.Builder builder = controller.createNotificationBuilder() + NotificationCompat.Builder builder = controller.createNotificationBuilder(account) .setSmallIcon(R.drawable.ic_notify_check_mail) .setWhen(System.currentTimeMillis()) .setOngoing(true) diff --git a/k9mail/src/main/java/com/fsck/k9/notification/WearNotifications.java b/k9mail/src/main/java/foundation/e/mail/notification/WearNotifications.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/notification/WearNotifications.java rename to k9mail/src/main/java/foundation/e/mail/notification/WearNotifications.java index fe9d9ce556e5b5ea78b8107f191a7762eccca1d7..58f97b4774f1102c01093b345d6463b09aa530bb 100644 --- a/k9mail/src/main/java/com/fsck/k9/notification/WearNotifications.java +++ b/k9mail/src/main/java/foundation/e/mail/notification/WearNotifications.java @@ -1,4 +1,4 @@ -package com.fsck.k9.notification; +package foundation.e.mail.notification; import java.util.ArrayList; @@ -9,11 +9,11 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.WearableExtender; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.controller.MessagingController; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.controller.MessagingController; class WearNotifications extends BaseNotifications { diff --git a/k9mail/src/main/java/com/fsck/k9/power/DeviceIdleManager.java b/k9mail/src/main/java/foundation/e/mail/power/DeviceIdleManager.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/power/DeviceIdleManager.java rename to k9mail/src/main/java/foundation/e/mail/power/DeviceIdleManager.java index c8d3646413cec012749587c779c0ccfc0f983d12..ee00b7975b15df6436e9cc75d9f385449363ea45 100644 --- a/k9mail/src/main/java/com/fsck/k9/power/DeviceIdleManager.java +++ b/k9mail/src/main/java/foundation/e/mail/power/DeviceIdleManager.java @@ -1,4 +1,4 @@ -package com.fsck.k9.power; +package foundation.e.mail.power; import android.annotation.TargetApi; diff --git a/k9mail/src/main/java/com/fsck/k9/power/DeviceIdleReceiver.java b/k9mail/src/main/java/foundation/e/mail/power/DeviceIdleReceiver.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/power/DeviceIdleReceiver.java rename to k9mail/src/main/java/foundation/e/mail/power/DeviceIdleReceiver.java index 8050c2d1e599a880a3c4abd04c45a56e6a731560..3070892a32805858c9534517c31665663d81f116 100644 --- a/k9mail/src/main/java/com/fsck/k9/power/DeviceIdleReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/power/DeviceIdleReceiver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.power; +package foundation.e.mail.power; import android.content.BroadcastReceiver; @@ -8,7 +8,7 @@ import android.os.Build; import android.os.PowerManager; import android.support.annotation.RequiresApi; -import com.fsck.k9.service.MailService; +import foundation.e.mail.service.MailService; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/power/DozeChecker.java b/k9mail/src/main/java/foundation/e/mail/power/DozeChecker.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/power/DozeChecker.java rename to k9mail/src/main/java/foundation/e/mail/power/DozeChecker.java index 7953dbb1371ce387512214a9f75023d12c433810..434d1a09569488efa1a527bf14872cef8ebabd19 100644 --- a/k9mail/src/main/java/com/fsck/k9/power/DozeChecker.java +++ b/k9mail/src/main/java/foundation/e/mail/power/DozeChecker.java @@ -1,4 +1,4 @@ -package com.fsck.k9.power; +package foundation.e.mail.power; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/AccountSettings.java b/k9mail/src/main/java/foundation/e/mail/preferences/AccountSettings.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/preferences/AccountSettings.java rename to k9mail/src/main/java/foundation/e/mail/preferences/AccountSettings.java index 5222ce931574054c5487db04165a8f407d8617c7..6cc316dfabc98939174968edea0f9ad3afbf356d 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/AccountSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/AccountSettings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.Collections; @@ -8,28 +8,28 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import com.fsck.k9.Account; -import com.fsck.k9.Account.DeletePolicy; -import com.fsck.k9.Account.Expunge; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.Account.MessageFormat; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.Account.Searchable; -import com.fsck.k9.Account.ShowPictures; -import com.fsck.k9.Account.SortType; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.mailstore.StorageManager; -import com.fsck.k9.preferences.Settings.BooleanSetting; -import com.fsck.k9.preferences.Settings.ColorSetting; -import com.fsck.k9.preferences.Settings.EnumSetting; -import com.fsck.k9.preferences.Settings.IntegerRangeSetting; -import com.fsck.k9.preferences.Settings.InvalidSettingValueException; -import com.fsck.k9.preferences.Settings.PseudoEnumSetting; -import com.fsck.k9.preferences.Settings.SettingsDescription; -import com.fsck.k9.preferences.Settings.SettingsUpgrader; -import com.fsck.k9.preferences.Settings.StringSetting; -import com.fsck.k9.preferences.Settings.V; +import foundation.e.mail.Account; +import foundation.e.mail.Account.DeletePolicy; +import foundation.e.mail.Account.Expunge; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.Account.MessageFormat; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.Account.Searchable; +import foundation.e.mail.Account.ShowPictures; +import foundation.e.mail.Account.SortType; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.mailstore.StorageManager; +import foundation.e.mail.preferences.Settings.BooleanSetting; +import foundation.e.mail.preferences.Settings.ColorSetting; +import foundation.e.mail.preferences.Settings.EnumSetting; +import foundation.e.mail.preferences.Settings.IntegerRangeSetting; +import foundation.e.mail.preferences.Settings.InvalidSettingValueException; +import foundation.e.mail.preferences.Settings.PseudoEnumSetting; +import foundation.e.mail.preferences.Settings.SettingsDescription; +import foundation.e.mail.preferences.Settings.SettingsUpgrader; +import foundation.e.mail.preferences.Settings.StringSetting; +import foundation.e.mail.preferences.Settings.V; public class AccountSettings { @@ -57,7 +57,7 @@ public class AccountSettings { new V(1, new StringSetting("INBOX")) )); s.put("automaticCheckIntervalMinutes", Settings.versions( - new V(1, new IntegerResourceSetting(-1, R.array.account_settings_check_frequency_values)) + new V(1, new IntegerResourceSetting(5, R.array.account_settings_check_frequency_values)) )); s.put("chipColor", Settings.versions( new V(1, new ColorSetting(0xFF0000FF)) @@ -66,7 +66,7 @@ public class AccountSettings { new V(1, new BooleanSetting(Account.DEFAULT_QUOTED_TEXT_SHOWN)) )); s.put("deletePolicy", Settings.versions( - new V(1, new DeletePolicySetting(DeletePolicy.NEVER)) + new V(1, new DeletePolicySetting(DeletePolicy.ON_DELETE)) )); s.put("displayCount", Settings.versions( new V(1, new IntegerResourceSetting(K9.DEFAULT_VISIBLE_LIMIT, @@ -116,7 +116,7 @@ public class AccountSettings { new V(1, new IntegerRangeSetting(0, 100, 10)) )); s.put("maximumAutoDownloadMessageSize", Settings.versions( - new V(1, new IntegerResourceSetting(32768, R.array.account_settings_autodownload_message_size_values)) + new V(1, new IntegerResourceSetting(1048576, R.array.account_settings_autodownload_message_size_values)) )); s.put("maximumPolledMessageAge", Settings.versions( new V(1, new IntegerResourceSetting(-1, R.array.account_settings_message_age_values)) @@ -173,7 +173,7 @@ public class AccountSettings { new V(9, new BooleanSetting(Account.DEFAULT_SORT_ASCENDING)) )); s.put("showPicturesEnum", Settings.versions( - new V(1, new EnumSetting<>(ShowPictures.class, ShowPictures.NEVER)) + new V(1, new EnumSetting<>(ShowPictures.class, ShowPictures.ALWAYS)) )); s.put("signatureBeforeQuotedText", Settings.versions( new V(1, new BooleanSetting(false)) diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/CheckBoxListPreference.java b/k9mail/src/main/java/foundation/e/mail/preferences/CheckBoxListPreference.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/preferences/CheckBoxListPreference.java rename to k9mail/src/main/java/foundation/e/mail/preferences/CheckBoxListPreference.java index 7b14d68d66242b921ba969231a5f3754b8e47c4f..4a35abb67f1ab12e7a3fb88de1789fbdf0df7ecc 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/CheckBoxListPreference.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/CheckBoxListPreference.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import android.app.AlertDialog.Builder; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/FolderSettings.java b/k9mail/src/main/java/foundation/e/mail/preferences/FolderSettings.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/preferences/FolderSettings.java rename to k9mail/src/main/java/foundation/e/mail/preferences/FolderSettings.java index 8b6a95a9539a7fdcefd33b4f142fbdd885bf7d15..a3dc8591bcf2b54dc1d1882dafd40171476cf717 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/FolderSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/FolderSettings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.Collections; @@ -8,12 +8,12 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import com.fsck.k9.mail.Folder.FolderClass; -import com.fsck.k9.preferences.Settings.BooleanSetting; -import com.fsck.k9.preferences.Settings.EnumSetting; -import com.fsck.k9.preferences.Settings.SettingsDescription; -import com.fsck.k9.preferences.Settings.SettingsUpgrader; -import com.fsck.k9.preferences.Settings.V; +import foundation.e.mail.mail.Folder.FolderClass; +import foundation.e.mail.preferences.Settings.BooleanSetting; +import foundation.e.mail.preferences.Settings.EnumSetting; +import foundation.e.mail.preferences.Settings.SettingsDescription; +import foundation.e.mail.preferences.Settings.SettingsUpgrader; +import foundation.e.mail.preferences.Settings.V; class FolderSettings { diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/GlobalSettings.java b/k9mail/src/main/java/foundation/e/mail/preferences/GlobalSettings.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/preferences/GlobalSettings.java rename to k9mail/src/main/java/foundation/e/mail/preferences/GlobalSettings.java index 693e82545d7db66c7a7e91bcf0ec5234c6ea75f4..398fdd9d4e4321b05caa12a21ef53c7fcd019862 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/GlobalSettings.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/GlobalSettings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.io.File; @@ -12,29 +12,29 @@ import java.util.TreeMap; import android.os.Environment; -import com.fsck.k9.Account; -import com.fsck.k9.Account.SortType; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.K9.NotificationHideSubject; -import com.fsck.k9.K9.NotificationQuickDelete; -import com.fsck.k9.K9.SplitViewMode; -import com.fsck.k9.K9.Theme; -import com.fsck.k9.R; -import com.fsck.k9.preferences.Settings.BooleanSetting; -import com.fsck.k9.preferences.Settings.ColorSetting; -import com.fsck.k9.preferences.Settings.EnumSetting; -import com.fsck.k9.preferences.Settings.FontSizeSetting; -import com.fsck.k9.preferences.Settings.IntegerRangeSetting; -import com.fsck.k9.preferences.Settings.InvalidSettingValueException; -import com.fsck.k9.preferences.Settings.PseudoEnumSetting; -import com.fsck.k9.preferences.Settings.SettingsDescription; -import com.fsck.k9.preferences.Settings.SettingsUpgrader; -import com.fsck.k9.preferences.Settings.StringSetting; -import com.fsck.k9.preferences.Settings.V; -import com.fsck.k9.preferences.Settings.WebFontSizeSetting; - -import static com.fsck.k9.K9.LockScreenNotificationVisibility; +import foundation.e.mail.Account; +import foundation.e.mail.Account.SortType; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.K9.NotificationHideSubject; +import foundation.e.mail.K9.NotificationQuickDelete; +import foundation.e.mail.K9.SplitViewMode; +import foundation.e.mail.K9.Theme; +import foundation.e.mail.R; +import foundation.e.mail.preferences.Settings.BooleanSetting; +import foundation.e.mail.preferences.Settings.ColorSetting; +import foundation.e.mail.preferences.Settings.EnumSetting; +import foundation.e.mail.preferences.Settings.FontSizeSetting; +import foundation.e.mail.preferences.Settings.IntegerRangeSetting; +import foundation.e.mail.preferences.Settings.InvalidSettingValueException; +import foundation.e.mail.preferences.Settings.PseudoEnumSetting; +import foundation.e.mail.preferences.Settings.SettingsDescription; +import foundation.e.mail.preferences.Settings.SettingsUpgrader; +import foundation.e.mail.preferences.Settings.StringSetting; +import foundation.e.mail.preferences.Settings.V; +import foundation.e.mail.preferences.Settings.WebFontSizeSetting; + +import static foundation.e.mail.K9.LockScreenNotificationVisibility; public class GlobalSettings { @@ -272,9 +272,6 @@ public class GlobalSettings { s.put("confirmDeleteFromNotification", Settings.versions( new V(38, new BooleanSetting(true)) )); - s.put("messageListSenderAboveSubject", Settings.versions( - new V(38, new BooleanSetting(false)) - )); s.put("notificationQuickDelete", Settings.versions( new V(38, new EnumSetting<>(NotificationQuickDelete.class, NotificationQuickDelete.NEVER)) )); diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/IdentitySettings.java b/k9mail/src/main/java/foundation/e/mail/preferences/IdentitySettings.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/preferences/IdentitySettings.java rename to k9mail/src/main/java/foundation/e/mail/preferences/IdentitySettings.java index 7d7b6670eec6996c19359b072bfe88a120d23e46..a26263737bfde10f98f29be3318e54e480710192 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/IdentitySettings.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/IdentitySettings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.Collections; @@ -8,14 +8,14 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import com.fsck.k9.EmailAddressValidator; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.preferences.Settings.BooleanSetting; -import com.fsck.k9.preferences.Settings.InvalidSettingValueException; -import com.fsck.k9.preferences.Settings.SettingsDescription; -import com.fsck.k9.preferences.Settings.SettingsUpgrader; -import com.fsck.k9.preferences.Settings.V; +import foundation.e.mail.EmailAddressValidator; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.preferences.Settings.BooleanSetting; +import foundation.e.mail.preferences.Settings.InvalidSettingValueException; +import foundation.e.mail.preferences.Settings.SettingsDescription; +import foundation.e.mail.preferences.Settings.SettingsUpgrader; +import foundation.e.mail.preferences.Settings.V; class IdentitySettings { diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/Settings.java b/k9mail/src/main/java/foundation/e/mail/preferences/Settings.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/preferences/Settings.java rename to k9mail/src/main/java/foundation/e/mail/preferences/Settings.java index 8bab3b70361e925fe2afd6d46eebe035129d7451..d9408f36e83297315e8e1e3931b316e7e18a2682 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/Settings.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/Settings.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.Collections; @@ -12,8 +12,8 @@ import java.util.TreeMap; import timber.log.Timber; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; /* * TODO: diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsExporter.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java rename to k9mail/src/main/java/foundation/e/mail/preferences/SettingsExporter.java index 936ea19f7f4dcf5cb2fe5b0ed42133d766e38d17..148a0220afa1b8b6763540efd183d6a814e58ada 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsExporter.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsExporter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.io.File; @@ -21,17 +21,17 @@ import android.content.Context; import android.net.Uri; import android.os.Environment; -import com.fsck.k9.mail.TransportUris; +import foundation.e.mail.mail.TransportUris; import timber.log.Timber; import android.util.Xml; -import com.fsck.k9.Account; -import com.fsck.k9.Preferences; -import com.fsck.k9.helper.FileHelper; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.preferences.Settings.InvalidSettingValueException; -import com.fsck.k9.preferences.Settings.SettingsDescription; +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.helper.FileHelper; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.preferences.Settings.InvalidSettingValueException; +import foundation.e.mail.preferences.Settings.SettingsDescription; import org.xmlpull.v1.XmlSerializer; diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsImportExportException.java b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsImportExportException.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/preferences/SettingsImportExportException.java rename to k9mail/src/main/java/foundation/e/mail/preferences/SettingsImportExportException.java index b2a6a5b7d4225cb269b405c3e75e3519b68bd779..462b73bb5167980a9a177e67c8f3b8298a1ada13 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsImportExportException.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsImportExportException.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; public class SettingsImportExportException extends Exception { private static final long serialVersionUID = -6042736634079588513L; diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsImporter.java b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsImporter.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/preferences/SettingsImporter.java rename to k9mail/src/main/java/foundation/e/mail/preferences/SettingsImporter.java index cef79918e5a28cfb891a5da183c927e61e9b13d8..112aa32fc5dbe473ebdde70cdbbba001cf6bfe81 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/SettingsImporter.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/SettingsImporter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.io.IOException; @@ -17,19 +17,19 @@ import android.content.SharedPreferences; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; -import com.fsck.k9.mail.TransportUris; +import foundation.e.mail.mail.TransportUris; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.Identity; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.mail.AuthType; -import com.fsck.k9.mail.ConnectionSecurity; -import com.fsck.k9.mail.ServerSettings; -import com.fsck.k9.mail.filter.Base64; -import com.fsck.k9.mail.store.RemoteStore; -import com.fsck.k9.preferences.Settings.InvalidSettingValueException; +import foundation.e.mail.Account; +import foundation.e.mail.Identity; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.mail.AuthType; +import foundation.e.mail.mail.ConnectionSecurity; +import foundation.e.mail.mail.ServerSettings; +import foundation.e.mail.mail.filter.Base64; +import foundation.e.mail.mail.store.RemoteStore; +import foundation.e.mail.preferences.Settings.InvalidSettingValueException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; @@ -350,9 +350,10 @@ public class SettingsImporter { String storeUri = RemoteStore.createStoreUri(incoming); putString(editor, accountKeyPrefix + Account.STORE_URI_KEY, Base64.encode(storeUri)); - // Mark account as disabled if the AuthType isn't EXTERNAL and the + // Mark account as disabled if the AuthType isn't EXTERNAL or XOAUTH2 and the // settings file didn't contain a password boolean createAccountDisabled = AuthType.EXTERNAL != incoming.authenticationType && + AuthType.XOAUTH2 != incoming.authenticationType && (incoming.password == null || incoming.password.isEmpty()); if (account.outgoing == null && !ServerSettings.Type.WebDAV.name().equals(account.incoming.type)) { @@ -372,6 +373,7 @@ public class SettingsImporter { * identical for this account type. Nor is a password required if the AuthType is EXTERNAL. */ boolean outgoingPasswordNeeded = AuthType.EXTERNAL != outgoing.authenticationType && + AuthType.XOAUTH2 != outgoing.authenticationType && !(ServerSettings.Type.WebDAV == outgoing.type) && outgoing.username != null && !outgoing.username.isEmpty() && diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/Storage.java b/k9mail/src/main/java/foundation/e/mail/preferences/Storage.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/preferences/Storage.java rename to k9mail/src/main/java/foundation/e/mail/preferences/Storage.java index 39bb819160ff11f976331ca8962990b9e7c79480..47e90d0448b8cd09909274ea84d08f4ebfb32a5c 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/Storage.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/Storage.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.net.URI; @@ -15,9 +15,9 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.os.SystemClock; -import com.fsck.k9.helper.UrlEncodingHelper; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.filter.Base64; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.filter.Base64; import timber.log.Timber; public class Storage { diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/StorageEditor.java b/k9mail/src/main/java/foundation/e/mail/preferences/StorageEditor.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/preferences/StorageEditor.java rename to k9mail/src/main/java/foundation/e/mail/preferences/StorageEditor.java index 0612b786daca6c36e59034e4a0089a5254c9e4e5..e309660d78dbd55f16b3b8a2c659929f85b9674c 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/StorageEditor.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/StorageEditor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.ArrayList; diff --git a/k9mail/src/main/java/com/fsck/k9/preferences/TimePickerPreference.java b/k9mail/src/main/java/foundation/e/mail/preferences/TimePickerPreference.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/preferences/TimePickerPreference.java rename to k9mail/src/main/java/foundation/e/mail/preferences/TimePickerPreference.java index 24e418f7a68f145f9c33f626def3bdae63e594e1..964b3cba3a5d49da4a5b0c0dd9a7a32eafb856fe 100644 --- a/k9mail/src/main/java/com/fsck/k9/preferences/TimePickerPreference.java +++ b/k9mail/src/main/java/foundation/e/mail/preferences/TimePickerPreference.java @@ -2,7 +2,7 @@ * on 2010-11-27 by jessev */ -package com.fsck.k9.preferences; +package foundation.e.mail.preferences; import java.util.Locale; diff --git a/k9mail/src/main/java/foundation/e/mail/provider/AppContentProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/AppContentProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..6821316c63343bd8ffdf37aee760987384cb84ea --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/provider/AppContentProvider.java @@ -0,0 +1,44 @@ +package foundation.e.mail.provider; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +public class AppContentProvider extends ContentProvider { + @Nullable + @Override + public String getType(@NonNull Uri uri) { + return null; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) { + return 0; + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) { + return null; + } + + @Override + public boolean onCreate() { + return false; + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) { + return null; + } + + @Override + public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) { + return 0; + } +} + diff --git a/k9mail/src/main/java/com/fsck/k9/provider/AttachmentProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/AttachmentProvider.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/provider/AttachmentProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/AttachmentProvider.java index f0e6a2222e157e8a1e41228cd00983f2fdabce8f..a673cbc824237e926bae5584fecd2ecd57e45d97 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/AttachmentProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/AttachmentProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.io.FileNotFoundException; @@ -15,13 +15,13 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.Preferences; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.mailstore.LocalStore.AttachmentInfo; +import foundation.e.mail.Account; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.Preferences; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.mailstore.LocalStore.AttachmentInfo; import org.openintents.openpgp.util.OpenPgpApi.OpenPgpDataSource; diff --git a/k9mail/src/main/java/com/fsck/k9/provider/AttachmentTempFileProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/AttachmentTempFileProvider.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/provider/AttachmentTempFileProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/AttachmentTempFileProvider.java index 1ee19935533d4311c4bc9f135770eeca813272e6..e2b579130547460e5128c763cb81661ea9f76d79 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/AttachmentTempFileProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/AttachmentTempFileProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.io.File; @@ -19,8 +19,8 @@ import android.support.annotation.WorkerThread; import android.support.v4.content.FileProvider; import timber.log.Timber; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.K9; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.K9; import okio.ByteString; import org.apache.commons.io.IOUtils; diff --git a/k9mail/src/main/java/com/fsck/k9/provider/DecryptedFileProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/DecryptedFileProvider.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/provider/DecryptedFileProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/DecryptedFileProvider.java index 697ebd465c36b1cff6faa9ff7676ac8f17fc68f9..57f2460af21fc22e0d9ef0bfeda9f01c9efb7e92 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/DecryptedFileProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/DecryptedFileProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.io.File; @@ -21,9 +21,9 @@ import android.support.v4.content.FileProvider; import android.text.TextUtils; import timber.log.Timber; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.K9; -import com.fsck.k9.mailstore.util.FileFactory; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.K9; +import foundation.e.mail.mailstore.util.FileFactory; import org.apache.james.mime4j.codec.Base64InputStream; import org.apache.james.mime4j.codec.QuotedPrintableInputStream; import org.apache.james.mime4j.util.MimeUtil; diff --git a/k9mail/src/main/java/com/fsck/k9/provider/EmailProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/EmailProvider.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/provider/EmailProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/EmailProvider.java index 68b24fcd3bc41bd1c7c6a56610a5d0283df9ef29..842167b31cb4e430b1ee5ba6dc03893d0562f927 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/EmailProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/EmailProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.util.ArrayList; @@ -17,18 +17,18 @@ import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import android.text.TextUtils; -import com.fsck.k9.Account; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.Preferences; -import com.fsck.k9.cache.EmailProviderCacheCursor; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.mailstore.LockableDatabase; -import com.fsck.k9.mailstore.LockableDatabase.DbCallback; -import com.fsck.k9.mailstore.LockableDatabase.WrappedException; -import com.fsck.k9.mailstore.UnavailableStorageException; -import com.fsck.k9.search.SqlQueryBuilder; +import foundation.e.mail.Account; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.Preferences; +import foundation.e.mail.cache.EmailProviderCacheCursor; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.mailstore.LockableDatabase; +import foundation.e.mail.mailstore.LockableDatabase.DbCallback; +import foundation.e.mail.mailstore.LockableDatabase.WrappedException; +import foundation.e.mail.mailstore.UnavailableStorageException; +import foundation.e.mail.search.SqlQueryBuilder; /** @@ -620,7 +620,7 @@ public class EmailProvider extends ContentProvider { } /** - * This class is needed to make {@link android.support.v4.widget.CursorAdapter} work with our database schema. + * This class is needed to make {@link CursorAdapter} work with our database schema. * *

    * {@code CursorAdapter} requires a column named {@code "_id"} containing a stable id. We use diff --git a/k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/MessageProvider.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/MessageProvider.java index 7fb9c145269b7eeb95d28b541bef88ef85c4e77c..7b73dd07f00f738381b84643ea7036bf22853780 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/MessageProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.lang.ref.WeakReference; @@ -36,23 +36,23 @@ import android.os.Bundle; import android.provider.BaseColumns; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.AccountStats; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.FolderInfoHolder; -import com.fsck.k9.activity.MessageInfoHolder; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.helper.MessageHelper; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.search.SearchAccount; +import foundation.e.mail.Account; +import foundation.e.mail.AccountStats; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.FolderInfoHolder; +import foundation.e.mail.activity.MessageInfoHolder; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.helper.MessageHelper; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.search.SearchAccount; public class MessageProvider extends ContentProvider { diff --git a/k9mail/src/main/java/com/fsck/k9/provider/RawMessageProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/RawMessageProvider.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/provider/RawMessageProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/RawMessageProvider.java index 46f621acc35c47c7ad9d53b941167583d1996ec3..1ee446f8d872ff509cfc58fffffe8051d881ea36 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/RawMessageProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/RawMessageProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; import java.io.FileNotFoundException; @@ -17,17 +17,17 @@ import android.provider.OpenableColumns; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.fsck.k9.Account; -import com.fsck.k9.BuildConfig; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.mail.FetchProfile; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.filter.CountingOutputStream; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalStore; +import foundation.e.mail.Account; +import foundation.e.mail.BuildConfig; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.mail.FetchProfile; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.filter.CountingOutputStream; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalStore; import org.openintents.openpgp.util.OpenPgpApi.OpenPgpDataSource; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/provider/UnreadWidgetProvider.java b/k9mail/src/main/java/foundation/e/mail/provider/UnreadWidgetProvider.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/provider/UnreadWidgetProvider.java rename to k9mail/src/main/java/foundation/e/mail/provider/UnreadWidgetProvider.java index c4f85c18582050621f8fa60533f38c6e26398447..fc47efbe29bd0026dfe1dd15d9178da403573419 100644 --- a/k9mail/src/main/java/com/fsck/k9/provider/UnreadWidgetProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/provider/UnreadWidgetProvider.java @@ -1,8 +1,8 @@ -package com.fsck.k9.provider; +package foundation.e.mail.provider; -import com.fsck.k9.R; -import com.fsck.k9.activity.UnreadWidgetConfiguration; -import com.fsck.k9.helper.UnreadWidgetProperties; +import foundation.e.mail.R; +import foundation.e.mail.activity.UnreadWidgetConfiguration; +import foundation.e.mail.helper.UnreadWidgetProperties; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; diff --git a/k9mail/src/main/java/com/fsck/k9/remotecontrol/AccountReceiver.java b/k9mail/src/main/java/foundation/e/mail/remotecontrol/AccountReceiver.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/remotecontrol/AccountReceiver.java rename to k9mail/src/main/java/foundation/e/mail/remotecontrol/AccountReceiver.java index 82353e9f4796c4d45248b9301aa23896d061e9c5..3f7ffa17c37400611f3485b1664e92f7041ae04d 100644 --- a/k9mail/src/main/java/com/fsck/k9/remotecontrol/AccountReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/remotecontrol/AccountReceiver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.remotecontrol; +package foundation.e.mail.remotecontrol; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/remotecontrol/K9AccountReceptor.java b/k9mail/src/main/java/foundation/e/mail/remotecontrol/K9AccountReceptor.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/remotecontrol/K9AccountReceptor.java rename to k9mail/src/main/java/foundation/e/mail/remotecontrol/K9AccountReceptor.java index 8732b83ac4b19a570367b2f046ab8e36054162d5..b4641e4cf1c562cbe551798f664c623b3143e994 100644 --- a/k9mail/src/main/java/com/fsck/k9/remotecontrol/K9AccountReceptor.java +++ b/k9mail/src/main/java/foundation/e/mail/remotecontrol/K9AccountReceptor.java @@ -1,4 +1,4 @@ -package com.fsck.k9.remotecontrol; +package foundation.e.mail.remotecontrol; /** * * @author Daniel I. Applebaum diff --git a/k9mail/src/main/java/com/fsck/k9/remotecontrol/K9RemoteControl.java b/k9mail/src/main/java/foundation/e/mail/remotecontrol/K9RemoteControl.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/remotecontrol/K9RemoteControl.java rename to k9mail/src/main/java/foundation/e/mail/remotecontrol/K9RemoteControl.java index 147d246c630fc04d83764ded4d98e5d2416ee63f..857db61d0cf55b32b749a2d86e9cd98a39c623c0 100644 --- a/k9mail/src/main/java/com/fsck/k9/remotecontrol/K9RemoteControl.java +++ b/k9mail/src/main/java/foundation/e/mail/remotecontrol/K9RemoteControl.java @@ -1,15 +1,15 @@ -package com.fsck.k9.remotecontrol; +package foundation.e.mail.remotecontrol; import android.app.Activity; import android.content.Context; import android.content.Intent; -import com.fsck.k9.BuildConfig; +import foundation.e.mail.BuildConfig; /** * Utility definitions for Android applications to control the behavior of K-9 Mail. All such applications must declare the following permission: - * + * * in their AndroidManifest.xml In addition, all applications sending remote control messages to K-9 Mail must * * An application that wishes to act on a particular Account in K-9 needs to fetch the list of configured Accounts by broadcasting an @@ -38,7 +38,7 @@ public class K9RemoteControl { /** * The {@link {@link Intent}} Action to set in order to cause K-9 to check mail. (Not yet implemented) */ - //public final static String K9_CHECK_MAIL = "com.fsck.k9.K9RemoteControl.checkMail"; + //public final static String K9_CHECK_MAIL = "foundation.e.mail.K9RemoteControl.checkMail"; /** * The {@link {@link Intent}} Action to set when remotely changing K-9 Mail settings diff --git a/k9mail/src/main/java/com/fsck/k9/search/ConditionsTreeNode.java b/k9mail/src/main/java/foundation/e/mail/search/ConditionsTreeNode.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/search/ConditionsTreeNode.java rename to k9mail/src/main/java/foundation/e/mail/search/ConditionsTreeNode.java index 7178826b3022df15e83597723a3b8a71fc52c763..4febd896f5a2083f6456012afa15d0569f184d45 100644 --- a/k9mail/src/main/java/com/fsck/k9/search/ConditionsTreeNode.java +++ b/k9mail/src/main/java/foundation/e/mail/search/ConditionsTreeNode.java @@ -1,4 +1,4 @@ -package com.fsck.k9.search; +package foundation.e.mail.search; import java.util.ArrayList; import java.util.HashSet; @@ -10,9 +10,9 @@ import android.database.Cursor; import android.os.Parcel; import android.os.Parcelable; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchCondition; -import com.fsck.k9.search.SearchSpecification.SearchField; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchCondition; +import foundation.e.mail.search.SearchSpecification.SearchField; /** diff --git a/k9mail/src/main/java/com/fsck/k9/search/LocalSearch.java b/k9mail/src/main/java/foundation/e/mail/search/LocalSearch.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/search/LocalSearch.java rename to k9mail/src/main/java/foundation/e/mail/search/LocalSearch.java index e86a792df243aea7ba5f2a89b99ee97ac8e87e4a..c4f669ea6f4a304cf5da8734469c340c920b9a6b 100644 --- a/k9mail/src/main/java/com/fsck/k9/search/LocalSearch.java +++ b/k9mail/src/main/java/foundation/e/mail/search/LocalSearch.java @@ -1,4 +1,4 @@ -package com.fsck.k9.search; +package foundation.e.mail.search; import java.util.ArrayList; import java.util.HashSet; diff --git a/k9mail/src/main/java/com/fsck/k9/search/SearchAccount.java b/k9mail/src/main/java/foundation/e/mail/search/SearchAccount.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/search/SearchAccount.java rename to k9mail/src/main/java/foundation/e/mail/search/SearchAccount.java index 2647eb5d73dd30083123370bde02066ed733a2a2..5090358a00b8fc9fc4766893f301797f7b79db10 100644 --- a/k9mail/src/main/java/com/fsck/k9/search/SearchAccount.java +++ b/k9mail/src/main/java/foundation/e/mail/search/SearchAccount.java @@ -1,11 +1,11 @@ -package com.fsck.k9.search; +package foundation.e.mail.search; import android.content.Context; -import com.fsck.k9.BaseAccount; -import com.fsck.k9.R; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchField; +import foundation.e.mail.BaseAccount; +import foundation.e.mail.R; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchField; /** diff --git a/k9mail/src/main/java/com/fsck/k9/search/SearchSpecification.java b/k9mail/src/main/java/foundation/e/mail/search/SearchSpecification.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/search/SearchSpecification.java rename to k9mail/src/main/java/foundation/e/mail/search/SearchSpecification.java index ccb63fbb3c710a983af07adc7244c592f16e419e..313aef26b00760c55c8cee6b744b1fda09635694 100644 --- a/k9mail/src/main/java/com/fsck/k9/search/SearchSpecification.java +++ b/k9mail/src/main/java/foundation/e/mail/search/SearchSpecification.java @@ -1,4 +1,4 @@ -package com.fsck.k9.search; +package foundation.e.mail.search; import android.os.Parcel; import android.os.Parcelable; diff --git a/k9mail/src/main/java/com/fsck/k9/search/SqlQueryBuilder.java b/k9mail/src/main/java/foundation/e/mail/search/SqlQueryBuilder.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/search/SqlQueryBuilder.java rename to k9mail/src/main/java/foundation/e/mail/search/SqlQueryBuilder.java index d3aa89d00ac055e865e288cebd5a7bdb531cdde9..077985ee7ce5a034b1b4dbf1720772ba2e746ea3 100644 --- a/k9mail/src/main/java/com/fsck/k9/search/SqlQueryBuilder.java +++ b/k9mail/src/main/java/foundation/e/mail/search/SqlQueryBuilder.java @@ -1,17 +1,17 @@ -package com.fsck.k9.search; +package foundation.e.mail.search; import java.util.List; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Folder; -import com.fsck.k9.mailstore.LocalFolder; -import com.fsck.k9.mailstore.LocalStore; -import com.fsck.k9.search.SearchSpecification.Attribute; -import com.fsck.k9.search.SearchSpecification.SearchCondition; -import com.fsck.k9.search.SearchSpecification.SearchField; +import foundation.e.mail.Account; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Folder; +import foundation.e.mail.mailstore.LocalFolder; +import foundation.e.mail.mailstore.LocalStore; +import foundation.e.mail.search.SearchSpecification.Attribute; +import foundation.e.mail.search.SearchSpecification.SearchCondition; +import foundation.e.mail.search.SearchSpecification.SearchField; public class SqlQueryBuilder { diff --git a/k9mail/src/main/java/com/fsck/k9/service/BootReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/BootReceiver.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/service/BootReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/BootReceiver.java index ad52a556a5e1cd7f1bd9897ac15b02f2ed205d25..2365d386f765a4d2563d02fb0981f3372ccd2f1b 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/BootReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/BootReceiver.java @@ -1,5 +1,5 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.app.AlarmManager; import android.app.PendingIntent; @@ -9,17 +9,17 @@ import android.net.ConnectivityManager; import android.net.Uri; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.helper.K9AlarmManager; +import foundation.e.mail.K9; +import foundation.e.mail.helper.K9AlarmManager; public class BootReceiver extends CoreReceiver { - public static final String FIRE_INTENT = "com.fsck.k9.service.BroadcastReceiver.fireIntent"; - public static final String SCHEDULE_INTENT = "com.fsck.k9.service.BroadcastReceiver.scheduleIntent"; - public static final String CANCEL_INTENT = "com.fsck.k9.service.BroadcastReceiver.cancelIntent"; + public static final String FIRE_INTENT = "foundation.e.mail.service.BroadcastReceiver.fireIntent"; + public static final String SCHEDULE_INTENT = "foundation.e.mail.service.BroadcastReceiver.scheduleIntent"; + public static final String CANCEL_INTENT = "foundation.e.mail.service.BroadcastReceiver.cancelIntent"; - public static final String ALARMED_INTENT = "com.fsck.k9.service.BroadcastReceiver.pendingIntent"; - public static final String AT_TIME = "com.fsck.k9.service.BroadcastReceiver.atTime"; + public static final String ALARMED_INTENT = "foundation.e.mail.service.BroadcastReceiver.pendingIntent"; + public static final String AT_TIME = "foundation.e.mail.service.BroadcastReceiver.atTime"; @Override public Integer receive(Context context, Intent intent, Integer tmpWakeLockId) { diff --git a/k9mail/src/main/java/com/fsck/k9/service/CoreReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/CoreReceiver.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/service/CoreReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/CoreReceiver.java index a30d1b857f23815cb4187300c5c834edd4a6998a..4c6f05fdb5d50aa2ff710dfc4a12bd02a7dbfe94 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/CoreReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/CoreReceiver.java @@ -1,5 +1,5 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -10,15 +10,15 @@ import android.content.Intent; import android.os.PowerManager; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.K9; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; public class CoreReceiver extends BroadcastReceiver { - public static final String WAKE_LOCK_RELEASE = "com.fsck.k9.service.CoreReceiver.wakeLockRelease"; + public static final String WAKE_LOCK_RELEASE = "foundation.e.mail.service.CoreReceiver.wakeLockRelease"; - public static final String WAKE_LOCK_ID = "com.fsck.k9.service.CoreReceiver.wakeLockId"; + public static final String WAKE_LOCK_ID = "foundation.e.mail.service.CoreReceiver.wakeLockId"; private static ConcurrentHashMap wakeLocks = new ConcurrentHashMap(); private static AtomicInteger wakeLockSeq = new AtomicInteger(0); diff --git a/k9mail/src/main/java/com/fsck/k9/service/CoreService.java b/k9mail/src/main/java/foundation/e/mail/service/CoreService.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/service/CoreService.java rename to k9mail/src/main/java/foundation/e/mail/service/CoreService.java index b31dc0757c573f0522044ad2174f707b3de7062b..4b9c2b71dc1d88a6d4fe4bf577bad9493799a55c 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/CoreService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/CoreService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -12,10 +12,10 @@ import android.content.Intent; import android.os.IBinder; import android.os.PowerManager; import timber.log.Timber; -import com.fsck.k9.K9; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.K9; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; /** * {@code CoreService} is the base class for all K-9 Services. @@ -57,7 +57,7 @@ import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; */ public abstract class CoreService extends Service { - public static final String WAKE_LOCK_ID = "com.fsck.k9.service.CoreService.wakeLockId"; + public static final String WAKE_LOCK_ID = "foundation.e.mail.service.CoreService.wakeLockId"; private static ConcurrentHashMap sWakeLocks = new ConcurrentHashMap(); diff --git a/k9mail/src/main/java/com/fsck/k9/service/DatabaseUpgradeService.java b/k9mail/src/main/java/foundation/e/mail/service/DatabaseUpgradeService.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/service/DatabaseUpgradeService.java rename to k9mail/src/main/java/foundation/e/mail/service/DatabaseUpgradeService.java index ea1767cfad1c2594e8137e1366eb71003a912790..1f32d8b852b97f654499fcc40e9e0a8a52d391a0 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/DatabaseUpgradeService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/DatabaseUpgradeService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,13 +11,13 @@ import android.os.PowerManager; import android.support.v4.content.LocalBroadcastManager; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.activity.UpgradeDatabases; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; -import com.fsck.k9.mailstore.UnavailableStorageException; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.activity.UpgradeDatabases; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mailstore.UnavailableStorageException; /** * Service used to upgrade the accounts' databases and/or track the progress of the upgrade. @@ -69,7 +69,7 @@ public class DatabaseUpgradeService extends Service { * Action used to start this service. */ private static final String ACTION_START_SERVICE = - "com.fsck.k9.service.DatabaseUpgradeService.startService"; + "foundation.e.mail.service.DatabaseUpgradeService.startService"; private static final String WAKELOCK_TAG = "DatabaseUpgradeService"; private static final long WAKELOCK_TIMEOUT = 10 * 60 * 1000; // 10 minutes diff --git a/k9mail/src/main/java/com/fsck/k9/service/MailService.java b/k9mail/src/main/java/foundation/e/mail/service/MailService.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/service/MailService.java rename to k9mail/src/main/java/foundation/e/mail/service/MailService.java index a95ea01ffc5d2b1a963fb45055559b376b473b78..d56173730375f17543026c21269919370cf6d02a 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/MailService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/MailService.java @@ -1,5 +1,5 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import java.util.Collection; @@ -10,27 +10,27 @@ import android.content.Intent; import android.os.IBinder; import android.os.SystemClock; -import com.fsck.k9.Account; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Pusher; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; +import foundation.e.mail.Account; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Pusher; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; import timber.log.Timber; public class MailService extends CoreService { - private static final String ACTION_CHECK_MAIL = "com.fsck.k9.intent.action.MAIL_SERVICE_WAKEUP"; - private static final String ACTION_RESET = "com.fsck.k9.intent.action.MAIL_SERVICE_RESET"; - private static final String ACTION_RESCHEDULE_POLL = "com.fsck.k9.intent.action.MAIL_SERVICE_RESCHEDULE_POLL"; - private static final String ACTION_CANCEL = "com.fsck.k9.intent.action.MAIL_SERVICE_CANCEL"; - private static final String ACTION_REFRESH_PUSHERS = "com.fsck.k9.intent.action.MAIL_SERVICE_REFRESH_PUSHERS"; - private static final String ACTION_RESTART_PUSHERS = "com.fsck.k9.intent.action.MAIL_SERVICE_RESTART_PUSHERS"; - private static final String CONNECTIVITY_CHANGE = "com.fsck.k9.intent.action.MAIL_SERVICE_CONNECTIVITY_CHANGE"; - private static final String CANCEL_CONNECTIVITY_NOTICE = "com.fsck.k9.intent.action.MAIL_SERVICE_CANCEL_CONNECTIVITY_NOTICE"; + private static final String ACTION_CHECK_MAIL = "foundation.e.mail.intent.action.MAIL_SERVICE_WAKEUP"; + private static final String ACTION_RESET = "foundation.e.mail.intent.action.MAIL_SERVICE_RESET"; + private static final String ACTION_RESCHEDULE_POLL = "foundation.e.mail.intent.action.MAIL_SERVICE_RESCHEDULE_POLL"; + private static final String ACTION_CANCEL = "foundation.e.mail.intent.action.MAIL_SERVICE_CANCEL"; + private static final String ACTION_REFRESH_PUSHERS = "foundation.e.mail.intent.action.MAIL_SERVICE_REFRESH_PUSHERS"; + private static final String ACTION_RESTART_PUSHERS = "foundation.e.mail.intent.action.MAIL_SERVICE_RESTART_PUSHERS"; + private static final String CONNECTIVITY_CHANGE = "foundation.e.mail.intent.action.MAIL_SERVICE_CONNECTIVITY_CHANGE"; + private static final String CANCEL_CONNECTIVITY_NOTICE = "foundation.e.mail.intent.action.MAIL_SERVICE_CANCEL_CONNECTIVITY_NOTICE"; private static long nextCheck = -1; private static boolean pushingRequested = false; diff --git a/k9mail/src/main/java/com/fsck/k9/service/PollService.java b/k9mail/src/main/java/foundation/e/mail/service/PollService.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/service/PollService.java rename to k9mail/src/main/java/foundation/e/mail/service/PollService.java index 2d2283e0f2964f9831e3f9f9e3c4357b09ff0d65..6abba92554ad1fc00577f018ec4a06dca08f14e7 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/PollService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/PollService.java @@ -1,22 +1,23 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.os.PowerManager; import timber.log.Timber; -import com.fsck.k9.*; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.mail.power.TracingPowerManager; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.Account; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.mail.power.TracingPowerManager; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.K9; import java.util.HashMap; import java.util.Map; public class PollService extends CoreService { - private static final String START_SERVICE = "com.fsck.k9.service.PollService.startService"; - private static final String STOP_SERVICE = "com.fsck.k9.service.PollService.stopService"; + private static final String START_SERVICE = "foundation.e.mail.service.PollService.startService"; + private static final String STOP_SERVICE = "foundation.e.mail.service.PollService.stopService"; private Listener mListener = new Listener(); diff --git a/k9mail/src/main/java/com/fsck/k9/service/PushService.java b/k9mail/src/main/java/foundation/e/mail/service/PushService.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/service/PushService.java rename to k9mail/src/main/java/foundation/e/mail/service/PushService.java index 1062709c2d3326e2071e39c0c2fa296ff2ea81cf..72092a5c9e35250652dd7cc462b63b08e39793c7 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/PushService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/PushService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.Context; import android.content.Intent; @@ -6,8 +6,8 @@ import android.os.IBinder; import timber.log.Timber; public class PushService extends CoreService { - private static final String START_SERVICE = "com.fsck.k9.service.PushService.startService"; - private static final String STOP_SERVICE = "com.fsck.k9.service.PushService.stopService"; + private static final String START_SERVICE = "foundation.e.mail.service.PushService.startService"; + private static final String STOP_SERVICE = "foundation.e.mail.service.PushService.stopService"; public static void startService(Context context) { Intent i = new Intent(); diff --git a/k9mail/src/main/java/com/fsck/k9/service/RemoteControlReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/RemoteControlReceiver.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/service/RemoteControlReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/RemoteControlReceiver.java index a8634d05efc913fbc026d9865f68b89c98f52bec..3dfa2d5a5c0871a61c8e0a5da9b547bba80c5ebf 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/RemoteControlReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/RemoteControlReceiver.java @@ -1,18 +1,18 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.Context; import android.content.Intent; import android.os.Bundle; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.remotecontrol.K9RemoteControl; -import com.fsck.k9.Preferences; +import foundation.e.mail.Account; +import foundation.e.mail.remotecontrol.K9RemoteControl; +import foundation.e.mail.Preferences; import java.util.List; -import static com.fsck.k9.remotecontrol.K9RemoteControl.*; +import static foundation.e.mail.remotecontrol.K9RemoteControl.*; public class RemoteControlReceiver extends CoreReceiver { @Override diff --git a/k9mail/src/main/java/com/fsck/k9/service/RemoteControlService.java b/k9mail/src/main/java/foundation/e/mail/service/RemoteControlService.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/service/RemoteControlService.java rename to k9mail/src/main/java/foundation/e/mail/service/RemoteControlService.java index 117cce6c04bf4a49a25a4b8418a0e3ea9689bf6e..c2c0e4e71de5577bd6305290385677304d60b0f3 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/RemoteControlService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/RemoteControlService.java @@ -1,16 +1,16 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.preferences.Storage; -import com.fsck.k9.preferences.StorageEditor; -import com.fsck.k9.remotecontrol.K9RemoteControl; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.Account.FolderMode; -import com.fsck.k9.K9.BACKGROUND_OPS; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.preferences.Storage; +import foundation.e.mail.preferences.StorageEditor; +import foundation.e.mail.remotecontrol.K9RemoteControl; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.Account.FolderMode; +import foundation.e.mail.K9.BACKGROUND_OPS; -import static com.fsck.k9.remotecontrol.K9RemoteControl.*; +import static foundation.e.mail.remotecontrol.K9RemoteControl.*; import android.content.Context; import android.content.Intent; @@ -20,10 +20,10 @@ import android.widget.Toast; import java.util.List; public class RemoteControlService extends CoreService { - private final static String RESCHEDULE_ACTION = "com.fsck.k9.service.RemoteControlService.RESCHEDULE_ACTION"; - private final static String PUSH_RESTART_ACTION = "com.fsck.k9.service.RemoteControlService.PUSH_RESTART_ACTION"; + private final static String RESCHEDULE_ACTION = "foundation.e.mail.service.RemoteControlService.RESCHEDULE_ACTION"; + private final static String PUSH_RESTART_ACTION = "foundation.e.mail.service.RemoteControlService.PUSH_RESTART_ACTION"; - private final static String SET_ACTION = "com.fsck.k9.service.RemoteControlService.SET_ACTION"; + private final static String SET_ACTION = "foundation.e.mail.service.RemoteControlService.SET_ACTION"; public static void set(Context context, Intent i, Integer wakeLockId) { // Intent i = new Intent(); diff --git a/k9mail/src/main/java/com/fsck/k9/service/ShutdownReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/ShutdownReceiver.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/service/ShutdownReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/ShutdownReceiver.java index b3d0ccad66c2f4b98c54463a4919991999455e5b..85074e7256b9540a1bc81dacfa84b60d2c636d34 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/ShutdownReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/ShutdownReceiver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/service/SleepService.java b/k9mail/src/main/java/foundation/e/mail/service/SleepService.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/service/SleepService.java rename to k9mail/src/main/java/foundation/e/mail/service/SleepService.java index 7e4a80de5378f7ee55b6f99b685929bc7fb92016..41c27f03d6a73669c16131a7e7e9fdb805f3af3a 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/SleepService.java +++ b/k9mail/src/main/java/foundation/e/mail/service/SleepService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import java.util.concurrent.ConcurrentHashMap; @@ -10,7 +10,7 @@ import android.content.Context; import android.content.Intent; import android.os.SystemClock; -import com.fsck.k9.mail.power.TracingPowerManager.TracingWakeLock; +import foundation.e.mail.mail.power.TracingPowerManager.TracingWakeLock; import timber.log.Timber; import static java.lang.Thread.currentThread; @@ -18,8 +18,8 @@ import static java.lang.Thread.currentThread; public class SleepService extends CoreService { - private static final String ALARM_FIRED = "com.fsck.k9.service.SleepService.ALARM_FIRED"; - private static final String LATCH_ID = "com.fsck.k9.service.SleepService.LATCH_ID_EXTRA"; + private static final String ALARM_FIRED = "foundation.e.mail.service.SleepService.ALARM_FIRED"; + private static final String LATCH_ID = "foundation.e.mail.service.SleepService.LATCH_ID_EXTRA"; private static ConcurrentHashMap sleepData = new ConcurrentHashMap(); diff --git a/k9mail/src/main/java/com/fsck/k9/service/StorageGoneReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/StorageGoneReceiver.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/service/StorageGoneReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/StorageGoneReceiver.java index e103fdf416c97e54f691a1bbb936be41fa3354d4..f794511f4539b5b5dd2389fbb57aed5dd98f6ba0 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/StorageGoneReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/StorageGoneReceiver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.BroadcastReceiver; import android.content.Context; @@ -6,7 +6,7 @@ import android.content.Intent; import android.net.Uri; import timber.log.Timber; -import com.fsck.k9.mailstore.StorageManager; +import foundation.e.mail.mailstore.StorageManager; /** * That BroadcastReceiver is only interested in UNMOUNT events. diff --git a/k9mail/src/main/java/com/fsck/k9/service/StorageReceiver.java b/k9mail/src/main/java/foundation/e/mail/service/StorageReceiver.java similarity index 90% rename from k9mail/src/main/java/com/fsck/k9/service/StorageReceiver.java rename to k9mail/src/main/java/foundation/e/mail/service/StorageReceiver.java index a3a93e4715922bee4174aa30af537c63ac08de9a..f9020f5e79cb44ef86dcfa9eb10bc54b6bec2680 100644 --- a/k9mail/src/main/java/com/fsck/k9/service/StorageReceiver.java +++ b/k9mail/src/main/java/foundation/e/mail/service/StorageReceiver.java @@ -1,4 +1,4 @@ -package com.fsck.k9.service; +package foundation.e.mail.service; import android.content.BroadcastReceiver; import android.content.Context; @@ -6,7 +6,7 @@ import android.content.Intent; import android.net.Uri; import timber.log.Timber; -import com.fsck.k9.mailstore.StorageManager; +import foundation.e.mail.mailstore.StorageManager; /** * That BroadcastReceiver is only interested in MOUNT events. diff --git a/k9mail/src/main/java/com/fsck/k9/setup/ServerNameSuggester.java b/k9mail/src/main/java/foundation/e/mail/setup/ServerNameSuggester.java similarity index 87% rename from k9mail/src/main/java/com/fsck/k9/setup/ServerNameSuggester.java rename to k9mail/src/main/java/foundation/e/mail/setup/ServerNameSuggester.java index 3cb52dad0050d0f1f38723a3cb6f10ef12fb9c1f..b2c8902201332b6b0b7eff9ef5bbd5a4e0abd456 100644 --- a/k9mail/src/main/java/com/fsck/k9/setup/ServerNameSuggester.java +++ b/k9mail/src/main/java/foundation/e/mail/setup/ServerNameSuggester.java @@ -1,7 +1,7 @@ -package com.fsck.k9.setup; +package foundation.e.mail.setup; -import com.fsck.k9.mail.ServerSettings.Type; +import foundation.e.mail.mail.ServerSettings.Type; public class ServerNameSuggester { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/ContactBadge.java b/k9mail/src/main/java/foundation/e/mail/ui/ContactBadge.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/ui/ContactBadge.java rename to k9mail/src/main/java/foundation/e/mail/ui/ContactBadge.java index 6a09fedca61e8fc50a3e80032fd304a316809a9f..de2352db273c53fcbc3a569e6144400073b5073f 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/ContactBadge.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/ContactBadge.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui; +package foundation.e.mail.ui; import android.content.ActivityNotFoundException; @@ -23,7 +23,7 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.widget.ImageView; import android.widget.Toast; -import com.fsck.k9.R; +import foundation.e.mail.R; /** diff --git a/k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java b/k9mail/src/main/java/foundation/e/mail/ui/EolConvertingEditText.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java rename to k9mail/src/main/java/foundation/e/mail/ui/EolConvertingEditText.java index b7fd8e09a80a3e48426450a2db929d941502c7ba..53f9e284db6d373e4f5504f1c942dc16e02326b5 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/EolConvertingEditText.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/EolConvertingEditText.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui; +package foundation.e.mail.ui; import android.content.Context; import android.util.AttributeSet; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessageMvpView.java b/k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessageMvpView.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessageMvpView.java rename to k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessageMvpView.java index cbc2ac095afcf7f45130bf3ee4ee8a9af9b0d078..0a2a11ee8bd162d86911f0572673194b8030fccf 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessageMvpView.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessageMvpView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.compose; +package foundation.e.mail.ui.compose; import android.text.TextWatcher; @@ -9,15 +9,15 @@ import android.webkit.WebViewClient; import android.widget.Button; import android.widget.ImageButton; -import com.fsck.k9.FontSizes; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.mailstore.AttachmentResolver; -import com.fsck.k9.message.QuotedTextMode; -import com.fsck.k9.message.SimpleMessageFormat; -import com.fsck.k9.ui.EolConvertingEditText; -import com.fsck.k9.view.MessageWebView; +import foundation.e.mail.FontSizes; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.mailstore.AttachmentResolver; +import foundation.e.mail.message.QuotedTextMode; +import foundation.e.mail.message.SimpleMessageFormat; +import foundation.e.mail.ui.EolConvertingEditText; +import foundation.e.mail.view.MessageWebView; public class QuotedMessageMvpView { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessagePresenter.java b/k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessagePresenter.java similarity index 93% rename from k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessagePresenter.java rename to k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessagePresenter.java index c4a307503cf0eebbfdb3e7027f935d08ffc51d60..ab4cac3f5e9d2e92b478a4136bf9356a8e0ebc4a 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/compose/QuotedMessagePresenter.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/compose/QuotedMessagePresenter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.compose; +package foundation.e.mail.ui.compose; import java.util.Map; @@ -7,28 +7,28 @@ import android.content.res.Resources; import android.os.Bundle; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.Account.MessageFormat; -import com.fsck.k9.Account.QuoteStyle; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.activity.MessageCompose.Action; -import com.fsck.k9.message.extractors.BodyTextExtractor; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.message.quote.HtmlQuoteCreator; -import com.fsck.k9.message.quote.TextQuoteCreator; -import com.fsck.k9.message.signature.HtmlSignatureRemover; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.AttachmentResolver; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.message.IdentityField; -import com.fsck.k9.message.quote.InsertableHtmlContent; -import com.fsck.k9.message.MessageBuilder; -import com.fsck.k9.message.QuotedTextMode; -import com.fsck.k9.message.SimpleMessageFormat; -import com.fsck.k9.message.signature.TextSignatureRemover; +import foundation.e.mail.Account; +import foundation.e.mail.Account.MessageFormat; +import foundation.e.mail.Account.QuoteStyle; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.activity.MessageCompose.Action; +import foundation.e.mail.message.extractors.BodyTextExtractor; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.message.quote.HtmlQuoteCreator; +import foundation.e.mail.message.quote.TextQuoteCreator; +import foundation.e.mail.message.signature.HtmlSignatureRemover; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.AttachmentResolver; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.message.IdentityField; +import foundation.e.mail.message.quote.InsertableHtmlContent; +import foundation.e.mail.message.MessageBuilder; +import foundation.e.mail.message.QuotedTextMode; +import foundation.e.mail.message.SimpleMessageFormat; +import foundation.e.mail.message.signature.TextSignatureRemover; public class QuotedMessagePresenter { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoAnnotations.java b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoAnnotations.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoAnnotations.java rename to k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoAnnotations.java index 7adf91ad196330e5171453e0207fb31f0f543094..d1702a0ccd8e7b68734f3cdb9d4f0ee8e6a8172b 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoAnnotations.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoAnnotations.java @@ -1,10 +1,10 @@ -package com.fsck.k9.ui.crypto; +package foundation.e.mail.ui.crypto; import java.util.HashMap; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mailstore.CryptoResultAnnotation; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mailstore.CryptoResultAnnotation; public class MessageCryptoAnnotations { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoCallback.java b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoCallback.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoCallback.java rename to k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoCallback.java index 627030666f45bc48f8fc65daf5494ce406f38450..ec7d806af006c1191457be53ef1934cf9f2a5b68 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoCallback.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoCallback.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.crypto; +package foundation.e.mail.ui.crypto; import android.content.Intent; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoHelper.java b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoHelper.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoHelper.java rename to k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoHelper.java index b18ee8141eb5d46e8f99f81e392114952cf7faa7..b5f8cd71ffbdd516b8e6026dd763dd382fd256f5 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/crypto/MessageCryptoHelper.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/crypto/MessageCryptoHelper.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.crypto; +package foundation.e.mail.ui.crypto; import java.io.ByteArrayOutputStream; @@ -17,28 +17,28 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.WorkerThread; -import com.fsck.k9.K9; -import com.fsck.k9.autocrypt.AutocryptOperations; -import com.fsck.k9.crypto.MessageCryptoStructureDetector; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Body; -import com.fsck.k9.mail.BodyPart; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.Multipart; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MessageExtractor; -import com.fsck.k9.mail.internet.MimeBodyPart; -import com.fsck.k9.mail.internet.MimeMultipart; -import com.fsck.k9.mail.internet.SizeAware; -import com.fsck.k9.mail.internet.TextBody; -import com.fsck.k9.mailstore.CryptoResultAnnotation; -import com.fsck.k9.mailstore.CryptoResultAnnotation.CryptoError; -import com.fsck.k9.mailstore.MessageHelper; -import com.fsck.k9.mailstore.MimePartStreamParser; -import com.fsck.k9.mailstore.util.FileFactory; -import com.fsck.k9.provider.DecryptedFileProvider; +import foundation.e.mail.K9; +import foundation.e.mail.autocrypt.AutocryptOperations; +import foundation.e.mail.crypto.MessageCryptoStructureDetector; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Body; +import foundation.e.mail.mail.BodyPart; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.Multipart; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MessageExtractor; +import foundation.e.mail.mail.internet.MimeBodyPart; +import foundation.e.mail.mail.internet.MimeMultipart; +import foundation.e.mail.mail.internet.SizeAware; +import foundation.e.mail.mail.internet.TextBody; +import foundation.e.mail.mailstore.CryptoResultAnnotation; +import foundation.e.mail.mailstore.CryptoResultAnnotation.CryptoError; +import foundation.e.mail.mailstore.MessageHelper; +import foundation.e.mail.mailstore.MimePartStreamParser; +import foundation.e.mail.mailstore.util.FileFactory; +import foundation.e.mail.provider.DecryptedFileProvider; import org.apache.commons.io.IOUtils; import org.openintents.openpgp.IOpenPgpService2; import org.openintents.openpgp.OpenPgpDecryptionResult; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/crypto/OpenPgpApiFactory.java b/k9mail/src/main/java/foundation/e/mail/ui/crypto/OpenPgpApiFactory.java similarity index 89% rename from k9mail/src/main/java/com/fsck/k9/ui/crypto/OpenPgpApiFactory.java rename to k9mail/src/main/java/foundation/e/mail/ui/crypto/OpenPgpApiFactory.java index 72a20b63bddcb651650600dcec3fad5e9a20bf4b..430bc900c990386b45ac36afc43dd52fb4a03795 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/crypto/OpenPgpApiFactory.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/crypto/OpenPgpApiFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.crypto; +package foundation.e.mail.ui.crypto; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/dialog/ApgDeprecationWarningDialog.java b/k9mail/src/main/java/foundation/e/mail/ui/dialog/ApgDeprecationWarningDialog.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/ui/dialog/ApgDeprecationWarningDialog.java rename to k9mail/src/main/java/foundation/e/mail/ui/dialog/ApgDeprecationWarningDialog.java index 1eeb159677ab415411d9aa74991156800692492c..4a5139202231012a17ab81b001f92eaf779d3f27 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/dialog/ApgDeprecationWarningDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/dialog/ApgDeprecationWarningDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.dialog; +package foundation.e.mail.ui.dialog; import android.annotation.SuppressLint; @@ -11,7 +11,7 @@ import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; -import com.fsck.k9.R; +import foundation.e.mail.R; public class ApgDeprecationWarningDialog extends AlertDialog { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/dialog/AutocryptPreferEncryptDialog.java b/k9mail/src/main/java/foundation/e/mail/ui/dialog/AutocryptPreferEncryptDialog.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/ui/dialog/AutocryptPreferEncryptDialog.java rename to k9mail/src/main/java/foundation/e/mail/ui/dialog/AutocryptPreferEncryptDialog.java index fcb0b7f765be027b9d9b30ac78a45e50ffb16734..4dae3674cae893f5c52c76014d00785118dd0ab2 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/dialog/AutocryptPreferEncryptDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/dialog/AutocryptPreferEncryptDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.dialog; +package foundation.e.mail.ui.dialog; import android.annotation.SuppressLint; @@ -13,7 +13,7 @@ import android.view.View.OnClickListener; import android.widget.CheckBox; import android.widget.TextView; -import com.fsck.k9.R; +import foundation.e.mail.R; public class AutocryptPreferEncryptDialog extends AlertDialog implements OnClickListener { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageExtractorLoader.java b/k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageExtractorLoader.java similarity index 85% rename from k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageExtractorLoader.java rename to k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageExtractorLoader.java index dfd87441b76e72ddbb13c67c8050e0ab4d9cd455..c19df42a5a0c1242ad62c466ae4854b1626893cb 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageExtractorLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageExtractorLoader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.message; +package foundation.e.mail.ui.message; import android.content.AsyncTaskLoader; @@ -7,11 +7,11 @@ import android.support.annotation.Nullable; import android.support.annotation.WorkerThread; import timber.log.Timber; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.MessageViewInfoExtractor; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.ui.crypto.MessageCryptoAnnotations; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.MessageViewInfoExtractor; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.ui.crypto.MessageCryptoAnnotations; public class LocalMessageExtractorLoader extends AsyncTaskLoader { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageLoader.java b/k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageLoader.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageLoader.java rename to k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageLoader.java index 873977ecbd758fc18769cce0f5ad9789ac2abaaa..b20af4c1489227014c1108bd0b8769299ce0c1ae 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/message/LocalMessageLoader.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/message/LocalMessageLoader.java @@ -1,15 +1,15 @@ -package com.fsck.k9.ui.message; +package foundation.e.mail.ui.message; import android.content.AsyncTaskLoader; import android.content.Context; import timber.log.Timber; -import com.fsck.k9.Account; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mailstore.LocalMessage; +import foundation.e.mail.Account; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mailstore.LocalMessage; public class LocalMessageLoader extends AsyncTaskLoader { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentController.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentController.java similarity index 60% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentController.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentController.java index e4f5f2bc97c3a8e8a45376d3cea348c77c1a319c..da4ebea0bc8eec3fa4b75883129b59e8a9121722 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentController.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentController.java @@ -1,57 +1,50 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.List; - -import android.app.DownloadManager; import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.AsyncTask; -import android.os.Environment; import android.support.annotation.WorkerThread; -import timber.log.Timber; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.cache.TemporaryAttachmentStore; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.controller.SimpleMessagingListener; -import com.fsck.k9.helper.FileHelper; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.Part; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.LocalPart; -import com.fsck.k9.provider.AttachmentTempFileProvider; import org.apache.commons.io.IOUtils; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; + +import foundation.e.mail.Account; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.controller.SimpleMessagingListener; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.Part; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.LocalPart; +import foundation.e.mail.provider.AttachmentTempFileProvider; +import timber.log.Timber; + public class AttachmentController { private final Context context; private final MessagingController controller; private final MessageViewFragment messageViewFragment; private final AttachmentViewInfo attachment; - private final DownloadManager downloadManager; - - AttachmentController(MessagingController controller, DownloadManager downloadManager, - MessageViewFragment messageViewFragment, AttachmentViewInfo attachment) { + AttachmentController(MessagingController controller, MessageViewFragment messageViewFragment, + AttachmentViewInfo attachment) { this.context = messageViewFragment.getApplicationContext(); this.controller = controller; - this.downloadManager = downloadManager; this.messageViewFragment = messageViewFragment; this.attachment = attachment; } @@ -64,12 +57,16 @@ public class AttachmentController { } } - public void saveAttachment() { + /*public void saveAttachment() { saveAttachmentTo(K9.getAttachmentDefaultPath()); - } + }*/ - public void saveAttachmentTo(String directory) { - saveAttachmentTo(new File(directory)); + public void saveAttachmentTo(Uri documentUri) { + if (!attachment.isContentAvailable()) { + downloadAndSaveAttachmentTo((LocalPart) attachment.part, documentUri); + } else { + saveLocalAttachmentTo(documentUri); + } } private void downloadAndViewAttachment(LocalPart localPart) { @@ -81,12 +78,12 @@ public class AttachmentController { }); } - private void downloadAndSaveAttachmentTo(LocalPart localPart, final File directory) { + private void downloadAndSaveAttachmentTo(LocalPart localPart, final Uri documentUri) { downloadAttachment(localPart, new Runnable() { @Override public void run() { messageViewFragment.refreshAttachmentThumbnail(attachment); - saveLocalAttachmentTo(directory); + saveLocalAttachmentTo(documentUri); } }); } @@ -116,46 +113,15 @@ public class AttachmentController { new ViewAttachmentAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } - private void saveAttachmentTo(File directory) { - boolean isExternalStorageMounted = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); - if (!isExternalStorageMounted) { - String message = context.getString(R.string.message_view_status_attachment_not_saved); - displayMessageToUser(message); - return; - } - - if (attachment.size > directory.getFreeSpace()) { - String message = context.getString(R.string.message_view_status_no_space); - displayMessageToUser(message); - return; - } - - if (!attachment.isContentAvailable()) { - downloadAndSaveAttachmentTo((LocalPart) attachment.part, directory); - } else { - saveLocalAttachmentTo(directory); - } - } - - private void saveLocalAttachmentTo(File directory) { - new SaveAttachmentAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, directory); - } - - private File saveAttachmentWithUniqueFileName(File directory) throws IOException { - String filename = FileHelper.sanitizeFilename(attachment.displayName); - File file = FileHelper.createUniqueFile(directory, filename); - - writeAttachmentToStorage(file); - - addSavedAttachmentToDownloadsDatabase(file); - - return file; + private void saveLocalAttachmentTo(Uri documentUri) { + new SaveAttachmentAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, documentUri); } - private void writeAttachmentToStorage(File file) throws IOException { - InputStream in = context.getContentResolver().openInputStream(attachment.internalUri); + private void writeAttachment(Uri documentUri) throws IOException { + ContentResolver contentResolver = context.getContentResolver(); + InputStream in = contentResolver.openInputStream(attachment.internalUri); try { - OutputStream out = new FileOutputStream(file); + OutputStream out = contentResolver.openOutputStream(documentUri); try { IOUtils.copy(in, out); out.flush(); @@ -167,17 +133,8 @@ public class AttachmentController { } } - private void addSavedAttachmentToDownloadsDatabase(File file) { - String fileName = file.getName(); - String path = file.getAbsolutePath(); - long fileLength = file.length(); - String mimeType = attachment.mimeType; - - downloadManager.addCompletedDownload(fileName, fileName, true, mimeType, path, fileLength, true); - } - @WorkerThread - private Intent getBestViewIntentAndSaveFile() { + private Intent getBestViewIntent() { Uri intentDataUri; try { intentDataUri = AttachmentTempFileProvider.createTempUriForContentUri(context, attachment.internalUri); @@ -192,53 +149,25 @@ public class AttachmentController { IntentAndResolvedActivitiesCount resolvedIntentInfo; String mimeType = attachment.mimeType; if (MimeUtility.isDefaultMimeType(mimeType)) { - resolvedIntentInfo = getBestViewIntentForMimeType(intentDataUri, inferredMimeType); + resolvedIntentInfo = getViewIntentForMimeType(intentDataUri, inferredMimeType); } else { - resolvedIntentInfo = getBestViewIntentForMimeType(intentDataUri, mimeType); + resolvedIntentInfo = getViewIntentForMimeType(intentDataUri, mimeType); if (!resolvedIntentInfo.hasResolvedActivities() && !inferredMimeType.equals(mimeType)) { - resolvedIntentInfo = getBestViewIntentForMimeType(intentDataUri, inferredMimeType); + resolvedIntentInfo = getViewIntentForMimeType(intentDataUri, inferredMimeType); } } if (!resolvedIntentInfo.hasResolvedActivities()) { - resolvedIntentInfo = getBestViewIntentForMimeType( - intentDataUri, MimeUtility.DEFAULT_ATTACHMENT_MIME_TYPE); - } - - Intent viewIntent; - if (resolvedIntentInfo.hasResolvedActivities() && resolvedIntentInfo.containsFileUri()) { - try { - File tempFile = TemporaryAttachmentStore.getFileForWriting(context, displayName); - writeAttachmentToStorage(tempFile); - viewIntent = createViewIntentForFileUri(resolvedIntentInfo.getMimeType(), Uri.fromFile(tempFile)); - } catch (IOException e) { - Timber.e(e, "Error while saving attachment to use file:// URI with ACTION_VIEW Intent"); - viewIntent = createViewIntentForAttachmentProviderUri(intentDataUri, MimeUtility.DEFAULT_ATTACHMENT_MIME_TYPE); - } - } else { - viewIntent = resolvedIntentInfo.getIntent(); + resolvedIntentInfo = getViewIntentForMimeType(intentDataUri, MimeUtility.DEFAULT_ATTACHMENT_MIME_TYPE); } - return viewIntent; + return resolvedIntentInfo.getIntent(); } - private IntentAndResolvedActivitiesCount getBestViewIntentForMimeType(Uri contentUri, String mimeType) { + private IntentAndResolvedActivitiesCount getViewIntentForMimeType(Uri contentUri, String mimeType) { Intent contentUriIntent = createViewIntentForAttachmentProviderUri(contentUri, mimeType); int contentUriActivitiesCount = getResolvedIntentActivitiesCount(contentUriIntent); - if (contentUriActivitiesCount > 0) { - return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); - } - - File tempFile = TemporaryAttachmentStore.getFile(context, attachment.displayName); - Uri tempFileUri = Uri.fromFile(tempFile); - Intent fileUriIntent = createViewIntentForFileUri(mimeType, tempFileUri); - int fileUriActivitiesCount = getResolvedIntentActivitiesCount(fileUriIntent); - - if (fileUriActivitiesCount > 0) { - return new IntentAndResolvedActivitiesCount(fileUriIntent, fileUriActivitiesCount); - } - return new IntentAndResolvedActivitiesCount(contentUriIntent, contentUriActivitiesCount); } @@ -318,7 +247,7 @@ public class AttachmentController { @Override protected Intent doInBackground(Void... params) { - return getBestViewIntentAndSaveFile(); + return getBestViewIntent(); } @Override @@ -339,7 +268,7 @@ public class AttachmentController { } } - private class SaveAttachmentAsyncTask extends AsyncTask { + private class SaveAttachmentAsyncTask extends AsyncTask { @Override protected void onPreExecute() { @@ -347,20 +276,21 @@ public class AttachmentController { } @Override - protected File doInBackground(File... params) { + protected Boolean doInBackground(Uri... params) { try { - File directory = params[0]; - return saveAttachmentWithUniqueFileName(directory); + Uri documentUri = params[0]; + writeAttachment(documentUri); + return true; } catch (IOException e) { Timber.e(e, "Error saving attachment"); - return null; + return false; } } @Override - protected void onPostExecute(File file) { + protected void onPostExecute(Boolean success) { messageViewFragment.enableAttachmentButtons(attachment); - if (file == null) { + if (!success) { displayAttachmentNotSavedMessage(); } } diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentView.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentView.java similarity index 83% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentView.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentView.java index 3bde82e7fb1dcdb37757d13c4b360ff19923b5f2..77790a20ba3af85ae103eaf0841e294fd498fd47 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/AttachmentView.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import android.content.Context; @@ -12,13 +12,13 @@ import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.helper.SizeFormatter; -import com.fsck.k9.mailstore.AttachmentViewInfo; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.helper.SizeFormatter; +import foundation.e.mail.mailstore.AttachmentViewInfo; -public class AttachmentView extends FrameLayout implements OnClickListener, OnLongClickListener { +public class AttachmentView extends FrameLayout implements OnClickListener { private AttachmentViewInfo attachment; private AttachmentViewCallback callback; @@ -69,7 +69,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo viewButton.setOnClickListener(this); downloadButton.setOnClickListener(this); - downloadButton.setOnLongClickListener(this); TextView attachmentName = (TextView) findViewById(R.id.attachment_name); attachmentName.setText(attachment.displayName); @@ -103,16 +102,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo } } - @Override - public boolean onLongClick(View view) { - if (view.getId() == R.id.download) { - onSaveButtonLongClick(); - return true; - } - - return false; - } - private void onViewButtonClick() { callback.onViewAttachment(attachment); } @@ -121,10 +110,6 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo callback.onSaveAttachment(attachment); } - private void onSaveButtonLongClick() { - callback.onSaveAttachmentToUserProvidedDirectory(attachment); - } - public void setCallback(AttachmentViewCallback callback) { this.callback = callback; } @@ -133,7 +118,7 @@ public class AttachmentView extends FrameLayout implements OnClickListener, OnLo ImageView thumbnailView = (ImageView) findViewById(R.id.attachment_icon); Glide.with(getContext()) .load(attachment.internalUri) - .placeholder(R.drawable.attached_image_placeholder) + .placeholder(R.drawable.ic_file_light) .centerCrop() .into(thumbnailView); } diff --git a/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentViewCallback.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentViewCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..e839ca343165e1b0d73e75186562235ef465fbdc --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/AttachmentViewCallback.java @@ -0,0 +1,10 @@ +package foundation.e.mail.ui.messageview; + + +import foundation.e.mail.mailstore.AttachmentViewInfo; + + +interface AttachmentViewCallback { + void onViewAttachment(AttachmentViewInfo attachment); + void onSaveAttachment(AttachmentViewInfo attachment); +} diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/CryptoInfoDialog.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/CryptoInfoDialog.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/CryptoInfoDialog.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/CryptoInfoDialog.java index 3f6ef2842ab3ca5e20e4d1eb38e397b4544c45ad..9492c4e40fe794f219326f133f5d2f47eca1eebc 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/CryptoInfoDialog.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/CryptoInfoDialog.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import android.annotation.SuppressLint; @@ -19,9 +19,9 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import com.fsck.k9.R; -import com.fsck.k9.view.MessageCryptoDisplayStatus; -import com.fsck.k9.view.ThemeUtils; +import foundation.e.mail.R; +import foundation.e.mail.view.MessageCryptoDisplayStatus; +import foundation.e.mail.view.ThemeUtils; public class CryptoInfoDialog extends DialogFragment { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/DownloadImageTask.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/DownloadImageTask.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/DownloadImageTask.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/DownloadImageTask.java index a28fe378088def41d1967d75092f4b99bf76dc0f..f6dcf4e3f5937d16614f1f8bd7c915915e29abbf 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/DownloadImageTask.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/DownloadImageTask.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import java.io.File; @@ -16,12 +16,12 @@ import android.os.AsyncTask; import timber.log.Timber; import android.widget.Toast; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.helper.FileHelper; -import com.fsck.k9.helper.UrlEncodingHelper; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.provider.AttachmentProvider.AttachmentProviderColumns; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.helper.FileHelper; +import foundation.e.mail.helper.UrlEncodingHelper; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.provider.AttachmentProvider.AttachmentProviderColumns; import org.apache.commons.io.IOUtils; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/LockedAttachmentView.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/LockedAttachmentView.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/LockedAttachmentView.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/LockedAttachmentView.java index 10d05cca0e460dd7d953d4ce1eebd06033bb2b96..20e8769fc061e3f1b748195c8cb4baf86b92ef66 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/LockedAttachmentView.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/LockedAttachmentView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import android.content.Context; @@ -7,9 +7,9 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewStub; -import com.fsck.k9.R; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.view.ToolableViewAnimator; +import foundation.e.mail.R; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.view.ToolableViewAnimator; public class LockedAttachmentView extends ToolableViewAnimator implements OnClickListener { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageContainerView.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageContainerView.java index 0738b97b88ba3dc41227e293760915860a653a65..3e914b23567b296cbd6a87361df0fe80724569df 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageContainerView.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageContainerView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import java.util.HashMap; @@ -25,18 +25,18 @@ import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.R; -import com.fsck.k9.helper.ClipboardManager; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.message.html.HtmlConverter; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mailstore.AttachmentResolver; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.view.MessageHeader.OnLayoutChangedListener; -import com.fsck.k9.view.MessageWebView; -import com.fsck.k9.view.MessageWebView.OnPageFinishedListener; +import foundation.e.mail.R; +import foundation.e.mail.helper.ClipboardManager; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.message.html.HtmlConverter; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mailstore.AttachmentResolver; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.view.MessageHeader.OnLayoutChangedListener; +import foundation.e.mail.view.MessageWebView; +import foundation.e.mail.view.MessageWebView.OnPageFinishedListener; public class MessageContainerView extends LinearLayout implements OnLayoutChangedListener, OnCreateContextMenuListener { diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageCryptoPresenter.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageCryptoPresenter.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageCryptoPresenter.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageCryptoPresenter.java index 9adaadc32cba8d074b0c405c0fc5d392bad8ea32..77091274d7143d6fd3bc2ea633b6d202622eb7c7 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageCryptoPresenter.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageCryptoPresenter.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import android.app.Activity; @@ -12,11 +12,11 @@ import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.Nullable; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.mailstore.CryptoResultAnnotation; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.view.MessageCryptoDisplayStatus; +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.mailstore.CryptoResultAnnotation; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.view.MessageCryptoDisplayStatus; import timber.log.Timber; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageTopView.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageTopView.java index 514b3804556a8a68883e3770cfe63d45434ca857..5e6759dc99f03fa5da36da2061fa40dd409ddd1b 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageTopView.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageTopView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; import android.animation.Animator; @@ -18,18 +18,18 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; -import com.fsck.k9.Account; -import com.fsck.k9.Account.ShowPictures; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.ui.messageview.MessageContainerView.OnRenderingFinishedListener; -import com.fsck.k9.view.MessageHeader; -import com.fsck.k9.view.ThemeUtils; -import com.fsck.k9.view.ToolableViewAnimator; +import foundation.e.mail.Account; +import foundation.e.mail.Account.ShowPictures; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.ui.messageview.MessageContainerView.OnRenderingFinishedListener; +import foundation.e.mail.view.MessageHeader; +import foundation.e.mail.view.ThemeUtils; +import foundation.e.mail.view.ToolableViewAnimator; import org.openintents.openpgp.OpenPgpError; diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageViewFragment.java similarity index 91% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageViewFragment.java index da52ab50789f315ce43c13e0b4e12ddc0f4633bc..8fd08bdd0245e660fa6039900b09536879b22ba9 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/MessageViewFragment.java @@ -1,19 +1,16 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; -import java.util.Collections; -import java.util.Locale; - import android.app.Activity; import android.app.DialogFragment; import android.app.DownloadManager; import android.app.Fragment; import android.app.FragmentManager; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.IntentSender.SendIntentException; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Parcelable; @@ -28,29 +25,30 @@ import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.K9; -import com.fsck.k9.Preferences; -import com.fsck.k9.R; -import com.fsck.k9.activity.ChooseFolder; -import com.fsck.k9.activity.MessageLoaderHelper; -import com.fsck.k9.activity.MessageLoaderHelper.MessageLoaderCallbacks; -import com.fsck.k9.activity.MessageReference; -import com.fsck.k9.activity.setup.OpenPgpAppSelectDialog; -import com.fsck.k9.controller.MessagingController; -import com.fsck.k9.fragment.AttachmentDownloadDialogFragment; -import com.fsck.k9.fragment.ConfirmationDialogFragment; -import com.fsck.k9.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; -import com.fsck.k9.helper.FileBrowserHelper; -import com.fsck.k9.helper.FileBrowserHelper.FileBrowserFailOverCallback; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mailstore.AttachmentViewInfo; -import com.fsck.k9.mailstore.LocalMessage; -import com.fsck.k9.mailstore.MessageViewInfo; -import com.fsck.k9.ui.messageview.CryptoInfoDialog.OnClickShowCryptoKeyListener; -import com.fsck.k9.ui.messageview.MessageCryptoPresenter.MessageCryptoMvpView; -import com.fsck.k9.view.MessageCryptoDisplayStatus; -import com.fsck.k9.view.MessageHeader; +import java.util.Collections; +import java.util.Locale; + +import foundation.e.mail.Account; +import foundation.e.mail.K9; +import foundation.e.mail.Preferences; +import foundation.e.mail.R; +import foundation.e.mail.activity.ChooseFolder; +import foundation.e.mail.activity.MessageLoaderHelper; +import foundation.e.mail.activity.MessageLoaderHelper.MessageLoaderCallbacks; +import foundation.e.mail.activity.MessageReference; +import foundation.e.mail.activity.setup.OpenPgpAppSelectDialog; +import foundation.e.mail.controller.MessagingController; +import foundation.e.mail.fragment.AttachmentDownloadDialogFragment; +import foundation.e.mail.fragment.ConfirmationDialogFragment; +import foundation.e.mail.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mailstore.AttachmentViewInfo; +import foundation.e.mail.mailstore.LocalMessage; +import foundation.e.mail.mailstore.MessageViewInfo; +import foundation.e.mail.ui.messageview.CryptoInfoDialog.OnClickShowCryptoKeyListener; +import foundation.e.mail.ui.messageview.MessageCryptoPresenter.MessageCryptoMvpView; +import foundation.e.mail.view.MessageCryptoDisplayStatus; +import foundation.e.mail.view.MessageHeader; import timber.log.Timber; @@ -61,7 +59,8 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF private static final int ACTIVITY_CHOOSE_FOLDER_MOVE = 1; private static final int ACTIVITY_CHOOSE_FOLDER_COPY = 2; - private static final int ACTIVITY_CHOOSE_DIRECTORY = 3; + private static final int REQUEST_CODE_CREATE_DOCUMENT = 3; + public static final int REQUEST_MASK_LOADER_HELPER = (1 << 8); public static final int REQUEST_MASK_CRYPTO_PRESENTER = (1 << 9); @@ -432,16 +431,9 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF // launched through the MessageList activity, and delivered back via onPendingIntentResult() switch (requestCode) { - case ACTIVITY_CHOOSE_DIRECTORY: { - if (data != null) { - // obtain the filename - Uri fileUri = data.getData(); - if (fileUri != null) { - String filePath = fileUri.getPath(); - if (filePath != null) { - getAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(filePath); - } - } + case REQUEST_CODE_CREATE_DOCUMENT: { + if (data != null && data.getData() != null) { + getAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(data.getData()); } break; } @@ -827,29 +819,22 @@ public class MessageViewFragment extends Fragment implements ConfirmationDialogF } @Override - public void onSaveAttachment(AttachmentViewInfo attachment) { + public void onSaveAttachment(final AttachmentViewInfo attachment) { currentAttachmentViewInfo = attachment; - getAttachmentController(attachment).saveAttachment(); - } - @Override - public void onSaveAttachmentToUserProvidedDirectory(final AttachmentViewInfo attachment) { - currentAttachmentViewInfo = attachment; - FileBrowserHelper.getInstance().showFileBrowserActivity(MessageViewFragment.this, null, - ACTIVITY_CHOOSE_DIRECTORY, new FileBrowserFailOverCallback() { - @Override - public void onPathEntered(String path) { - getAttachmentController(attachment).saveAttachmentTo(path); - } + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); + intent.setType(attachment.mimeType); + intent.putExtra(Intent.EXTRA_TITLE, attachment.displayName); + intent.addCategory(Intent.CATEGORY_OPENABLE); - @Override - public void onCancel() { - // Do nothing - } - }); + try { + startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT); + } catch (ActivityNotFoundException e) { + Toast.makeText(mContext, R.string.error_activity_not_found, Toast.LENGTH_LONG).show(); + } } private AttachmentController getAttachmentController(AttachmentViewInfo attachment) { - return new AttachmentController(mController, downloadManager, this, attachment); + return new AttachmentController(mController, this, attachment); } } diff --git a/k9mail/src/main/java/com/fsck/k9/ui/messageview/OnCryptoClickListener.java b/k9mail/src/main/java/foundation/e/mail/ui/messageview/OnCryptoClickListener.java similarity index 62% rename from k9mail/src/main/java/com/fsck/k9/ui/messageview/OnCryptoClickListener.java rename to k9mail/src/main/java/foundation/e/mail/ui/messageview/OnCryptoClickListener.java index 7df9d45e787a7026caa119fad13b038898e620d0..b2532515f6df33e2a68b2164ceca9bb271028264 100644 --- a/k9mail/src/main/java/com/fsck/k9/ui/messageview/OnCryptoClickListener.java +++ b/k9mail/src/main/java/foundation/e/mail/ui/messageview/OnCryptoClickListener.java @@ -1,4 +1,4 @@ -package com.fsck.k9.ui.messageview; +package foundation.e.mail.ui.messageview; public interface OnCryptoClickListener { diff --git a/k9mail/src/main/java/com/fsck/k9/view/ClientCertificateSpinner.java b/k9mail/src/main/java/foundation/e/mail/view/ClientCertificateSpinner.java similarity index 86% rename from k9mail/src/main/java/com/fsck/k9/view/ClientCertificateSpinner.java rename to k9mail/src/main/java/foundation/e/mail/view/ClientCertificateSpinner.java index 9b17b4fec8660c4e106d27d0a474e72f34d389fe..db27a55226f60063bf7936d6e2dadd3e5fde6797 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/ClientCertificateSpinner.java +++ b/k9mail/src/main/java/foundation/e/mail/view/ClientCertificateSpinner.java @@ -1,14 +1,17 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; -import com.fsck.k9.R; +import foundation.e.mail.R; import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.util.AttributeSet; import timber.log.Timber; + +import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; @@ -37,6 +40,8 @@ public class ClientCertificateSpinner extends LinearLayout { if (context instanceof Activity) { mActivity = (Activity) context; + } else if (context instanceof ContextThemeWrapper) { + mActivity = getActivity(); } else { Timber.e("ClientCertificateSpinner init failed! Please inflate with Activity!"); } @@ -63,6 +68,17 @@ public class ClientCertificateSpinner extends LinearLayout { }); } + public Activity getActivity() { + Context context = getContext(); + while (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity)context; + } + context = ((ContextWrapper)context).getBaseContext(); + } + return null; + } + public void setAlias(String alias) { // Note: KeyChainAliasCallback gives back "" on cancel if (alias != null && alias.equals("")) { diff --git a/k9mail/src/main/java/com/fsck/k9/view/ColorChip.java b/k9mail/src/main/java/foundation/e/mail/view/ColorChip.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/view/ColorChip.java rename to k9mail/src/main/java/foundation/e/mail/view/ColorChip.java index a20b8ff50b9dbc44f97d804f751ba7e8f4ff9730..95c9c298c5dd63c07e34743ea54dc6581dba5aba 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/ColorChip.java +++ b/k9mail/src/main/java/foundation/e/mail/view/ColorChip.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.graphics.Paint; diff --git a/k9mail/src/main/java/com/fsck/k9/view/CryptoModeSelector.java b/k9mail/src/main/java/foundation/e/mail/view/CryptoModeSelector.java similarity index 92% rename from k9mail/src/main/java/com/fsck/k9/view/CryptoModeSelector.java rename to k9mail/src/main/java/foundation/e/mail/view/CryptoModeSelector.java index b6fd473c38f712946acb96966c57edf1b0aaa2c2..9ac949ff61a485a4d63ab408d88da36e7cbed0df 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/CryptoModeSelector.java +++ b/k9mail/src/main/java/foundation/e/mail/view/CryptoModeSelector.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; public interface CryptoModeSelector { diff --git a/k9mail/src/main/java/com/fsck/k9/view/FoldableLinearLayout.java b/k9mail/src/main/java/foundation/e/mail/view/FoldableLinearLayout.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/view/FoldableLinearLayout.java rename to k9mail/src/main/java/foundation/e/mail/view/FoldableLinearLayout.java index 12029141922f9551df89d39b6557031bc9503e92..fd634ad39d0bc4ff01506f1f5a6cc2e86bd02b9a 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/FoldableLinearLayout.java +++ b/k9mail/src/main/java/foundation/e/mail/view/FoldableLinearLayout.java @@ -1,6 +1,6 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; -import com.fsck.k9.R; +import foundation.e.mail.R; import android.content.Context; import android.content.res.Resources.Theme; @@ -21,12 +21,12 @@ import android.widget.TextView; * Class representing a LinearLayout that can fold and hide it's content when * pressed To use just add the following to your xml layout *

    {@code
    - *
      *    
    - *}
    + *}
      * 
    */ public class FoldableLinearLayout extends LinearLayout { diff --git a/k9mail/src/main/java/com/fsck/k9/view/HighlightDialogFragment.java b/k9mail/src/main/java/foundation/e/mail/view/HighlightDialogFragment.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/view/HighlightDialogFragment.java rename to k9mail/src/main/java/foundation/e/mail/view/HighlightDialogFragment.java index c09789524c5f23565238236f8c9fceb1900009ee..a013886f023db5227aaf4bf51333c2d8d045531d 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/HighlightDialogFragment.java +++ b/k9mail/src/main/java/foundation/e/mail/view/HighlightDialogFragment.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.app.Activity; @@ -9,7 +9,7 @@ import android.content.DialogInterface; import android.view.View; import android.view.inputmethod.InputMethodManager; -import com.fsck.k9.R; +import foundation.e.mail.R; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.ShowcaseView.Builder; import com.github.amlcurran.showcaseview.targets.ViewTarget; diff --git a/k9mail/src/main/java/com/fsck/k9/view/K9WebViewClient.java b/k9mail/src/main/java/foundation/e/mail/view/K9WebViewClient.java similarity index 97% rename from k9mail/src/main/java/com/fsck/k9/view/K9WebViewClient.java rename to k9mail/src/main/java/foundation/e/mail/view/K9WebViewClient.java index a58bf2070c9cf3c737b826c64a2d1f3740c52d96..150920dc54fc7bcdfcfdbfcf570deace1ac6b2fc 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/K9WebViewClient.java +++ b/k9mail/src/main/java/foundation/e/mail/view/K9WebViewClient.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import java.io.InputStream; @@ -22,8 +22,8 @@ import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; -import com.fsck.k9.mailstore.AttachmentResolver; -import com.fsck.k9.view.MessageWebView.OnPageFinishedListener; +import foundation.e.mail.mailstore.AttachmentResolver; +import foundation.e.mail.view.MessageWebView.OnPageFinishedListener; /** diff --git a/k9mail/src/main/java/com/fsck/k9/view/LinearViewAnimator.java b/k9mail/src/main/java/foundation/e/mail/view/LinearViewAnimator.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/view/LinearViewAnimator.java rename to k9mail/src/main/java/foundation/e/mail/view/LinearViewAnimator.java index 76695e298f7b121a8aa2b2ad29be65682ef9d6da..a72ca3bc7f98086bc0d13099672ee70fe0643114 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/LinearViewAnimator.java +++ b/k9mail/src/main/java/foundation/e/mail/view/LinearViewAnimator.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; @@ -8,7 +8,7 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ViewAnimator; -import com.fsck.k9.R; +import foundation.e.mail.R; /** This view extends the common ViewAnimator, allowing different sets of animations diff --git a/k9mail/src/main/java/com/fsck/k9/view/MessageCryptoDisplayStatus.java b/k9mail/src/main/java/foundation/e/mail/view/MessageCryptoDisplayStatus.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/view/MessageCryptoDisplayStatus.java rename to k9mail/src/main/java/foundation/e/mail/view/MessageCryptoDisplayStatus.java index 9c8aa92ed5d3babafc20a7f343281f4cc0cb9ab4..017aa05b19a628a791386e2621364dc566725969 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/MessageCryptoDisplayStatus.java +++ b/k9mail/src/main/java/foundation/e/mail/view/MessageCryptoDisplayStatus.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.support.annotation.AttrRes; @@ -6,8 +6,8 @@ import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.StringRes; -import com.fsck.k9.R; -import com.fsck.k9.mailstore.CryptoResultAnnotation; +import foundation.e.mail.R; +import foundation.e.mail.mailstore.CryptoResultAnnotation; import org.openintents.openpgp.OpenPgpDecryptionResult; import org.openintents.openpgp.OpenPgpSignatureResult; diff --git a/k9mail/src/main/java/com/fsck/k9/view/MessageCryptoStatusView.java b/k9mail/src/main/java/foundation/e/mail/view/MessageCryptoStatusView.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/view/MessageCryptoStatusView.java rename to k9mail/src/main/java/foundation/e/mail/view/MessageCryptoStatusView.java index b70929d6619aa6b72501c5c897b4365fc5cf65d6..630e070ec2727f0697d0f247517301a6cb074870 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/MessageCryptoStatusView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/MessageCryptoStatusView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; @@ -7,7 +7,7 @@ import android.util.AttributeSet; import android.widget.FrameLayout; import android.widget.ImageView; -import com.fsck.k9.R; +import foundation.e.mail.R; public class MessageCryptoStatusView extends FrameLayout { diff --git a/k9mail/src/main/java/com/fsck/k9/view/MessageHeader.java b/k9mail/src/main/java/foundation/e/mail/view/MessageHeader.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/view/MessageHeader.java rename to k9mail/src/main/java/foundation/e/mail/view/MessageHeader.java index aec6418e59e691d5d5115b01e4faa15b0f595bd8..a068bc3897bd3ac30608fa401fa0576c53faa760 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/MessageHeader.java +++ b/k9mail/src/main/java/foundation/e/mail/view/MessageHeader.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import java.util.Arrays; @@ -24,26 +24,28 @@ import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.widget.CheckBox; import android.widget.LinearLayout; +import android.widget.QuickContactBadge; import android.widget.TextView; import android.widget.Toast; -import com.fsck.k9.Account; -import com.fsck.k9.FontSizes; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.misc.ContactPictureLoader; -import com.fsck.k9.helper.ClipboardManager; -import com.fsck.k9.helper.ContactPicture; -import com.fsck.k9.helper.Contacts; -import com.fsck.k9.helper.MessageHelper; -import com.fsck.k9.helper.Utility; -import com.fsck.k9.mail.Address; -import com.fsck.k9.mail.Flag; -import com.fsck.k9.mail.Message; -import com.fsck.k9.mail.MessagingException; -import com.fsck.k9.mail.internet.MimeUtility; -import com.fsck.k9.ui.messageview.OnCryptoClickListener; -import com.fsck.k9.ui.ContactBadge; +import foundation.e.mail.Account; +import foundation.e.mail.FontSizes; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.RoundedQuickContactBadge; +import foundation.e.mail.activity.misc.ContactPictureLoader; +import foundation.e.mail.helper.ClipboardManager; +import foundation.e.mail.helper.ContactPicture; +import foundation.e.mail.helper.Contacts; +import foundation.e.mail.helper.MessageHelper; +import foundation.e.mail.helper.Utility; +import foundation.e.mail.mail.Address; +import foundation.e.mail.mail.Flag; +import foundation.e.mail.mail.Message; +import foundation.e.mail.mail.MessagingException; +import foundation.e.mail.mail.internet.MimeUtility; +import foundation.e.mail.ui.messageview.OnCryptoClickListener; +import foundation.e.mail.ui.ContactBadge; public class MessageHeader extends LinearLayout implements OnClickListener, OnLongClickListener { @@ -60,7 +62,6 @@ public class MessageHeader extends LinearLayout implements OnClickListener, OnLo private TextView mSubjectView; private MessageCryptoStatusView mCryptoStatusIcon; - private View mChip; private CheckBox mFlagged; private int defaultSubjectColor; private TextView mAdditionalHeadersView; @@ -74,7 +75,7 @@ public class MessageHeader extends LinearLayout implements OnClickListener, OnLo private MessageHelper mMessageHelper; private ContactPictureLoader mContactsPictureLoader; - private ContactBadge mContactBadge; + private RoundedQuickContactBadge mContactBadge; private OnLayoutChangedListener mOnLayoutChangedListener; private OnCryptoClickListener onCryptoClickListener; @@ -114,11 +115,10 @@ public class MessageHeader extends LinearLayout implements OnClickListener, OnLo mBccView = (TextView) findViewById(R.id.bcc); mBccLabel = (TextView) findViewById(R.id.bcc_label); - mContactBadge = (ContactBadge) findViewById(R.id.contact_badge); + mContactBadge = (RoundedQuickContactBadge) findViewById(R.id.contact_badge); mSubjectView = (TextView) findViewById(R.id.subject); mAdditionalHeadersView = (TextView) findViewById(R.id.additional_headers_view); - mChip = findViewById(R.id.chip); mDateView = (TextView) findViewById(R.id.date); mFlagged = (CheckBox) findViewById(R.id.flagged); @@ -351,8 +351,6 @@ public class MessageHeader extends LinearLayout implements OnClickListener, OnLo mForwardedIcon.setVisibility(message.isSet(Flag.FORWARDED) ? View.VISIBLE : View.GONE); mFlagged.setChecked(message.isSet(Flag.FLAGGED)); - mChip.setBackgroundColor(mAccount.getChipColor()); - setVisibility(View.VISIBLE); if (mSavedState != null) { diff --git a/k9mail/src/main/java/com/fsck/k9/view/MessageTitleView.java b/k9mail/src/main/java/foundation/e/mail/view/MessageTitleView.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/view/MessageTitleView.java rename to k9mail/src/main/java/foundation/e/mail/view/MessageTitleView.java index af086ad03d9cad17af7b41dfdeb867617d7a1f38..2d58c6bc383df1299b4cfe664f194394fa273bc3 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/MessageTitleView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/MessageTitleView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; import android.graphics.Canvas; @@ -6,7 +6,7 @@ import android.util.AttributeSet; import android.widget.TextView; /** - * This {@link TextView} is used in the custom view of the {@link com.fsck.k9.activity.MessageList} + * This {@link TextView} is used in the custom view of the {@link foundation.e.mail.activity.MessageList} * action bar. * It will hide the subject line in {@link MessageHeader} if the subject fits completely into the * action bar's title view. diff --git a/k9mail/src/main/java/com/fsck/k9/view/MessageWebView.java b/k9mail/src/main/java/foundation/e/mail/view/MessageWebView.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/view/MessageWebView.java rename to k9mail/src/main/java/foundation/e/mail/view/MessageWebView.java index 16d451f76ca972280aa1d552a66976966f40b25c..ef665b8c2de8d6144ef923f23bc16099db35337e 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/MessageWebView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/MessageWebView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; @@ -14,10 +14,10 @@ import android.webkit.WebSettings.RenderPriority; import android.webkit.WebView; import android.widget.Toast; -import com.fsck.k9.K9; -import com.fsck.k9.K9.Theme; -import com.fsck.k9.R; -import com.fsck.k9.mailstore.AttachmentResolver; +import foundation.e.mail.K9; +import foundation.e.mail.K9.Theme; +import foundation.e.mail.R; +import foundation.e.mail.mailstore.AttachmentResolver; public class MessageWebView extends RigidWebView { diff --git a/k9mail/src/main/java/com/fsck/k9/view/NonLockingScrollView.java b/k9mail/src/main/java/foundation/e/mail/view/NonLockingScrollView.java similarity index 99% rename from k9mail/src/main/java/com/fsck/k9/view/NonLockingScrollView.java rename to k9mail/src/main/java/foundation/e/mail/view/NonLockingScrollView.java index c97848275e6e288e56033762e080871f120011ec..209f9560f4788bd267c81eaf1207edc51b8b71fb 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/NonLockingScrollView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/NonLockingScrollView.java @@ -15,7 +15,7 @@ */ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; import android.graphics.Rect; diff --git a/k9mail/src/main/java/com/fsck/k9/view/RecipientSelectView.java b/k9mail/src/main/java/foundation/e/mail/view/RecipientSelectView.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/view/RecipientSelectView.java rename to k9mail/src/main/java/foundation/e/mail/view/RecipientSelectView.java index 99c15db020daa40bd267570d6ab2f0fb4760420d..27c37c78efacf32e058fd112cdbc8d7b0ee74c0a 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/RecipientSelectView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/RecipientSelectView.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import java.io.IOException; @@ -32,14 +32,14 @@ import android.widget.ListPopupWindow; import android.widget.ListView; import android.widget.TextView; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.activity.AlternateRecipientAdapter; -import com.fsck.k9.activity.AlternateRecipientAdapter.AlternateRecipientListener; -import com.fsck.k9.activity.compose.RecipientAdapter; -import com.fsck.k9.activity.compose.RecipientLoader; -import com.fsck.k9.mail.Address; -import com.fsck.k9.view.RecipientSelectView.Recipient; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.activity.AlternateRecipientAdapter; +import foundation.e.mail.activity.AlternateRecipientAdapter.AlternateRecipientListener; +import foundation.e.mail.activity.compose.RecipientAdapter; +import foundation.e.mail.activity.compose.RecipientLoader; +import foundation.e.mail.mail.Address; +import foundation.e.mail.view.RecipientSelectView.Recipient; import com.tokenautocomplete.TokenCompleteTextView; import org.apache.james.mime4j.util.CharsetUtil; import timber.log.Timber; @@ -207,6 +207,20 @@ public class RecipientSelectView extends TokenCompleteTextView implem } } + /** + * TokenCompleteTextView removes composing strings, and etc, but leaves internal composition + * predictions partially constructed. Changing either/or the Selection or Candidate start/end + * positions, forces the IMM to reset cleaner. + */ + @Override + protected void replaceText(CharSequence text) { + super.replaceText(text); + + InputMethodManager imm = (InputMethodManager) getContext().getSystemService( + Context.INPUT_METHOD_SERVICE); + imm.updateSelection(this, getSelectionStart(), getSelectionEnd(), -1, -1); + } + private void displayKeyboard() { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm == null) { diff --git a/k9mail/src/main/java/com/fsck/k9/view/RigidWebView.java b/k9mail/src/main/java/foundation/e/mail/view/RigidWebView.java similarity index 96% rename from k9mail/src/main/java/com/fsck/k9/view/RigidWebView.java rename to k9mail/src/main/java/foundation/e/mail/view/RigidWebView.java index 4096eb7206803fd71bb708f3f93a2138cd7b17fc..45b4a55c68ca389b9e129b061b4dccfad020858a 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/RigidWebView.java +++ b/k9mail/src/main/java/foundation/e/mail/view/RigidWebView.java @@ -15,7 +15,7 @@ */ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; import android.os.Build; @@ -23,9 +23,9 @@ import android.util.AttributeSet; import timber.log.Timber; import android.webkit.WebView; -import com.fsck.k9.Clock; -import com.fsck.k9.Throttle; -import com.fsck.k9.helper.Utility; +import foundation.e.mail.Clock; +import foundation.e.mail.Throttle; +import foundation.e.mail.helper.Utility; /** * A custom WebView that is robust to rapid resize events in sequence. diff --git a/k9mail/src/main/java/foundation/e/mail/view/TextInputLayoutWithHelperText.java b/k9mail/src/main/java/foundation/e/mail/view/TextInputLayoutWithHelperText.java new file mode 100644 index 0000000000000000000000000000000000000000..b0e94263739bed65f29b090d082675340070f0cb --- /dev/null +++ b/k9mail/src/main/java/foundation/e/mail/view/TextInputLayoutWithHelperText.java @@ -0,0 +1,155 @@ +package foundation.e.mail.view; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.support.design.widget.TextInputLayout; +import android.support.v4.view.ViewCompat; +import android.support.v4.view.ViewPropertyAnimatorListenerAdapter; +import android.support.v4.view.animation.FastOutSlowInInterpolator; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Interpolator; +import android.widget.EditText; +import android.widget.TextView; + +import foundation.e.mail.R; + + +/** + * TextInputLayout temporary workaround for helper text showing + */ +@SuppressWarnings("unused") +public class TextInputLayoutWithHelperText extends TextInputLayout { + + static final Interpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new FastOutSlowInInterpolator(); + + private CharSequence mHelperText; + private ColorStateList mHelperTextColor; + private boolean mHelperTextEnabled = false; + private boolean mErrorEnabled = false; + private TextView mHelperView; + private int mHelperTextAppearance = R.style.HelperTextAppearance; + + public TextInputLayoutWithHelperText(Context _context) { + super(_context); + } + + public TextInputLayoutWithHelperText(Context _context, AttributeSet _attrs) { + super(_context, _attrs); + + final TypedArray a = getContext().obtainStyledAttributes( + _attrs, + R.styleable.TextInputLayoutWithHelperText,0,0); + try { + mHelperTextColor = a.getColorStateList(R.styleable.TextInputLayoutWithHelperText_helperTextColor); + mHelperText = a.getText(R.styleable.TextInputLayoutWithHelperText_helperText); + } finally { + a.recycle(); + } + } + + @Override + public void addView(View child, int index, ViewGroup.LayoutParams params) { + super.addView(child, index, params); + if (child instanceof EditText) { + if (!TextUtils.isEmpty(mHelperText)) { + setHelperText(mHelperText); + } + } + } + + public int getHelperTextAppearance() { + return mHelperTextAppearance; + } + + public void setHelperTextAppearance(int _helperTextAppearanceResId) { + mHelperTextAppearance = _helperTextAppearanceResId; + } + + public void setHelperTextColor(ColorStateList _helperTextColor) { + mHelperTextColor = _helperTextColor; + } + + public void setHelperTextEnabled(boolean _enabled) { + if (mHelperTextEnabled == _enabled) return; + if (_enabled && mErrorEnabled) { + setErrorEnabled(false); + } + if (this.mHelperTextEnabled != _enabled) { + if (_enabled) { + this.mHelperView = new TextView(this.getContext()); + this.mHelperView.setTextAppearance(this.getContext(), this.mHelperTextAppearance); + if (mHelperTextColor != null){ + this.mHelperView.setTextColor(mHelperTextColor); + } + this.mHelperView.setVisibility(INVISIBLE); + this.addView(this.mHelperView); + if (this.mHelperView != null) { + ViewCompat.setPaddingRelative( + this.mHelperView, + ViewCompat.getPaddingStart(getEditText()), + 0, ViewCompat.getPaddingEnd(getEditText()), + getEditText().getPaddingBottom()); + } + } else { + this.removeView(this.mHelperView); + this.mHelperView = null; + } + + this.mHelperTextEnabled = _enabled; + } + } + + public void setHelperText(CharSequence _helperText) { + mHelperText = _helperText; + if (!this.mHelperTextEnabled) { + if (TextUtils.isEmpty(mHelperText)) { + return; + } + this.setHelperTextEnabled(true); + } + + if (!TextUtils.isEmpty(mHelperText)) { + this.mHelperView.setText(mHelperText); + this.mHelperView.setVisibility(VISIBLE); + ViewCompat.setAlpha(this.mHelperView, 0.0F); + ViewCompat.animate(this.mHelperView) + .alpha(1.0F).setDuration(200L) + .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) + .setListener(null).start(); + } else if (this.mHelperView.getVisibility() == VISIBLE) { + ViewCompat.animate(this.mHelperView) + .alpha(0.0F).setDuration(200L) + .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) + .setListener(new ViewPropertyAnimatorListenerAdapter() { + public void onAnimationEnd(View view) { + mHelperView.setText(null); + mHelperView.setVisibility(INVISIBLE); + } + }).start(); + } + this.sendAccessibilityEvent(2048); + } + + @Override + public void setErrorEnabled(boolean _enabled) { + if (mErrorEnabled == _enabled) return; + mErrorEnabled = _enabled; + if (_enabled && mHelperTextEnabled) { + setHelperTextEnabled(false); + } + + super.setErrorEnabled(_enabled); + + if (!(_enabled || TextUtils.isEmpty(mHelperText))) { + setHelperText(mHelperText); + } + } + +} + + + diff --git a/k9mail/src/main/java/com/fsck/k9/view/ThemeUtils.java b/k9mail/src/main/java/foundation/e/mail/view/ThemeUtils.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/view/ThemeUtils.java rename to k9mail/src/main/java/foundation/e/mail/view/ThemeUtils.java index b38c8c0ef545dca76d45b4d17a4ddd6057d72bb3..f6f584fedc3a2cdca413c368ed2be0f51e0d5d2b 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/ThemeUtils.java +++ b/k9mail/src/main/java/foundation/e/mail/view/ThemeUtils.java @@ -1,4 +1,4 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; diff --git a/k9mail/src/main/java/com/fsck/k9/view/ToolableViewAnimator.java b/k9mail/src/main/java/foundation/e/mail/view/ToolableViewAnimator.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/view/ToolableViewAnimator.java rename to k9mail/src/main/java/foundation/e/mail/view/ToolableViewAnimator.java index c9c8047772355d8bdb8a004c2d01958a679f3f5a..d9da8aaa86bcbfdbe9b556cfd2aa9cda137670a6 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/ToolableViewAnimator.java +++ b/k9mail/src/main/java/foundation/e/mail/view/ToolableViewAnimator.java @@ -22,7 +22,7 @@ * THE SOFTWARE. */ -package com.fsck.k9.view; +package foundation.e.mail.view; import android.content.Context; @@ -34,7 +34,7 @@ import android.view.ViewGroup; import android.view.animation.Animation; import android.widget.ViewAnimator; -import com.fsck.k9.R; +import foundation.e.mail.R; /** This view is essentially identical to ViewAnimator, but allows specifying the initial view diff --git a/k9mail/src/main/java/com/fsck/k9/view/ViewSwitcher.java b/k9mail/src/main/java/foundation/e/mail/view/ViewSwitcher.java similarity index 98% rename from k9mail/src/main/java/com/fsck/k9/view/ViewSwitcher.java rename to k9mail/src/main/java/foundation/e/mail/view/ViewSwitcher.java index f38beb7f232be90778162cde0fadd424fa45667a..7ba58768f3de8f93004d93666ceac3dd3bf977b6 100644 --- a/k9mail/src/main/java/com/fsck/k9/view/ViewSwitcher.java +++ b/k9mail/src/main/java/foundation/e/mail/view/ViewSwitcher.java @@ -1,6 +1,6 @@ -package com.fsck.k9.view; +package foundation.e.mail.view; -import com.fsck.k9.K9; +import foundation.e.mail.K9; import android.content.Context; import android.util.AttributeSet; diff --git a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListRemoteViewFactory.java b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListRemoteViewFactory.java similarity index 94% rename from k9mail/src/main/java/com/fsck/k9/widget/list/MessageListRemoteViewFactory.java rename to k9mail/src/main/java/foundation/e/mail/widget/list/MessageListRemoteViewFactory.java index 83c745d81af0b732c88c3e9a8ad817f9e32308ae..f24b646721c891d3cd6dca7685743f5d275e095f 100644 --- a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListRemoteViewFactory.java +++ b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListRemoteViewFactory.java @@ -1,4 +1,4 @@ -package com.fsck.k9.widget.list; +package foundation.e.mail.widget.list; import java.util.ArrayList; @@ -18,9 +18,9 @@ import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; -import com.fsck.k9.K9; -import com.fsck.k9.R; -import com.fsck.k9.provider.MessageProvider; +import foundation.e.mail.K9; +import foundation.e.mail.R; +import foundation.e.mail.provider.MessageProvider; public class MessageListRemoteViewFactory implements RemoteViewsService.RemoteViewsFactory { @@ -38,7 +38,6 @@ public class MessageListRemoteViewFactory implements RemoteViewsService.RemoteVi private final Context context; private final Calendar calendar; private final ArrayList mailItems = new ArrayList<>(25); - private boolean senderAboveSubject; private int readTextColor; private int unreadTextColor; @@ -50,7 +49,6 @@ public class MessageListRemoteViewFactory implements RemoteViewsService.RemoteVi @Override public void onCreate() { - senderAboveSubject = K9.messageListSenderAboveSubject(); readTextColor = ContextCompat.getColor(context, R.color.message_list_widget_text_read); unreadTextColor = ContextCompat.getColor(context, R.color.message_list_widget_text_unread); } @@ -110,6 +108,11 @@ public class MessageListRemoteViewFactory implements RemoteViewsService.RemoteVi CharSequence sender = item.unread ? bold(item.sender) : item.sender; CharSequence subject = item.unread ? bold(item.subject) : item.subject; + // TODO Rewrite this code and redo the layouts to always have the sender name above the subject. + // Use a hardcoded value instead of a value from the preference + // since the preference has been removed. + boolean senderAboveSubject = true; + if (senderAboveSubject) { remoteView.setTextViewText(R.id.sender, sender); remoteView.setTextViewText(R.id.mail_subject, subject); diff --git a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetProvider.java b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetProvider.java similarity index 95% rename from k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetProvider.java rename to k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetProvider.java index e135cf05589b64efbadfc4e3877be23327f3f6ff..676563c21911b7a99e44b883540b6217336beb5f 100644 --- a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetProvider.java +++ b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetProvider.java @@ -1,4 +1,4 @@ -package com.fsck.k9.widget.list; +package foundation.e.mail.widget.list; import android.app.PendingIntent; @@ -10,9 +10,9 @@ import android.content.Intent; import android.net.Uri; import android.widget.RemoteViews; -import com.fsck.k9.R; -import com.fsck.k9.activity.MessageCompose; -import com.fsck.k9.activity.MessageList; +import foundation.e.mail.R; +import foundation.e.mail.activity.MessageCompose; +import foundation.e.mail.activity.MessageList; public class MessageListWidgetProvider extends AppWidgetProvider { diff --git a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetService.java b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetService.java similarity index 88% rename from k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetService.java rename to k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetService.java index 980a585c620c27ff614b1aa34084bbedcbcf6bbb..aea51b2de9908d91d4bd1c0c2102513115b9111b 100644 --- a/k9mail/src/main/java/com/fsck/k9/widget/list/MessageListWidgetService.java +++ b/k9mail/src/main/java/foundation/e/mail/widget/list/MessageListWidgetService.java @@ -1,4 +1,4 @@ -package com.fsck.k9.widget.list; +package foundation.e.mail.widget.list; import android.content.Intent; diff --git a/k9mail/src/main/res/drawable-hdpi/action_search_folder_dark.png b/k9mail/src/main/res/drawable-hdpi/action_search_folder_dark.png index 34d2d79123c34c313e5e49fa6e522041f7fb8a2e..4391f742c95d3b034fff89d56a9e0e03de56d9f2 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/action_search_folder_dark.png and b/k9mail/src/main/res/drawable-hdpi/action_search_folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/action_search_folder_light.png b/k9mail/src/main/res/drawable-hdpi/action_search_folder_light.png deleted file mode 100644 index b3b208ae9877e25db2fcebca3533ecc5a0161ed1..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/action_search_folder_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/attached_image_placeholder.png b/k9mail/src/main/res/drawable-hdpi/attached_image_placeholder.png deleted file mode 100644 index bbbd306c1e6946a76d3b6559ffc87cab64b02de2..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/attached_image_placeholder.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/attachment_text_box_dark.9.png b/k9mail/src/main/res/drawable-hdpi/attachment_text_box_dark.9.png deleted file mode 100644 index 516c91ab1b46620833e35d0df2d0aedeb8ce20f4..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/attachment_text_box_dark.9.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/attachment_text_box_light.9.png b/k9mail/src/main/res/drawable-hdpi/attachment_text_box_light.9.png deleted file mode 100644 index 3bfc8a8d943ca2c24cf088646634e7c223e8a260..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/attachment_text_box_light.9.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_dark.png b/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_dark.png index d30eec865012067506cfd581f1c4f9c8184c87c2..e93d87a671ba5d9604f35ab0ae41e968696ac18d 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_dark.png and b/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_light.png b/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_light.png index 351a4f0887600f7610556cd6c569033b161eca80..5e1e0ed24d9a7d3b67388b8b11bb98153b336f26 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_light.png and b/k9mail/src/main/res/drawable-hdpi/btn_check_off_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_dark.png b/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_dark.png index b06f548dcce55c4347fa9588e647d22fe124aac2..db33d42d0d0a07fcfd46ae15eeedf32f4db54332 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_dark.png and b/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_light.png b/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_light.png index 4b4364c92910461df237669173bb510ea6915417..ffc22005d60336d04d1958079f40563a973377ca 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_light.png and b/k9mail/src/main/res/drawable-hdpi/btn_check_on_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_dark.png b/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_dark.png index 06e5b4730bb52db612943b349fccd0c32691f66e..245829f306eb84161aa9c5dba8210ad188605feb 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_dark.png and b/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_light.png b/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_light.png index d362ec1c768246109451da4dfd2e0c9203a9f81f..003798f60c16f92c596ec9bfe9854409f5bf5fcb 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_light.png and b/k9mail/src/main/res/drawable-hdpi/dropdown_ic_arrow_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/folder_dark.png b/k9mail/src/main/res/drawable-hdpi/folder_dark.png index 6f441b41da840fd8bff666f47f3beb5925976e0c..fad320af7efae8e144417e453c46a12b19d8ea4e 100755 Binary files a/k9mail/src/main/res/drawable-hdpi/folder_dark.png and b/k9mail/src/main/res/drawable-hdpi/folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/folder_light.png b/k9mail/src/main/res/drawable-hdpi/folder_light.png index 3db304fa8d16bc1301b616ce21b3ab75680cad7f..b921aad0adfab7d0b7aeca338af85083735a5181 100755 Binary files a/k9mail/src/main/res/drawable-hdpi/folder_light.png and b/k9mail/src/main/res/drawable-hdpi/folder_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_about_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_about_dark.png index 6eaf08aecf51320ff4c77bba1249ca972992b076..e72c579b4412ad97be5dfec2d9b09e5259fa6766 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_about_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_about_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_about_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_about_light.png index 8f39c428ac6cacd0ad4fd9e7ab4252a77ce91a53..0d4570b14882927606fb49a32bc05172772a339a 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_about_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_about_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_dark.png index 0107feef7b693c62ab33c69bf6d6407e460bbf7d..71a2b51b54614d6b76ffff96c3872c9852f82d55 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_light.png index 26941f700994e765d324a0f004b0b0d0f26b1f4e..1a13d078f778020c8afd21dc7f2904b56d941b3e 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bbc_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bbc_light.png index b115bf1acbf478a4914b93e8213314163b181481..92f44757532ce1b040152e019677653a2265985a 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bbc_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bbc_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bcc_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bcc_dark.png index 27d721dac54c3480940c1311828d1df81e5d5103..a274ba9f3b53c13402f6b114787e455965a5c8da 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bcc_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_cc_bcc_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_dark.png index ad8ada6bdfa0d08e96c96ef2e8fc6656efc31f34..048eafd198a0aafb5233018105897a8d0d01c42a 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_add_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_add_light.png index 5741995cbed712bc049ffb199ebb8728cb25919a..17c5042aae85ae340468565741d04e7ac1fcbe13 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_add_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_add_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_archive_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_archive_dark.png index f18e288d25592420ea5f41659f0a2f6173123cbe..7c94eff00531cb853a0553bbd66ed0618867d31f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_archive_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_archive_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_archive_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_archive_light.png deleted file mode 100644 index c38723212e5d420a1e4b38c7dbff9db9c6bc08a6..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_archive_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_dark.png index 094eea589246b46e26d3cf02285f26c1abb33700..495fed7ac6131bce605a6c8ba6fec1ca453d0cf4 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_light.png index cde36e1fa7b8fb99cd7cdb3dc1e18466196750b0..8f037dc79c4d1ff904246e50f8ff13fbceaa76c2 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_cancel_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_compose_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_compose_dark.png index 9d5733a44cd96432408d3fd5f57c2d46a9772f01..ff06a246fa1a8a2a2c74e7ad712bdfcd24ea10bd 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_compose_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_compose_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_compose_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_compose_light.png deleted file mode 100644 index 1a876e8ed62cef0c9258b10ddbb1a1b6bd5c90a6..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_compose_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_copy_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_copy_dark.png index 72c6bc6e213c1f730a0939be123f4f97d9aa0cfb..c6f34939996e52dd85f405d673744b2d1303cc0d 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_copy_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_copy_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_copy_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_copy_light.png index 623b7150486eb0c09c4dd866e672aa94337ce8f9..cb4bc4d4d3ab0108b7345942fe8d61ae8bdc387e 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_copy_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_copy_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_delete_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_delete_dark.png index e770a298e9f8ba85b6898b7b18f924300f9409ae..a08988374e072041c938a05df39a3a856ff3990a 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_delete_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_delete_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_delete_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_delete_light.png deleted file mode 100644 index 09abb199e67174377bbd4174c00e78fb2525c439..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_delete_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_flag_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_flag_dark.png index fc421c70c56344221fc428558be906c6f2c6e6fe..ef359564b601999a782e6ab475043d99fc6d0bbc 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_flag_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_flag_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_flag_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_flag_light.png index eb0a3f7b8ef3fd7008b2deedefb167c852a8cebd..ff1ede864eedb1bfbed1b05e186666d1151541aa 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_flag_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_flag_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_dark.png index 160a2b8fe3fa9f49f086329fb90c54f254f166f3..7bcbff9498f79fbbf0cfec0a3ca67fcd119fb187 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_light.png index cf7e761bad88f18f3085e7570e10b1350342a616..cd6f06c9fb0c0140da0df37bb674bffc9e199607 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_import_export_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_dark.png index e51350ff631e0fc5daacdf7c090eba0483e55fd8..1fe841f0b3760202cab1fe774bae167997872d9f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_light.png deleted file mode 100644 index 003b9b0e4ef19c186aee7d05d79c1c2f49ebfbda..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_read_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_dark.png index 058daeea764c5e57a7ea189748e9eddef644752a..505b1f804c9cd43faf06b2b20de19fde66e16116 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_light.png deleted file mode 100644 index d0fa47b286b077f393ce4c98a182590dd9093e5b..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_mark_as_unread_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_move_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_move_dark.png index b293d11dce729e3a8a376f87d9eefb06ee261482..3b70bcbeb7ba949d20badef75d4d9c36ab484aca 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_move_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_move_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_move_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_move_light.png index a11c32645c6a6eda18e8a9d1f721f8abb0e41923..fa045f1b9976bec2b33f6b9dfb535e598b62670e 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_move_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_move_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_dark.png index 1d66661927ead3ba815862521d2024c9b2bbfb18..e4ed5a83bbe66f891fc1319d4eb7402a4e4cf573 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_light.png index b4a8f955f4c912941adce9a509892baa634ed3f4..45d8b223e30e0c77de76b03b75e520220eabbe0f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_next_message_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_dark.png index 657054d44757211e413bb1c1f323e0a6ebdcb29c..b5dea39b59996bfeefd6e5584c4e6c1fcc4d1132 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_light.png index 49f871ec809921da8b35e4df26aef9fc81be5d69..09f990ee2168ab0e581d6af63bcf64b75ddabec2 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_previous_message_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_dark.png index d0ac1dfda1ecc5488fa5433b0e04d306c5cd446f..b16d06e09417a33984a37260e0b059a1f07fba5b 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_light.png index 2df79d81fa7a10d0ece937975961a6edfad6e6e2..8dd28f0ea45e9c2f13083aaf733181915aa51850 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_refresh_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_dark.png index f266c75347414198d4adc4d512e72f8e1e436aee..24a03fac8a1ba0d9e5f14356a56bce42dcdfa874 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_light.png index 88221375ae116cbe81d1292df4c9f2674a4df5ae..2778007ca05068f13c98591e3b190e7b5e99dd9b 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_remote_search_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_dark.png index 1950ff406cd4d17604db5da8023ca6ca9c130da5..26e4b8debdec62d89e5b0b1f56b46b9d809d8ae0 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_light.png index 173a3b6c319873e0105a5ee74eaffbf2d6ef9ff5..b2111eaf0394edef548da7c82cef30fc90d6887f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_request_read_receipt_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_save_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_save_dark.png index 306d55a9cbb0a02909f6a3b0d910700a5aa9d5b6..ae971fa98147bb3027a71f49462d331250649dc9 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_save_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_save_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_save_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_save_light.png index 07c2817b5a7b3acf6cd1b08c0881c5f35068cb5e..352bc424c4bda9ed7f960281e6786bcffeaa91e4 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_save_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_save_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_search_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_search_dark.png index caa960723ec9a0861adfdbca7867100d9cb98931..b74d89872e9916af2dc07855f053534f20f02baa 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_search_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_search_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_search_light.png deleted file mode 100644 index 32e8d7b31b56daf6dcb332f37c93ee318f4340fe..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_search_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_dark.png index 26a270b33a56e47db2da491a79e73f25c25f9aee..fb50bbea15ef05396b5f2c1d8e523c74c9cb3e25 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_light.png index 7053d7ac76d14f9f287aa0c055dfa44fbf0f7c3e..4de988170120db5b95a632dc14d4483492562340 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_select_all_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_send_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_send_dark.png index 3ec4a6904dd7236c768d9d702af2f518bc86b43f..df595d42efdaed9b85d4dbc0abbe37d386c2a785 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_send_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_send_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_send_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_send_light.png index 073ca61d46b35bb5a7b798849dac63bb640f5d9d..bc90b76364c2e6e50a4e2b5baba2e017e1e9144f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_send_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_send_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_settings_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_settings_dark.png index d57b29053e2154ea744f4f596e5ef9dec0ae1f77..442ae1114259f97823a5812b57a78ba89310c3d6 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_settings_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_settings_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_settings_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_settings_light.png index 4695ffb5617659b4304b85980da554ca662a98f0..3d9bcb41957c3103cc106a8e98e3d7db133a2d75 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_settings_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_settings_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_single_message_options_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_single_message_options_light.png deleted file mode 100644 index ff9dbdda915b42cc44f6a37f066e631e43f07ef5..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_single_message_options_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_sort_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_sort_dark.png index d1ba8064798d7947155e028e1f4c1c9ebb96fe67..a00137afdd0bbd422275037b0a137366b6737dce 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_sort_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_sort_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_sort_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_sort_light.png index 449ac5bf1f07c559a5d12250eae7b8759224a4a1..f9cdc21bc8710d37ea7cd9fd8c81f974ed1165e3 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_sort_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_sort_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_spam_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_spam_dark.png index 26f854e637896b28c34a9ae5a8ca8261d9de2181..aa65350119adc603df1a5a225fa24a64f15c7114 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_spam_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_spam_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_spam_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_spam_light.png index 003e3c9c0a6ccf8847940c933955c7a3622b85fa..8408841e36614d561d4a4aa03582dd6894baad3f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_spam_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_spam_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_dark.png index 88b68557d12ab1d76f172ef1c12300914f1d63be..2d0bbe3b10fd4e2c02557f237e7a956e48a3474f 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_light.png index 23608f041820775f44dcefaec418cb155325320d..dce5cbc1f946a2f33ff3607e8d7c0bff7d690bc3 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_unflag_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_upload_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_action_upload_dark.png index 0faf43b06b308a428b21e5f18f89bad68ad2e16f..bfbbd3728e4f819234c0a909615719fc388f6832 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_upload_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_upload_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_action_upload_light.png b/k9mail/src/main/res/drawable-hdpi/ic_action_upload_light.png index d30ee8a8300f022404e3632e86456ca2e4ba4250..1855fc33becae4165fc43178a075205219ebe788 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_action_upload_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_action_upload_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_attachment_light.png b/k9mail/src/main/res/drawable-hdpi/ic_attachment_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e46005d0419219f91f0cea29fb2675349a191f1e Binary files /dev/null and b/k9mail/src/main/res/drawable-hdpi/ic_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_dark.png index d22a3ea949a96325a65857c4fa7eddb626a7494f..c0309bd15dedfd3809766165f2d4dc4083dc0d9d 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_dark.png and b/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_light.png b/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_light.png index 38b91cc7ce29dac49f4f048c4e7738bde2e41bf1..07846940a03e9e0947d43c5d8b050caa8a343bd0 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_light.png and b/k9mail/src/main/res/drawable-hdpi/ic_button_add_contact_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_chevron_right_dark.png b/k9mail/src/main/res/drawable-hdpi/ic_chevron_right_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ed5a83bbe66f891fc1319d4eb7402a4e4cf573 Binary files /dev/null and b/k9mail/src/main/res/drawable-hdpi/ic_chevron_right_dark.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_circle.xml b/k9mail/src/main/res/drawable-hdpi/ic_circle.xml new file mode 100755 index 0000000000000000000000000000000000000000..2e7e87912b884091a8541fd27ad776bb2c5acb34 --- /dev/null +++ b/k9mail/src/main/res/drawable-hdpi/ic_circle.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/k9mail/src/main/res/drawable-hdpi/ic_email_attachment.png b/k9mail/src/main/res/drawable-hdpi/ic_email_attachment.png index afe1aa2f3b5a065412b0ad3ea7ae2615805d4616..e46005d0419219f91f0cea29fb2675349a191f1e 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_email_attachment.png and b/k9mail/src/main/res/drawable-hdpi/ic_email_attachment.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_email_attachment_small.png b/k9mail/src/main/res/drawable-hdpi/ic_email_attachment_small.png index 4b12869f0f366f34a163ef139b4e67b674f965a6..e46005d0419219f91f0cea29fb2675349a191f1e 100644 Binary files a/k9mail/src/main/res/drawable-hdpi/ic_email_attachment_small.png and b/k9mail/src/main/res/drawable-hdpi/ic_email_attachment_small.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_file_light.png b/k9mail/src/main/res/drawable-hdpi/ic_file_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c0dede51e32a542d2bf830635a2674b2a31d23 Binary files /dev/null and b/k9mail/src/main/res/drawable-hdpi/ic_file_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_forward_light.png b/k9mail/src/main/res/drawable-hdpi/ic_forward_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e8dd8bf13310c1a0a2cd34df598de7c1e4a5c544 Binary files /dev/null and b/k9mail/src/main/res/drawable-hdpi/ic_forward_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/ic_reply_light.png b/k9mail/src/main/res/drawable-hdpi/ic_reply_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2c29d81e4bbee6bfa2ceac0ab8406a851e813afe Binary files /dev/null and b/k9mail/src/main/res/drawable-hdpi/ic_reply_light.png differ diff --git a/k9mail/src/main/res/drawable-hdpi/icon.png b/k9mail/src/main/res/drawable-hdpi/icon.png deleted file mode 100644 index 56efaad953a089edafa7055e083f062f037ab5fc..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-hdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/action_search_folder_dark.png b/k9mail/src/main/res/drawable-mdpi/action_search_folder_dark.png index b192e496c24bee262f4a064252c3dd80a1d14a53..3a512986546987debe82e18f516faabe6a4c9a0a 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/action_search_folder_dark.png and b/k9mail/src/main/res/drawable-mdpi/action_search_folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/action_search_folder_light.png b/k9mail/src/main/res/drawable-mdpi/action_search_folder_light.png deleted file mode 100644 index 2c1add08c269097ac6028b591c8cf4932f3c3a6b..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/action_search_folder_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/attached_image_placeholder.png b/k9mail/src/main/res/drawable-mdpi/attached_image_placeholder.png deleted file mode 100644 index 90acbf7727951236a4e6b5b4230fc02279e8ef51..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/attached_image_placeholder.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/attachment_text_box_dark.9.png b/k9mail/src/main/res/drawable-mdpi/attachment_text_box_dark.9.png deleted file mode 100644 index dec70346485ccf316be4afe83e696a2f3919a941..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/attachment_text_box_dark.9.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/attachment_text_box_light.9.png b/k9mail/src/main/res/drawable-mdpi/attachment_text_box_light.9.png deleted file mode 100644 index e7d4207b82d247dd7212f5bbf7686e0144a6da5b..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/attachment_text_box_light.9.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_dark.png b/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_dark.png index 160649d1d78bb52a99daba058c6b7b70175a02e0..346b36f53d85ddd3576a17ac478fdd70112b2303 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_dark.png and b/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_light.png b/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_light.png index eda15916f87af4f608a505b15cfff8fb158ac233..4626d63ce38ac70756b3a8cc2cd38f4256566abd 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_light.png and b/k9mail/src/main/res/drawable-mdpi/btn_check_off_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_dark.png b/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_dark.png index 30e2a1f40244194b8bf7729c6170465c25086515..12f82f0013f11c61f4f43b5e0bcfdd97ec3b0db5 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_dark.png and b/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_light.png b/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_light.png index ed6dca980ab4f95858e97cf3e0a728e6a9cd0d2e..32769160a054f7406e8e7aa325763640d1421213 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_light.png and b/k9mail/src/main/res/drawable-mdpi/btn_check_on_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_dark.png b/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_dark.png index 81de1bb4610d08041e18e8e787c7515dc5ff3b47..bffb6ba2449e92c1cff5573f4a8b7f96c8a68ec8 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_dark.png and b/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_light.png b/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_light.png index c3fdef7bffb24eddbeffc9cad18021a4175ba67c..3de197c7dcc40998459eccf5473578e1fbeaa6a6 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_light.png and b/k9mail/src/main/res/drawable-mdpi/dropdown_ic_arrow_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/folder_dark.png b/k9mail/src/main/res/drawable-mdpi/folder_dark.png index cc81e57f7ecc485edb05d35c1efda39a45bc3e85..17741278d7b5758659db2ca8300a0dd7f675a80d 100755 Binary files a/k9mail/src/main/res/drawable-mdpi/folder_dark.png and b/k9mail/src/main/res/drawable-mdpi/folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/folder_light.png b/k9mail/src/main/res/drawable-mdpi/folder_light.png index fda13f1bebb588e4197131b72ac96e4b5cfc25ff..9350ac97696524c4eaa150d67a0d14e4f11611c2 100755 Binary files a/k9mail/src/main/res/drawable-mdpi/folder_light.png and b/k9mail/src/main/res/drawable-mdpi/folder_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_about_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_about_dark.png index d7b7e698630e6b7b9235a937ae682db2ff94e851..01539004f406a0cd851337634eb9800dfa58edd4 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_about_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_about_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_about_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_about_light.png index 7c57436fc57705e300e32dfb04a13508b47ec534..06e3e3eb28fbe909e1b354cd751624a0447a13a9 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_about_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_about_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_dark.png index 7b66272c0781d62bd950e0ea7fe620c8e0dcfc9f..75e4da40f7c099d5b2845d878c955343cc4ed32a 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_light.png index 2c4b2946c556164326b174b9b5fdafc34929326d..279ceab3786f57d7cc8821fe403721a6926000f7 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bbc_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bbc_light.png index 30c73509833e6d9e937fba77b2806b59953f28f8..30affbeee08a3ac44431db4bd8da6c7cdcbcf9c9 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bbc_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bbc_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bcc_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bcc_dark.png index af06adc7228c8f73e0857232b0f9131629d27169..be6b1132499bb6103b937e9f8b6a9a329eb6142b 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bcc_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_cc_bcc_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_dark.png index 4d5d484b39978c1b37dec37c77c6b3d9de6ce74e..cab1ce7016f8823cafe728a8ea921ce0116cae59 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_add_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_add_light.png index 884c9d2703775305168d0e36579816ca95140fc1..ebdf1eaf44930f7ca7881089309f0435c5981d5e 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_add_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_add_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_archive_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_archive_dark.png index 7e46c2514ff6dd2c6979a22787ea25e8cf50c331..b314830522dd86c81c7a05daa82ce1066e7ed4d9 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_archive_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_archive_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_archive_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_archive_light.png deleted file mode 100644 index 02eed094495a9b4da2a7872873492d2c3b884f67..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_archive_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_dark.png index 3336760d5f3efdfefefd6899317c3a09264430f6..6379017b3ce47372a65a7f08935be7ee5e6c27cb 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_light.png index 9f4c3d6a2b5bffc7529ef77789f4b9a1258c967e..63b07297c3dfdf4ff0583b96ce1ad8beb71448c4 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_cancel_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_compose_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_compose_dark.png index 0532eeeeb09eb577ee63f37b6b4dfb38f686367c..578bb4753cd6648b3b72b4e30fa5f2c92e9ddb86 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_compose_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_compose_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_compose_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_compose_light.png deleted file mode 100644 index c34f3d660f4128eeeffcd339fb0f3eb23e9937e8..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_compose_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_copy_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_copy_dark.png index d93968e5b52ee78d35d3f27c5d957d37078fc991..ac9b8d29f525bcdad943dd3fa3b1e2e2d9acbd12 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_copy_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_copy_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_copy_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_copy_light.png index efb2445f0a3e2ac7ae3cca3891895d34e1eb2b95..00c1efa0f5f8b6363bb08123a8782cd469c81bc7 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_copy_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_copy_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_delete_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_delete_dark.png index 729893f41da68cdcdad5170364eaaf541e40bab2..22e7574a382623be87c42c812c725b38a821e055 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_delete_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_delete_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_delete_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_delete_light.png deleted file mode 100644 index 60903db9d56256a5f7fe456158c457c08200ca97..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_delete_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_flag_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_flag_dark.png index 1b997eaf6d2b5a3575b74bc5593e7d0ab7a7328b..acb6d52652f988aa079cf305ae95b00cb87aa21f 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_flag_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_flag_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_flag_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_flag_light.png index 2cbff776c99e36c027df18802772168e93eb557b..33302209e487033a2d32e049f824990281604634 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_flag_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_flag_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_dark.png index a74fe679439ab477abba8e222bf10484140d8beb..0155338f268bec30f250a41972cb00b1b1d1d380 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_light.png index f481a04aab282f77e5363b18353fd3ae288e503f..bc20c4730d8c0a2fe459a0b6aab14605330d7da9 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_import_export_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_dark.png index 99c751feca47426e6c1d31b1077cfca12894532f..54ff320683508e1524ace058834f3627db2a95da 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_light.png deleted file mode 100644 index 07f0119751a59165b0de5bd07203d1168420f3ee..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_read_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_dark.png index cca47cb39b8ebd360a2029b9106709d6c7870e0d..53b8939401e67a447149fcfbe00027dbc0c134b8 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_light.png deleted file mode 100644 index b3ebbaeb08452c24819c13812e531aa14f5aee6a..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_mark_as_unread_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_move_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_move_dark.png index 70109aee047282d1a552cd2474d616275f6ef3dd..289d0db4238ac0ef87e9e4b0f3f13bbd345004cd 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_move_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_move_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_move_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_move_light.png index a8972a10f4eab8076b31a55a5b8fb3375357ae1d..9c1091d97f5728be2766d419f6fccce1ea3cc081 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_move_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_move_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_dark.png index 1eea4b0d6eee675edf40b026c53ebd18557c5f9d..8ea3347317fc48ecc5b8faca8762b62bf9cd0715 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_light.png index 498f7f4d2cf9e784ea0da4fa6d118785e0aa3ea4..31e0ae5bdad6fb3c3629564b53a8cfd3d684055e 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_next_message_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_dark.png index dc675d5b5673e35db405a056f603cbb0286f8c26..5fee93346e5abb9c77b525b57873505cc6ba71be 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_light.png index d80d0e11272a1598ef0cb61ba192e63e8099a80a..1fe4dd58cfc3a7b9ef744da214e63699bea38d8d 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_previous_message_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_dark.png index e5cd4d9e1a4f8f90be2743cd22bcb4984aaf5ebf..da0219d26763479eb5ae77d4a57ed8de579a815e 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_light.png index eae2016732508576f0a2654a453f867a04e6aba6..058ec63f91bab455ee23d7014782d42b3d01cffb 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_refresh_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_dark.png index 489c10a5198ffdc8c1724cdd57b481085020a322..2c73adf9c863cedbc3a4451d3f964fe2abafb0bf 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_light.png index d9604be5523fadf644e20a9640b51cdfc9812e1e..4f89b550f119e6d4e05cc330c96cccb44dbc4628 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_remote_search_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_dark.png index 6d9102c7d6994276c2bc23ac6b78e5c7845cffc9..5aa188594f928e8688fd1b9091bd7349a7040bf4 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_light.png index 5e9196633aa961fe8ad499b99744927d5ef405e0..2007ff9405d410b292b82b8ada8ec665f6233120 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_request_read_receipt_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_save_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_save_dark.png index ad076955394575364de27bf01b41b4824b002586..ce8cb7605c61b436f6fa9bdcce61ac6b7ceed515 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_save_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_save_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_save_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_save_light.png index d12760bbddc8c5c3af751d245ff19774b4b405c6..d8a7ecdf9b7439f831013300a3839dc349e10e34 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_save_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_save_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_search_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_search_dark.png index bcad447acc03c268f99f5ae699b36cf74a37eea3..65709b2584ca2ef66a1c9c2bc39ff512ec088368 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_search_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_search_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_search_light.png deleted file mode 100644 index a0d8dadb90c110cf56be9f79f94fca4b5f9b2d50..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_search_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_dark.png index 070593ff867bb6b0b266c67053dd61cd48263653..301032f0613a1a6dd48bc8527ddc56de2b8333d4 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_light.png index 9eb75cb0ac153f4f59753e0a749fec016d68540a..8a673f11b28ebd20706f12abb9adc34445a35b1a 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_select_all_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_send_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_send_dark.png index 1ae900ac37f05feaf31595d26f30eceda4ac3daa..c107eecccb060a6e21b913ec60370aa245a23431 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_send_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_send_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_send_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_send_light.png index 89a0fe8a2038af12f0124af77fb6e16b4b1374e8..ebef3b65ef7b8f18bbc10c420d80a7c74c2e0655 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_send_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_send_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_settings_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_settings_dark.png index d90f1255e77a74e368c5cd09d949ffb4c2aa4f61..fd09e6eb9d8b3dcd9c64a67d18adc053a47ef9f2 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_settings_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_settings_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_settings_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_settings_light.png index 4a192d4bc568db1a37d228e8dbae511cdee746d0..66b457351abd9ed178556df73eab9fd3430eaafc 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_settings_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_settings_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_single_message_options_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_single_message_options_light.png deleted file mode 100644 index b08e56929dc87d8d0dc7dfe3e0846bc8844dfab3..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_single_message_options_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_sort_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_sort_dark.png index 43801c156ff01d25b9652d020bcb993b507bd2d7..4a2bc7a20fca6e50154b4a748e9dc60820822e53 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_sort_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_sort_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_sort_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_sort_light.png index 6926afbe803670d6f531d5f45760b82f3cbd4245..5b02f3ca7f9b1470bdd0ddd64f2a68f317c10352 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_sort_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_sort_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_spam_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_spam_dark.png index f6da34b5d8feba93f6b8287a85137003de7dfeb2..1a365f45423bbe2cd47463226a7b7c5917a49092 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_spam_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_spam_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_spam_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_spam_light.png index c512d1a4b4075aba50bfb7bc90f9017a85dc2b7d..06560ac076148e712432a687d72035ab03c0233b 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_spam_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_spam_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_dark.png index 9206e0c89a2c27e1c32ce7c6fd4c06cae09f3ae8..1b27b1bb1cb3be0f03d379ddeecf0ce422becd3a 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_light.png index 983d6016d92003901b9c179c6952e4e3fe862149..e17e020710f299ed2545020f0bb696e903a9caf3 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_unflag_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_upload_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_action_upload_dark.png index 2d4ba56fa2fd337c5b071cd1a8f4bf0a13183269..0aa5cdca9b70c0cbfa5413c90f4a452180c83327 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_upload_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_upload_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_action_upload_light.png b/k9mail/src/main/res/drawable-mdpi/ic_action_upload_light.png index 9e3f74504f710dbdfd155c2255676678f39bfbff..ee1a57c61003e72619e54cce5d6b6dc31ae12075 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_action_upload_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_action_upload_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_attachment_light.png b/k9mail/src/main/res/drawable-mdpi/ic_attachment_light.png new file mode 100644 index 0000000000000000000000000000000000000000..de544602e9bd764f606a8efb3f4f2ba0a06cfe50 Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_dark.png index 9d24b732ffc2759401d6c00131d24e4b76397315..8ced798f83466f0b433351909406866c2e8ae9fd 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_dark.png and b/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_light.png b/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_light.png index 2c9899ec8a0368e314306dd6525edd74932f47d2..762ad8e93ded9ed26828b96b96565653a77e121f 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_light.png and b/k9mail/src/main/res/drawable-mdpi/ic_button_add_contact_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_dark.png b/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea3347317fc48ecc5b8faca8762b62bf9cd0715 Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_dark.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_light.png b/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_light.png new file mode 100644 index 0000000000000000000000000000000000000000..31e0ae5bdad6fb3c3629564b53a8cfd3d684055e Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_chevron_right_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_email_attachment.png b/k9mail/src/main/res/drawable-mdpi/ic_email_attachment.png index 6fe0d3ebe2cd9c4ea862b7bcb063c48318e8cc09..de544602e9bd764f606a8efb3f4f2ba0a06cfe50 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_email_attachment.png and b/k9mail/src/main/res/drawable-mdpi/ic_email_attachment.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_email_attachment_small.png b/k9mail/src/main/res/drawable-mdpi/ic_email_attachment_small.png index eaed42c9ac4fe223458dd64b1a0f4cfcbdf60385..de544602e9bd764f606a8efb3f4f2ba0a06cfe50 100644 Binary files a/k9mail/src/main/res/drawable-mdpi/ic_email_attachment_small.png and b/k9mail/src/main/res/drawable-mdpi/ic_email_attachment_small.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_file_light.png b/k9mail/src/main/res/drawable-mdpi/ic_file_light.png new file mode 100644 index 0000000000000000000000000000000000000000..42b3308b536fcb9924499d6079d97c81f26a01f4 Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_file_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_forward_light.png b/k9mail/src/main/res/drawable-mdpi/ic_forward_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c67dba432e9fc597755b5b37fc2e96417d217124 Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_forward_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/ic_reply_light.png b/k9mail/src/main/res/drawable-mdpi/ic_reply_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7766e76428141f60965032b9792d6fa04b1d6a9a Binary files /dev/null and b/k9mail/src/main/res/drawable-mdpi/ic_reply_light.png differ diff --git a/k9mail/src/main/res/drawable-mdpi/icon.png b/k9mail/src/main/res/drawable-mdpi/icon.png deleted file mode 100644 index 9f34a43d59f7d26381401bcd2886b7cc8d9ae809..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-mdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/action_search_folder_dark.png b/k9mail/src/main/res/drawable-xhdpi/action_search_folder_dark.png index e7cc38ed67a561ee5433a1ff36904d31210989b8..36708e052085763f1019f5cb00ddbdb0ec25a887 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/action_search_folder_dark.png and b/k9mail/src/main/res/drawable-xhdpi/action_search_folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/action_search_folder_light.png b/k9mail/src/main/res/drawable-xhdpi/action_search_folder_light.png index de254cc83c8cdb44b886499218b976a03a3d7ab7..14e97d3fa98853cd4cbed1d4976a36c2f0e53b21 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/action_search_folder_light.png and b/k9mail/src/main/res/drawable-xhdpi/action_search_folder_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png b/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png index 84a0a44f8e3e1a15d49ab68aa3e442478cfbd225..2bd2fe75a768ac46cdd11fbd7398ce983d77222c 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png and b/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_light.png b/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_light.png index d3809fa13e127068cff7698eb0dab6f710abe067..5691eade37b19e8a0de8e751480479ed32e70e95 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_light.png and b/k9mail/src/main/res/drawable-xhdpi/btn_check_off_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_dark.png b/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_dark.png index 3d62162d59315ada6c8c22f77bce340cc6f0146c..16e2fbd4e920760b25f0e0c993dcf9c7679b5d64 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_dark.png and b/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_light.png b/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_light.png index 7e1bc8cbab50a87573cc8cc84b80ef8ff14f0e1c..99c5feeed3d16815594667d355a042d98fe7ba6e 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_light.png and b/k9mail/src/main/res/drawable-xhdpi/btn_check_on_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_dark.png b/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_dark.png index 36d8cf47ee090130149d831437eab1eec1f40dfa..fc848d455fb9faa4031f819d4c6339b2b577359f 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_dark.png and b/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_light.png b/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_light.png index a931132bfb2035941da5b52b0258a63d574930b7..bd034c023a3e8d6ce731d880573c9de390572cc7 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_light.png and b/k9mail/src/main/res/drawable-xhdpi/dropdown_ic_arrow_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/folder_dark.png b/k9mail/src/main/res/drawable-xhdpi/folder_dark.png index 78500a93c12e3ee5b69b68e4a9a9fa74a5e0daac..ea091c6a85d72b8db9b16ffa03519f92bd127400 100755 Binary files a/k9mail/src/main/res/drawable-xhdpi/folder_dark.png and b/k9mail/src/main/res/drawable-xhdpi/folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/folder_light.png b/k9mail/src/main/res/drawable-xhdpi/folder_light.png index d1324014d0df9390f1cbe97a5afd4201471f5cbb..207d93ae07bb02598871e878c2c562b5bff61e57 100755 Binary files a/k9mail/src/main/res/drawable-xhdpi/folder_light.png and b/k9mail/src/main/res/drawable-xhdpi/folder_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_about_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_about_dark.png index 4ee903f071bbd86118d23e3e348af5ff8190171f..cde2d030f052b20494df09e241500a6c518fc84a 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_about_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_about_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_about_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_about_light.png index 2641f142a4684cf149ac36e23417ad56cf021e61..a087d1dc6861d8cb7212a1b26b20a02c2ff809d9 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_about_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_about_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_dark.png index 295437ff5d9f49d0d972e56e99477096813156bf..6b021d8c79e155cfd9463ed30cf03d5e274e032d 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_light.png index 19ddf0f2dcc5633bbab1aa39d2b6b58511d84747..aa966202b84f4775baf83b3059983148907a9119 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bbc_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bbc_light.png index c944e0d9dbbe9d916cea10fe3f189c382e4d7a2a..4c2d7c45589f5922d03b518e6d2128d3819ed548 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bbc_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bbc_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bcc_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bcc_dark.png index 48834c43a9ddf3993680e6fba152ee66212e387b..7f09aff30beac9fa5747231611706bf803bf7668 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bcc_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_cc_bcc_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_dark.png index 23b9a1c1857791d618ce961f019585acf47ed1c5..53ada747809ae4cb28fa747e03dee7c263a34839 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_light.png index 9b48a63dad67fc8cba5cb57abe12f5ce97dc9e01..b8c427e570c212a343d7c77ec351bc2e5a8e15f5 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_add_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_add_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_dark.png index f19730baff29ffeb2f44804246a6a91095efc406..42e1e36c3b74631fb0318eeb4ccc6e03fdf1b582 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_light.png deleted file mode 100644 index 80f42280ea69b7032c644eb0f654a01091112ca2..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_archive_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_dark.png index f391760ef134adb96dcce85abb2c5ab776f8e6bd..dd8fdbd2a367ea8012e1c729d31104ccf21b7f39 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_light.png index ca7d159fdaa906473fa7ce7a63814ced79c89db3..1718aa65c323cb596d5900c0f41ecb58992faf7e 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_cancel_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_dark.png index 8429bc152549959b24aec6430f0bb6185780a125..1523b67cf29f46c9f162e785f4411c5631f8a62c 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_light.png deleted file mode 100644 index 1faf38c691ca935a8e068cba62c46f933ac1bd65..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_compose_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_dark.png index 04e290d8b99915220acda5e11c81f889de57abce..572ee0a1cfda6becd53580e4ff344f1f0e8a24c4 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_light.png index 00bff33c74d93b8074203580dfb90bcdd7de4264..9b74d8c23ff4447523bf27d46dd03d93665c2f99 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_copy_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_dark.png index 90d65dfb9ce05f1975a2a023aab7ec390e92b899..6bece624c3b33a349c3b9b07893a29e4f09b24ca 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_light.png deleted file mode 100644 index 311511330d8e79ab650b1f639990a7021cf4e2b0..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_delete_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_dark.png index c1fd258291a6ec752bd77112f334ac5d3d73a734..2d16125217371611fb3b97bcafcb8ea8fb047569 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_light.png index d0bdfd64d96f4f498e2de66e66709248755b7dfc..61c73ff36433c36e74bc52ccbcf28a2a47e8a58f 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_flag_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_dark.png index 6161b58e6d90d783780c6b817b8f4d06fbf7fcb0..fecdd5649cdd55ebe0b9cb37150a3156a2479452 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_light.png index 7c1c1d718d30a403fbc21079cd30c7fb5ce821ed..3bbbc7fa8488aee9ef7a88211d3d20677d2b9a9f 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_import_export_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_dark.png index 58247d0be539e2871618d2859f634dda0c57530a..97f9fdaddd040a32e343f52e3a3d9f1d7a5ebcc8 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_light.png deleted file mode 100644 index 4dec462082688dd6e0a2e14506345882cc87a656..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_read_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_dark.png index e334e65daa4b9ff47dc7fdb32e4e04a0e9c4d941..f47ff7c25f16f6fde62121119669688d04b0b823 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_light.png deleted file mode 100644 index 926cdef30c9d4d884d7f04a09ec2c143343e0e9d..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_mark_as_unread_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_move_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_move_dark.png index d5a910c5d50f8aaea5151c3965e41a75b4f0ea8b..8c18ef3cf74c88b3dbb18e6533de7cd62c0c77f4 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_move_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_move_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_move_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_move_light.png index 5721c615cffaf7925335eb809a520e83afb188b8..99d8d009e7aaf6b1126c5cb15642356ed1cd7820 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_move_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_move_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_dark.png index 49b4564003d307634876ded6c08a541814a5f908..bfb02695efb386b7476bed635c195595b53dd76c 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_light.png index 16443bba768d0ade65d9878f147fdcb0fd6de66b..069a9499a60941d9f3c60b1b3031015f3d4d420d 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_next_message_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_dark.png index b03529e16fb25edd9866e623f6ba03338c9b2460..467fa9779967b968f53e6503ce7e5e29732bc72e 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_light.png index 039afc39eae44fb3e6e75a6fbe5a26c760d71d8e..018fc1205dd6f96b5ee4ec49946eb393f6c48d99 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_previous_message_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_dark.png index 2cec0c8d45df59351f581aa42750d147f1bd28af..e8cf0d0d0c03e5f43f8c7111aaf1da081973e411 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_light.png index 9ded06afb9bf48f6252329663fbfe492c6181554..ef80f9403c9156fdd7b122085a1cdaa9e5a18590 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_refresh_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_dark.png index 651785d17340daeff26081f498bd3058a68d8d67..ab9324860c2f9ca3b4847b72abb52a32d65c3259 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_light.png index ee8ecbd3c91aef117ec8f8401205cd0de9028555..56f61733fb7051c77479ffc6ba0779e51dfe4255 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_remote_search_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_dark.png index f39686cb34b133de9fb2445fceebd9d76c7fbec2..51cdf330c434bfe22f9ef2b41c6ec7ff14fe03b9 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_light.png index 4233a2fa8b9984c6753db52021fb088bcd07b5ff..f396e106153be34d6cb136a4ca3ab15863a1b982 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_request_read_receipt_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_save_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_save_dark.png index 272060253d0f904061c87ad0bea14d2ad5387abd..39d8aa8e7d0979a8187eabb8a7bff4cca822005b 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_save_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_save_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_save_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_save_light.png index 9460b391c5d9cdc8f0c0ce412f06c186b913fceb..750cb80e4fcc1779e135a88270cd7ac56213cff8 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_save_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_save_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_search_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_search_dark.png index be76f2fa46a1c7c14b7427906d4bcccda3359ed1..a35ff9349e9f6971045a45c40b5ba26f09da8b5a 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_search_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_search_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_search_light.png deleted file mode 100644 index f4acc174d6c156b28120d9f811bf4e78cc597aec..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_search_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_dark.png index 52d1155d28bf14d6c8bb00ea6463387d8eb523d8..0df91d352c9f9259c3edf9ea11e615bfbea54f01 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_light.png index fbe5845addeba9e0506213ea0b7ed79e0413707f..ed3dc94346340bdde58ac89619462c90bfa49dac 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_select_all_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_send_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_send_dark.png index 6e7d5d02f713767a148082c9a058ffd693b0eb6a..0017d174a7bcd7aad76d2df2915ebadc53bf7e0d 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_send_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_send_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_send_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_send_light.png index 6eb16bfe40d8c20a9602ad9db64628f5427438e0..aa0c5fb29f8948287bb383d711636c7536c1da41 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_send_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_send_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_dark.png index f2572c8463e5c8d6a7bd39fcad76933e2d3b3182..8e1af463b44f262bb73828dba8a53e1c7f4861ee 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_light.png index 86273ab2c04c2f0b27f0d8090a3eaee239a26b7f..3d0518d6e2f63cec665baf28f6dd7002185ba9e7 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_settings_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_single_message_options_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_single_message_options_light.png deleted file mode 100644 index 0a127864972cae73f788da7f035de5f8aeed08cb..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_single_message_options_light.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_dark.png index fdff32265d528006411342fa8e952523d26eb0f3..985ce218bc331a6d18fd3e718f973db93c6e8fbc 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_light.png index f149262285b42d0dce97c6f8722c00c26b420ea2..61a3ad31943af3ff5320ec959446083eb4cecfaf 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_sort_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_dark.png index bed41cd4f3435b79cd5536f7a86cd516469a82a0..11b3db454b9839945d515221fce9708a57048c86 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_light.png index d83ef256dbe609c56338308ea4a77611fcd2a2c9..96aca0660b9342c1e5b0831ff636f62357b88093 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_spam_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_dark.png index 8f62231c804c443d2b43b1a995c5d3c8fe07831d..b359127291f2b08c0c7a12338c79dc86c4133d4f 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_light.png index 5b3f34471c930f631eca55ef9ffcc5c67f4984af..e514e48a973ecd64614f63148634837f06b6e2e8 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_unflag_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_dark.png index 2369348c9d9622b68fd125d30f592a8946eb1d8b..c33cbabe3f7a0e0749f6b578d1578f5b848a893e 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_light.png index b372b7e19ab3dd5bc4dc17cda88fa4da45d127f9..152f5c157376f17afa1477ddf8356177ac197051 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_action_upload_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_attachment_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_attachment_light.png new file mode 100644 index 0000000000000000000000000000000000000000..21506e80deb5865736c95e43bef72edc10c7ef9b Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_dark.png index 08d874d2575af33efd0b5074f50f30e762f33506..97dd25b265f912fecabd5ce4fb91644fcd6c5e1b 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_dark.png and b/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_light.png index 2cefca64503310db99633e3b989344bc96c8b75f..a33b72f8bb395bdaaf8417e5a58d9645e4534cb5 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_light.png and b/k9mail/src/main/res/drawable-xhdpi/ic_button_add_contact_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_chevron_right_dark.png b/k9mail/src/main/res/drawable-xhdpi/ic_chevron_right_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb02695efb386b7476bed635c195595b53dd76c Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_chevron_right_dark.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment.png b/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..21506e80deb5865736c95e43bef72edc10c7ef9b Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment_small.png b/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment_small.png new file mode 100644 index 0000000000000000000000000000000000000000..21506e80deb5865736c95e43bef72edc10c7ef9b Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_email_attachment_small.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_file_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_file_light.png new file mode 100644 index 0000000000000000000000000000000000000000..9cc5b9261ab8f000f982c164b26a0ef6c50a0f20 Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_file_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_forward_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_forward_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dd2c7a4e36053bb7944559c155f87965ec3ac9 Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_forward_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/ic_reply_light.png b/k9mail/src/main/res/drawable-xhdpi/ic_reply_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd8adaf3f9a44b40bad0cd659e9cab372110705 Binary files /dev/null and b/k9mail/src/main/res/drawable-xhdpi/ic_reply_light.png differ diff --git a/k9mail/src/main/res/drawable-xhdpi/icon.png b/k9mail/src/main/res/drawable-xhdpi/icon.png deleted file mode 100644 index 206a05b53ca987379438bbb09f398432ac17e8bd..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xhdpi/item_pressed.9.png b/k9mail/src/main/res/drawable-xhdpi/item_pressed.9.png index e4b33935a3aa4f1af3fa9e9e199b5c47d43f4b74..ae569be9e180f0d9259dcc80645cab0a5fc97dab 100644 Binary files a/k9mail/src/main/res/drawable-xhdpi/item_pressed.9.png and b/k9mail/src/main/res/drawable-xhdpi/item_pressed.9.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/action_search_folder_dark.png b/k9mail/src/main/res/drawable-xxhdpi/action_search_folder_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7d11be6cbcab99a11341131d452fe70e4d1f5f87 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/action_search_folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_dark.png b/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..50e8ab40765541ffc95ce9ba5f89d72731ceb3a4 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_light.png b/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa7928e037575cb12849da6fefb54cf6f091bd1 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/btn_check_off_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_dark.png b/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..65ab94d977ab1e6a4dbb7a9df766db75218b55b2 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_light.png b/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2605e9e9bb908fe4c5f14bd1d4ebfbe3ab2b6 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/btn_check_on_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_dark.png b/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4587f1ff8986d9191fbd26f5f89683b80b665725 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_light.png b/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5603874849d0cb74670625f321ba62d34aa77a0d Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/dropdown_ic_arrow_normal_holo_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/folder_dark.png b/k9mail/src/main/res/drawable-xxhdpi/folder_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..319ff00ce14dc7617193a7b673e69cb5667d25a8 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/folder_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/folder_light.png b/k9mail/src/main/res/drawable-xxhdpi/folder_light.png new file mode 100644 index 0000000000000000000000000000000000000000..4bc09b34410af2ac80246de1f5397a42a25af34c Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/folder_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5e2693b80793494eba939418f4d123d2c4aef7 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2be47d5ebd5e014660bed33392bbc7ec7540a3e7 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_about_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d09fbb978f4d7253183a5dfaa4218de32c3222c0 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_light.png new file mode 100644 index 0000000000000000000000000000000000000000..d435aaba1f7e0439a26f2a4da932585cd3bb13b6 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bbc_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bbc_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f04c06f315fa07701cee8a94ae65dcb5079fd6ba Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bbc_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bcc_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bcc_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4a6ac7f019b600181f9bf4859ddabfa01a5fe4 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_cc_bcc_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebbf5ed48e2f29aa33de4685fa8bf90dae9bad3 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_light.png new file mode 100644 index 0000000000000000000000000000000000000000..56d0fa90a844241ea06597ac9de6816173db45c1 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_add_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..75264a7b2389d775debc603763b1ae55659be510 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8f131ab243469d0585f93e75704fbef2cb5561af Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a25191ae7a3048b7e3d5e8c0eb666461ae00dabc Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_cancel_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_compose_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_compose_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..83827dd1e440bee452aa330c30f760f5af5d7fbc Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_compose_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..03ba28e07b29520152cf989aa0baeb0119a84dd1 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_light.png new file mode 100644 index 0000000000000000000000000000000000000000..92f3cbe6e0ca34ca62728325b6e8295230311e23 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_copy_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9ef032fc48c692846cd88f97d2f63d3ebec508 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_delete_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4a36a3e15691367a3a7e8fe36d2ce1a7d99eef7c Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a90d5eb6fda1e273bc1cfc6f9912af03b2accc9d Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_flag_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..937fe443418db802e5cd34c7fdb8a44cd77d48ba Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b08f02fe66cdb5c5d8b61135538823bb1444f233 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_import_export_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_read_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_read_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f172f7f644a9b6ee5ba3180e2e1ca5d6b3d59f74 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_read_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_unread_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_unread_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..450da0c204bacaf25bdc690f4afa528f8fd2c3ec Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_mark_as_unread_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff90da55d7e6c3bb9bbcf32fb36f2c9d8b38fc0 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0f9a18a7dd399fba0b17c53a060f22097577bda9 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_move_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1a59641ac882364d1ca1a285c3d75bb944b6e034 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7a953bf13af3bc9638e790bd5da066ccc73eee1b Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_next_message_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1243993897d8ae03e99e00e27844837cbcf00a Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5582c0deaad41a5d756d185e9925a11517f487ed Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_previous_message_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb62fb4f8dce8e9483d9d379c52f728afa52530 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5a4bb3060c5f0382669fa27474387d13fd5a89b4 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_refresh_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d18f0d407f2618089a3bbcc7963cd62a7ec74ca7 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0208fa9b17c642e05204e253bea2dd8b40d45d66 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_remote_search_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1443352c0f14e7abd651ab77b3f4b09cfe5a95 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_light.png new file mode 100644 index 0000000000000000000000000000000000000000..009dd61cbfedf1429665e3254050814a46578a80 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_request_read_receipt_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..302ee2d23b6e287d3312ab5287c6f6bbcc9dc2bf Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_light.png new file mode 100644 index 0000000000000000000000000000000000000000..679d3c90197164f7a7120af977aa25a94b9325ab Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_save_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_search_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_search_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1207e2c8e0eae34bf7e196f695aa1145da4595 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_search_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4f784f506ab68a94f98d0d278f787666e7b63530 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_light.png new file mode 100644 index 0000000000000000000000000000000000000000..77d4beae055fae3e998cb770ee1db6864f91aa3e Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_select_all_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a397336089c1160f1d08fc35841bb86e33c60674 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_light.png new file mode 100644 index 0000000000000000000000000000000000000000..af278f74bddea283930f6bc26e4b21bb09be6852 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_send_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..dee13d7083395b67fcfe6d2f236fb95d7c7e1b6f Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b172bbe38e76a7df1939af5f83bc1a7b95955638 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_settings_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3afa066090441f55f7d977e201ac0af11f1d80d5 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3431c0774df2d69b5f38497edeab4f87724f85f7 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_sort_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ab852ca5fc95235fb59f2ee357da3a55dd372d9b Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7c779eebe4a20d2e755bd82db7bd085ac5336c2a Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_spam_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5a81ff1cd82b396dad41d4305e6cd15a10b72fcf Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7eec9b0b940dca5a35239142c48b478a9b3ec3c0 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_unflag_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7148d3e1ee9ac76f2a2a16ba9bf06c4dbe06aa70 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_light.png new file mode 100644 index 0000000000000000000000000000000000000000..027a4bd579a7d77709db719a6b3e97f4dac2aeda Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_action_upload_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_attachment_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_attachment_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0d55d63754a19512276940a9d6e8620947ee9d28 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_attachment_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e5d61658c8c766a8c2b41c56bbe4571b25c91d Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3801fe326137e98b0f6c084214b31bf4cca1f499 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_button_add_contact_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_chevron_right_dark.png b/k9mail/src/main/res/drawable-xxhdpi/ic_chevron_right_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1a59641ac882364d1ca1a285c3d75bb944b6e034 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_chevron_right_dark.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment.png b/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment.png new file mode 100644 index 0000000000000000000000000000000000000000..0d55d63754a19512276940a9d6e8620947ee9d28 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment_small.png b/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0d55d63754a19512276940a9d6e8620947ee9d28 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_email_attachment_small.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_file_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_file_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5c74cafa4883d3922c6c2b72536ff1def0570183 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_file_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_forward_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_forward_light.png new file mode 100644 index 0000000000000000000000000000000000000000..df57913429082d5dfd2a4dcf3b805e9ff53a1f95 Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_forward_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/ic_reply_light.png b/k9mail/src/main/res/drawable-xxhdpi/ic_reply_light.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ae4bd5f72cd2b06e1cbe6b56f4760bc9a59d5f Binary files /dev/null and b/k9mail/src/main/res/drawable-xxhdpi/ic_reply_light.png differ diff --git a/k9mail/src/main/res/drawable-xxhdpi/icon.png b/k9mail/src/main/res/drawable-xxhdpi/icon.png deleted file mode 100644 index cd3e89be8f2c5591e594e0c0cbe5863103bcdb60..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xxhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable-xxxhdpi/icon.png b/k9mail/src/main/res/drawable-xxxhdpi/icon.png deleted file mode 100644 index a73d1d3aefc74bc35f117cd50a4ee1e35e91d4f0..0000000000000000000000000000000000000000 Binary files a/k9mail/src/main/res/drawable-xxxhdpi/icon.png and /dev/null differ diff --git a/k9mail/src/main/res/drawable/action_search_folder_light.xml b/k9mail/src/main/res/drawable/action_search_folder_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a131abbe4313d4da98ba177c7ddc22db7a1c7c6 --- /dev/null +++ b/k9mail/src/main/res/drawable/action_search_folder_light.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_action_archive_light.xml b/k9mail/src/main/res/drawable/ic_action_archive_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..df6bff1c70b1c531ab63d9e37bfa700bafd0328a --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_archive_light.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_action_compose_light.xml b/k9mail/src/main/res/drawable/ic_action_compose_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..87407139bcd1a192e3ad81fc460d1b593bb5509e --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_compose_light.xml @@ -0,0 +1,4 @@ + + + diff --git a/k9mail/src/main/res/drawable/ic_action_delete_light.xml b/k9mail/src/main/res/drawable/ic_action_delete_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..d36d5ffc8a92af3a543652381133754c01bc2fe7 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_delete_light.xml @@ -0,0 +1,4 @@ + + + diff --git a/k9mail/src/main/res/drawable/ic_action_mark_as_read_light.xml b/k9mail/src/main/res/drawable/ic_action_mark_as_read_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..fdbe78f74fa05e66927b7e804034bafe20fd9f7b --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_mark_as_read_light.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_action_mark_as_unread_light.xml b/k9mail/src/main/res/drawable/ic_action_mark_as_unread_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..1262522bec1ca8cf5f77a16f721a6635524cae00 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_mark_as_unread_light.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_action_search_light.xml b/k9mail/src/main/res/drawable/ic_action_search_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..21d4050a5ade1d3dd7af1e4ae4dea6c6085f5cc7 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_search_light.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_action_single_message_options_light.xml b/k9mail/src/main/res/drawable/ic_action_single_message_options_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..72cd8c1cbf57ce1602957defd70615b633be218f --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_action_single_message_options_light.xml @@ -0,0 +1,10 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_chevron_right_light.xml b/k9mail/src/main/res/drawable/ic_chevron_right_light.xml new file mode 100644 index 0000000000000000000000000000000000000000..d99dbe408ae14d8ae3d424458822f707fa5dd008 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_chevron_right_light.xml @@ -0,0 +1,10 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_folder_open_svg.xml b/k9mail/src/main/res/drawable/ic_folder_open_svg.xml new file mode 100644 index 0000000000000000000000000000000000000000..d2646dbecd96b3b23b3d84801d91ae54c2388771 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_folder_open_svg.xml @@ -0,0 +1,5 @@ + + + + diff --git a/k9mail/src/main/res/drawable/ic_inbox_svg.xml b/k9mail/src/main/res/drawable/ic_inbox_svg.xml new file mode 100644 index 0000000000000000000000000000000000000000..2046a28a432db2a2d95c3d84c0deee5942173f1b --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_inbox_svg.xml @@ -0,0 +1,4 @@ + + + diff --git a/k9mail/src/main/res/drawable/ic_star.xml b/k9mail/src/main/res/drawable/ic_star.xml new file mode 100644 index 0000000000000000000000000000000000000000..8046ea746a8ef667b092e491a5667240a3263878 --- /dev/null +++ b/k9mail/src/main/res/drawable/ic_star.xml @@ -0,0 +1,10 @@ + + + + diff --git a/k9mail/src/main/res/layout-land/actionbar_custom.xml b/k9mail/src/main/res/layout-land/actionbar_custom.xml index 83c7557cd3f70caf0371d7ae7936c2f41ee55659..f097e6ce484dc572f353d388e1b1b82b0e5046ec 100644 --- a/k9mail/src/main/res/layout-land/actionbar_custom.xml +++ b/k9mail/src/main/res/layout-land/actionbar_custom.xml @@ -22,7 +22,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="start" - android:singleLine="true" + android:singleLine="true" + android:textColor="@color/colorAccent" android:textSize="14sp" /> - - \ No newline at end of file + diff --git a/k9mail/src/main/res/layout/account_setup.xml b/k9mail/src/main/res/layout/account_setup.xml new file mode 100644 index 0000000000000000000000000000000000000000..08a4a8e03d8446a850cf71640f02313307676bfa --- /dev/null +++ b/k9mail/src/main/res/layout/account_setup.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/k9mail/src/main/res/layout/account_setup_account_type.xml b/k9mail/src/main/res/layout/account_setup_account_type.xml index 2712fde60f6f8f1cff10e8c85117e37b1ea05c42..f9a3158e2a0681e72d9e2d41e2b4f92484ffaff6 100644 --- a/k9mail/src/main/res/layout/account_setup_account_type.xml +++ b/k9mail/src/main/res/layout/account_setup_account_type.xml @@ -1,45 +1,85 @@ - + -