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