VendorPolicyLoader.java revision 0434fef1f6706a0a6fc53b499f3e982f70d7142d
1f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki/*
2f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Copyright (C) 2010 The Android Open Source Project
3f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *
4f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * you may not use this file except in compliance with the License.
6f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * You may obtain a copy of the License at
7f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *
8f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *
10f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * Unless required by applicable law or agreed to in writing, software
11f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * See the License for the specific language governing permissions and
14f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * limitations under the License.
15f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */
16f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
17f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukipackage com.android.email;
18f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
19ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadlerimport com.android.email.activity.setup.AccountSetupBasics.Provider;
20ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler
21f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.content.Context;
22f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.content.pm.ApplicationInfo;
23f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.content.pm.PackageManager.NameNotFoundException;
24f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.os.Bundle;
25f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport android.util.Log;
26f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
27f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukiimport java.lang.reflect.Method;
28ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadlerimport java.net.URI;
29ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadlerimport java.net.URISyntaxException;
30f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
31f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki/**
32f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * A bridge class to the email vendor policy apk.
33f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *
34f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * <p>Email vendor policy is a system apk named "com.android.email.helper".  When exists, it must
35f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * contain a class called "com.android.email.policy.EmailPolicy" with a static public method
36f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * <code>Bundle getPolicy(String, Bundle)</code>, which serves vendor specific configurations.
37f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki *
38f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * <p>A vendor policy apk is optional.  The email application will operate properly when none is
39f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki * found.
40f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki */
41f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onukipublic class VendorPolicyLoader {
42f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static final String POLICY_PACKAGE = "com.android.email.policy";
43f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static final String POLICY_CLASS = POLICY_PACKAGE + ".EmailPolicy";
44f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static final String GET_POLICY_METHOD = "getPolicy";
45f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static final Class<?>[] ARGS = new Class<?>[] {String.class, Bundle.class};
46f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
47ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    // call keys and i/o bundle keys
48ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    // when there is only one parameter or return value, use call key
49f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static final String USE_ALTERNATE_EXCHANGE_STRINGS = "useAlternateExchangeStrings";
50ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String GET_IMAP_ID = "getImapId";
51ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String GET_IMAP_ID_USER = "getImapId.user";
52ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String GET_IMAP_ID_HOST = "getImapId.host";
53ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String GET_IMAP_ID_CAPA = "getImapId.capabilities";
54ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER = "findProvider";
55ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER_IN_URI = "findProvider.inUri";
56ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER_IN_USER = "findProvider.inUser";
57ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER_OUT_URI = "findProvider.outUri";
58ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER_OUT_USER = "findProvider.outUser";
59ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    private static final String FIND_PROVIDER_NOTE = "findProvider.note";
60f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
61f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /** Singleton instance */
62f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private static VendorPolicyLoader sInstance;
63f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
64f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private final Method mPolicyMethod;
65f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
66f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    public static VendorPolicyLoader getInstance(Context context) {
67f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        if (sInstance == null) {
68f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            // It's okay to instantiate VendorPolicyLoader multiple times.  No need to synchronize.
69f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            sInstance = new VendorPolicyLoader(context);
70f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        }
71f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        return sInstance;
72f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
73f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
74f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    private VendorPolicyLoader(Context context) {
75f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        this(context, POLICY_PACKAGE, POLICY_CLASS, false);
76f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
77f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
78f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /**
79f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * Constructor for testing, where we need to use an alternate package/class name, and skip
80f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * the system apk check.
81f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     */
82f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /* package */ VendorPolicyLoader(Context context, String packageName, String className,
83f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            boolean allowNonSystemApk) {
84f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        if (!allowNonSystemApk && !isSystemPackage(context, packageName)) {
85f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            mPolicyMethod = null;
86f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            return;
87f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        }
88f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
89f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        Class<?> clazz = null;
90f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        Method method = null;
91f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        try {
92f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            final Context policyContext = context.createPackageContext(packageName,
93f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki                    Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
94f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            final ClassLoader classLoader = policyContext.getClassLoader();
95f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            clazz = classLoader.loadClass(className);
96f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            method = clazz.getMethod(GET_POLICY_METHOD, ARGS);
97f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        } catch (NameNotFoundException ignore) {
98f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            // Package not found -- it's okay.
990434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler        } catch (ClassNotFoundException ignore) {
1000434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler            // Class not found -- it's okay.
1010434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler        } catch (NoSuchMethodException ignore) {
1020434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler            // Method not found -- it's okay.
1030434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler        } catch (RuntimeException e) {
104f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            Log.w(Email.LOG_TAG, "VendorPolicyLoader: " + e);
105f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        }
106f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        mPolicyMethod = method;
107f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
108f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
109f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    // Not private for testing
110f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /* package */ static boolean isSystemPackage(Context context, String packageName) {
111f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        try {
112f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
113f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
114f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        } catch (NameNotFoundException e) {
115f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            return false; // Package not found.
116f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        }
117f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
118f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
119f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /**
120f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * Calls the getPolicy method in the policy apk, if one exists.  This method never returns null;
121f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * It returns an empty {@link Bundle} when there is no policy apk (or even if the inner
122f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * getPolicy returns null).
123f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     */
124f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    // Not private for testing
125f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /* package */ Bundle getPolicy(String policy, Bundle args) {
126f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        Bundle ret = null;
127f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        if (mPolicyMethod != null) {
128f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            try {
129f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki                ret = (Bundle) mPolicyMethod.invoke(null, policy, args);
130f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            } catch (Exception e) {
131f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki                Log.w(Email.LOG_TAG, "VendorPolicyLoader", e);
132f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki            }
133f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        }
134f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        return (ret != null) ? ret : Bundle.EMPTY;
135f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
136f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki
137f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    /**
138f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     * Returns true if alternate exchange descriptive text is required.
139ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *
140ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * Vendor function:
141ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Select: USE_ALTERNATE_EXCHANGE_STRINGS
142ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Params: none
143ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Result: USE_ALTERNATE_EXCHANGE_STRINGS (boolean)
144f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki     */
145f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    public boolean useAlternateExchangeStrings() {
146f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki        return getPolicy(USE_ALTERNATE_EXCHANGE_STRINGS, null)
147f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki                .getBoolean(USE_ALTERNATE_EXCHANGE_STRINGS, false);
148f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki    }
149ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler
150ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    /**
151ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * Returns additional key/value pairs for the IMAP ID string.
152ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *
153ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * Vendor function:
154ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Select: GET_IMAP_ID
155ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Params: GET_IMAP_ID_USER (String)
156ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          GET_IMAP_ID_HOST (String)
157ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          GET_IMAP_ID_CAPABILITIES (String)
158ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Result: GET_IMAP_ID (String)
159ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *
160ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @param userName the server that is being contacted (e.g. "imap.server.com")
161ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @param host the server that is being contacted (e.g. "imap.server.com")
162ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @param reported capabilities, if known.  null is OK
163ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @return zero or more key/value pairs, quoted and delimited by spaces.  If there is
164ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * nothing to add, return null.
165ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     */
166ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    public String getImapIdValues(String userName, String host, String capabilities) {
167ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        Bundle params = new Bundle();
168ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        params.putString(GET_IMAP_ID_USER, userName);
169ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        params.putString(GET_IMAP_ID_HOST, host);
170ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        params.putString(GET_IMAP_ID_CAPA, capabilities);
171ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        String result = getPolicy(GET_IMAP_ID, params).getString(GET_IMAP_ID);
172ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        return result;
173ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    }
174ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler
175ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    /**
176ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * Returns provider setup information for a given email address
177ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *
178ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * Vendor function:
179ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Select: FIND_PROVIDER
180ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Param:  FIND_PROVIDER (String)
181ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *  Result: FIND_PROVIDER_IN_URI
182ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          FIND_PROVIDER_IN_USER
183ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          FIND_PROVIDER_OUT_URI
184ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          FIND_PROVIDER_OUT_USER
185ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *          FIND_PROVIDER_NOTE
186ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     *
187ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @param domain The domain portion of the user's email address
188ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     * @return suitable Provider definition, or null if no match found
189ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler     */
190ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    public Provider findProviderForDomain(String domain) {
191ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        Bundle params = new Bundle();
192ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        params.putString(FIND_PROVIDER, domain);
193ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        Bundle out = getPolicy(FIND_PROVIDER, params);
1940434fef1f6706a0a6fc53b499f3e982f70d7142dAndrew Stadler        if (out != null && !out.isEmpty()) {
195ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler            try {
196ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                Provider p = new Provider();
197ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.id = null;
198ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.label = null;
199ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.domain = domain;
200ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.incomingUriTemplate = new URI(out.getString(FIND_PROVIDER_IN_URI));
201ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.incomingUsernameTemplate = out.getString(FIND_PROVIDER_IN_USER);
202ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.outgoingUriTemplate = new URI(out.getString(FIND_PROVIDER_OUT_URI));
203ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.outgoingUsernameTemplate = out.getString(FIND_PROVIDER_OUT_USER);
204ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                p.note = out.getString(FIND_PROVIDER_NOTE);
205ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                return p;
206ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler            } catch (URISyntaxException e) {
207ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler                Log.d(Email.LOG_TAG, "uri exception while vendor policy loads " + domain);
208ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler            }
209ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        }
210ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler        return null;
211ecb1af804144689d4ead96a247b565f9b4eb8160Andrew Stadler    }
212f613489663cdc5df71b029dfcec5fd3c5173a549Makoto Onuki}
213