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