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