10d4fc55861ed4393aa82f124f2865695ef564641Marc Blank/* 20d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * Copyright (C) 2009 The Android Open Source Project 30d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 40d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 50d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * you may not use this file except in compliance with the License. 60d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * You may obtain a copy of the License at 70d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 80d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * http://www.apache.org/licenses/LICENSE-2.0 90d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 100d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * Unless required by applicable law or agreed to in writing, software 110d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * distributed under the License is distributed on an "AS IS" BASIS, 120d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * See the License for the specific language governing permissions and 140d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * limitations under the License. 150d4fc55861ed4393aa82f124f2865695ef564641Marc Blank */ 160d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 170d4fc55861ed4393aa82f124f2865695ef564641Marc Blankpackage com.android.emailcommon.service; 180d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 190d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.content.Context; 200d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.content.Intent; 210d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.os.Bundle; 220d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.os.IBinder; 230d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.os.RemoteException; 240d4fc55861ed4393aa82f124f2865695ef564641Marc Blankimport android.util.Log; 250d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 26f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.Api; 27f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.Device; 28f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.TempDirectory; 29f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.mail.MessagingException; 30f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.provider.HostAuth; 31f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.provider.Policy; 32f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 33dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blankimport java.io.IOException; 34dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank 350d4fc55861ed4393aa82f124f2865695ef564641Marc Blank/** 360d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * The EmailServiceProxy class provides a simple interface for the UI to call into the various 370d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * EmailService classes (e.g. ExchangeService for EAS). It wraps the service connect/disconnect 380d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * process so that the caller need not be concerned with it. 390d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 400d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * Use the class like this: 41c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * new EmailServiceProxy(context, class).loadAttachment(attachmentId, callback) 420d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 430d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * Methods without a return value return immediately (i.e. are asynchronous); methods with a 440d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * return value wait for a result from the Service (i.e. they should not be called from the UI 450d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * thread) with a default timeout of 30 seconds (settable) 460d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * 470d4fc55861ed4393aa82f124f2865695ef564641Marc Blank * An EmailServiceProxy object cannot be reused (trying to do so generates a RemoteException) 480d4fc55861ed4393aa82f124f2865695ef564641Marc Blank */ 490d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 500d4fc55861ed4393aa82f124f2865695ef564641Marc Blankpublic class EmailServiceProxy extends ServiceProxy implements IEmailService { 510d4fc55861ed4393aa82f124f2865695ef564641Marc Blank private static final String TAG = "EmailServiceProxy"; 520d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook // Private intent that will be used to connect to an independent Exchange service 54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static final String EXCHANGE_INTENT = "com.android.email.EXCHANGE_INTENT"; 55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook public static final String IMAP_INTENT = "com.android.email.IMAP_INTENT"; 56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 570d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final String AUTO_DISCOVER_BUNDLE_ERROR_CODE = "autodiscover_error_code"; 580d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final String AUTO_DISCOVER_BUNDLE_HOST_AUTH = "autodiscover_host_auth"; 590d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 600d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final String VALIDATE_BUNDLE_RESULT_CODE = "validate_result_code"; 610d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final String VALIDATE_BUNDLE_POLICY_SET = "validate_policy_set"; 620d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final String VALIDATE_BUNDLE_ERROR_MESSAGE = "validate_error_message"; 63265530723b8c008f6bc23b1723f4de706a3e9556Marc Blank public static final String VALIDATE_BUNDLE_UNSUPPORTED_POLICIES = 64265530723b8c008f6bc23b1723f4de706a3e9556Marc Blank "validate_unsupported_policies"; 650d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 660d4fc55861ed4393aa82f124f2865695ef564641Marc Blank private final IEmailServiceCallback mCallback; 670d4fc55861ed4393aa82f124f2865695ef564641Marc Blank private Object mReturn = null; 680d4fc55861ed4393aa82f124f2865695ef564641Marc Blank private IEmailService mService; 69f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank private final boolean isRemote; 700d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 710d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // Standard debugging 720d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final int DEBUG_BIT = 1; 730d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // Verbose (parser) logging 740d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final int DEBUG_VERBOSE_BIT = 2; 750d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // File (SD card) logging 760d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public static final int DEBUG_FILE_BIT = 4; 7719b2a7ebc9cc770baace1605ff5b44b3fcb46320Makoto Onuki // Enable strict mode 7819b2a7ebc9cc770baace1605ff5b44b3fcb46320Makoto Onuki public static final int DEBUG_ENABLE_STRICT_MODE = 8; 790d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 800d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // The first two constructors are used with local services that can be referenced by class 810d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public EmailServiceProxy(Context _context, Class<?> _class) { 820d4fc55861ed4393aa82f124f2865695ef564641Marc Blank this(_context, _class, null); 830d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 840d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 850d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public EmailServiceProxy(Context _context, Class<?> _class, IEmailServiceCallback _callback) { 860d4fc55861ed4393aa82f124f2865695ef564641Marc Blank super(_context, new Intent(_context, _class)); 870d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mCallback = _callback; 88f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank isRemote = false; 890d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 900d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 910d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // The following two constructors are used with remote services that must be referenced by 920d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // a known action or by a prebuilt intent 930d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public EmailServiceProxy(Context _context, Intent _intent, IEmailServiceCallback _callback) { 940d4fc55861ed4393aa82f124f2865695ef564641Marc Blank super(_context, _intent); 95dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank try { 96dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank Device.getDeviceId(_context); 97f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank TempDirectory.setTempDirectory(_context); 98dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank } catch (IOException e) { 99dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank } 1000d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mCallback = _callback; 101f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank isRemote = true; 1020d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1030d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 1040d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public EmailServiceProxy(Context _context, String _action, IEmailServiceCallback _callback) { 1050d4fc55861ed4393aa82f124f2865695ef564641Marc Blank super(_context, new Intent(_action)); 106dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank try { 107dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank Device.getDeviceId(_context); 108f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank TempDirectory.setTempDirectory(_context); 109dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank } catch (IOException e) { 110dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank } 1110d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mCallback = _callback; 112f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank isRemote = true; 1130d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1140d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 1150d4fc55861ed4393aa82f124f2865695ef564641Marc Blank @Override 1160d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void onConnected(IBinder binder) { 1170d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService = IEmailService.Stub.asInterface(binder); 1180d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1190d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 120f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public boolean isRemote() { 121f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank return isRemote; 122f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 123f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 1240d4fc55861ed4393aa82f124f2865695ef564641Marc Blank @Override 1250d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public int getApiLevel() { 1260d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return Api.LEVEL; 1270d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1280d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 129c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 130c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Request an attachment to be loaded; the service MUST give higher priority to 131c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * non-background loading. The service MUST use the loadAttachmentStatus callback when 132c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * loading has started and stopped and SHOULD send callbacks with progress information if 133c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * possible. 134c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 135c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param attachmentId the id of the attachment record 136c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param background whether or not this request corresponds to a background action (i.e. 137c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * prefetch) vs a foreground action (user request) 138c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 139f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 140dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank public void loadAttachment(final long attachmentId, final boolean background) 141dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank throws RemoteException { 1420d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 143f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 1440d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 1450d4fc55861ed4393aa82f124f2865695ef564641Marc Blank try { 1460d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 147dc78a769fce18d259eccc602c4623fa74cdf5319Marc Blank mService.loadAttachment(attachmentId, background); 1480d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } catch (RemoteException e) { 1490d4fc55861ed4393aa82f124f2865695ef564641Marc Blank try { 1500d4fc55861ed4393aa82f124f2865695ef564641Marc Blank // Try to send a callback (if set) 1510d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) { 1520d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mCallback.loadAttachmentStatus(-1, attachmentId, 1530d4fc55861ed4393aa82f124f2865695ef564641Marc Blank EmailServiceStatus.REMOTE_EXCEPTION, 0); 1540d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1550d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } catch (RemoteException e1) { 1560d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1570d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1580d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1590d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "loadAttachment"); 1600d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1610d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 162c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 163c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Request the sync of a mailbox; the service MUST send the syncMailboxStatus callback 164c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * indicating "starting" and "finished" (or error), regardless of whether the mailbox is 165c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * actually syncable. 166c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 167c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param mailboxId the id of the mailbox record 168c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param userRequest whether or not the user specifically asked for the sync 169c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 170f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 1710d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void startSync(final long mailboxId, final boolean userRequest) throws RemoteException { 1720d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 173f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 1740d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 1750d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 1760d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.startSync(mailboxId, userRequest); 1770d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1780d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "startSync"); 1790d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1800d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 181c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 182c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Request the immediate termination of a mailbox sync. Although the service is not required to 183c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * acknowledge this request, it MUST send a "finished" (or error) syncMailboxStatus callback if 184c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * the sync was started via the startSync service call. 185c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 186c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param mailboxId the id of the mailbox record 187c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param userRequest whether or not the user specifically asked for the sync 188c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 189f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 1900d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void stopSync(final long mailboxId) throws RemoteException { 1910d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 192f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 1930d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 1940d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 1950d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.stopSync(mailboxId); 1960d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1970d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "stopSync"); 1980d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 1990d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 200c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 201c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Validate a user account, given a protocol, host address, port, ssl status, and credentials. 202c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * The result of this call is returned in a Bundle which MUST include a result code and MAY 203c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * include a PolicySet that is required by the account. A successful validation implies a host 204c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * address that serves the specified protocol and credentials sufficient to be authorized 205c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * by the server to do so. 206c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 20722409fcffae4c6e551fb3e6ead4cdc92e33fded1Ben Komalo * @param hostAuth the hostauth object to validate 208c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @return a Bundle as described above 209c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 210f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 21122409fcffae4c6e551fb3e6ead4cdc92e33fded1Ben Komalo public Bundle validate(final HostAuth hostAuth) throws RemoteException { 2120d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 213f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2140d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException{ 2150d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 21622409fcffae4c6e551fb3e6ead4cdc92e33fded1Ben Komalo mReturn = mService.validate(hostAuth); 2170d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2180d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "validate"); 2190d4fc55861ed4393aa82f124f2865695ef564641Marc Blank waitForCompletion(); 2200d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mReturn == null) { 2210d4fc55861ed4393aa82f124f2865695ef564641Marc Blank Bundle bundle = new Bundle(); 2220d4fc55861ed4393aa82f124f2865695ef564641Marc Blank bundle.putInt(VALIDATE_BUNDLE_RESULT_CODE, MessagingException.UNSPECIFIED_EXCEPTION); 2230d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return bundle; 2240d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } else { 2250d4fc55861ed4393aa82f124f2865695ef564641Marc Blank Bundle bundle = (Bundle) mReturn; 226aeee10e57ef4d931e7708fde218d590453a82aeaMarc Blank bundle.setClassLoader(Policy.class.getClassLoader()); 2270d4fc55861ed4393aa82f124f2865695ef564641Marc Blank Log.v(TAG, "validate returns " + bundle.getInt(VALIDATE_BUNDLE_RESULT_CODE)); 2280d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return bundle; 2290d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2300d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2310d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 232c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 233c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Attempt to determine a user's host address and credentials from an email address and 234c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * password. The result is returned in a Bundle which MUST include an error code and MAY (on 235c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * success) include a HostAuth record sufficient to enable the service to validate the user's 236c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * account. 237c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 238c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param userName the user's email address 239c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param password the user's password 240c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @return a Bundle as described above 241c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 242f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2430d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public Bundle autoDiscover(final String userName, final String password) 2440d4fc55861ed4393aa82f124f2865695ef564641Marc Blank throws RemoteException { 2450d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 246f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2470d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException{ 2480d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 2490d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mReturn = mService.autoDiscover(userName, password); 2500d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2510d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "autoDiscover"); 2520d4fc55861ed4393aa82f124f2865695ef564641Marc Blank waitForCompletion(); 2530d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mReturn == null) { 2540d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return null; 2550d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } else { 2560d4fc55861ed4393aa82f124f2865695ef564641Marc Blank Bundle bundle = (Bundle) mReturn; 2570d4fc55861ed4393aa82f124f2865695ef564641Marc Blank bundle.setClassLoader(HostAuth.class.getClassLoader()); 2580d4fc55861ed4393aa82f124f2865695ef564641Marc Blank Log.v(TAG, "autoDiscover returns " + bundle.getInt(AUTO_DISCOVER_BUNDLE_ERROR_CODE)); 2590d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return bundle; 2600d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2610d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2620d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 263c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 264c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Request that the service reload the folder list for the specified account. The service 265c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * MUST use the syncMailboxListStatus callback to indicate "starting" and "finished" 266c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 267c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accoundId the id of the account whose folder list is to be updated 268c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 269f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2700d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void updateFolderList(final long accountId) throws RemoteException { 2710d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 272f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2730d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 2740d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 2750d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.updateFolderList(accountId); 2760d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2770d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "updateFolderList"); 2780d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2790d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 280c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 281c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Specify the debug flags selected by the user. The service SHOULD log debug information as 282c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * requested. 283c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 284c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param flags an integer whose bits represent logging flags as defined in DEBUG_* flags above 285c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 286f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 287c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank public void setLogging(final int flags) throws RemoteException { 2880d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 289f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 2900d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 2910d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 292c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank mService.setLogging(flags); 2930d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2940d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "setLogging"); 2950d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 2960d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 297c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 298c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Set the global callback object to be used by the service; the service MUST always use the 299c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * most recently set callback object 300c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 301c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param cb a callback object through which all service callbacks are executed 302c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 303f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3040d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void setCallback(final IEmailServiceCallback cb) throws RemoteException { 3050d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 306f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3070d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 3080d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.setCallback(cb); 3090d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3100d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "setCallback"); 3110d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3120d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 313c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 314c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Alert the sync adapter that the account's host information has (or may have) changed; the 315c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * service MUST stop all in-process or pending syncs, clear error states related to the 316c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * account and its mailboxes, and restart necessary sync adapters (e.g. pushed mailboxes) 317c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 318c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the id of the account whose host information has changed 319c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 320f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3210d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void hostChanged(final long accountId) throws RemoteException { 3220d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 323f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3240d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 3250d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.hostChanged(accountId); 3260d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3270d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "hostChanged"); 3280d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3290d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 330c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 331c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Send a meeting response for the specified message 332c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 333c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param messageId the id of the message containing the meeting request 334c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param response the response code, as defined in EmailServiceConstants 335c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 336f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3370d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void sendMeetingResponse(final long messageId, final int response) 3380d4fc55861ed4393aa82f124f2865695ef564641Marc Blank throws RemoteException { 3390d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 340f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3410d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 3420d4fc55861ed4393aa82f124f2865695ef564641Marc Blank if (mCallback != null) mService.setCallback(mCallback); 3430d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.sendMeetingResponse(messageId, response); 3440d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3450d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "sendMeetingResponse"); 3460d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3470d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 348c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 349f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank * Request the sync adapter to load a complete message 350c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 351c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param messageId the id of the message to be loaded 352c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 353f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 354f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void loadMore(final long messageId) throws RemoteException { 355f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank setTask(new ProxyTask() { 356f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 357f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void run() throws RemoteException { 358f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mCallback != null) mService.setCallback(mCallback); 359f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mService.loadMore(messageId); 360f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 361f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank }, "startSync"); 3620d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3630d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 364c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 365c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Not yet used 366c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 367c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the account in which the folder is to be created 368c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param name the name of the folder to be created 369c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 370f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3710d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public boolean createFolder(long accountId, String name) throws RemoteException { 3720d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return false; 3730d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3740d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 375c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 376c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Not yet used 377c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 378c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the account in which the folder resides 379c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param name the name of the folder to be deleted 380c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 381f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3820d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public boolean deleteFolder(long accountId, String name) throws RemoteException { 3830d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return false; 3840d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3850d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 386c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 387c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Not yet used 388c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 389c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the account in which the folder resides 390c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param oldName the name of the existing folder 391c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param newName the new name for the folder 392c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 393f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 3940d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public boolean renameFolder(long accountId, String oldName, String newName) 3950d4fc55861ed4393aa82f124f2865695ef564641Marc Blank throws RemoteException { 3960d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return false; 3970d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 3980d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 399c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 400c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Request the service to delete the account's PIM (personal information management) data. This 401c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * data includes any data that is 1) associated with the account and 2) created/stored by the 402c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * service or its sync adapters and 3) not stored in the EmailProvider database (e.g. contact 403c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * and calendar information). 404c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 405c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the account whose data is to be deleted 406c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 407f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 4080d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void deleteAccountPIMData(final long accountId) throws RemoteException { 4090d4fc55861ed4393aa82f124f2865695ef564641Marc Blank setTask(new ProxyTask() { 410f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 4110d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public void run() throws RemoteException { 4120d4fc55861ed4393aa82f124f2865695ef564641Marc Blank mService.deleteAccountPIMData(accountId); 4130d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 4140d4fc55861ed4393aa82f124f2865695ef564641Marc Blank }, "deleteAccountPIMData"); 4150d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 4160d4fc55861ed4393aa82f124f2865695ef564641Marc Blank 417bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook 418c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank /** 419bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * PRELIMINARY 420c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * Search for messages given a query string. The string is interpreted as the logical AND of 421c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * terms separated by white space. The search is performed on the specified mailbox in the 422c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * specified account (including subfolders, as specified by the includeSubfolders parameter). 423c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * At most numResults messages matching the query term(s) will be added to the mailbox specified 424c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * as destMailboxId. If mailboxId is -1, the entire account will be searched. If firstResult is 425c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * specified and non-zero, results will be added starting with the firstResult'th match (i.e. 426c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * for the continuation of a previous search) 427c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * 428c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param accountId the id of the account to be searched 42975a754660e33c5e18cacffff193983ba22a7b9b0Marc Blank * @param searchParams the search specification 430c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @param destMailboxId the id of the mailbox into which search results are appended 431c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank * @return the total number of matches for this search (regardless of how many were requested) 432c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank */ 433f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 43475a754660e33c5e18cacffff193983ba22a7b9b0Marc Blank public int searchMessages(final long accountId, final SearchParams searchParams, 43575a754660e33c5e18cacffff193983ba22a7b9b0Marc Blank final long destMailboxId) throws RemoteException { 436c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank setTask(new ProxyTask() { 437f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 438c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank public void run() throws RemoteException{ 439c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank if (mCallback != null) mService.setCallback(mCallback); 44075a754660e33c5e18cacffff193983ba22a7b9b0Marc Blank mReturn = mService.searchMessages(accountId, searchParams, destMailboxId); 441c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank } 442c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank }, "searchMessages"); 443c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank waitForCompletion(); 444c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank if (mReturn == null) { 445c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank return 0; 446c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank } else { 447c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank return (Integer)mReturn; 448c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank } 449c60b8d0529168edecf2376a6f421a0ae1e10fe29Marc Blank } 450f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 451f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank /** 452f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank * Request the service to send mail in the specified account's Outbox 453f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank * 454f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank * @param accountId the account whose outgoing mail should be sent 455f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank */ 456f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 457f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void sendMail(final long accountId) throws RemoteException { 458f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank setTask(new ProxyTask() { 459f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 460f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank public void run() throws RemoteException{ 461f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank if (mCallback != null) mService.setCallback(mCallback); 462f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank mService.sendMail(accountId); 463f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 464f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank }, "sendMail"); 465f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank } 466f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank 467f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank @Override 4680d4fc55861ed4393aa82f124f2865695ef564641Marc Blank public IBinder asBinder() { 4690d4fc55861ed4393aa82f124f2865695ef564641Marc Blank return null; 4700d4fc55861ed4393aa82f124f2865695ef564641Marc Blank } 4710d4fc55861ed4393aa82f124f2865695ef564641Marc Blank} 472