1bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang/* 2bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Copyright (C) 2009 The Android Open Source Project 3bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 4bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Licensed under the Apache License, Version 2.0 (the "License"); 5bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * you may not use this file except in compliance with the License. 6bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * You may obtain a copy of the License at 7bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 8bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * http://www.apache.org/licenses/LICENSE-2.0 9bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 10bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Unless required by applicable law or agreed to in writing, software 11bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * distributed under the License is distributed on an "AS IS" BASIS, 12bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * See the License for the specific language governing permissions and 14bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * limitations under the License. 15bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 16bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 179a3cb14e28536e4133dddbe952f47189fe344ec1Mason Tangpackage com.android.calendar.widget; 18bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 196bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelsonimport static android.provider.CalendarContract.EXTRA_EVENT_ALL_DAY; 20a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_BEGIN_TIME; 21a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErikimport static android.provider.CalendarContract.EXTRA_EVENT_END_TIME; 22bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan 23bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.AlarmManager; 24bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.app.PendingIntent; 25bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetManager; 26bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.appwidget.AppWidgetProvider; 27bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.ComponentName; 28bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Context; 29bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.content.Intent; 3047d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.net.Uri; 31a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract; 32bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangimport android.text.format.DateUtils; 3347d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.text.format.Time; 3447d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.util.Log; 3547d40324272ae39af0872bf5cbf27e1800478021Mason Tangimport android.widget.RemoteViews; 36bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 370ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.AllInOneActivity; 380ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.EventInfoActivity; 390ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.R; 400ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelsonimport com.android.calendar.Utils; 410ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson 42bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang/** 43bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Simple widget to show next upcoming calendar event. 44bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 45bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tangpublic class CalendarAppWidgetProvider extends AppWidgetProvider { 46bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final String TAG = "CalendarAppWidgetProvider"; 47bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final boolean LOGD = false; 48bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 49bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // TODO Move these to Calendar.java 50bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static final String EXTRA_EVENT_IDS = "com.android.calendar.EXTRA_EVENT_IDS"; 51bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 52bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 53bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 54bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 55bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 56bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onReceive(Context context, Intent intent) { 57bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Handle calendar-specific updates ourselves because they might be 58bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // coming in without extras, which AppWidgetProvider then blocks. 59bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang final String action = intent.getAction(); 60f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik if (LOGD) 61f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik Log.d(TAG, "AppWidgetProvider got the intent: " + intent.toString()); 62064beb957ae443760118023a40fd7001eb11c1a1RoboErik if (Utils.getWidgetUpdateAction(context).equals(action)) { 6347d40324272ae39af0872bf5cbf27e1800478021Mason Tang AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 6447d40324272ae39af0872bf5cbf27e1800478021Mason Tang performUpdate(context, appWidgetManager, 6547d40324272ae39af0872bf5cbf27e1800478021Mason Tang appWidgetManager.getAppWidgetIds(getComponentName(context)), 66bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang null /* no eventIds */); 67f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik } else if (action.equals(Intent.ACTION_PROVIDER_CHANGED) 68f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik || action.equals(Intent.ACTION_TIME_CHANGED) 69f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik || action.equals(Intent.ACTION_TIMEZONE_CHANGED) 70f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik || action.equals(Intent.ACTION_DATE_CHANGED) 71f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik || action.equals(Utils.getWidgetScheduledUpdateAction(context))) { 72f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik Intent service = new Intent(context, CalendarAppWidgetService.class); 73f1416205f0bd6d40ed20c49752fdf8da63258611RoboErik context.startService(service); 74bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } else { 75bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang super.onReceive(context, intent); 76bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 77bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 78bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 79bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 80bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 81bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 82bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 83bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onDisabled(Context context) { 84bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang // Unsubscribe from all AlarmManager updates 85bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 86bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang PendingIntent pendingUpdate = getUpdateIntent(context); 87bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang am.cancel(pendingUpdate); 88bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 89bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 90bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 91bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@inheritDoc} 92bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 93bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang @Override 94bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 9547d40324272ae39af0872bf5cbf27e1800478021Mason Tang performUpdate(context, appWidgetManager, appWidgetIds, null /* no eventIds */); 96bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 97bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 98bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 99bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 100bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Build {@link ComponentName} describing this specific 101bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * {@link AppWidgetProvider} 102bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 103bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static ComponentName getComponentName(Context context) { 104bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang return new ComponentName(context, CalendarAppWidgetProvider.class); 105bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 106bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 107bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 108bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Process and push out an update for the given appWidgetIds. This call 109bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * actually fires an intent to start {@link CalendarAppWidgetService} as a 110bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * background service which handles the actual update, to prevent ANR'ing 111bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * during database queries. 112bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 113bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param context Context to use when starting {@link CalendarAppWidgetService}. 114bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param appWidgetIds List of specific appWidgetIds to update, or null for 115bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * all. 116bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param changedEventIds Specific events known to be changed. If present, 117bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * we use it to decide if an update is necessary. 118bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 1194143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa private void performUpdate(Context context, 1204143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa AppWidgetManager appWidgetManager, int[] appWidgetIds, 121bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang long[] changedEventIds) { 12247d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Launch over to service so it can perform update 12347d40324272ae39af0872bf5cbf27e1800478021Mason Tang for (int appWidgetId : appWidgetIds) { 12447d40324272ae39af0872bf5cbf27e1800478021Mason Tang if (LOGD) Log.d(TAG, "Building widget update..."); 12547d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent updateIntent = new Intent(context, CalendarAppWidgetService.class); 12647d40324272ae39af0872bf5cbf27e1800478021Mason Tang updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 127bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang if (changedEventIds != null) { 128bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang updateIntent.putExtra(EXTRA_EVENT_IDS, changedEventIds); 129bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 13047d40324272ae39af0872bf5cbf27e1800478021Mason Tang updateIntent.setData(Uri.parse(updateIntent.toUri(Intent.URI_INTENT_SCHEME))); 13147d40324272ae39af0872bf5cbf27e1800478021Mason Tang 13247d40324272ae39af0872bf5cbf27e1800478021Mason Tang RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget); 13347d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Calendar header 13495d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng Time time = new Time(Utils.getTimeZone(context, null)); 13547d40324272ae39af0872bf5cbf27e1800478021Mason Tang time.setToNow(); 13695d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng long millis = time.toMillis(true); 13795d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng final String dayOfWeek = DateUtils.getDayOfWeekString(time.weekDay + 1, 13895d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng DateUtils.LENGTH_MEDIUM); 13995d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng final String date = Utils.formatDateRange(context, millis, millis, 14095d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE 14195d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng | DateUtils.FORMAT_NO_YEAR); 14247d40324272ae39af0872bf5cbf27e1800478021Mason Tang views.setTextViewText(R.id.day_of_week, dayOfWeek); 14395d6fe0b672284a19699edc4727c366e3b0ccec7Peter Ng views.setTextViewText(R.id.date, date); 14447d40324272ae39af0872bf5cbf27e1800478021Mason Tang // Attach to list of events 145129b79699cca6cccbe68654aad8f5ffb511c92c2Winson Chung views.setRemoteAdapter(appWidgetId, R.id.events_list, updateIntent); 1460054262c76ccc4b20dc6596e161df8a99d0c81c7Mason Tang appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.events_list); 14747d40324272ae39af0872bf5cbf27e1800478021Mason Tang 148629085ada768ffa6c10edddb319291636e3774b7Michael Chan 149629085ada768ffa6c10edddb319291636e3774b7Michael Chan // Launch calendar app when the user taps on the header 150629085ada768ffa6c10edddb319291636e3774b7Michael Chan final Intent launchCalendarIntent = new Intent(Intent.ACTION_VIEW); 15107d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan launchCalendarIntent.setClass(context, AllInOneActivity.class); 1522c2dab4805522ceb8674aafa6d0939889084c589RoboErik launchCalendarIntent 1532c2dab4805522ceb8674aafa6d0939889084c589RoboErik .setData(Uri.parse("content://com.android.calendar/time/" + millis)); 154c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik final PendingIntent launchCalendarPendingIntent = PendingIntent.getActivity( 155c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik context, 0 /* no requestCode */, launchCalendarIntent, 0 /* no flags */); 156629085ada768ffa6c10edddb319291636e3774b7Michael Chan views.setOnClickPendingIntent(R.id.header, launchCalendarPendingIntent); 15747d40324272ae39af0872bf5cbf27e1800478021Mason Tang 158c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik // Each list item will call setOnClickExtra() to let the list know 159c46c2dc5dbec57616d799b1d0290d7c827b48d0cRoboErik // which item 1604143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa // is selected by a user. 1614143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa final PendingIntent updateEventIntent = getLaunchPendingIntentTemplate(context); 1624143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa views.setPendingIntentTemplate(R.id.events_list, updateEventIntent); 16347d40324272ae39af0872bf5cbf27e1800478021Mason Tang 16447d40324272ae39af0872bf5cbf27e1800478021Mason Tang appWidgetManager.updateAppWidget(appWidgetId, views); 16547d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 166bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 167bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang 168bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang /** 169bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * Build the {@link PendingIntent} used to trigger an update of all calendar 170064beb957ae443760118023a40fd7001eb11c1a1RoboErik * widgets. Uses {@link Utils#getWidgetScheduledUpdateAction(Context)} to 171a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik * directly target all widgets instead of using 172a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik * {@link AppWidgetManager#EXTRA_APPWIDGET_IDS}. 173bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * 174bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang * @param context Context to use when building broadcast. 175bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang */ 176bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang static PendingIntent getUpdateIntent(Context context) { 177064beb957ae443760118023a40fd7001eb11c1a1RoboErik Intent intent = new Intent(Utils.getWidgetScheduledUpdateAction(context)); 17842dabd1e1e89b0d4af5afb776c6ecc53f6ae9fbaRoboErik intent.setDataAndType(CalendarContract.CONTENT_URI, Utils.APPWIDGET_DATA_TYPE); 179a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik return PendingIntent.getBroadcast(context, 0 /* no requestCode */, intent, 180a38da7d3d03e1a1151d199dbac0a00ff2ff75a89RoboErik 0 /* no flags */); 181bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang } 18247d40324272ae39af0872bf5cbf27e1800478021Mason Tang 18347d40324272ae39af0872bf5cbf27e1800478021Mason Tang /** 1844143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * Build a {@link PendingIntent} to launch the Calendar app. This should be used 1854143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * in combination with {@link RemoteViews#setPendingIntentTemplate(int, PendingIntent)}. 18647d40324272ae39af0872bf5cbf27e1800478021Mason Tang */ 1874143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa static PendingIntent getLaunchPendingIntentTemplate(Context context) { 18847d40324272ae39af0872bf5cbf27e1800478021Mason Tang Intent launchIntent = new Intent(); 18947d40324272ae39af0872bf5cbf27e1800478021Mason Tang launchIntent.setAction(Intent.ACTION_VIEW); 1900ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | 1910ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson Intent.FLAG_ACTIVITY_TASK_ON_HOME); 1920ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson launchIntent.setClass(context, AllInOneActivity.class); 1930ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson return PendingIntent.getActivity(context, 0 /* no requestCode */, launchIntent, 1940ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson PendingIntent.FLAG_UPDATE_CURRENT); 1954143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa } 1960c715c837a7ecc2cfda3a62d952f8dc7e79a39f3Daisuke Miyakawa 1974143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa /** 1984143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * Build an {@link Intent} available as FillInIntent to launch the Calendar app. 1994143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * This should be used in combination with 2004143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 2014143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * If the go to time is 0, then calendar will be launched without a starting time. 2024143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * 2034143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * @param goToTime time that calendar should take the user to, or 0 to 2044143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa * indicate no specific start time. 2054143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa */ 2066bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson static Intent getLaunchFillInIntent(Context context, long id, long start, long end, 2076bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson boolean allDay) { 2084143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa final Intent fillInIntent = new Intent(); 209bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan String dataString = "content://com.android.calendar/events"; 210bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan if (id != 0) { 2114143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa fillInIntent.putExtra(Utils.INTENT_KEY_DETAIL_VIEW, true); 2120ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson fillInIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | 2130ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson Intent.FLAG_ACTIVITY_TASK_ON_HOME); 2140ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson 215bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan dataString += "/" + id; 2160ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // If we have an event id - start the event info activity 2170ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson fillInIntent.setClass(context, EventInfoActivity.class); 2180ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson } else { 2190ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson // If we do not have an event id - start AllInOne 2200ef732f240516f9f8b8add982f82244e01ec509bIsaac Katzenelson fillInIntent.setClass(context, AllInOneActivity.class); 22147d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 22247d40324272ae39af0872bf5cbf27e1800478021Mason Tang Uri data = Uri.parse(dataString); 223b79279d9311c798138ab745d1836ca52f235f99dDaisuke Miyakawa fillInIntent.setData(data); 224a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik fillInIntent.putExtra(EXTRA_EVENT_BEGIN_TIME, start); 225a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik fillInIntent.putExtra(EXTRA_EVENT_END_TIME, end); 2266bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson fillInIntent.putExtra(EXTRA_EVENT_ALL_DAY, allDay); 227bdbf15078ad5efdf27c021d7aca8c8aa4693878cMichael Chan 2284143cfabb36f0c3adcad410a6eed29bc2b89d6e3Daisuke Miyakawa return fillInIntent; 22947d40324272ae39af0872bf5cbf27e1800478021Mason Tang } 23047d40324272ae39af0872bf5cbf27e1800478021Mason Tang 23107d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// private static PendingIntent getNewEventPendingIntent(Context context) { 23207d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// Intent newEventIntent = new Intent(Intent.ACTION_EDIT); 23307d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// newEventIntent.setClass(context, EditEventActivity.class); 23407d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// Builder builder = CalendarContract.CONTENT_URI.buildUpon(); 23507d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// builder.appendPath("events"); 23607d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// newEventIntent.setData(builder.build()); 23707d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// return PendingIntent.getActivity(context, 0, newEventIntent, 23807d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// PendingIntent.FLAG_UPDATE_CURRENT); 23907d9fee87bc02849c0dd7b66326a320d53cf5479Michael Chan// } 240bb3f08abac01e3083d837e5e823b311e3c039e90Mason Tang} 241