diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/SampleEmailPolicy/Android.mk | 33 | ||||
-rw-r--r-- | apps/SampleEmailPolicy/AndroidManifest.xml | 27 | ||||
-rw-r--r-- | apps/SampleEmailPolicy/README | 23 | ||||
-rw-r--r-- | apps/SampleEmailPolicy/proguard.flags | 21 | ||||
-rw-r--r-- | apps/SampleEmailPolicy/res/values/strings.xml | 20 | ||||
-rw-r--r-- | apps/SampleEmailPolicy/src/com/android/email/policy/EmailPolicy.java | 247 |
6 files changed, 371 insertions, 0 deletions
diff --git a/apps/SampleEmailPolicy/Android.mk b/apps/SampleEmailPolicy/Android.mk new file mode 100644 index 0000000..b657506 --- /dev/null +++ b/apps/SampleEmailPolicy/Android.mk @@ -0,0 +1,33 @@ +# Copyright 2010, The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This is the makefile for the Email Policy package contained elsewhere in this sample. +# When deploying to an actual device, you must change LOCAL_PACKAGE_NAME to the name desired for +# your local version, e.g. LOCAL_PACKAGE_NAME := MyDeviceEmailPolicy This will cause the build +# system to create "MyDeviceEmailPolicy.apk". You must then add this to the appropriate product.mk +# file for your device, to include the APK file in your system image. + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := optional + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_PACKAGE_NAME := SampleEmailPolicy +LOCAL_CERTIFICATE := platform + +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + +include $(BUILD_PACKAGE) diff --git a/apps/SampleEmailPolicy/AndroidManifest.xml b/apps/SampleEmailPolicy/AndroidManifest.xml new file mode 100644 index 0000000..1329a03 --- /dev/null +++ b/apps/SampleEmailPolicy/AndroidManifest.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.email.policy" + > + <!-- + This package has no components. It is simply a container for a single class, which is + loaded and used by the email application. + --> + <application android:label="@string/app_label"> + </application> + +</manifest> diff --git a/apps/SampleEmailPolicy/README b/apps/SampleEmailPolicy/README new file mode 100644 index 0000000..147c9f7 --- /dev/null +++ b/apps/SampleEmailPolicy/README @@ -0,0 +1,23 @@ +# Copyright 2010, The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +This package contains sample code for building Email Policy packages. These are small Android +Package (APK) files containing a device-specific configuration values for the Email application. + +These policy files are intended for use by an OEM who is building a device using the Android +Open Source platform, but wishes to provide small customizations to the Email application without +having to edit or merge changes directly into its source. It also allows the same Email application +to be deployed to devices with slightly different policies. + +For more information, see the comments in src/com/android/email/policy/EmailPolicy.java. diff --git a/apps/SampleEmailPolicy/proguard.flags b/apps/SampleEmailPolicy/proguard.flags new file mode 100644 index 0000000..cb39abd --- /dev/null +++ b/apps/SampleEmailPolicy/proguard.flags @@ -0,0 +1,21 @@ +# Copyright 2010, The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Prevent ProGuard from discarding the "getPolicy" method, or the class that contains it. + +-keep class com.android.email.policy.EmailPolicy + +-keepclasseswithmembers class * { + public static android.os.Bundle getPolicy(java.lang.String, android.os.Bundle); +} diff --git a/apps/SampleEmailPolicy/res/values/strings.xml b/apps/SampleEmailPolicy/res/values/strings.xml new file mode 100644 index 0000000..4c5818e --- /dev/null +++ b/apps/SampleEmailPolicy/res/values/strings.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- This string will never be seen by the user --> +<resources> + <string name="app_label">Email policy</string> +</resources> diff --git a/apps/SampleEmailPolicy/src/com/android/email/policy/EmailPolicy.java b/apps/SampleEmailPolicy/src/com/android/email/policy/EmailPolicy.java new file mode 100644 index 0000000..6e69eac --- /dev/null +++ b/apps/SampleEmailPolicy/src/com/android/email/policy/EmailPolicy.java @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.email.policy; + +import android.os.Bundle; + +/** + * This sample is the framework that can be used to build EmailPolicy packages for inclusion + * on specific devices. This sample is intended for use by OEMs or other creators of system + * images. + * + * When this package is built and included in a system image, the Email application will detect + * it (using reflection) and will make calls to the getPolicy() method at certain times. This + * can be used to provide local customization of the Email application. + * + * Do not change the package, class name, or method name - these must match the names used in + * this sample code or the Email application will not find the helper. + * + * Three customization points are provided: + * + * * Alternate strings for Exchange/ActiveSync UI + * * Insertion of device-specific text into IMAP ID commands + * * Device- or Carrier- specific account presets + * + * Each policy request may contain one or more parameters; These are supplied as keyed entries + * in the "arguments" bundle. If there is a single argument, it will typically use the same key + * as the policy name. If there are multiple arguments, they keys are provided and called out. + * + * In all cases, getPolicy() should return a bundle. For default behavior, or for any unknown + * policy, simply return Bundle.EMPTY. + * + * To return actual data, create a new bundle and place result values in it. If there is a single + * return value, this value is placed in the return bundle using the same key as the request. + * If there are multiple return values, keys will be provided for them as well. + * + * Future versions of the Email application may access additional customization points. If + * the call to getPolicy() is made with an unknown or unexpected policy keys, or the expected + * argument values cannot be found, the method should Bundle.EMPTY. + */ +public class EmailPolicy { + + /** + * This policy request configures the UI to conform to various Exchange/ActiveSync + * license requirements. In the default configuration, the UI will refer to this protocol as + * "Exchange", while in the alternate configuration, the UI will refer to it as + * "Exchange ActiveSync" or "Microsoft Exchange ActiveSync". + * + * For the default behavior, return the empty bundle. + * For the alternate behavior, return a bundle containing a single entry with a key of + * USE_ALTERNATE_EXCHANGE_STRINGS and a value of "true". + */ + private static final String USE_ALTERNATE_EXCHANGE_STRINGS = "useAlternateExchangeStrings"; + + /** + * This policy request allows you to insert field/value pairs into the IMAP ID command, which + * is sent to an IMAP server on each connection. + * + * The following arguments are provided: + * * GET_IMAP_ID_USER - the userid of the account being connected to + * * GET_IMAP_ID_HOST - the hostname of the server being connected to + * * GET_IMAP_ID_CAPA - the values returned by the "CAPA" command + * + * For default behavior (no values inserted), return the empty bundle. + * To insert additional values into the IMAP ID command, return a bundle containing a single + * entry with a key of GET_IMAP_ID and a String value. The value must be field/value pairs + * surrounded by quotes and separated by spaces. Multiple field/value pairs may be provided. + * See RFC 2971 for more information. + */ + private static final String GET_IMAP_ID = "getImapId"; + private static final String GET_IMAP_ID_USER = "getImapId.user"; + private static final String GET_IMAP_ID_HOST = "getImapId.host"; + private static final String GET_IMAP_ID_CAPA = "getImapId.capabilities"; + + /** + * This policy request allows you to supply preset server configurations to provide + * automatic setup/configuration for specific email providers. These values supplement (or + * override) the automatic configurations provided in res/xml/providers.xml in + * the Email sources. (See that file for more information and plenty of samples.) + * + * The only argument (with the key FIND_PROVIDER) is a string containing the domain that the + * user entered as part of their email address; For example, if the user enters + * "MyEmailAddress@gmail.com", the domain will be "gmail.com". + * + * If no server information is provided for this domain, simply return Bundle.EMPTY. + * If server information is available for this domain, it can be returned in the following + * values: + * * FIND_PROVIDER_IN_URI The server configuration for the incoming (IMAP or POP) server + * * FIND_PROVIDER_IN_USER Format of the username (login) value + * * FIND_PROVIDER_OUT_URI The server configuration for the outgoing (SMTP) server + * * FIND_PROVIDER_OUT_USER Format of the username (login) value + * + * Valid incoming uri schemes are: + * imap IMAP with no transport security. + * imap+tls+ IMAP with required TLS transport security. + * If TLS is not available the connection fails. + * imap+ssl+ IMAP with required SSL transport security. + * If SSL is not available the connection fails. + * + * pop3 POP3 with no transport security. + * pop3+tls+ POP3 with required TLS transport security. + * If TLS is not available the connection fails. + * pop3+ssl+ POP3 with required SSL transport security. + * If SSL is not available the connection fails. + * + * Valid outgoing uri schemes are: + * smtp SMTP with no transport security. + * smtp+tls+ SMTP with required TLS transport security. + * If TLS is not available the connection fails. + * smtp+ssl+ SMTP with required SSL transport security. + * If SSL is not available the connection fails. + * + * To the above schemes you may also add "trustallcerts" to indicate that, + * although link encryption is still required, "non-trusted" certificates may + * will be excepted. For example, "imap+ssl+trustallcerts" or + * "smtp+tls+trustallcerts". This should only used when necessary, as it + * could allow a spoofed server to intercept password and mail. + * + * The URIs should be full templates for connection, including a port if + * the service uses a non-default port. The default ports are as follows: + * imap 143 pop3 110 smtp 587 + * imap+tls+ 143 pop3+tls+ 110 smtp+tls+ 587 + * imap+ssl+ 993 pop3+ssl+ 995 smtp+ssl+ 465 + * + * The username attribute is used to supply a template for the username + * that will be presented to the server. This username is built from a + * set of variables that are substituted with parts of the user + * specified email address. + * + * Valid substitution values for the username attribute are: + * $email - the email address the user entered + * $user - the value before the @ sign in the email address the user entered + * $domain - the value after the @ signin the email address the user entered + * + * The username attribute MUST be specified for the incoming element, so the POP3 or IMAP + * server can identify the mailbox to be opened. + * + * The username attribute MAY be the empty string for the outgoing element, but only if the + * SMTP server supports anonymous transmission (most don't). + * + * For more information about these values, and many examples, see res/xml/providers.xml in + * the Email sources. + */ + private static final String FIND_PROVIDER = "findProvider"; + private static final String FIND_PROVIDER_IN_URI = "findProvider.inUri"; + private static final String FIND_PROVIDER_IN_USER = "findProvider.inUser"; + private static final String FIND_PROVIDER_OUT_URI = "findProvider.outUri"; + private static final String FIND_PROVIDER_OUT_USER = "findProvider.outUser"; + + /** + * The following data is simply examples, and would be changed (or removed) based on the + * requirements for your device. + */ + + /** + * Sample: Email domains that will be auto-configured. In our example, a number of domains + * are controlled by a single mail server. + */ + private static final String[] KNOWN_DOMAINS = new String[] { + "physics.school.edu", "math.school.edu", "language.school.edu", "history.school.edu" + }; + + /** + * Sample: When we see a particular capability (identifying a particular server), send + * back a special value in the IMAP ID command. + */ + private static final String MY_SERVER_CAPABILITY = "MY-SERVER-CAPABILITY"; + private static final String MY_DEVICE_ID = "\"DEVICE-ID-FIELD\" \"MY-DEVICE-ID-VALUE\""; + + /** + * Entry point from the Email application. + * + * @param policy A string requesting a particular policy + * @param arguments A bundle containing zero or more argument values for the requested policy + * @return A bundle containing zero or more return values for the requested policy + */ + public static Bundle getPolicy(String policy, Bundle arguments) { + /* + * Policy: Use alternate exchange strings + */ + if (USE_ALTERNATE_EXCHANGE_STRINGS.equals(policy)) { + // Un-comment the following code to select alternate exchange strings + // Bundle alternates = new Bundle(); + // alternates.putBoolean(USE_ALTERNATE_EXCHANGE_STRINGS, true); + // return alternates; + } + + /* + * Policy: For a known domain, configure to the servers for that domain + */ + if (FIND_PROVIDER.equals(policy)) { + String domain = arguments.getString(FIND_PROVIDER); + if (domain != null) { + domain = domain.toLowerCase(); + boolean isKnownDomain = false; + for (String knownDomain : KNOWN_DOMAINS) { + if (knownDomain.equals(domain)) { + isKnownDomain = true; + break; + } + } + if (isKnownDomain) { + Bundle b = new Bundle(); + b.putString(FIND_PROVIDER_IN_URI, "imap+ssl://imap.school.edu"); + b.putString(FIND_PROVIDER_IN_USER, "$email"); + b.putString(FIND_PROVIDER_OUT_URI, "smtp+ssl://smtp.school.edu"); + b.putString(FIND_PROVIDER_OUT_USER, "$email"); + return b; + } + } + } + + /** + * Policy: If the IMAP server presents a particular capability, send back a particular + * identifier in the IMAP ID. + */ + if (GET_IMAP_ID.equals(policy)) { + String capabilities = arguments.getString(GET_IMAP_ID_CAPA); + if (capabilities != null) { + if (capabilities.toUpperCase().contains(MY_SERVER_CAPABILITY)) { + Bundle b = new Bundle(); + b.putString(GET_IMAP_ID, MY_DEVICE_ID); + return b; + } + } + } + + /** + * For any other policy request, or any policy request that cannot be processed, + * return an empty bundle. + */ + return Bundle.EMPTY; + } +} |