1d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/*
2d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Copyright (C) 2010 The Android Open Source Project
3d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
4d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Licensed under the Apache License, Version 2.0 (the "License");
5d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * you may not use this file except in compliance with the License.
6d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * You may obtain a copy of the License at
7d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
8d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *      http://www.apache.org/licenses/LICENSE-2.0
9d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
10d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Unless required by applicable law or agreed to in writing, software
11d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * distributed under the License is distributed on an "AS IS" BASIS,
12d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * See the License for the specific language governing permissions and
14d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * limitations under the License.
15d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
16d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
17d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpackage com.android.exchange;
18d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
19d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport com.android.emailcommon.Logging;
20d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
21d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.accounts.Account;
22d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.accounts.AccountManager;
23d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.app.Notification;
24d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.app.NotificationManager;
25d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.app.PendingIntent;
26d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.content.ContentResolver;
27d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.content.Context;
28d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.content.Intent;
29d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.net.Uri;
30d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.provider.CalendarContract;
31d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankimport android.util.Log;
32d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
33d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank/**
34d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * Utility class to enable Exchange calendar sync for all existing Exchange accounts.
35d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
36d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * <p>Exchange calendar was first supported on Froyo.  It wasn't supported on Eclair, which
37d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * was the first version that supported Exchange email.
38d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank *
39d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * <p>This class is used only once when the devices is upgraded to Froyo (or later) from Eclair,
40d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank * to enable calendar sync for all the existing Exchange accounts.
41d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank */
42d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blankpublic class CalendarSyncEnabler {
43d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private final Context mContext;
44d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
45d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public CalendarSyncEnabler(Context context) {
46d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        this.mContext = context;
47d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
48d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
49d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
50d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * Enable calendar sync for all the existing exchange accounts, and post a notification if any.
51d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
52d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public final void enableEasCalendarSync() {
53d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        String emailAddresses = enableEasCalendarSyncInternalForTest();
54d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        if (emailAddresses.length() > 0) {
55d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            // Exchange account(s) found.
56d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            showNotificationForTest(emailAddresses.toString());
57d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
58d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
59d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
60d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
61d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * Enable calendar sync for all the existing exchange accounts
62d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     *
63d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * @return email addresses of the Exchange accounts joined with spaces as delimiters,
64d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     *     or the empty string if there's no Exchange accounts.
65d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
66d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /* package for testing */ final String enableEasCalendarSyncInternalForTest() {
67d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        StringBuilder emailAddresses = new StringBuilder();
68d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
69d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        Account[] exchangeAccounts = AccountManager.get(mContext)
70d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                .getAccountsByType(Eas.EXCHANGE_ACCOUNT_MANAGER_TYPE);
71d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        for (Account account : exchangeAccounts) {
72d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            final String emailAddress = account.name;
73d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            Log.i(Logging.LOG_TAG, "Enabling Exchange calendar sync for " + emailAddress);
74d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
75d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            ContentResolver.setIsSyncable(account, CalendarContract.AUTHORITY, 1);
76d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            ContentResolver.setSyncAutomatically(account, CalendarContract.AUTHORITY, true);
77d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
78d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            // Accumulate addresses for notification.
79d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            if (emailAddresses.length() > 0) {
80d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                emailAddresses.append(' ');
81d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            }
82d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank            emailAddresses.append(emailAddress);
83d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        }
84d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return emailAddresses.toString();
85d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
86d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
87d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    // *** Taken from NotificationController
88d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    public static final int NOTIFICATION_ID_EXCHANGE_CALENDAR_ADDED = 2;
89d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
90d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /**
91d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * Show the "Exchange calendar added" notification.
92d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     *
93d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     * @param emailAddresses space delimited list of email addresses of Exchange accounts.  It'll
94d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     *     be shown on the notification.
95d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank     */
96d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /* package for testing */ void showNotificationForTest(String emailAddresses) {
97d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        // Launch Calendar app when clicked.
98d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        PendingIntent launchCalendarPendingIntent = PendingIntent.getActivity(mContext, 0,
99d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                createLaunchCalendarIntent(), 0);
100d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
101d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        String tickerText = mContext.getString(R.string.notification_exchange_calendar_added);
102d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        Notification n = new Notification(R.drawable.stat_notify_calendar,
103d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                tickerText, System.currentTimeMillis());
104d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        n.setLatestEventInfo(mContext, tickerText, emailAddresses, launchCalendarPendingIntent);
105d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        n.flags = Notification.FLAG_AUTO_CANCEL;
106d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
107d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        NotificationManager nm =
108d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank                (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
109d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        nm.notify(NOTIFICATION_ID_EXCHANGE_CALENDAR_ADDED, n);
110d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
111d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank
112d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    /** @return {@link Intent} to launch the Calendar app. */
113d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    private Intent createLaunchCalendarIntent() {
114d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank        return new Intent(Intent.ACTION_VIEW, Uri.parse("content://com.android.calendar/time"));
115d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank    }
116d2e4d4675d04e78591ebd38fd084fc2cdbe144a0Marc Blank}
117