19fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki/*
29fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * Copyright (C) 2010 The Android Open Source Project
39fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki *
49fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
59fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * you may not use this file except in compliance with the License.
69fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * You may obtain a copy of the License at
79fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki *
89fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
99fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki *
109fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * Unless required by applicable law or agreed to in writing, software
119fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
129fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * See the License for the specific language governing permissions and
149fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki * limitations under the License.
159fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki */
169fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki
1766a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankpackage com.android.email.service;
189fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki
1903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport android.app.Service;
209fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onukiimport android.content.Context;
219fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onukiimport android.content.Intent;
2203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport android.os.Bundle;
2303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport android.os.IBinder;
2403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport android.os.RemoteException;
25e1a6088ee4e3f0e4344dd9bc38029b6d01431eabMarc Blank
2603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.emailcommon.Api;
27e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blankimport com.android.emailcommon.provider.HostAuth;
2866a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankimport com.android.emailcommon.service.EmailServiceProxy;
2966a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankimport com.android.emailcommon.service.IEmailService;
3066a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankimport com.android.emailcommon.service.IEmailServiceCallback;
3103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blankimport com.android.emailcommon.service.SearchParams;
3266a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blank
339fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki/**
3466a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blank * Utility functions for EmailService support.
359fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki */
3666a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blankpublic class EmailServiceUtils {
379fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki    /**
38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Starts an EmailService by name
399fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki     */
40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void startService(Context context, String intentAction) {
41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        context.startService(new Intent(intentAction));
429fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki    }
439fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki
449fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki    /**
45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Returns an {@link IEmailService} for the service; otherwise returns an empty
46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link IEmailService} implementation.
47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param context
49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * @param callback Object to get callback, or can be null
509fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki     */
51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static IEmailService getService(Context context, String intentAction,
52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            IEmailServiceCallback callback) {
53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new EmailServiceProxy(context, intentAction, callback);
54f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
55f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
56f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    /**
57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * Determine if the EmailService is available
58f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank     */
59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static boolean isServiceAvailable(Context context, String intentAction) {
60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return new EmailServiceProxy(context, intentAction, null).test();
61f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
62f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static void startExchangeService(Context context) {
64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        startService(context, EmailServiceProxy.EXCHANGE_INTENT);
653a5c1fb274a9ce72d708d88509bf2607cb018dddMarc Blank    }
663a5c1fb274a9ce72d708d88509bf2607cb018dddMarc Blank
67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static IEmailService getExchangeService(Context context,
68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            IEmailServiceCallback callback) {
69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return getService(context, EmailServiceProxy.EXCHANGE_INTENT, callback);
70f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
71f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static boolean isExchangeAvailable(Context context) {
73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return isServiceAvailable(context, EmailServiceProxy.EXCHANGE_INTENT);
74f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    }
75f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
76f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank    /**
77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * An empty {@link IEmailService} implementation which is used instead of
78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * {@link com.android.exchange.ExchangeService} on the build with no exchange support.
79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     *
80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * <p>In theory, the service in question isn't used on the no-exchange-support build,
81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * because we won't have any exchange accounts in that case, so we wouldn't have to have this
82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * class.  However, there are a few places we do use the service even if there's no exchange
83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook     * accounts (e.g. setLogging), so this class is added for safety and simplicity.
84f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank     */
85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static class NullEmailService extends Service implements IEmailService {
86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public static final NullEmailService INSTANCE = new NullEmailService();
87f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank
88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public int getApiLevel() {
89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return Api.LEVEL;
90f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
9166a47b8dac5e97e37c30b928bc5a227d74baada9Marc Blank
92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public Bundle autoDiscover(String userName, String password) throws RemoteException {
93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return Bundle.EMPTY;
94f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        }
95c18f8f615f134a2b391d06e2d8d49434a8bb94e5Makoto Onuki
96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public boolean createFolder(long accountId, String name) throws RemoteException {
97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return false;
9870edcf05387df33f4761b766add6b80999e425e9Marc Blank        }
9970edcf05387df33f4761b766add6b80999e425e9Marc Blank
100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public boolean deleteFolder(long accountId, String name) throws RemoteException {
101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return false;
102e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        }
103e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void hostChanged(long accountId) throws RemoteException {
105e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        }
106e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void loadAttachment(long attachmentId, boolean background) throws RemoteException {
108e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        }
109e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void loadMore(long messageId) throws RemoteException {
111e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        }
112e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public boolean renameFolder(long accountId, String oldName, String newName)
114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                throws RemoteException {
115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return false;
11670edcf05387df33f4761b766add6b80999e425e9Marc Blank        }
11703cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void sendMeetingResponse(long messageId, int response) throws RemoteException {
11903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
120e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void setCallback(IEmailServiceCallback cb) throws RemoteException {
12203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
12303cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void setLogging(int flags) throws RemoteException {
12503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
12603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
127f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        public void startSync(long mailboxId, boolean userRequest) throws RemoteException {
12803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
12903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
130f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        public void stopSync(long mailboxId) throws RemoteException {
13103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
13203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
133f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank        public void updateFolderList(long accountId) throws RemoteException {
13403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
13503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
136bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public Bundle validate(HostAuth hostAuth) throws RemoteException {
137f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blank            return null;
13803cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
13903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
14003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        public void deleteAccountPIMData(long accountId) throws RemoteException {
14103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
14203cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
143bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public int searchMessages(long accountId, SearchParams searchParams, long destMailboxId) {
14403cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank            return 0;
14503cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
14603cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
147bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public IBinder asBinder() {
148bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;
14903cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        }
15003cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank
15103cd72805dab0379ed255d151f1c17cc60655fc3Marc Blank        @Override
152bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public IBinder onBind(Intent intent) {
153bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return null;
154e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        }
155e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank
156e714bb9d153cfe13a7f0932e7d67ea08fa5a1d98Marc Blank        @Override
157bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        public void sendMail(long accountId) throws RemoteException {
158f19f9cf4d3e5229715da77fe05a1a2bbd8da3f41Marc Blank        }
1599fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki    }
1609fe51f632965f5d085ae45a1089c7c97dcec8881Makoto Onuki}
161